Skip to content

Client API

Complete API reference for the Torrin client library.

createTorrinClient(options)

Creates a new Torrin client instance.

typescript
import { createTorrinClient } from '@torrin-kit/client';

const torrin = createTorrinClient({
  endpoint: 'http://localhost:3000/api/uploads',
  defaultChunkSize: 5 * 1024 * 1024,
  maxConcurrency: 3,
  retryAttempts: 5,
  retryDelay: 1000,
  headers: async () => ({
    Authorization: `Bearer ${await getToken()}`,
  }),
  resumeStore: createLocalStorageResumeStore(),
});

Options

OptionTypeRequiredDefaultDescription
endpointstringYes-Server endpoint URL for upload operations
defaultChunkSizenumberNo1048576 (1MB)Default chunk size in bytes
maxConcurrencynumberNo3Maximum concurrent chunk uploads
retryAttemptsnumberNo3Number of retries for failed chunks
retryDelaynumberNo1000Initial delay in ms for retry (exponential backoff)
headers() => Record<string, string> | Promise<Record<string, string>>No-Function returning custom headers for authentication
resumeStoreTorrinResumeStoreNo-Resume store for persistence (e.g., localStorage)

Returns

TorrinClient instance

TorrinClient

createUpload(options)

Creates a new upload instance for a file.

typescript
const upload = torrin.createUpload({
  file: myFile,
  chunkSize: 10 * 1024 * 1024,
  metadata: {
    userId: '123',
    projectId: 'abc',
  },
});

Options

OptionTypeRequiredDescription
fileFile | BlobYes*File or Blob to upload (browser)
bufferArrayBuffer | Uint8ArrayYes*Buffer to upload (Node.js)
fileNamestringNoFile name (required if using buffer)
fileSizenumberNoFile size in bytes (required if using buffer)
mimeTypestringNoMIME type of the file
chunkSizenumberNoOverride default chunk size for this upload
metadataRecord<string, any>NoCustom metadata to send to server
uploadIdstringNoExisting uploadId to resume

*Either file or buffer is required

Returns

TorrinUpload instance

TorrinUpload

Upload instance with methods for control and event listening.

Properties

PropertyTypeDescription
uploadIdstring | nullUpload ID from server (null until initialized)
statusUploadClientStatusCurrent upload status

Methods

start(): Promise<TorrinCompleteResult>

Starts or resumes the upload.

typescript
const result = await upload.start();
console.log('Uploaded to:', result.location);

Returns: Promise resolving to TorrinCompleteResult

Throws: TorrinError if upload fails


pause(): void

Pauses the upload. Can be resumed later with resume() or start().

typescript
upload.pause();

resume(): void

Resumes a paused upload.

typescript
upload.resume();

cancel(): Promise<void>

Cancels the upload and notifies the server to clean up.

typescript
await upload.cancel();

Returns: Promise that resolves when cancellation is complete


on(event, handler): this

Registers an event listener.

typescript
upload.on('progress', (progress) => {
  console.log(`${progress.percentage}%`);
});

upload.on('status', (status) => {
  console.log('Status:', status);
});

upload.on('error', (error) => {
  console.error('Error:', error);
});

Parameters:

  • event: Event name ('progress', 'status', or 'error')
  • handler: Event handler function

Returns: Upload instance (for chaining)


off(event, handler): this

Removes an event listener.

typescript
const handler = (p) => console.log(p.percentage);
upload.on('progress', handler);
upload.off('progress', handler);

Parameters:

  • event: Event name
  • handler: Handler function to remove

Returns: Upload instance (for chaining)

Events

progress

Emitted during upload with progress information.

typescript
upload.on('progress', (progress: TorrinProgress) => {
  console.log(`${progress.percentage}% complete`);
  console.log(`${progress.chunksCompleted}/${progress.totalChunks} chunks`);
  console.log(`${progress.bytesUploaded}/${progress.totalBytes} bytes`);
});

