Skip to content

zefir-git/Multipart.ts

Folders and files

NameName
Last commit message
Last commit date
May 5, 2025
Aug 4, 2024
Feb 9, 2025
Dec 20, 2024
Aug 4, 2024
Aug 4, 2024
May 2, 2025
May 12, 2025
Mar 17, 2025
Aug 4, 2024
Aug 4, 2024

Repository files navigation

Multipart.ts

A TypeScript library for multipart data parsing and creation.

Documentation

Features

  • 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

Getting started

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.

Example

node:http

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);

Browser

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!

Licence

Copyright © 2024–2025 Zefir Kirilov.

This project is licensed under the GNU Lesser General Public License v3.0 (LGPL-3.0). A copy of the licence text is included in this repository. If not, see https://www.gnu.org/licenses/.