diff options
Diffstat (limited to 'js/text_encoding.ts')
-rw-r--r-- | js/text_encoding.ts | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/js/text_encoding.ts b/js/text_encoding.ts index 03cc966b1..025a17f4f 100644 --- a/js/text_encoding.ts +++ b/js/text_encoding.ts @@ -461,6 +461,11 @@ export class TextDecoder { } } +interface TextEncoderEncodeIntoResult { + read: number; + written: number; +} + export class TextEncoder { /** Returns "utf-8". */ readonly encoding = "utf-8"; @@ -484,6 +489,36 @@ export class TextEncoder { return new Uint8Array(output); } + encodeInto(input: string, dest: Uint8Array): TextEncoderEncodeIntoResult { + const encoder = new UTF8Encoder(); + const inputStream = new Stream(stringToCodePoints(input)); + + let written = 0; + let read = 0; + while (true) { + const result = encoder.handler(inputStream.read()); + if (result === FINISHED) { + break; + } + read++; + if (Array.isArray(result)) { + dest.set(result, written); + written += result.length; + if (result.length > 3) { + // increment read a second time if greater than U+FFFF + read++; + } + } else { + dest[written] = result; + written++; + } + } + + return { + read, + written + }; + } get [Symbol.toStringTag](): string { return "TextEncoder"; } |