| 1234567891011121314151617181920212223242526272829303132 |
- 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
- }
- }
|