UNPKG

@remotion/media-parser

Version:

A pure JavaScript library for parsing video files

113 lines (110 loc) 3.16 kB
// src/writers/node.ts import fs from "node:fs"; // src/log.ts var logLevels = ["trace", "verbose", "info", "warn", "error"]; var getNumberForLogLevel = (level) => { return logLevels.indexOf(level); }; var isEqualOrBelowLogLevel = (currentLevel, level) => { return getNumberForLogLevel(currentLevel) <= getNumberForLogLevel(level); }; var Log = { trace: (logLevel, ...args) => { if (isEqualOrBelowLogLevel(logLevel, "trace")) { return console.log(...args); } }, verbose: (logLevel, ...args) => { if (isEqualOrBelowLogLevel(logLevel, "verbose")) { return console.log(...args); } }, info: (logLevel, ...args) => { if (isEqualOrBelowLogLevel(logLevel, "info")) { return console.log(...args); } }, warn: (logLevel, ...args) => { if (isEqualOrBelowLogLevel(logLevel, "warn")) { return console.warn(...args); } }, error: (...args) => { return console.error(...args); } }; // src/writers/node.ts var createContent = (filename) => { return async ({ logLevel }) => { let writPromise = Promise.resolve(); const remove = async () => { Log.verbose(logLevel, "Removing file", filename); await fs.promises.unlink(filename).catch(() => {}); }; await remove(); if (!fs.existsSync(filename)) { Log.verbose(logLevel, "Creating file", filename); fs.writeFileSync(filename, ""); } const writeStream = fs.openSync(filename, "w"); let written = 0; const write = async (data) => { await new Promise((resolve, reject) => { fs.write(writeStream, data, 0, data.length, undefined, (err) => { if (err) { reject(err); return; } Log.verbose(logLevel, "Wrote", data.length, "bytes to", filename); resolve(); }); }); written += data.byteLength; }; const updateDataAt = (position, data) => { return new Promise((resolve, reject) => { fs.write(writeStream, data, 0, data.length, position, (err) => { if (err) { reject(err); return; } Log.verbose(logLevel, "Wrote", data.length, "bytes to", filename, "at position", position); resolve(); }); }); }; const writer = { write: (arr) => { writPromise = writPromise.then(() => write(arr)); return writPromise; }, updateDataAt: (position, data) => { writPromise = writPromise.then(() => updateDataAt(position, data)); return writPromise; }, getWrittenByteCount: () => written, remove, finish: async () => { await writPromise; try { Log.verbose(logLevel, "Closing file", filename); fs.closeSync(writeStream); return Promise.resolve(); } catch (e) { return Promise.reject(e); } }, getBlob: async () => { const file = await fs.promises.readFile(filename); return new Blob([file]); } }; return writer; }; }; var nodeWriter = (path) => { return { createContent: createContent(path) }; }; export { nodeWriter };