52 lines
1.6 KiB
JavaScript
52 lines
1.6 KiB
JavaScript
|
/* c8 ignore start */
|
||
|
// 64 KiB (same size chrome slice theirs blob into Uint8array's)
|
||
|
const POOL_SIZE = 65536
|
||
|
|
||
|
if (!globalThis.ReadableStream) {
|
||
|
// `node:stream/web` got introduced in v16.5.0 as experimental
|
||
|
// and it's preferred over the polyfilled version. So we also
|
||
|
// suppress the warning that gets emitted by NodeJS for using it.
|
||
|
try {
|
||
|
const process = require('node:process')
|
||
|
const { emitWarning } = process
|
||
|
try {
|
||
|
process.emitWarning = () => {}
|
||
|
Object.assign(globalThis, require('node:stream/web'))
|
||
|
process.emitWarning = emitWarning
|
||
|
} catch (error) {
|
||
|
process.emitWarning = emitWarning
|
||
|
throw error
|
||
|
}
|
||
|
} catch (error) {
|
||
|
// fallback to polyfill implementation
|
||
|
Object.assign(globalThis, require('web-streams-polyfill/dist/ponyfill.es2018.js'))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
// Don't use node: prefix for this, require+node: is not supported until node v14.14
|
||
|
// Only `import()` can use prefix in 12.20 and later
|
||
|
const { Blob } = require('buffer')
|
||
|
if (Blob && !Blob.prototype.stream) {
|
||
|
Blob.prototype.stream = function name (params) {
|
||
|
let position = 0
|
||
|
const blob = this
|
||
|
|
||
|
return new ReadableStream({
|
||
|
type: 'bytes',
|
||
|
async pull (ctrl) {
|
||
|
const chunk = blob.slice(position, Math.min(blob.size, position + POOL_SIZE))
|
||
|
const buffer = await chunk.arrayBuffer()
|
||
|
position += buffer.byteLength
|
||
|
ctrl.enqueue(new Uint8Array(buffer))
|
||
|
|
||
|
if (position === blob.size) {
|
||
|
ctrl.close()
|
||
|
}
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
} catch (error) {}
|
||
|
/* c8 ignore end */
|