UNPKG

@zazuko/trifid-plugin-sparql-proxy

Version:

Trifid plugin for sparql-proxy

38 lines (37 loc) 1.48 kB
import { Transform } from 'node:stream'; class ReplaceStream extends Transform { searchStr; replaceStr; tailPiece; searchStrLen; constructor(searchStr, replaceStr, options = {}) { super(options); this.searchStr = searchStr; this.replaceStr = replaceStr; this.tailPiece = ''; // Holds trailing data from previous chunk this.searchStrLen = searchStr.length; } _transform(chunk, _encoding, callback) { const data = this.tailPiece + chunk.toString(); // Combine previous tail with new chunk let lastIndex = 0; let index; const pieces = []; // Search for occurrences of searchStr while ((index = data.indexOf(this.searchStr, lastIndex)) !== -1) { pieces.push(data.slice(lastIndex, index)); // Push the data before the match pieces.push(this.replaceStr); // Push the replacement string lastIndex = index + this.searchStrLen; // Move the index past the match } // Save the remaining data after the last match as tailPiece this.tailPiece = data.slice(lastIndex); // Push the processed data this.push(pieces.join('')); callback(); } _flush(callback) { // Push out any remaining data in tailPiece, processing any matches in it this.push(this.tailPiece.replace(new RegExp(this.searchStr, 'g'), this.replaceStr)); callback(); } } export default ReplaceStream;