@hokuto/jam-node
Version:
JAM Node TS, guardians and utils
72 lines (71 loc) • 2.32 kB
JavaScript
import { createReadStream } from "fs";
import { Duplex } from "stream";
import StreamJson from "stream-json";
import { Blob as NodeFetchBlob } from "node-fetch";
import Asm from "stream-json/Assembler.js";
import { JsonStreamStringify } from "json-stream-stringify";
function bufferToStream(myBuffer) {
const tmp = new Duplex();
tmp.push(myBuffer);
tmp.push(null);
return tmp;
}
export function buildJson(readable) {
return new Promise((resolve, reject) => {
try {
const pipeline = readable().pipe(StreamJson.parser());
pipeline.on("error", (err) => {
reject(err);
});
const asm = Asm.connectTo(pipeline);
asm.on("done", (asm) => {
pipeline.end();
resolve(asm.current);
});
}
catch (e) {
reject(e);
}
});
}
export function streamToBlob(stream, mimeType) {
if (mimeType != null && typeof mimeType !== "string") {
throw new Error("Invalid mimetype, expected string.");
}
return new Promise((resolve, reject) => {
const chunks = [];
stream
.on("data", (chunk) => chunks.push(chunk))
.once("end", () => {
const blob = mimeType != null
? new NodeFetchBlob(chunks, { type: mimeType })
: new NodeFetchBlob(chunks);
resolve(blob);
})
.once("error", reject);
});
}
export function objectToBlob(obj, mimeType) {
if (mimeType != null && typeof mimeType !== "string") {
throw new Error("Invalid mimetype, expected string.");
}
return new Promise((resolve, reject) => {
const jsonStream = new JsonStreamStringify(obj);
const chunks = [];
jsonStream
.on("data", (chunk) => chunks.push(chunk))
.once("end", () => {
const blob = mimeType
? new NodeFetchBlob(chunks, { type: mimeType })
: new NodeFetchBlob(chunks);
resolve(blob);
})
.once("error", reject);
});
}
export function readJsonFile(filePath) {
return buildJson(() => createReadStream(filePath));
}
export function readJsonBuffer(buffer) {
return buildJson(() => bufferToStream(buffer));
}