UNPKG

mindee

Version:

Mindee Client Library for Node.js

56 lines (55 loc) 2.02 kB
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(); }); } }