multipart-ts - v1.3.2

Multipart.ts

A TypeScript library for multipart data parsing and creation.

Documentation

  • Parse any kind of multipart/*, e.g. multipart/mixed, multipart/form-data, multipart/byteranges, etc.
  • Create your own multipart with any parts
  • Create a Multipart instance from FormData
  • Serialise a Multipart instance into bytes (Uint8Array)
  • Works with Node.js and in the browser without any polyfills
  • Zero dependencies

Install using NPM

npm i multipart-ts

Import as native ESM

import {Multipart} from "multipart-ts";

This library uses mainly Uint8Array so that it works in the browser. In Node.js, you can use Buffer as it is a superset of Uint8Array. In the browser, to convert a string to Uint8Array and vice-versa, use TextEncoder and TextDecoder respectively.

import http from "node:http";
import {Component, Multipart} from "multipart-ts";

http.createServer(async (req, res) => {
// Parse multipart request body
if (req.method === "POST" && req.headers["content-type"]) {

// get the request body
const body: Uint8Array[] = [];
for await (const chunk of req)
body.push(chunk);

// create a blob to hold the Content-Type header (which includes the boundary) and the body
const blob = new Blob(body, {type: req.headers["content-type"]});
// parse multipart from the blob
const multipart = await Multipart.blob(blob);
console.log(multipart);

res.end("ok");
}
// Return a multipart response
else if (req.method === "GET") {
const multipart = new Multipart(
[
new Component({
"X-Foo": "Bar Baz",
"Content-Type": "text/plain"
}, Buffer.from("Hello world!")),

// You can add nested multipart components
new Multipart([
new Component({"Content-Type": "application/json"}, Buffer.from(JSON.stringify({foo: "bar"}))),
new Component({}, [0x66, 0x6f, 0x6f, 0x20, 0x62, 0x61, 0x72])
])
],
"your-custom-boundary", // or omit to generate a random one
"multipart/mixed"
);
// use the content-type header generated by the multipart
res.setHeader("Content-Type", multipart.headers.get("Content-Type")!);
// send the multipart body bytes
res.end(multipart.body);
}
else res.end();
}).listen(3000);
import {Multipart, Component} from "multipart-ts";

//create
const multipart = new Multipart(
[new Component({"Content-Type": "text/plain"}, new TextEncoder().encode("Hello world!"))],
"your-custom-boundary", // or omit to generate a random one
"multipart/mixed"
);

// parse
const data: Uint8Array = multipart.bytes();
const parsed: Multipart = Multipart.parse(data);

console.log(new TextDecoder().decode(parsed.parts[0].body)); // Hello world!