UNPKG

@strapi/data-transfer

Version:

Data transfer capabilities for Strapi

1 lines 5.57 kB
{"version":3,"file":"stream.mjs","sources":["../../src/utils/stream.ts"],"sourcesContent":["import { Transform, Readable } from 'stream';\n\ntype TransformOptions = ConstructorParameters<typeof Transform>[0];\n\n/**\n * Create a filter stream that discard chunks which doesn't satisfies the given predicate\n *\n * @param predicate - A filter predicate, takes a stream data chunk as parameter and returns a boolean value\n * @param options - Transform stream options\n */\nexport const filter = <T>(\n predicate: (value: T) => boolean | Promise<boolean>,\n options: TransformOptions = { objectMode: true }\n): Transform => {\n return new Transform({\n ...options,\n\n async transform(chunk, _encoding, callback) {\n const keep = await predicate(chunk);\n\n callback(null, keep ? chunk : undefined);\n },\n });\n};\n\n/**\n * Create a map stream that transform chunks using the given predicate\n *\n * @param predicate - A map predicate, takes a stream data chunk as parameter and returns a mapped value\n * @param options - Transform stream options\n */\nexport const map = <T, U = T>(\n predicate: (value: T) => U | Promise<U>,\n options: TransformOptions = { objectMode: true }\n): Transform => {\n return new Transform({\n ...options,\n\n async transform(chunk, _encoding, callback) {\n const mappedValue = await predicate(chunk);\n\n callback(null, mappedValue);\n },\n });\n};\n\n/**\n * Collect every chunks from a Readable stream.\n *\n * @param stream - The redable stream to collect data from\n * @param options.destroy - If set to true, it automatically calls `destroy()` on the given stream upon receiving the 'end' event\n */\nexport const collect = <T = unknown>(\n stream: Readable,\n options: { destroy: boolean } = { destroy: true }\n): Promise<T[]> => {\n const chunks: T[] = [];\n\n return new Promise((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n stream.removeListener('data', onData);\n stream.removeListener('end', onEnd);\n stream.removeListener('close', onClose);\n stream.removeListener('error', onError);\n };\n\n const finishResolve = () => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(chunks);\n };\n\n const finishReject = (err: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(err);\n };\n\n const onData = (chunk: T) => {\n chunks.push(chunk);\n };\n\n const onEnd = () => {\n if (options.destroy) {\n stream.destroy();\n }\n finishResolve();\n };\n\n const onClose = () => {\n // Handles streams that emit `close` without `end` (e.g. `destroy()` in `_read`).\n finishResolve();\n };\n\n const onError = (err: Error) => {\n finishReject(err);\n };\n\n stream.on('data', onData);\n stream.on('end', onEnd);\n stream.on('close', onClose);\n stream.on('error', onError);\n });\n};\n"],"names":["filter","predicate","options","objectMode","Transform","transform","chunk","_encoding","callback","keep","undefined","map","mappedValue","collect","stream","destroy","chunks","Promise","resolve","reject","settled","cleanup","removeListener","onData","onEnd","onClose","onError","finishResolve","finishReject","err","push","on"],"mappings":"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"}