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 ​