@whatwg-node/node-fetch
Version:
Fetch API implementation for Node
116 lines (115 loc) • 4.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PonyfillWritableStream = void 0;
const node_events_1 = require("node:events");
const node_stream_1 = require("node:stream");
const promise_helpers_1 = require("@whatwg-node/promise-helpers");
const utils_js_1 = require("./utils.js");
class PonyfillWritableStream {
writable;
constructor(underlyingSink) {
if (underlyingSink instanceof node_stream_1.Writable) {
this.writable = underlyingSink;
}
else if (underlyingSink) {
const writable = new node_stream_1.Writable({
write(chunk, _encoding, callback) {
try {
const result = underlyingSink.write?.(chunk, controller);
if (result instanceof Promise) {
result.then(() => {
callback();
}, err => {
callback(err);
});
}
else {
callback();
}
}
catch (err) {
callback(err);
}
},
final(callback) {
const result = underlyingSink.close?.();
if (result instanceof Promise) {
result.then(() => {
callback();
}, err => {
callback(err);
});
}
else {
callback();
}
},
});
this.writable = writable;
const abortCtrl = new AbortController();
const controller = {
signal: abortCtrl.signal,
error(e) {
writable.destroy(e);
},
};
writable.once('error', err => abortCtrl.abort(err));
writable.once('close', () => abortCtrl.abort());
}
else {
this.writable = new node_stream_1.Writable();
}
}
getWriter() {
const writable = this.writable;
return {
get closed() {
return (0, node_events_1.once)(writable, 'close');
},
get desiredSize() {
return writable.writableLength;
},
get ready() {
return (0, node_events_1.once)(writable, 'drain');
},
releaseLock() {
// no-op
},
write(chunk) {
const promise = (0, utils_js_1.fakePromise)();
if (chunk == null) {
return promise;
}
return promise.then(() => (0, utils_js_1.safeWrite)(chunk, writable));
},
close() {
if (!writable.errored && writable.closed) {
return (0, utils_js_1.fakePromise)();
}
if (writable.errored) {
return (0, promise_helpers_1.fakeRejectPromise)(writable.errored);
}
return (0, utils_js_1.fakePromise)().then(() => (0, utils_js_1.endStream)(writable));
},
abort(reason) {
writable.destroy(reason);
return (0, node_events_1.once)(writable, 'close');
},
};
}
close() {
if (!this.writable.errored && this.writable.closed) {
return (0, utils_js_1.fakePromise)();
}
if (this.writable.errored) {
return (0, promise_helpers_1.fakeRejectPromise)(this.writable.errored);
}
return (0, utils_js_1.fakePromise)().then(() => (0, utils_js_1.endStream)(this.writable));
}
abort(reason) {
this.writable.destroy(reason);
return (0, node_events_1.once)(this.writable, 'close');
}
locked = false;
}
exports.PonyfillWritableStream = PonyfillWritableStream;