You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
1.7 KiB
JavaScript

"use strict";
const debug = require("debug")("promistream:from-node-stream:readable");
const attachHandlers = require("./attach-handlers");
const createPushBuffer = require("./push-buffer");
const destroyStream = require("../destroy-stream");
const assertErrorType = require("../assert-error-type");
module.exports = function wireUpReadableInterface(stream, { onEnd, onError } = {}) {
let pushBuffer = createPushBuffer({
onPause: function () {
if (stream.pause != null) {
debug("Pausing underlying stream");
stream.pause();
return true; // FIXME: Can we verify whether the pausing was successful, somehow? Eg. to deal with streams with `readable` event handlers attached.
} else {
return false;
}
},
onResume: function () {
if (stream.resume != null) {
debug("Resuming underlying stream");
stream.resume();
return true;
} else {
throw new Error(`Stream was successfully paused but does not have a resume method. This should never happen!`);
}
}
});
// TODO: Verify that auto-detaching all event handlers upon end/error is actually the correct thing to do!
attachHandlers({
stream: stream,
onData: (data) => {
if (Buffer.isBuffer(data)) {
debug(`Chunk emitted of length ${data.length}`);
} else {
debug(`Value emitted`);
}
pushBuffer.queueValue(data);
},
onError: (error) => {
assertErrorType(error);
pushBuffer.queueError(error);
if (onError != null) {
onError(error);
}
},
onClose: () => {
pushBuffer.markEnded();
if (onEnd != null) {
onEnd();
}
}
});
return {
request: pushBuffer.queueRequest,
consumeImmediateBuffer: pushBuffer.consumeImmediateBuffer,
destroy: () => {
return destroyStream(stream);
}
};
};