tus-js-client-stall-detection
Version:
A pure JavaScript client for the tus resumable upload protocol (fork with stall detection)
58 lines (50 loc) • 1.99 kB
text/typescript
import type { FileSource, UploadInput } from './options.js'
import { ArrayBufferViewFileSource } from './sources/ArrayBufferViewFileSource.js'
import { BlobFileSource } from './sources/BlobFileSource.js'
import { WebStreamFileSource } from './sources/WebStreamFileSource.js'
/**
* openFile provides FileSources for input types that have to be handled in all environments,
* including Node.js and browsers.
*/
export function openFile(input: UploadInput, chunkSize: number): FileSource | null {
// File is a subtype of Blob, so we only check for Blob here.
// Note: We could turn Blobs into ArrayBuffers using `input.arrayBuffer()` and then
// pass it to the ArrayBufferFileSource. However, in browsers, a File instance can
// represent a file on disk. By keeping it a File instance and passing it to XHR/Fetch,
// we can avoid reading the entire file into memory.
if (input instanceof Blob) {
return new BlobFileSource(input)
}
// ArrayBufferViews can be TypedArray (e.g. Uint8Array) or DataView instances.
// Note that Node.js' Buffers are also Uint8Arrays.
if (ArrayBuffer.isView(input)) {
return new ArrayBufferViewFileSource(input)
}
// SharedArrayBuffer is not available in all browser context for security reasons.
// Hence we check if the constructor exists at all.
if (
input instanceof ArrayBuffer ||
(typeof SharedArrayBuffer !== 'undefined' && input instanceof SharedArrayBuffer)
) {
const view = new DataView(input)
return new ArrayBufferViewFileSource(view)
}
if (input instanceof ReadableStream) {
chunkSize = Number(chunkSize)
if (!Number.isFinite(chunkSize)) {
throw new Error(
'cannot create source for stream without a finite value for the `chunkSize` option',
)
}
return new WebStreamFileSource(input)
}
return null
}
export const supportedTypes = [
'File',
'Blob',
'ArrayBuffer',
'SharedArrayBuffer',
'ArrayBufferView',
'ReadableStream (Web Streams)',
]