rdf-dataset-fragmenter
Version:
Fragments an RDF dataset into multiple parts
67 lines • 2.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.QuadTransformStream = void 0;
const node_stream_1 = require("node:stream");
/**
* A transform stream that runs quads through an array of transformers.
*/
class QuadTransformStream extends node_stream_1.Transform {
transformers;
transformCallback;
constructor(transformers, callback) {
super({ objectMode: true });
this.transformers = transformers;
this.transformCallback = callback;
}
runTransformers(quad) {
let quads = [quad];
for (const transformer of this.transformers) {
const newQuads = [];
for (const quadIn of quads) {
for (const quadOut of transformer.transform(quadIn)) {
newQuads.push(quadOut);
}
}
quads = newQuads;
}
return quads;
}
// eslint-disable-next-line ts/naming-convention
_transform(quad, encoding, callback) {
const transformedQuads = this.runTransformers(quad);
// If we have a transformCallback, we need to gather the
// promises run them and only indicate we're done
// with the _transform call after they resolve
if (this.transformCallback) {
const promises = this.transformCallback.map(cb => cb.run(quad, transformedQuads));
Promise.all(promises)
.then(() => {
for (const transformedQuad of transformedQuads) {
this.push(transformedQuad);
}
callback();
})
.catch((error) => {
const err = error instanceof Error ? error : new Error(String(error));
callback(err);
});
}
else {
for (const transformedQuad of transformedQuads) {
this.push(transformedQuad);
}
callback();
}
}
// eslint-disable-next-line ts/naming-convention
_flush(callback) {
for (const transformer of this.transformers) {
if (transformer.end) {
transformer.end();
}
}
callback();
}
}
exports.QuadTransformStream = QuadTransformStream;
//# sourceMappingURL=QuadTransformStream.js.map