116 lines
4.1 KiB
JavaScript
116 lines
4.1 KiB
JavaScript
"use strict";
|
|
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;
|