tussle icon indicating copy to clipboard operation
tussle copied to clipboard

Tus daemon written in Typescript using a pluggable architecture

Tussle

Tussle is a mostly spec-compliant server implementation of the tus upload protocol.

CircleCI Coverage Status

Component based

Tussle is implemented as a collection of interchangeable modular components, allowing the developer to choose which services that they'd like to integrate with. At the center of a Tussle instance is the Tussle Core, which handles all communication between individual components.

Components

Middleware

Middleware components handle communication between clients and the Tussle instance.

  • middleware-koa - mount a Tussle server as a Koa route handler.
  • middleware-cloudflareworker - run Tussle server in a cloudflare worker.

State

Tracking state is tricky and often your options are limited by your deployment environment. Tussle state components are modeled after the Web Storage API

  • state-memory - simple in-memory store, works anywhere.
  • state-memory-ttl - in-memory store with TTL record expiration, works anywhere.
  • state-namespace - wrapper to add transparent key prefixing for other stores.
  • state-postgres - store upload state in a PostgreSQL database.
  • state-cloudflareworkerkv - store upload state in Cloudflare Workers KV.

Storage

Uploaded files have to be stored somewhere, that's the purpose of the storage components.

  • storage-b2 - Backblaze B2 cloud storage (supports large file upload)
  • storage-s3 - AWS S3 compatible cloud storage (supports large file upload)
  • storage-r2 - Cloudflare R2 cloud storage (supports large file upload, ^0.4.0 adds parallel support)

Request

The request component a responsible for creating outbound HTTP requests and -- when possible/appropriate -- transparently proxy upload payloads, which is determined by the storage component.

  • request-axios - Use Axios, suitable for node environments.
  • request-cloudflareworker - Use Cloudflare Worker's Fetch() (for use with middleware-cloudflareworker).

Support me

If you find this library useful, please consider buying me a coffee as a way of showing your support! "Buy Me A Coffee"