Payload: TorrinProgress

FieldTypeDescription
uploadIdstringUpload ID
percentagenumberProgress percentage (0-100)
bytesUploadednumberBytes uploaded so far
totalBytesnumberTotal file size in bytes
chunksCompletednumberNumber of chunks successfully uploaded
totalChunksnumberTotal number of chunks
chunkIndexnumber (optional)Current chunk being uploaded

status

Emitted when upload status changes.

typescript
upload.on('status', (status: UploadClientStatus) => {
  console.log('Status changed to:', status);
});

Payload: UploadClientStatus

Possible values:

  • 'idle' - Upload not started
  • 'initializing' - Initializing upload session with server
  • 'uploading' - Actively uploading chunks
  • 'paused' - Upload paused by user
  • 'completing' - Finalizing upload on server
  • 'completed' - Upload finished successfully
  • 'failed' - Upload failed
  • 'canceled' - Upload canceled by user

error

Emitted when an error occurs.

typescript
upload.on('error', (error: TorrinError) => {
  console.error(`Error [${error.code}]:`, error.message);
  console.error('Details:', error.details);
});

Payload: TorrinError

FieldTypeDescription
messagestringError message
codeTorrinErrorCodeError code (e.g., 'NETWORK_ERROR')
statusCodenumberHTTP status code
detailsRecord<string, any> (optional)Additional error details

Types

TorrinCompleteResult

Result returned when upload completes successfully.

typescript
interface TorrinCompleteResult {
  uploadId: string;
  status: 'completed';
  location: TorrinStorageLocation;
  metadata?: Record<string, any>;
}

TorrinStorageLocation

Information about where the file was stored.

typescript
interface TorrinStorageLocation {
  type: string; // 'local', 's3', etc.
  path?: string; // For local storage
  bucket?: string; // For S3
  key?: string; // For S3
  url?: string; // Public URL if available
  [key: string]: any; // Custom fields
}

Resume Stores

createLocalStorageResumeStore()

Creates a resume store using browser localStorage.

typescript
import { createLocalStorageResumeStore } from '@torrin-kit/client';

const resumeStore = createLocalStorageResumeStore();

createInMemoryResumeStore()

Creates an in-memory resume store (for testing).

typescript
import { createInMemoryResumeStore } from '@torrin-kit/client';

const resumeStore = createInMemoryResumeStore();

Custom Resume Store

Implement TorrinResumeStore interface:

typescript
interface TorrinResumeStore {
  save(uploadId: string, state: TorrinUploadState): Promise<void> | void;
  load(uploadId: string): Promise<TorrinUploadState | null> | TorrinUploadState | null;
  remove(uploadId: string): Promise<void> | void;
  findByFile?(fileKey: string): Promise<TorrinUploadState | null> | TorrinUploadState | null;
  saveFileKey?(fileKey: string, uploadId: string): Promise<void> | void;
  removeFileKey?(fileKey: string): Promise<void> | void;
}

Examples

Basic Upload

typescript
const torrin = createTorrinClient({
  endpoint: '/api/uploads',
});

const upload = torrin.createUpload({ file: myFile });

upload.on('progress', (p) => {
  console.log(`${p.percentage}%`);
});

const result = await upload.start();
console.log('Done:', result.location);

With Authentication

typescript
const torrin = createTorrinClient({
  endpoint: '/api/uploads',
  headers: async () => {
    const token = await getAccessToken();
    return { Authorization: `Bearer ${token}` };
  },
});

With Resume Support

typescript
const torrin = createTorrinClient({
  endpoint: '/api/uploads',
  resumeStore: createLocalStorageResumeStore(),
});

// Upload automatically resumes if interrupted
const upload = torrin.createUpload({ file: myFile });
await upload.start();

Pause/Resume/Cancel

typescript
const upload = torrin.createUpload({ file: myFile });

upload.start();

// Later...
upload.pause();
upload.resume();
await upload.cancel();

Next Steps