@whatwg-node/node-fetch
Version:
Fetch API implementation for Node
76 lines (75 loc) • 2.59 kB
JavaScript
import { Transform } from 'node:stream';
import { PonyfillReadableStream } from './ReadableStream.js';
import { endStream } from './utils.js';
import { PonyfillWritableStream } from './WritableStream.js';
export class PonyfillTransformStream {
transform;
writable;
readable;
constructor(transformer) {
if (transformer instanceof Transform) {
this.transform = transformer;
}
else if (transformer) {
const controller = {
enqueue(chunk) {
transform.push(chunk);
},
error(reason) {
transform.destroy(reason);
},
terminate() {
endStream(transform);
},
get desiredSize() {
return transform.writableLength;
},
};
const transform = new Transform({
read() { },
write(chunk, _encoding, callback) {
try {
const result = transformer.transform?.(chunk, controller);
if (result instanceof Promise) {
result.then(() => {
callback();
}, err => {
callback(err);
});
}
else {
callback();
}
}
catch (err) {
callback(err);
}
},
final(callback) {
try {
const result = transformer.flush?.(controller);
if (result instanceof Promise) {
result.then(() => {
callback();
}, err => {
callback(err);
});
}
else {
callback();
}
}
catch (err) {
callback(err);
}
},
});
this.transform = transform;
}
else {
this.transform = new Transform();
}
this.writable = new PonyfillWritableStream(this.transform);
this.readable = new PonyfillReadableStream(this.transform);
}
}