const partials = [ [0b110, 5, 0], [0b1110, 4, 1], [0b11110, 3, 2], ] export class UTF8Splitter { private internal = Buffer.alloc(0) write (data: Buffer): Buffer { this.internal = Buffer.concat([this.internal, data]) let keep = 0 for (const [pattern, shift, maxOffset] of partials) { for (let offset = 0; offset < maxOffset + 1; offset++) { if (this.internal[this.internal.length - offset - 1] >> shift === pattern) { keep = Math.max(keep, offset + 1) } } } const result = this.internal.slice(0, this.internal.length - keep) this.internal = this.internal.slice(this.internal.length - keep) return result } flush (): Buffer { const result = this.internal this.internal = Buffer.alloc(0) return result } }