2021-07-10 20:56:56 -07:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const {
|
|
|
|
ObjectDefineProperties,
|
2023-11-13 13:47:46 +01:00
|
|
|
SymbolToStringTag,
|
2021-07-10 20:56:56 -07:00
|
|
|
} = primordials;
|
|
|
|
|
|
|
|
const {
|
|
|
|
newReadableWritablePairFromDuplex,
|
|
|
|
} = require('internal/webstreams/adapters');
|
|
|
|
|
2022-02-11 18:30:47 +01:00
|
|
|
const { customInspect } = require('internal/webstreams/util');
|
2021-07-10 20:56:56 -07:00
|
|
|
|
|
|
|
const {
|
|
|
|
customInspectSymbol: kInspect,
|
2022-02-11 18:30:47 +01:00
|
|
|
kEnumerableProperty,
|
2021-07-10 20:56:56 -07:00
|
|
|
} = require('internal/util');
|
|
|
|
|
2023-11-09 12:09:17 +01:00
|
|
|
const { createEnumConverter } = require('internal/webidl');
|
|
|
|
|
2021-07-10 20:56:56 -07:00
|
|
|
let zlib;
|
|
|
|
function lazyZlib() {
|
|
|
|
zlib ??= require('zlib');
|
|
|
|
return zlib;
|
|
|
|
}
|
|
|
|
|
2023-11-09 12:09:17 +01:00
|
|
|
const formatConverter = createEnumConverter('CompressionFormat', [
|
|
|
|
'deflate',
|
|
|
|
'deflate-raw',
|
|
|
|
'gzip',
|
|
|
|
]);
|
|
|
|
|
2021-07-10 20:56:56 -07:00
|
|
|
/**
|
|
|
|
* @typedef {import('./readablestream').ReadableStream} ReadableStream
|
|
|
|
* @typedef {import('./writablestream').WritableStream} WritableStream
|
|
|
|
*/
|
|
|
|
|
|
|
|
class CompressionStream {
|
2023-03-22 10:45:37 -04:00
|
|
|
#handle;
|
|
|
|
#transform;
|
|
|
|
|
2021-07-10 20:56:56 -07:00
|
|
|
/**
|
2023-11-09 12:18:57 +01:00
|
|
|
* @param {'deflate'|'deflate-raw'|'gzip'} format
|
2021-07-10 20:56:56 -07:00
|
|
|
*/
|
|
|
|
constructor(format) {
|
2023-11-09 12:09:17 +01:00
|
|
|
format = formatConverter(format, {
|
|
|
|
prefix: "Failed to construct 'CompressionStream'",
|
|
|
|
context: '1st argument',
|
|
|
|
});
|
2021-07-10 20:56:56 -07:00
|
|
|
switch (format) {
|
|
|
|
case 'deflate':
|
2023-03-22 10:45:37 -04:00
|
|
|
this.#handle = lazyZlib().createDeflate();
|
2021-07-10 20:56:56 -07:00
|
|
|
break;
|
2023-11-09 12:18:57 +01:00
|
|
|
case 'deflate-raw':
|
|
|
|
this.#handle = lazyZlib().createDeflateRaw();
|
|
|
|
break;
|
2021-07-10 20:56:56 -07:00
|
|
|
case 'gzip':
|
2023-03-22 10:45:37 -04:00
|
|
|
this.#handle = lazyZlib().createGzip();
|
2021-07-10 20:56:56 -07:00
|
|
|
break;
|
|
|
|
}
|
2023-03-22 10:45:37 -04:00
|
|
|
this.#transform = newReadableWritablePairFromDuplex(this.#handle);
|
2021-07-10 20:56:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @readonly
|
|
|
|
* @type {ReadableStream}
|
|
|
|
*/
|
|
|
|
get readable() {
|
2023-03-22 10:45:37 -04:00
|
|
|
return this.#transform.readable;
|
2021-07-10 20:56:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @readonly
|
|
|
|
* @type {WritableStream}
|
|
|
|
*/
|
|
|
|
get writable() {
|
2023-03-22 10:45:37 -04:00
|
|
|
return this.#transform.writable;
|
2021-07-10 20:56:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
[kInspect](depth, options) {
|
2024-05-12 10:38:40 +03:00
|
|
|
return customInspect(depth, options, 'CompressionStream', {
|
2023-03-22 10:45:37 -04:00
|
|
|
readable: this.#transform.readable,
|
|
|
|
writable: this.#transform.writable,
|
2021-07-10 20:56:56 -07:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
class DecompressionStream {
|
2023-03-22 10:45:37 -04:00
|
|
|
#handle;
|
|
|
|
#transform;
|
|
|
|
|
2021-07-10 20:56:56 -07:00
|
|
|
/**
|
2023-11-09 12:18:57 +01:00
|
|
|
* @param {'deflate'|'deflate-raw'|'gzip'} format
|
2021-07-10 20:56:56 -07:00
|
|
|
*/
|
|
|
|
constructor(format) {
|
2023-11-09 12:09:17 +01:00
|
|
|
format = formatConverter(format, {
|
|
|
|
prefix: "Failed to construct 'DecompressionStream'",
|
|
|
|
context: '1st argument',
|
|
|
|
});
|
2021-07-10 20:56:56 -07:00
|
|
|
switch (format) {
|
|
|
|
case 'deflate':
|
2025-05-26 06:08:39 +05:30
|
|
|
this.#handle = lazyZlib().createInflate({
|
|
|
|
rejectGarbageAfterEnd: true,
|
|
|
|
});
|
2021-07-10 20:56:56 -07:00
|
|
|
break;
|
2023-11-09 12:18:57 +01:00
|
|
|
case 'deflate-raw':
|
|
|
|
this.#handle = lazyZlib().createInflateRaw();
|
|
|
|
break;
|
2021-07-10 20:56:56 -07:00
|
|
|
case 'gzip':
|
2025-05-26 06:08:39 +05:30
|
|
|
this.#handle = lazyZlib().createGunzip({
|
|
|
|
rejectGarbageAfterEnd: true,
|
|
|
|
});
|
2021-07-10 20:56:56 -07:00
|
|
|
break;
|
|
|
|
}
|
2023-03-22 10:45:37 -04:00
|
|
|
this.#transform = newReadableWritablePairFromDuplex(this.#handle);
|
2025-05-26 06:08:39 +05:30
|
|
|
|
|
|
|
this.#handle.on('error', (err) => {
|
|
|
|
if (this.#transform?.writable &&
|
|
|
|
!this.#transform.writable.locked &&
|
|
|
|
typeof this.#transform.writable.abort === 'function') {
|
|
|
|
this.#transform.writable.abort(err);
|
|
|
|
}
|
|
|
|
});
|
2021-07-10 20:56:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @readonly
|
|
|
|
* @type {ReadableStream}
|
|
|
|
*/
|
|
|
|
get readable() {
|
2023-03-22 10:45:37 -04:00
|
|
|
return this.#transform.readable;
|
2021-07-10 20:56:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @readonly
|
|
|
|
* @type {WritableStream}
|
|
|
|
*/
|
|
|
|
get writable() {
|
2023-03-22 10:45:37 -04:00
|
|
|
return this.#transform.writable;
|
2021-07-10 20:56:56 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
[kInspect](depth, options) {
|
2024-05-12 10:38:40 +03:00
|
|
|
return customInspect(depth, options, 'DecompressionStream', {
|
2023-03-22 10:45:37 -04:00
|
|
|
readable: this.#transform.readable,
|
|
|
|
writable: this.#transform.writable,
|
2021-07-10 20:56:56 -07:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ObjectDefineProperties(CompressionStream.prototype, {
|
|
|
|
readable: kEnumerableProperty,
|
|
|
|
writable: kEnumerableProperty,
|
2023-11-13 13:47:46 +01:00
|
|
|
[SymbolToStringTag]: {
|
|
|
|
__proto__: null,
|
|
|
|
configurable: true,
|
|
|
|
value: 'CompressionStream',
|
|
|
|
},
|
2021-07-10 20:56:56 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
ObjectDefineProperties(DecompressionStream.prototype, {
|
|
|
|
readable: kEnumerableProperty,
|
|
|
|
writable: kEnumerableProperty,
|
2023-11-13 13:47:46 +01:00
|
|
|
[SymbolToStringTag]: {
|
|
|
|
__proto__: null,
|
|
|
|
configurable: true,
|
|
|
|
value: 'DecompressionStream',
|
|
|
|
},
|
2021-07-10 20:56:56 -07:00
|
|
|
});
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
CompressionStream,
|
|
|
|
DecompressionStream,
|
|
|
|
};
|