mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-21 05:50:55 +08:00
- Extend native FFI with additional scalar widths and writable byte spans. - Compile stored text codecs and supported bundled module patterns without a JavaScript engine. - Document supported limits.
76 lines
3.2 KiB
TypeScript
76 lines
3.2 KiB
TypeScript
import { sharedEncoder, decodeShared } from "./shared.ts";
|
|
import { TextEncoder as UserEncoder } from "./user.ts";
|
|
|
|
class CodecOwner {
|
|
readonly encoder: TextEncoder = new TextEncoder();
|
|
readonly decoder: TextDecoder = new TextDecoder();
|
|
roundTrip(text: string): string {
|
|
return this.decoder.decode(this.encoder.encode(text));
|
|
}
|
|
}
|
|
|
|
function decodeWith(decoder: TextDecoder, bytes: Uint8Array): string {
|
|
return decoder.decode(bytes);
|
|
}
|
|
|
|
function makeEncoder(): (text: string) => Uint8Array {
|
|
const encoder = new TextEncoder();
|
|
return (text: string) => encoder.encode(text);
|
|
}
|
|
|
|
const owner = new CodecOwner();
|
|
console.log(owner.roundTrip("café 🎉"));
|
|
console.log(decodeShared(sharedEncoder.encode("imported ✓")));
|
|
const encode = makeEncoder();
|
|
console.log(decodeWith(new TextDecoder(), encode("captured 😀")));
|
|
let decoder: TextDecoder = new TextDecoder("windows-1252");
|
|
console.log(decodeWith(decoder, new Uint8Array([0x80, 0x93, 0x41, 0x94])));
|
|
decoder = new TextDecoder();
|
|
console.log(decodeWith(decoder, new Uint8Array([0xef, 0xbb, 0xbf, 0x41, 0xff])));
|
|
console.log(decoder.decode().length, owner.encoder.encode().length);
|
|
console.log(new TextEncoder().encode().length);
|
|
const alias = owner.encoder;
|
|
console.log(alias === owner.encoder, alias === new TextEncoder());
|
|
const pair = [new TextDecoder("utf-16le"), new TextDecoder("windows-1252")];
|
|
console.log(pair[0]!.decode(new Uint8Array([0x61, 0, 0x62, 0])), pair[1]!.decode(new Uint8Array([0x80])));
|
|
|
|
let events = "";
|
|
function receiver(): TextDecoder { events += "receiver;"; return decoder; }
|
|
function input(): Uint8Array { events += "input;"; return new Uint8Array([0x41]); }
|
|
console.log(receiver().decode(input()), events);
|
|
events = "";
|
|
function label(): "utf-8" { events += "label;"; return "utf-8"; }
|
|
const labelled = new TextDecoder(label());
|
|
console.log(labelled.decode(input()), labelled.decode(), events);
|
|
|
|
// User types with codec-like names retain their own implementation.
|
|
console.log(new UserEncoder().encode("hello"));
|
|
|
|
function earlyCapture(early: boolean): string {
|
|
const use = () => encoder.encode("x");
|
|
if (early) {
|
|
try { return String(use().length); }
|
|
catch (error) { return error instanceof Error ? error.name + ":" + error.message : "wrong error"; }
|
|
}
|
|
const encoder = new TextEncoder();
|
|
return String(use().length);
|
|
}
|
|
console.log(earlyCapture(true), earlyCapture(false));
|
|
|
|
function globalRead(): number { return laterEncoder.encode("early").length; }
|
|
try { console.log(globalRead()); }
|
|
catch (error) { if (error instanceof Error) console.log(error.name, error.message); }
|
|
const laterEncoder = new TextEncoder();
|
|
console.log(globalRead());
|
|
|
|
let writes = 0;
|
|
function value(): TextDecoder { writes++; return new TextDecoder("windows-1252"); }
|
|
function globalWrite(): void { laterDecoder = value(); }
|
|
function globalWriteExpression(): TextDecoder { return laterDecoder = value(); }
|
|
try { globalWrite(); }
|
|
catch (error) { if (error instanceof Error) console.log(error.name, error.message, writes); }
|
|
try { globalWriteExpression(); }
|
|
catch (error) { if (error instanceof Error) console.log(error.name, error.message, writes); }
|
|
let laterDecoder = new TextDecoder();
|
|
console.log(globalWriteExpression().decode(new Uint8Array([0x80])), writes);
|