Skip to content

Capability matrix

Every provider advertises its own CapabilitySet. The full programmatic matrix is exposed via getBuiltinCapabilityMatrix() and renders to Markdown via formatCapabilityMatrixMarkdown().

The table below is the canonical output of formatCapabilityMatrixMarkdown() so it never drifts from the live CapabilitySet values:

Providerliststatreadwriteresume↓resume↑server-side copy/movechecksumsauth
Local file system❌ / ❌-anonymous
In-memory (test fixture)❌ / ❌-anonymous
FTP❌ / ❌-anonymous, password
FTPS❌ / ❌-anonymous, password, client-certificate
SFTP❌ / ❌-password, keyboard-interactive, publickey
HTTP/HTTPS (read-only)❌ / ❌etaganonymous, password, token
WebDAV❌ / ❌etaganonymous, password, token
S3-compatible (multipart uploads, default)❌ / ❌etagpassword, token
S3-compatible (single-shot uploads)❌ / ❌etagpassword, token
Dropbox❌ / ❌dropbox-content-hashtoken, oauth
Google Drive❌ / ❌md5, sha256, crc32ctoken, oauth
OneDrive / SharePoint❌ / ❌sha1, sha256, quickxorhashtoken, oauth
Azure Blob Storage❌ / ❌md5token, oauth
Google Cloud Storage❌ / ❌md5, crc32ctoken, oauth

Notes:

  • resume↑ (resume upload) maps to provider-managed multipart / staged-block / resumable-session uploads. S3, Azure Blob, GCS, and OneDrive enable that path by default for payloads above their respective multipart.thresholdBytes (8 MiB for Azure/GCS/S3, 4 MiB for OneDrive); S3 and Azure additionally upload parts in parallel (partConcurrency: 4 by default). Dropbox and Google Drive also stream large payloads through chunked sessions by default (8 MiB threshold), but do not yet support resuming those sessions across attempts - hence their ❌. Pass multipart: { enabled: false } on any factory to force single-shot uploads.
  • A resume↓ source plus a resume↑ destination is what makes checkpointed resume possible: configure resume: { store } and interrupted transfers continue from the committed watermark across retries and process restarts.
  • server-side copy/move means the provider can perform the operation on the backend without streaming bytes through the client. No built-in provider implements this yet - the flags exist in the capability model, but every copy today streams through your machine via copyBetween(), which works across any provider pair. Backend fast paths (S3 CopyObject, WebDAV COPY/MOVE, OpenSSH’s copy-data SFTP extension, the cloud-drive copy endpoints) are on the roadmap; the column will flip to ✅ per provider as each lands.
  • checksums is the sourced checksum format(s) the provider can surface; the engine verifies whichever one the read side returns.

For a live, type-safe view at runtime:

import { getBuiltinCapabilityMatrix } from "@zero-transfer/sdk";
const matrix = getBuiltinCapabilityMatrix();
console.table(matrix);

Operations branch on capabilities at runtime - for example, the engine consults resumeDownload/resumeUpload before attempting ranged or multipart transfers, and resume-capable uploads switch on automatically above the provider’s multipart threshold. You don’t have to special-case providers in your own code.