mindee
Version:
Mindee Client Library for Node.js
56 lines (55 loc) • 2.02 kB
JavaScript
import { LocalInputSource } from "./localInputSource.js";
import { INPUT_TYPE_STREAM } from "./inputSource.js";
import { logger } from "../logger.js";
import { MindeeInputSourceError } from "../errors/index.js";
export class StreamInput extends LocalInputSource {
constructor({ inputStream, filename }) {
super({
inputType: INPUT_TYPE_STREAM,
});
this.fileObject = Buffer.alloc(0);
this.filename = filename;
this.inputStream = inputStream;
}
async init() {
if (this.initialized) {
return;
}
logger.debug("Loading from stream");
this.fileObject = await this.stream2buffer(this.inputStream);
this.mimeType = await this.checkMimetype();
this.initialized = true;
}
async stream2buffer(stream, signal) {
return new Promise((resolve, reject) => {
if (stream.closed || stream.destroyed) {
return reject(new MindeeInputSourceError("Stream is already closed"));
}
if (signal?.aborted) {
return reject(new MindeeInputSourceError("Operation aborted"));
}
const onAbort = () => {
stream.destroy();
reject(new MindeeInputSourceError("Operation aborted"));
};
if (signal) {
signal.addEventListener("abort", onAbort, { once: true });
}
const cleanup = () => {
signal?.removeEventListener("abort", onAbort);
};
const _buf = [];
stream.pause();
stream.on("data", (chunk) => _buf.push(chunk));
stream.on("end", () => {
cleanup();
resolve(Buffer.concat(_buf));
});
stream.on("error", (err) => {
cleanup();
reject(new MindeeInputSourceError(`Error converting stream - ${err}`));
});
stream.resume();
});
}
}