mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-17 08:50:15 +01:00
* build/refactor: move lint/prettier packages to project root, install husky, add pre-commit hook * refactor: reformat files * build: put full eslintrc back with all rules
59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
JavaScript
const { Readable } = require('stream');
|
|
|
|
class TextStream extends Readable {
|
|
constructor(text, options = {}) {
|
|
super(options);
|
|
this.text = text;
|
|
this.currentIndex = 0;
|
|
this.delay = options.delay || 20; // Time in milliseconds
|
|
}
|
|
|
|
_read() {
|
|
const minChunkSize = 2;
|
|
const maxChunkSize = 4;
|
|
const { delay } = this;
|
|
|
|
if (this.currentIndex < this.text.length) {
|
|
setTimeout(() => {
|
|
const remainingChars = this.text.length - this.currentIndex;
|
|
const chunkSize = Math.min(this.randomInt(minChunkSize, maxChunkSize + 1), remainingChars);
|
|
|
|
const chunk = this.text.slice(this.currentIndex, this.currentIndex + chunkSize);
|
|
this.push(chunk);
|
|
this.currentIndex += chunkSize;
|
|
}, delay);
|
|
} else {
|
|
this.push(null); // signal end of data
|
|
}
|
|
}
|
|
|
|
randomInt(min, max) {
|
|
return Math.floor(Math.random() * (max - min)) + min;
|
|
}
|
|
|
|
async processTextStream(onProgressCallback) {
|
|
const streamPromise = new Promise((resolve, reject) => {
|
|
this.on('data', (chunk) => {
|
|
onProgressCallback(chunk.toString());
|
|
});
|
|
|
|
this.on('end', () => {
|
|
console.log('Stream ended');
|
|
resolve();
|
|
});
|
|
|
|
this.on('error', (err) => {
|
|
reject(err);
|
|
});
|
|
});
|
|
|
|
try {
|
|
await streamPromise;
|
|
} catch (err) {
|
|
console.error('Error processing text stream:', err);
|
|
// Handle the error appropriately, e.g., return an error message or throw an error
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = TextStream;
|