@arpabet/vrpc 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/dist/index.d.ts +561 -0
- package/dist/index.js +2262 -0
- package/dist/index.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/value.ts","../src/msgpack.ts","../src/json.ts","../src/codec.ts","../src/errors.ts","../src/hashchain.ts","../src/protocol.ts","../src/transport.ts","../src/internal/async.ts","../src/client.ts","../src/typed.ts"],"sourcesContent":["/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * The TypeScript projection of the `go.arpabet.com/value` model.\n *\n * | value kind | TypeScript |\n * |-----------------|-------------------------------------|\n * | NULL | null (undefined encodes as null) |\n * | BOOL | boolean |\n * | NUMBER/LONG | number (safe integers) or bigint |\n * | NUMBER/DOUBLE | number (or VrpcDouble to force) |\n * | NUMBER/BIGINT | bigint beyond int64 |\n * | NUMBER/DECIMAL | VrpcDecimal |\n * | STRING/UTF8 | string |\n * | STRING/RAW | Uint8Array |\n * | LIST | Array |\n * | MAP | plain object (string keys) |\n * | UNKNOWN (ext) | VrpcExt |\n */\nexport type Value =\n | null\n | boolean\n | number\n | bigint\n | string\n | Uint8Array\n | VrpcDouble\n | VrpcDecimal\n | VrpcExt\n | Value[]\n | { [key: string]: Value };\n\n/** A string-keyed map value (the envelope shape). */\nexport type ValueMap = { [key: string]: Value };\n\nexport const INT64_MIN = -9223372036854775808n;\nexport const INT64_MAX = 9223372036854775807n;\n\n/**\n * Forces a JS number to encode as a value DOUBLE (float64) even when it is\n * integer-valued. Bare integer-valued numbers encode as LONG; use\n * `double(42)` when the peer's handler verifies a DOUBLE argument.\n */\nexport class VrpcDouble {\n constructor(readonly value: number) {}\n valueOf(): number {\n return this.value;\n }\n toString(): string {\n return String(this.value);\n }\n}\n\n/** Convenience constructor for {@link VrpcDouble}. */\nexport function double(value: number): VrpcDouble {\n return new VrpcDouble(value);\n}\n\n/**\n * An arbitrary-precision decimal: `coefficient * 10^exponent`, mirroring the\n * shopspring/decimal representation used by value's NUMBER/DECIMAL kind.\n * Round-trips through the msgpack codec (ext tag 2). The JSON codec cannot\n * represent it (matching the Go-side asymmetry) and rejects it on encode.\n */\nexport class VrpcDecimal {\n constructor(\n readonly coefficient: bigint,\n readonly exponent: number,\n ) {\n if (!Number.isInteger(exponent) || exponent < -2147483648 || exponent > 2147483647) {\n throw new RangeError(`vrpc: decimal exponent out of int32 range: ${exponent}`);\n }\n }\n\n /** Parses \"123\", \"-1.045\", \"1.2e-5\" style decimal strings. */\n static fromString(s: string): VrpcDecimal {\n const m = /^([+-]?)(\\d+)(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/.exec(s.trim());\n if (!m) throw new SyntaxError(`vrpc: invalid decimal string: ${JSON.stringify(s)}`);\n const [, sign, int, frac = \"\", expStr] = m;\n let exponent = (expStr ? parseInt(expStr, 10) : 0) - frac.length;\n let digits = (int ?? \"\") + frac;\n digits = digits.replace(/^0+(?=\\d)/, \"\");\n let coefficient = BigInt(digits);\n if (sign === \"-\") coefficient = -coefficient;\n return new VrpcDecimal(coefficient, exponent);\n }\n\n toString(): string {\n const neg = this.coefficient < 0n;\n let digits = (neg ? -this.coefficient : this.coefficient).toString();\n let out: string;\n if (this.exponent >= 0) {\n out = digits + \"0\".repeat(this.exponent);\n } else {\n const point = digits.length + this.exponent;\n if (point > 0) {\n out = digits.slice(0, point) + \".\" + digits.slice(point);\n } else {\n out = \"0.\" + \"0\".repeat(-point) + digits;\n }\n }\n return (neg ? \"-\" : \"\") + out;\n }\n\n toNumber(): number {\n return Number(this.toString());\n }\n\n equals(other: VrpcDecimal): boolean {\n return this.coefficient === other.coefficient && this.exponent === other.exponent;\n }\n}\n\n/** Convenience constructor for {@link VrpcDecimal} from a decimal string. */\nexport function decimal(s: string): VrpcDecimal {\n return VrpcDecimal.fromString(s);\n}\n\n/**\n * An opaque msgpack extension value (value kind UNKNOWN): the ext tag plus its\n * payload bytes. Preserved through both codecs so unrecognized extensions\n * round-trip unchanged. The JSON form is the value-library convention\n * `\"data:application/x-msgpack-ext;base64,<tag byte + data, base64>\"`.\n */\nexport class VrpcExt {\n constructor(\n readonly tag: number,\n readonly data: Uint8Array,\n ) {\n if (!Number.isInteger(tag) || tag < 0 || tag > 255) {\n throw new RangeError(`vrpc: ext tag out of byte range: ${tag}`);\n }\n }\n\n equals(other: VrpcExt): boolean {\n return this.tag === other.tag && bytesEqual(this.data, other.data);\n }\n}\n\nexport function bytesEqual(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/** True for objects that should encode as MAP (plain objects only). */\nexport function isPlainObject(v: unknown): v is { [key: string]: Value } {\n if (v === null || typeof v !== \"object\") return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n}\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder(\"utf-8\", { fatal: false });\n\nexport function utf8Encode(s: string): Uint8Array {\n return textEncoder.encode(s);\n}\n\nexport function utf8Decode(b: Uint8Array): string {\n return textDecoder.decode(b);\n}\n\n/**\n * Compares two strings by their UTF-8 byte order — the ordering value uses for\n * canonical (sorted) map keys. This differs from JS default string comparison\n * for keys mixing astral-plane characters with U+E000..U+FFFF.\n */\nexport function compareUtf8(a: string, b: string): number {\n if (a === b) return 0;\n const ab = utf8Encode(a);\n const bb = utf8Encode(b);\n const n = Math.min(ab.length, bb.length);\n for (let i = 0; i < n; i++) {\n const d = (ab[i] as number) - (bb[i] as number);\n if (d !== 0) return d;\n }\n return ab.length - bb.length;\n}\n\n/** Sorted own enumerable string keys of a map source, canonical order. */\nexport function sortedMapKeys(obj: { [key: string]: Value } | Map<string, Value>): string[] {\n const keys = obj instanceof Map ? [...obj.keys()] : Object.keys(obj);\n return keys.sort(compareUtf8);\n}\n\nconst B64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nconst B64REV = new Int8Array(128).fill(-1);\nfor (let i = 0; i < B64.length; i++) B64REV[B64.charCodeAt(i)] = i;\n\n/** Standard-alphabet base64 without padding (Go base64.RawStdEncoding). */\nexport function base64RawStdEncode(data: Uint8Array): string {\n let out = \"\";\n let i = 0;\n for (; i + 2 < data.length; i += 3) {\n const n = ((data[i] as number) << 16) | ((data[i + 1] as number) << 8) | (data[i + 2] as number);\n out += B64[(n >> 18) & 63]! + B64[(n >> 12) & 63]! + B64[(n >> 6) & 63]! + B64[n & 63]!;\n }\n const rest = data.length - i;\n if (rest === 1) {\n const n = (data[i] as number) << 16;\n out += B64[(n >> 18) & 63]! + B64[(n >> 12) & 63]!;\n } else if (rest === 2) {\n const n = ((data[i] as number) << 16) | ((data[i + 1] as number) << 8);\n out += B64[(n >> 18) & 63]! + B64[(n >> 12) & 63]! + B64[(n >> 6) & 63]!;\n }\n return out;\n}\n\n/** Decodes standard-alphabet base64; accepts both padded and unpadded input. */\nexport function base64RawStdDecode(s: string): Uint8Array {\n let end = s.length;\n while (end > 0 && s[end - 1] === \"=\") end--;\n const outLen = Math.floor((end * 3) / 4);\n const out = new Uint8Array(outLen);\n let acc = 0;\n let bits = 0;\n let o = 0;\n for (let i = 0; i < end; i++) {\n const c = s.charCodeAt(i);\n const v = c < 128 ? B64REV[c]! : -1;\n if (v < 0) throw new SyntaxError(`vrpc: invalid base64 character at ${i}`);\n acc = (acc << 6) | v;\n bits += 6;\n if (bits >= 8) {\n bits -= 8;\n out[o++] = (acc >> bits) & 0xff;\n }\n }\n if (o !== outLen) throw new SyntaxError(\"vrpc: truncated base64 input\");\n return out;\n}\n\nexport function bytesToHex(data: Uint8Array): string {\n let out = \"\";\n for (const b of data) out += b.toString(16).padStart(2, \"0\");\n return out;\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * MessagePack codec producing the canonical byte form of go.arpabet.com/value\n * (see its CANONICAL.md): minimal integer family, doubles always float64,\n * str/bin distinct, map keys sorted by UTF-8 byte order, BIGINT as ext tag 1\n * (big.Int gob framing), DECIMAL as ext tag 2 (shopspring framing). Equal\n * values therefore produce byte-identical frames on both sides of the wire.\n */\n\nimport {\n INT64_MAX,\n INT64_MIN,\n VrpcDecimal,\n VrpcDouble,\n VrpcExt,\n compareUtf8,\n isPlainObject,\n utf8Decode,\n utf8Encode,\n type Value,\n type ValueMap,\n} from \"./value.js\";\n\nexport const BIGINT_EXT_TAG = 1;\nexport const DECIMAL_EXT_TAG = 2;\n\n/** Decode limits mirroring value's limits.go defaults. */\nexport interface DecodeLimits {\n maxDepth: number;\n maxCollectionLen: number;\n maxByteLen: number;\n}\n\nexport const DEFAULT_LIMITS: DecodeLimits = {\n maxDepth: 1000,\n maxCollectionLen: 16_777_216,\n maxByteLen: 1_073_741_824,\n};\n\n// ---------------------------------------------------------------------------\n// Encoding\n// ---------------------------------------------------------------------------\n\nclass Writer {\n buf = new Uint8Array(256);\n len = 0;\n\n private ensure(n: number): void {\n if (this.len + n <= this.buf.length) return;\n let cap = this.buf.length * 2;\n while (cap < this.len + n) cap *= 2;\n const next = new Uint8Array(cap);\n next.set(this.buf.subarray(0, this.len));\n this.buf = next;\n }\n\n byte(b: number): void {\n this.ensure(1);\n this.buf[this.len++] = b;\n }\n\n bytes(data: Uint8Array): void {\n this.ensure(data.length);\n this.buf.set(data, this.len);\n this.len += data.length;\n }\n\n u16(v: number): void {\n this.ensure(2);\n this.buf[this.len++] = (v >> 8) & 0xff;\n this.buf[this.len++] = v & 0xff;\n }\n\n u32(v: number): void {\n this.ensure(4);\n this.buf[this.len++] = (v >>> 24) & 0xff;\n this.buf[this.len++] = (v >>> 16) & 0xff;\n this.buf[this.len++] = (v >>> 8) & 0xff;\n this.buf[this.len++] = v & 0xff;\n }\n\n u64(v: bigint): void {\n this.ensure(8);\n const dv = new DataView(this.buf.buffer, this.buf.byteOffset + this.len, 8);\n dv.setBigUint64(0, BigInt.asUintN(64, v));\n this.len += 8;\n }\n\n f64(v: number): void {\n this.ensure(8);\n const dv = new DataView(this.buf.buffer, this.buf.byteOffset + this.len, 8);\n dv.setFloat64(0, v);\n this.len += 8;\n }\n\n result(): Uint8Array {\n return this.buf.slice(0, this.len);\n }\n}\n\nfunction packLongNumber(w: Writer, v: number): void {\n // Safe-range integer; mirrors value's WriteLong (positives use the unsigned\n // family, negatives the signed family, both minimal).\n if (v >= 0) {\n if (v <= 0x7f) w.byte(v);\n else if (v <= 0xff) {\n w.byte(0xcc);\n w.byte(v);\n } else if (v <= 0xffff) {\n w.byte(0xcd);\n w.u16(v);\n } else if (v <= 0xffffffff) {\n w.byte(0xce);\n w.u32(v);\n } else {\n w.byte(0xcf);\n w.u64(BigInt(v));\n }\n } else {\n if (v >= -32) w.byte(0x100 + v);\n else if (v >= -128) {\n w.byte(0xd0);\n w.byte(v & 0xff);\n } else if (v >= -32768) {\n w.byte(0xd1);\n w.u16(v & 0xffff);\n } else if (v >= -2147483648) {\n w.byte(0xd2);\n w.u32(v >>> 0);\n } else {\n w.byte(0xd3);\n w.u64(BigInt.asUintN(64, BigInt(v)));\n }\n }\n}\n\nfunction packLongBig(w: Writer, v: bigint): void {\n if (v >= 0n) {\n if (v <= 0xffffffffn) {\n packLongNumber(w, Number(v));\n } else {\n w.byte(0xcf);\n w.u64(v);\n }\n } else if (v >= -2147483648n) {\n packLongNumber(w, Number(v));\n } else {\n w.byte(0xd3);\n w.u64(BigInt.asUintN(64, v));\n }\n}\n\nfunction packDouble(w: Writer, v: number): void {\n w.byte(0xcb);\n w.f64(v);\n}\n\nfunction packStr(w: Writer, s: string): void {\n const b = utf8Encode(s);\n if (b.length < 32) w.byte(0xa0 | b.length);\n else if (b.length <= 0xff) {\n w.byte(0xd9);\n w.byte(b.length);\n } else if (b.length <= 0xffff) {\n w.byte(0xda);\n w.u16(b.length);\n } else {\n w.byte(0xdb);\n w.u32(b.length);\n }\n w.bytes(b);\n}\n\nfunction packBin(w: Writer, b: Uint8Array): void {\n if (b.length <= 0xff) {\n w.byte(0xc4);\n w.byte(b.length);\n } else if (b.length <= 0xffff) {\n w.byte(0xc5);\n w.u16(b.length);\n } else {\n w.byte(0xc6);\n w.u32(b.length);\n }\n w.bytes(b);\n}\n\nfunction packExt(w: Writer, tag: number, data: Uint8Array): void {\n const n = data.length;\n if (n === 1) w.byte(0xd4);\n else if (n === 2) w.byte(0xd5);\n else if (n === 4) w.byte(0xd6);\n else if (n === 8) w.byte(0xd7);\n else if (n === 16) w.byte(0xd8);\n else if (n <= 0xff) {\n w.byte(0xc7);\n w.byte(n);\n } else if (n <= 0xffff) {\n w.byte(0xc8);\n w.u16(n);\n } else {\n w.byte(0xc9);\n w.u32(n);\n }\n w.byte(tag);\n w.bytes(data);\n}\n\n/** big.Int gob framing: [version<<1 | signBit, ...big-endian magnitude]. */\nexport function bigIntGobEncode(v: bigint): Uint8Array {\n const neg = v < 0n;\n let abs = neg ? -v : v;\n const mag: number[] = [];\n while (abs > 0n) {\n mag.unshift(Number(abs & 0xffn));\n abs >>= 8n;\n }\n const out = new Uint8Array(1 + mag.length);\n out[0] = (1 << 1) | (neg ? 1 : 0);\n out.set(mag, 1);\n return out;\n}\n\nexport function bigIntGobDecode(data: Uint8Array): bigint {\n if (data.length === 0) throw new SyntaxError(\"vrpc: empty bigint payload\");\n const first = data[0] as number;\n if (first >> 1 !== 1) throw new SyntaxError(`vrpc: unsupported bigint gob version ${first >> 1}`);\n const neg = (first & 1) === 1;\n let v = 0n;\n for (let i = 1; i < data.length; i++) v = (v << 8n) | BigInt(data[i] as number);\n return neg ? -v : v;\n}\n\nfunction packBigInt(w: Writer, v: bigint): void {\n packExt(w, BIGINT_EXT_TAG, bigIntGobEncode(v));\n}\n\nfunction packDecimal(w: Writer, v: VrpcDecimal): void {\n const coef = bigIntGobEncode(v.coefficient);\n const payload = new Uint8Array(4 + coef.length);\n const dv = new DataView(payload.buffer);\n dv.setInt32(0, v.exponent);\n payload.set(coef, 4);\n packExt(w, DECIMAL_EXT_TAG, payload);\n}\n\nfunction packValue(w: Writer, v: Value | undefined): void {\n if (v === null || v === undefined) {\n w.byte(0xc0);\n return;\n }\n switch (typeof v) {\n case \"boolean\":\n w.byte(v ? 0xc3 : 0xc2);\n return;\n case \"number\":\n if (Number.isSafeInteger(v)) packLongNumber(w, v === 0 ? 0 : v); // -0 -> Long 0\n else if (Number.isInteger(v)) {\n throw new RangeError(\n `vrpc: integer ${v} exceeds ±2^53; pass a bigint for exact int64 encoding`,\n );\n } else packDouble(w, v);\n return;\n case \"string\":\n packStr(w, v);\n return;\n case \"bigint\":\n if (v >= INT64_MIN && v <= INT64_MAX) packLongBig(w, v);\n else packBigInt(w, v);\n return;\n case \"object\":\n break;\n default:\n throw new TypeError(`vrpc: cannot encode ${typeof v} as a value`);\n }\n if (v instanceof Uint8Array) {\n packBin(w, v);\n } else if (v instanceof VrpcDouble) {\n packDouble(w, v.value);\n } else if (v instanceof VrpcDecimal) {\n packDecimal(w, v);\n } else if (v instanceof VrpcExt) {\n packExt(w, v.tag, v.data);\n } else if (Array.isArray(v)) {\n if (v.length < 16) w.byte(0x90 | v.length);\n else if (v.length <= 0xffff) {\n w.byte(0xdc);\n w.u16(v.length);\n } else {\n w.byte(0xdd);\n w.u32(v.length);\n }\n for (const item of v) packValue(w, item);\n } else if (v instanceof Map) {\n packMapEntries(\n w,\n [...v.keys()].map((k) => String(k)),\n (k) => v.get(k) as Value,\n );\n } else if (isPlainObject(v)) {\n packMapEntries(w, Object.keys(v), (k) => v[k] as Value);\n } else {\n throw new TypeError(`vrpc: cannot encode ${(v as object).constructor?.name ?? \"object\"} as a value`);\n }\n}\n\nfunction packMapEntries(w: Writer, keys: string[], get: (k: string) => Value | undefined): void {\n const live = keys.filter((k) => get(k) !== undefined).sort(compareUtf8);\n if (live.length < 16) w.byte(0x80 | live.length);\n else if (live.length <= 0xffff) {\n w.byte(0xde);\n w.u16(live.length);\n } else {\n w.byte(0xdf);\n w.u32(live.length);\n }\n for (const k of live) {\n packStr(w, k);\n packValue(w, get(k));\n }\n}\n\n/** Encodes a single value in value's canonical MessagePack form. */\nexport function msgpackEncode(v: Value): Uint8Array {\n const w = new Writer();\n packValue(w, v);\n return w.result();\n}\n\n// ---------------------------------------------------------------------------\n// Decoding\n// ---------------------------------------------------------------------------\n\nclass Reader {\n pos = 0;\n private readonly dv: DataView;\n\n constructor(\n readonly buf: Uint8Array,\n readonly limits: DecodeLimits,\n ) {\n this.dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n }\n\n byte(): number {\n if (this.pos >= this.buf.length) throw new SyntaxError(\"vrpc: truncated msgpack input\");\n return this.buf[this.pos++] as number;\n }\n\n take(n: number): Uint8Array {\n if (n > this.limits.maxByteLen) throw new RangeError(`vrpc: msgpack byte length ${n} exceeds limit`);\n if (this.pos + n > this.buf.length) throw new SyntaxError(\"vrpc: truncated msgpack input\");\n const out = this.buf.slice(this.pos, this.pos + n);\n this.pos += n;\n return out;\n }\n\n u8(): number {\n return this.byte();\n }\n u16(): number {\n const v = this.dv.getUint16(this.need(2));\n return v;\n }\n u32(): number {\n return this.dv.getUint32(this.need(4));\n }\n i8(): number {\n return this.dv.getInt8(this.need(1));\n }\n i16(): number {\n return this.dv.getInt16(this.need(2));\n }\n i32(): number {\n return this.dv.getInt32(this.need(4));\n }\n i64(): bigint {\n return this.dv.getBigInt64(this.need(8));\n }\n u64(): bigint {\n return this.dv.getBigUint64(this.need(8));\n }\n f32(): number {\n return this.dv.getFloat32(this.need(4));\n }\n f64(): number {\n return this.dv.getFloat64(this.need(8));\n }\n\n private need(n: number): number {\n if (this.pos + n > this.buf.length) throw new SyntaxError(\"vrpc: truncated msgpack input\");\n const at = this.pos;\n this.pos += n;\n return at;\n }\n}\n\nfunction normalizeInt(v: bigint): number | bigint {\n return v >= -9007199254740991n && v <= 9007199254740991n ? Number(v) : v;\n}\n\nfunction decodeExt(tag: number, data: Uint8Array): Value {\n if (tag === BIGINT_EXT_TAG) return bigIntGobDecode(data);\n if (tag === DECIMAL_EXT_TAG) {\n if (data.length < 5) throw new SyntaxError(\"vrpc: truncated decimal payload\");\n const dv = new DataView(data.buffer, data.byteOffset, data.byteLength);\n const exponent = dv.getInt32(0);\n return new VrpcDecimal(bigIntGobDecode(data.subarray(4)), exponent);\n }\n return new VrpcExt(tag, data);\n}\n\nfunction readValue(r: Reader, depth: number): Value {\n if (depth > r.limits.maxDepth) throw new RangeError(\"vrpc: msgpack nesting too deep\");\n const b = r.byte();\n\n if (b <= 0x7f) return b; // positive fixint\n if (b >= 0xe0) return b - 0x100; // negative fixint\n if (b >= 0xa0 && b <= 0xbf) return utf8Decode(r.take(b & 0x1f)); // fixstr\n if (b >= 0x90 && b <= 0x9f) return readList(r, b & 0x0f, depth); // fixarray\n if (b >= 0x80 && b <= 0x8f) return readMap(r, b & 0x0f, depth); // fixmap\n\n switch (b) {\n case 0xc0:\n return null;\n case 0xc2:\n return false;\n case 0xc3:\n return true;\n case 0xc4:\n return r.take(r.u8());\n case 0xc5:\n return r.take(r.u16());\n case 0xc6:\n return r.take(r.u32());\n case 0xc7: {\n const n = r.u8();\n return decodeExt(r.byte(), r.take(n));\n }\n case 0xc8: {\n const n = r.u16();\n return decodeExt(r.byte(), r.take(n));\n }\n case 0xc9: {\n const n = r.u32();\n return decodeExt(r.byte(), r.take(n));\n }\n case 0xca:\n return r.f32();\n case 0xcb:\n return r.f64();\n case 0xcc:\n return r.u8();\n case 0xcd:\n return r.u16();\n case 0xce:\n return r.u32();\n case 0xcf:\n return normalizeInt(r.u64());\n case 0xd0:\n return r.i8();\n case 0xd1:\n return r.i16();\n case 0xd2:\n return r.i32();\n case 0xd3:\n return normalizeInt(r.i64());\n case 0xd4:\n return decodeExt(r.byte(), r.take(1));\n case 0xd5:\n return decodeExt(r.byte(), r.take(2));\n case 0xd6:\n return decodeExt(r.byte(), r.take(4));\n case 0xd7:\n return decodeExt(r.byte(), r.take(8));\n case 0xd8:\n return decodeExt(r.byte(), r.take(16));\n case 0xd9:\n return utf8Decode(r.take(r.u8()));\n case 0xda:\n return utf8Decode(r.take(r.u16()));\n case 0xdb:\n return utf8Decode(r.take(r.u32()));\n case 0xdc:\n return readList(r, r.u16(), depth);\n case 0xdd:\n return readList(r, r.u32(), depth);\n case 0xde:\n return readMap(r, r.u16(), depth);\n case 0xdf:\n return readMap(r, r.u32(), depth);\n default:\n throw new SyntaxError(`vrpc: unsupported msgpack format 0x${b.toString(16)}`);\n }\n}\n\nfunction readList(r: Reader, n: number, depth: number): Value[] {\n if (n > r.limits.maxCollectionLen) throw new RangeError(`vrpc: msgpack list length ${n} exceeds limit`);\n const out: Value[] = new Array(n);\n for (let i = 0; i < n; i++) out[i] = readValue(r, depth + 1);\n return out;\n}\n\nfunction readMap(r: Reader, n: number, depth: number): ValueMap {\n if (n > r.limits.maxCollectionLen) throw new RangeError(`vrpc: msgpack map length ${n} exceeds limit`);\n const out: ValueMap = {};\n for (let i = 0; i < n; i++) {\n const key = readValue(r, depth + 1);\n const val = readValue(r, depth + 1);\n // String keys are the MAP form; integer keys are value's SparseList\n // encoding — surfaced as stringified keys, matching the JSON projection.\n if (typeof key === \"string\") out[key] = val;\n else if (typeof key === \"number\" || typeof key === \"bigint\") out[String(key)] = val;\n else throw new SyntaxError(\"vrpc: unsupported msgpack map key type\");\n }\n return out;\n}\n\n/** Decodes one value; throws on malformed, truncated, or oversized input. */\nexport function msgpackDecode(data: Uint8Array, limits: DecodeLimits = DEFAULT_LIMITS): Value {\n const r = new Reader(data, limits);\n const v = readValue(r, 0);\n if (r.pos !== data.length) throw new SyntaxError(\"vrpc: trailing bytes after msgpack value\");\n return v;\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * JSON codec per WEB.md §3.1 — the value library's existing JSON conventions:\n *\n * - raw bytes <-> \"base64,<standard base64, no padding>\"\n * - msgpack ext <-> \"data:application/x-msgpack-ext;base64,<tag+data>\"\n * - NaN / ±Inf -> null (decode never produces them)\n * - map keys -> sorted by UTF-8 byte order (canonical, deterministic)\n * - integers -> plain JSON numbers; throws beyond ±2^53 on encode\n * - bigint -> encoded as a number when within ±2^53, else rejected\n * (the wire cannot carry it exactly; use msgpack)\n * - VrpcDecimal -> rejected on encode (does not round-trip through JSON)\n *\n * Known hazard inherited from the convention: a *string* that genuinely starts\n * with \"base64,\" or \"data:application/x-msgpack-ext;\" is indistinguishable\n * from encoded bytes/ext and will decode as such.\n */\n\nimport {\n VrpcDecimal,\n VrpcDouble,\n VrpcExt,\n base64RawStdDecode,\n base64RawStdEncode,\n compareUtf8,\n isPlainObject,\n type Value,\n type ValueMap,\n} from \"./value.js\";\nimport { DEFAULT_LIMITS, type DecodeLimits } from \"./msgpack.js\";\n\nexport const BASE64_PREFIX = \"base64,\";\nexport const EXT_PREFIX = \"data:application/x-msgpack-ext;\";\nconst MAX_SAFE = 9007199254740991; // 2^53 - 1\n\nfunction writeValue(out: string[], v: Value | undefined, depth: number): void {\n if (depth > 512) throw new RangeError(\"vrpc: json nesting too deep\");\n if (v === null || v === undefined) {\n out.push(\"null\");\n return;\n }\n switch (typeof v) {\n case \"boolean\":\n out.push(v ? \"true\" : \"false\");\n return;\n case \"number\":\n writeNumber(out, v);\n return;\n case \"bigint\":\n if (v > BigInt(MAX_SAFE) || v < -BigInt(MAX_SAFE)) {\n throw new RangeError(\n `vrpc: bigint ${v} exceeds ±2^53 and cannot travel exactly in JSON; use the msgpack codec or model it as a string`,\n );\n }\n out.push(v.toString());\n return;\n case \"string\":\n out.push(JSON.stringify(v));\n return;\n case \"object\":\n break;\n default:\n throw new TypeError(`vrpc: cannot encode ${typeof v} as a value`);\n }\n if (v instanceof Uint8Array) {\n out.push(JSON.stringify(BASE64_PREFIX + base64RawStdEncode(v)));\n } else if (v instanceof VrpcDouble) {\n writeNumber(out, v.value, true);\n } else if (v instanceof VrpcExt) {\n const payload = new Uint8Array(1 + v.data.length);\n payload[0] = v.tag;\n payload.set(v.data, 1);\n out.push(JSON.stringify(EXT_PREFIX + BASE64_PREFIX + base64RawStdEncode(payload)));\n } else if (v instanceof VrpcDecimal) {\n throw new TypeError(\n \"vrpc: VrpcDecimal does not round-trip through the JSON codec; use msgpack or model it as a string\",\n );\n } else if (Array.isArray(v)) {\n out.push(\"[\");\n for (let i = 0; i < v.length; i++) {\n if (i > 0) out.push(\",\");\n writeValue(out, v[i], depth + 1);\n }\n out.push(\"]\");\n } else if (v instanceof Map || isPlainObject(v)) {\n const get: (k: string) => Value | undefined =\n v instanceof Map ? (k) => v.get(k) as Value : (k) => (v as ValueMap)[k];\n const keys = (v instanceof Map ? [...v.keys()].map(String) : Object.keys(v))\n .filter((k) => get(k) !== undefined)\n .sort(compareUtf8);\n out.push(\"{\");\n for (let i = 0; i < keys.length; i++) {\n if (i > 0) out.push(\",\");\n out.push(JSON.stringify(keys[i]), \":\");\n writeValue(out, get(keys[i] as string), depth + 1);\n }\n out.push(\"}\");\n } else {\n throw new TypeError(`vrpc: cannot encode ${(v as object).constructor?.name ?? \"object\"} as a value`);\n }\n}\n\nfunction writeNumber(out: string[], v: number, forceDouble = false): void {\n if (!Number.isFinite(v)) {\n // Matches the value library's NaN policy (and the WEB.md ±Inf decision).\n out.push(\"null\");\n return;\n }\n if (Number.isInteger(v) && !forceDouble && Math.abs(v) > MAX_SAFE) {\n throw new RangeError(`vrpc: integer ${v} exceeds ±2^53; use the msgpack codec with a bigint`);\n }\n out.push(Object.is(v, -0) ? \"0\" : String(v));\n}\n\n/** Serializes a value to canonical JSON text (sorted keys). */\nexport function jsonEncode(v: Value): string {\n const out: string[] = [];\n writeValue(out, v, 0);\n return out.join(\"\");\n}\n\nfunction reviveString(s: string): Value {\n if (s.startsWith(EXT_PREFIX)) {\n const rest = s.slice(EXT_PREFIX.length);\n if (rest.startsWith(BASE64_PREFIX)) {\n const payload = base64RawStdDecode(rest.slice(BASE64_PREFIX.length));\n if (payload.length >= 1) {\n return new VrpcExt(payload[0] as number, payload.slice(1));\n }\n }\n return s;\n }\n if (s.startsWith(BASE64_PREFIX)) {\n try {\n return base64RawStdDecode(s.slice(BASE64_PREFIX.length));\n } catch {\n return s; // not valid base64 after the prefix: keep the string\n }\n }\n return s;\n}\n\nfunction reviveValue(v: unknown, depth: number, limits: DecodeLimits): Value {\n if (depth > limits.maxDepth) throw new RangeError(\"vrpc: json nesting too deep\");\n if (v === null) return null;\n switch (typeof v) {\n case \"boolean\":\n case \"number\":\n return v;\n case \"string\":\n return reviveString(v);\n case \"object\":\n break;\n default:\n throw new SyntaxError(`vrpc: unsupported json value of type ${typeof v}`);\n }\n if (Array.isArray(v)) {\n if (v.length > limits.maxCollectionLen) throw new RangeError(\"vrpc: json list too long\");\n return v.map((item) => reviveValue(item, depth + 1, limits));\n }\n const out: ValueMap = {};\n const entries = Object.entries(v as Record<string, unknown>);\n if (entries.length > limits.maxCollectionLen) throw new RangeError(\"vrpc: json map too large\");\n for (const [k, val] of entries) out[k] = reviveValue(val, depth + 1, limits);\n return out;\n}\n\n/** Parses JSON text into a value, applying the string-prefix conventions. */\nexport function jsonDecode(text: string, limits: DecodeLimits = DEFAULT_LIMITS): Value {\n return reviveValue(JSON.parse(text), 0, limits);\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { jsonDecode, jsonEncode } from \"./json.js\";\nimport { DEFAULT_LIMITS, msgpackDecode, msgpackEncode, type DecodeLimits } from \"./msgpack.js\";\nimport type { ValueMap } from \"./value.js\";\n\nexport type CodecName = \"msgpack\" | \"json\";\n\n/**\n * The wire codec seam (WEB.md §3.3): one envelope per WebSocket frame,\n * msgpack in binary frames, JSON in text frames.\n */\nexport interface WireCodec {\n readonly name: CodecName;\n /**\n * Subprotocol offered on dial. msgpack offers none: \"no subprotocol\" IS the\n * msgpack negotiation, and it keeps compatibility with servers that predate\n * codec negotiation. JSON offers \"vrpc.json\" and requires the server to echo\n * it (a server that does not support JSON fails the connect with a clear\n * error instead of choking on text frames).\n */\n readonly subprotocols: string[];\n readonly textFrames: boolean;\n encode(msg: ValueMap): Uint8Array | string;\n decode(data: Uint8Array | string): ValueMap;\n}\n\nfunction assertMap(v: unknown, codec: string): ValueMap {\n if (v === null || typeof v !== \"object\" || Array.isArray(v) || v instanceof Uint8Array) {\n throw new SyntaxError(`vrpc: expected a ${codec} map envelope`);\n }\n return v as ValueMap;\n}\n\nexport function msgpackCodec(limits: DecodeLimits = DEFAULT_LIMITS): WireCodec {\n return {\n name: \"msgpack\",\n subprotocols: [],\n textFrames: false,\n encode: (msg) => msgpackEncode(msg),\n decode: (data) => {\n if (typeof data === \"string\") {\n throw new SyntaxError(\n \"vrpc: received a text frame on a msgpack connection; JSON was not negotiated (offer subprotocol vrpc.json)\",\n );\n }\n return assertMap(msgpackDecode(data, limits), \"msgpack\");\n },\n };\n}\n\nexport function jsonCodec(limits: DecodeLimits = DEFAULT_LIMITS): WireCodec {\n return {\n name: \"json\",\n subprotocols: [\"vrpc.json\"],\n textFrames: true,\n encode: (msg) => jsonEncode(msg),\n decode: (data) => {\n if (typeof data !== \"string\") {\n throw new SyntaxError(\"vrpc: received a binary frame on a JSON connection\");\n }\n return assertMap(jsonDecode(data, limits), \"json\");\n },\n };\n}\n\nexport function codecByName(name: CodecName, limits?: DecodeLimits): WireCodec {\n return name === \"json\" ? jsonCodec(limits) : msgpackCodec(limits);\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Machine-readable RPC status, mirroring valuerpc.Code (a useful subset of\n * gRPC status codes). Carried on the wire in ErrorResponse frames.\n */\nexport enum Code {\n OK = 0,\n Unknown = 1,\n Canceled = 2,\n InvalidArgument = 3,\n DeadlineExceeded = 4,\n NotFound = 5,\n ResourceExhausted = 6,\n Unavailable = 7,\n Unauthenticated = 8,\n Internal = 9,\n}\n\nconst CODE_NAMES: Record<number, string> = {\n [Code.OK]: \"OK\",\n [Code.Unknown]: \"Unknown\",\n [Code.Canceled]: \"Canceled\",\n [Code.InvalidArgument]: \"InvalidArgument\",\n [Code.DeadlineExceeded]: \"DeadlineExceeded\",\n [Code.NotFound]: \"NotFound\",\n [Code.ResourceExhausted]: \"ResourceExhausted\",\n [Code.Unavailable]: \"Unavailable\",\n [Code.Unauthenticated]: \"Unauthenticated\",\n [Code.Internal]: \"Internal\",\n};\n\nexport function codeName(code: Code): string {\n return CODE_NAMES[code] ?? \"Unknown\";\n}\n\n/**\n * A coded RPC error, mirroring *valuerpc.Error. Server-raised failures arrive\n * with the server's code; client-local failures (timeout, connection loss,\n * cancellation) use the matching local code so callers can branch on\n * `err.code` the way Go callers branch on valuerpc.CodeOf(err).\n */\nexport class VrpcError extends Error {\n override readonly name = \"VrpcError\";\n constructor(\n readonly code: Code,\n message: string,\n options?: { cause?: unknown },\n ) {\n super(`vrpc ${codeName(code)}: ${message}`, options);\n }\n\n /** The message without the \"vrpc <Code>: \" prefix. */\n get detail(): string {\n return this.message.replace(/^vrpc [A-Za-z]+: /, \"\");\n }\n}\n\n/** The Code carried by err: VrpcError's code, or Unknown for foreign errors. */\nexport function codeOf(err: unknown): Code {\n if (err == null) return Code.OK;\n if (err instanceof VrpcError) return err.code;\n return Code.Unknown;\n}\n\nexport function errTimeout(what: string, ms: number): VrpcError {\n return new VrpcError(Code.DeadlineExceeded, `${what} timed out after ${ms}ms`);\n}\n\nexport function errCanceled(what: string): VrpcError {\n return new VrpcError(Code.Canceled, `${what} was canceled`);\n}\n\nexport function errConnectionLost(): VrpcError {\n return new VrpcError(Code.Unavailable, \"connection lost\");\n}\n\nexport function errClientClosed(): VrpcError {\n return new VrpcError(Code.Unavailable, \"client closed\");\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { bytesToHex } from \"./value.js\";\n\n/**\n * Client-held reverse hash chain (S/KEY style) for replay-resistant session\n * resumption, mirroring valuerpc.HashChain:\n *\n * seed = h[0], h[i] = SHA-256(h[i-1]), anchor = h[N]\n *\n * The anchor is presented (hex) in the first handshake's `tok` field; each\n * reconnect reveals the next pre-image in reverse order. The chain always\n * advances — even when a handshake is lost — and the server self-heals by\n * hashing forward (its resync window), so a link is never revealed twice.\n *\n * Browser-sized default: 1024 links (~1024 awaited SHA-256 digests at build\n * time, milliseconds) bounds reconnects per session; an exhausted chain makes\n * the client start a fresh session (new clientId + new chain).\n */\nexport class HashChain {\n private constructor(\n private readonly links: Uint8Array[],\n private next: number,\n ) {}\n\n static readonly DEFAULT_LENGTH = 1024;\n\n static async create(n: number = HashChain.DEFAULT_LENGTH): Promise<HashChain> {\n if (n <= 0) n = HashChain.DEFAULT_LENGTH;\n const links: Uint8Array[] = new Array(n + 1);\n const seed = new Uint8Array(32);\n crypto.getRandomValues(seed);\n links[0] = seed;\n for (let i = 1; i <= n; i++) {\n const digest = await crypto.subtle.digest(\"SHA-256\", links[i - 1] as Uint8Array<ArrayBuffer>);\n links[i] = new Uint8Array(digest);\n }\n return new HashChain(links, n - 1);\n }\n\n /** The public commitment h[N], hex-encoded. Resending it consumes nothing. */\n anchor(): string {\n return bytesToHex(this.links[this.links.length - 1] as Uint8Array);\n }\n\n /**\n * Reveals the next one-time resumption token and advances. Returns \"\" when\n * the chain is exhausted and a fresh session is required.\n */\n nextToken(): string {\n if (this.next < 0) return \"\";\n const tok = bytesToHex(this.links[this.next] as Uint8Array);\n this.next--;\n return tok;\n }\n\n remaining(): number {\n return this.next + 1;\n }\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Code } from \"./errors.js\";\nimport { VrpcDouble, type Value, type ValueMap } from \"./value.js\";\n\n/** vRPC message types (wire numbering; 12/13 reserved). */\nexport enum MessageType {\n HandshakeRequest = 0,\n HandshakeResponse = 1,\n FunctionRequest = 2,\n FunctionResponse = 3,\n GetStreamRequest = 4,\n PutStreamRequest = 5,\n ChatRequest = 6,\n ErrorResponse = 7,\n StreamReady = 8,\n StreamValue = 9,\n StreamEnd = 10,\n CancelRequest = 11,\n StreamCredit = 14,\n}\n\n/**\n * Dialect names the wire-level fields and markers of the vRPC envelope,\n * mirroring valuerpc.Dialect. Both peers MUST share the same dialect.\n * Override fields only if your Go deployment installed a custom Dialect.\n */\nexport interface Dialect {\n magic: string;\n version: number;\n handshakeRequestId: number;\n messageTypeField: string;\n magicField: string;\n versionField: string;\n requestIdField: string;\n timeoutField: string;\n clientIdField: string;\n sessionTokenField: string;\n authField: string;\n functionNameField: string;\n argumentsField: string;\n resultField: string;\n errorField: string;\n codeField: string;\n creditField: string;\n metadataField: string;\n valueField: string;\n}\n\n/** The standard vRPC dialect (the default wire format). */\nexport function newDialect(): Dialect {\n return {\n magic: \"vRPC\",\n version: 1.0,\n handshakeRequestId: 0,\n messageTypeField: \"t\",\n magicField: \"m\",\n versionField: \"v\",\n requestIdField: \"rid\",\n timeoutField: \"sla\",\n clientIdField: \"cid\",\n sessionTokenField: \"tok\",\n authField: \"auth\",\n functionNameField: \"fn\",\n argumentsField: \"args\",\n resultField: \"res\",\n errorField: \"err\",\n codeField: \"code\",\n creditField: \"cr\",\n metadataField: \"md\",\n valueField: \"val\",\n };\n}\n\nexport type Metadata = Record<string, string>;\n\n/** Envelope builders and field accessors bound to one dialect. */\nexport class Protocol {\n constructor(readonly d: Dialect) {}\n\n handshakeRequest(clientId: number, token: string, auth: Value | undefined): ValueMap {\n const req: ValueMap = {\n [this.d.magicField]: this.d.magic,\n // Sent as a DOUBLE like the Go client (value.Double(1.0)); the server\n // accepts any NUMBER <= its version.\n [this.d.versionField]: new VrpcDouble(this.d.version),\n [this.d.messageTypeField]: MessageType.HandshakeRequest,\n [this.d.requestIdField]: this.d.handshakeRequestId,\n [this.d.clientIdField]: clientId,\n };\n if (token !== \"\") req[this.d.sessionTokenField] = token;\n if (auth !== undefined && auth !== null) req[this.d.authField] = auth;\n return req;\n }\n\n request(\n mt: MessageType,\n requestId: number,\n name: string,\n args: Value | undefined,\n timeoutMs: number,\n metadata: Metadata | undefined,\n ): ValueMap {\n const req: ValueMap = {\n [this.d.messageTypeField]: mt,\n [this.d.requestIdField]: requestId,\n [this.d.functionNameField]: name,\n };\n if (args !== undefined) req[this.d.argumentsField] = args;\n if (timeoutMs > 0) req[this.d.timeoutField] = Math.floor(timeoutMs);\n if (metadata && Object.keys(metadata).length > 0) {\n req[this.d.metadataField] = { ...metadata };\n }\n return req;\n }\n\n functionResult(requestId: number, result: Value): ValueMap {\n const resp: ValueMap = {\n [this.d.messageTypeField]: MessageType.FunctionResponse,\n [this.d.requestIdField]: requestId,\n };\n if (result !== null && result !== undefined) resp[this.d.resultField] = result;\n return resp;\n }\n\n errorResponse(requestId: number, code: Code, message: string): ValueMap {\n return {\n [this.d.messageTypeField]: MessageType.ErrorResponse,\n [this.d.requestIdField]: requestId,\n [this.d.codeField]: code,\n [this.d.errorField]: message,\n };\n }\n\n streamReady(requestId: number): ValueMap {\n return {\n [this.d.messageTypeField]: MessageType.StreamReady,\n [this.d.requestIdField]: requestId,\n };\n }\n\n streamValue(requestId: number, value: Value): ValueMap {\n return {\n [this.d.messageTypeField]: MessageType.StreamValue,\n [this.d.requestIdField]: requestId,\n [this.d.valueField]: value,\n };\n }\n\n streamEnd(requestId: number, value?: Value): ValueMap {\n const resp: ValueMap = {\n [this.d.messageTypeField]: MessageType.StreamEnd,\n [this.d.requestIdField]: requestId,\n };\n if (value !== undefined && value !== null) resp[this.d.valueField] = value;\n return resp;\n }\n\n streamCredit(requestId: number, credit: number): ValueMap {\n return {\n [this.d.messageTypeField]: MessageType.StreamCredit,\n [this.d.requestIdField]: requestId,\n [this.d.creditField]: credit,\n };\n }\n\n cancelRequest(requestId: number): ValueMap {\n return {\n [this.d.messageTypeField]: MessageType.CancelRequest,\n [this.d.requestIdField]: requestId,\n };\n }\n\n // --- field accessors (absent or wrong-typed fields return undefined) ---\n\n messageType(msg: ValueMap): MessageType | undefined {\n return asIntField(msg[this.d.messageTypeField]);\n }\n\n requestId(msg: ValueMap): number | undefined {\n return asIntField(msg[this.d.requestIdField]);\n }\n\n functionName(msg: ValueMap): string | undefined {\n const v = msg[this.d.functionNameField];\n return typeof v === \"string\" ? v : undefined;\n }\n\n args(msg: ValueMap): Value {\n return msg[this.d.argumentsField] ?? null;\n }\n\n result(msg: ValueMap): Value {\n return msg[this.d.resultField] ?? null;\n }\n\n streamVal(msg: ValueMap): Value {\n return msg[this.d.valueField] ?? null;\n }\n\n credit(msg: ValueMap): number | undefined {\n return asIntField(msg[this.d.creditField]);\n }\n\n errorOf(msg: ValueMap): { code: Code; message: string } {\n const code = asIntField(msg[this.d.codeField]) ?? Code.Unknown;\n const err = msg[this.d.errorField];\n return { code: code as Code, message: typeof err === \"string\" ? err : \"\" };\n }\n\n metadata(msg: ValueMap): Metadata | undefined {\n const v = msg[this.d.metadataField];\n if (v === null || v === undefined || typeof v !== \"object\" || Array.isArray(v) || v instanceof Uint8Array) {\n return undefined;\n }\n const out: Metadata = {};\n let any = false;\n for (const [k, val] of Object.entries(v as ValueMap)) {\n if (typeof val === \"string\") {\n out[k] = val;\n any = true;\n }\n }\n return any ? out : undefined;\n }\n}\n\nfunction asIntField(v: Value | undefined): number | undefined {\n if (typeof v === \"number\" && Number.isFinite(v)) return v;\n if (typeof v === \"bigint\") return Number(v);\n return undefined;\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Code, VrpcError } from \"./errors.js\";\n\n/**\n * One established message connection. Deliberately tiny (WEB.md §7): a future\n * WebTransport implementation slots in without touching the protocol layer.\n */\nexport interface Transport {\n send(data: Uint8Array | string): void;\n close(): void;\n onMessage: ((data: Uint8Array | string) => void) | null;\n /** Fired exactly once, for both clean and failed closes. */\n onClose: ((err?: Error) => void) | null;\n}\n\nexport interface DialOptions {\n url: string;\n subprotocols: string[];\n timeoutMs: number;\n /** Override the WebSocket constructor (tests, custom agents). */\n webSocket?: typeof WebSocket;\n}\n\nexport type Dialer = (opts: DialOptions) => Promise<Transport>;\n\n/** Dials a WebSocket and resolves once the connection is open. */\nexport const webSocketDialer: Dialer = (opts) => {\n return new Promise<Transport>((resolve, reject) => {\n const WS = opts.webSocket ?? globalThis.WebSocket;\n if (typeof WS !== \"function\") {\n reject(\n new VrpcError(\n Code.Internal,\n \"no WebSocket implementation available; pass one via the webSocket option\",\n ),\n );\n return;\n }\n let ws: WebSocket;\n try {\n ws = opts.subprotocols.length > 0 ? new WS(opts.url, opts.subprotocols) : new WS(opts.url);\n } catch (err) {\n reject(new VrpcError(Code.Unavailable, `websocket dial failed: ${String(err)}`, { cause: err }));\n return;\n }\n ws.binaryType = \"arraybuffer\";\n\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n ws.close();\n reject(new VrpcError(Code.DeadlineExceeded, `websocket dial timed out after ${opts.timeoutMs}ms`));\n }, opts.timeoutMs);\n\n ws.onopen = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (opts.subprotocols.length > 0 && !opts.subprotocols.includes(ws.protocol)) {\n ws.close();\n reject(\n new VrpcError(\n Code.Unavailable,\n `server did not accept subprotocol ${opts.subprotocols.join(\"/\")} (got ${JSON.stringify(\n ws.protocol,\n )}); it likely predates JSON codec support — use codec: \"msgpack\"`,\n ),\n );\n return;\n }\n resolve(wrap(ws));\n };\n ws.onerror = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(new VrpcError(Code.Unavailable, `websocket dial failed: ${opts.url}`));\n };\n ws.onclose = (ev) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(\n new VrpcError(\n Code.Unavailable,\n `websocket closed during dial (code ${ev.code}${ev.reason ? `, ${ev.reason}` : \"\"})`,\n ),\n );\n };\n });\n};\n\nfunction wrap(ws: WebSocket): Transport {\n // Frames can arrive before the consumer assigns onMessage (the server's\n // handshake response can land in the same task the dial resolves in, before\n // the client's connect() continuation runs). Buffer any such early frames\n // and flush them the moment onMessage is wired, so none are dropped.\n let onMessageCb: ((data: Uint8Array | string) => void) | null = null;\n const early: (Uint8Array | string)[] = [];\n const deliver = (d: Uint8Array | string): void => {\n if (onMessageCb) onMessageCb(d);\n else early.push(d);\n };\n const t: Transport = {\n send(data) {\n // Uint8Array and string are both valid WebSocket payloads.\n ws.send(data as never);\n },\n close() {\n ws.onclose = null;\n ws.onerror = null;\n ws.onmessage = null;\n try {\n ws.close(1000);\n } catch {\n // already closing\n }\n },\n get onMessage() {\n return onMessageCb;\n },\n set onMessage(cb: ((data: Uint8Array | string) => void) | null) {\n onMessageCb = cb;\n if (cb && early.length > 0) {\n const queued = early.splice(0, early.length);\n for (const d of queued) cb(d);\n }\n },\n onClose: null,\n };\n let closed = false;\n const fireClose = (err?: Error): void => {\n if (closed) return;\n closed = true;\n t.onClose?.(err);\n };\n ws.onmessage = (ev: MessageEvent) => {\n const data = ev.data as unknown;\n if (typeof data === \"string\") deliver(data);\n else if (data instanceof ArrayBuffer) deliver(new Uint8Array(data));\n else if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n deliver(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));\n }\n };\n ws.onclose = (ev) => {\n fireClose(\n ev.wasClean && ev.code === 1000\n ? undefined\n : new VrpcError(Code.Unavailable, `websocket closed (code ${ev.code}${ev.reason ? `, ${ev.reason}` : \"\"})`),\n );\n };\n ws.onerror = () => {\n // An error event is always followed by close in browsers, but not\n // necessarily in every server runtime; normalize to one close signal.\n fireClose(new VrpcError(Code.Unavailable, \"websocket error\"));\n };\n return t;\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport interface Deferred<T> {\n promise: Promise<T>;\n resolve: (v: T) => void;\n reject: (err: unknown) => void;\n}\n\nexport function deferred<T>(): Deferred<T> {\n let resolve!: (v: T) => void;\n let reject!: (err: unknown) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\n/**\n * The sender side of credit-based stream flow control, mirroring\n * valuerpc.CreditGate: acquire() resolves once the peer has granted credit\n * (or resolves false when the gate closes on teardown).\n */\nexport class CreditGate {\n private credit = 0;\n private closed = false;\n private waiters: Deferred<boolean>[] = [];\n\n acquire(): Promise<boolean> {\n if (this.closed) return Promise.resolve(false);\n if (this.credit > 0) {\n this.credit--;\n return Promise.resolve(true);\n }\n const d = deferred<boolean>();\n this.waiters.push(d);\n return d.promise;\n }\n\n grant(n: number): void {\n if (n <= 0 || this.closed) return;\n this.credit += n;\n while (this.credit > 0 && this.waiters.length > 0) {\n this.credit--;\n (this.waiters.shift() as Deferred<boolean>).resolve(true);\n }\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n for (const w of this.waiters) w.resolve(false);\n this.waiters = [];\n }\n}\n\n/**\n * A bounded push/async-pull queue: the receive side of a stream. push() never\n * blocks (it reports overflow past maxPending — the peer overran its credit);\n * next() pulls at the consumer's pace and fires onConsume per delivered value,\n * which is where receive credit gets replenished (pull-based backpressure).\n */\nexport class AsyncValueQueue<T> {\n private buf: T[] = [];\n private waiter: Deferred<IteratorResult<T>> | null = null;\n private ended = false;\n private failure: unknown = null;\n\n constructor(\n private readonly maxPending: number,\n private readonly onConsume?: () => void,\n ) {}\n\n /** Queues a value; false means the queue is finished or overflowed. */\n push(v: T): boolean {\n if (this.ended) return false;\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n w.resolve({ value: v, done: false });\n this.onConsume?.();\n return true;\n }\n if (this.buf.length >= this.maxPending) return false;\n this.buf.push(v);\n return true;\n }\n\n /** Graceful end-of-stream: buffered values still drain to the consumer. */\n end(): void {\n if (this.ended) return;\n this.ended = true;\n if (this.waiter && this.buf.length === 0) {\n const w = this.waiter;\n this.waiter = null;\n if (this.failure != null) w.reject(this.failure);\n else w.resolve({ value: undefined as never, done: true });\n }\n }\n\n /** Ends the stream with an error; buffered values still drain first. */\n fail(err: unknown): void {\n if (this.ended) return;\n this.failure = err;\n this.end();\n }\n\n /** Hard stop: discards buffered values and ends immediately. */\n abort(err?: unknown): void {\n this.buf = [];\n if (this.ended && !this.waiter) return;\n this.ended = true;\n if (err !== undefined) this.failure = err;\n if (this.waiter) {\n const w = this.waiter;\n this.waiter = null;\n if (this.failure != null) w.reject(this.failure);\n else w.resolve({ value: undefined as never, done: true });\n }\n }\n\n get isEnded(): boolean {\n return this.ended;\n }\n\n next(): Promise<IteratorResult<T>> {\n if (this.buf.length > 0) {\n const v = this.buf.shift() as T;\n this.onConsume?.();\n return Promise.resolve({ value: v, done: false });\n }\n if (this.ended) {\n return this.failure != null ? Promise.reject(this.failure) : Promise.resolve({ value: undefined as never, done: true });\n }\n if (this.waiter) {\n return Promise.reject(new Error(\"vrpc: concurrent reads from a single stream consumer\"));\n }\n this.waiter = deferred<IteratorResult<T>>();\n return this.waiter.promise;\n }\n}\n\nexport interface BackoffOptions {\n initialDelayMs: number;\n maxDelayMs: number;\n /** Equal jitter: half fixed, half random (mirrors the Go client). */\n jitter: boolean;\n}\n\nexport function backoffDelay(attempt: number, opts: BackoffOptions): number {\n let delay = opts.initialDelayMs * 2 ** Math.max(0, attempt - 1);\n if (delay > opts.maxDelayMs) delay = opts.maxDelayMs;\n if (opts.jitter) delay = delay / 2 + Math.random() * (delay / 2);\n return Math.round(delay);\n}\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) return resolve();\n const t = setTimeout(done, ms);\n function done(): void {\n clearTimeout(t);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\n/** A random positive integer within the 53-bit safe range (client ids). */\nexport function randomClientId(): number {\n const a = new Uint32Array(2);\n crypto.getRandomValues(a);\n // 21 high bits + 32 low bits = 53 bits; +1 keeps it strictly positive.\n const id = (a[0] as number) % 0x200000 * 0x100000000 + (a[1] as number);\n return id === 0 ? 1 : id;\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { codecByName, type CodecName, type WireCodec } from \"./codec.js\";\nimport { Code, VrpcError, codeOf, errClientClosed, errConnectionLost } from \"./errors.js\";\nimport { HashChain } from \"./hashchain.js\";\nimport { MessageType, Protocol, newDialect, type Dialect, type Metadata } from \"./protocol.js\";\nimport { webSocketDialer, type DialOptions, type Dialer, type Transport } from \"./transport.js\";\nimport type { Value, ValueMap } from \"./value.js\";\nimport {\n AsyncValueQueue,\n CreditGate,\n backoffDelay,\n deferred,\n randomClientId,\n sleep,\n type Deferred,\n} from \"./internal/async.js\";\n\nexport type Status = \"idle\" | \"connecting\" | \"open\" | \"resuming\" | \"closed\";\n\nexport interface ReconnectOptions {\n /** Re-establish dropped connections automatically. Default true. */\n enabled?: boolean;\n /** First backoff delay. Default 300 ms. */\n initialDelayMs?: number;\n /** Backoff cap. Default 10 000 ms. */\n maxDelayMs?: number;\n /** Give up after this many consecutive failed attempts. Default Infinity. */\n maxAttempts?: number;\n /** Equal jitter (half fixed, half random), like the Go client. Default true. */\n jitter?: boolean;\n}\n\nexport interface ClientOptions {\n /** WebSocket endpoint, e.g. \"wss://example.com/rpc\". */\n url: string;\n /**\n * Wire codec. \"msgpack\" (default) speaks to every value-rpc server —\n * binary frames, no subprotocol. \"json\" offers the \"vrpc.json\" subprotocol\n * and requires a server with JSON codec support (WEB.md phase 1).\n */\n codec?: CodecName | WireCodec;\n /**\n * Credential for the handshake `auth` field, validated by the server's\n * Authenticator. A function is re-evaluated on every (re)connect, so\n * refreshed tokens are picked up automatically.\n */\n auth?: Value | (() => Value | Promise<Value>);\n /** Default unary timeout / request SLA in ms. Default 5000. */\n timeoutMs?: number;\n /** Dial + handshake timeout in ms. Default 10 000. */\n connectTimeoutMs?: number;\n /** Metadata attached to every request (static or per-request factory). */\n metadata?: Metadata | ((name: string) => Metadata | undefined);\n reconnect?: boolean | ReconnectOptions;\n /**\n * Hash-chain session resumption (default true): reconnects present a\n * one-time token proving continuity, so the server reattaches the session.\n * When disabled, every connection is a fresh session with a fresh clientId.\n */\n resume?: boolean;\n /** Resumption chain length = max reconnects per session. Default 1024. */\n chainLength?: number;\n /** Per-stream receive window (flow-control credit). Default 4096. */\n maxPending?: number;\n /** Wire dialect overrides; must match the server's Dialect. */\n dialect?: Partial<Dialect>;\n /** WebSocket constructor override (tests, custom agents). */\n webSocket?: typeof WebSocket;\n /** Transport override (in-memory tests, future WebTransport). */\n dialer?: Dialer;\n}\n\nexport interface CallOptions {\n /** Per-call timeout in ms; also sent to the server as the request SLA. */\n timeoutMs?: number;\n /** Abort maps to a vRPC CancelRequest toward the server. */\n signal?: AbortSignal;\n metadata?: Metadata;\n}\n\n/** A server->client stream (getStream): pull-based, credit-backed. */\nexport interface VrpcStream extends AsyncIterableIterator<Value> {\n readonly requestId: number;\n /** Resolves when the server acks the stream (StreamReady). */\n readonly ready: Promise<void>;\n /** Cancels the stream (sends CancelRequest); the iterator ends. */\n cancel(): void;\n}\n\n/** A bidirectional stream (chat). */\nexport interface VrpcChat extends AsyncIterable<Value> {\n readonly requestId: number;\n readonly ready: Promise<void>;\n readonly incoming: AsyncIterableIterator<Value>;\n /** Sends one value; awaits flow-control credit from the peer. */\n send(v: Value): Promise<void>;\n /** Half-closes our sending side (StreamEnd); receiving continues. */\n end(): void;\n /** Tears the whole chat down (CancelRequest). */\n cancel(): void;\n}\n\nexport interface HandlerContext {\n readonly requestId: number;\n readonly metadata: Metadata | undefined;\n /** Aborted when the peer cancels the request or the connection drops. */\n readonly signal: AbortSignal;\n}\n\nexport type UnaryHandler = (args: Value, ctx: HandlerContext) => Value | Promise<Value>;\nexport type OutgoingStreamHandler = (\n args: Value,\n ctx: HandlerContext,\n) => Iterable<Value> | AsyncIterable<Value> | Promise<Iterable<Value> | AsyncIterable<Value>>;\nexport type IncomingStreamHandler = (\n args: Value,\n incoming: AsyncIterableIterator<Value>,\n ctx: HandlerContext,\n) => void | Promise<void>;\nexport type ChatHandler = (\n args: Value,\n incoming: AsyncIterableIterator<Value>,\n ctx: HandlerContext,\n) => Iterable<Value> | AsyncIterable<Value> | Promise<Iterable<Value> | AsyncIterable<Value>>;\n\nexport interface ClientEvents {\n status: (status: Status) => void;\n /** Fired per successful handshake with the server's handshake response. */\n open: (handshake: ValueMap) => void;\n close: () => void;\n /** Non-fatal protocol anomalies (unroutable or malformed frames). */\n error: (err: Error) => void;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\nconst DEFAULT_CONNECT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_PENDING = 4096;\n\ntype HandlerKind = \"unary\" | \"out\" | \"in\" | \"chat\";\n\ninterface RegisteredHandler {\n kind: HandlerKind;\n fn: UnaryHandler | OutgoingStreamHandler | IncomingStreamHandler | ChatHandler;\n}\n\n/** One in-flight client-initiated request (positive request id). */\nclass PendingRequest {\n ready: Deferred<void> = deferred<void>();\n queue: AsyncValueQueue<Value> | null = null;\n sendCredit: CreditGate | null = null;\n unary: Deferred<Value> | null = null;\n timer: ReturnType<typeof setTimeout> | null = null;\n error: VrpcError | null = null;\n getClosed = false;\n putClosed = false;\n delivered = 0;\n\n constructor(\n readonly requestId: number,\n readonly kind: \"unary\" | \"get\" | \"put\" | \"chat\",\n readonly name: string,\n readonly window: number,\n ) {\n if (kind === \"unary\") this.unary = deferred<Value>();\n if (kind === \"get\" || kind === \"chat\") this.queue = new AsyncValueQueue<Value>(window, () => this.onConsume?.());\n if (kind === \"put\" || kind === \"chat\") this.sendCredit = new CreditGate();\n // A pending request's promises may be settled by teardown paths nobody\n // awaits anymore (e.g. cancel after the consumer left); keep those from\n // surfacing as unhandled rejections.\n this.ready.promise.catch(() => {});\n this.unary?.promise.catch(() => {});\n }\n\n onConsume: (() => void) | null = null;\n\n fail(err: VrpcError): void {\n this.error = err;\n this.ready.reject(err);\n this.unary?.reject(err);\n this.queue?.fail(err);\n this.sendCredit?.close();\n this.getClosed = true;\n this.putClosed = true;\n if (this.timer) clearTimeout(this.timer);\n }\n\n /** Graceful teardown without an error (server cancel / normal close). */\n finish(): void {\n this.ready.reject(this.error ?? new VrpcError(Code.Canceled, `request ${this.requestId} closed`));\n this.unary?.reject(this.error ?? new VrpcError(Code.Canceled, `request ${this.requestId} closed`));\n this.queue?.end();\n this.sendCredit?.close();\n this.getClosed = true;\n this.putClosed = true;\n if (this.timer) clearTimeout(this.timer);\n }\n}\n\n/** One stream/call this client serves for the peer (negative request id). */\nclass ServingRequest {\n inQueue: AsyncValueQueue<Value> | null = null;\n sendCredit: CreditGate | null = null;\n abort = new AbortController();\n delivered = 0;\n closed = false;\n\n constructor(\n readonly requestId: number,\n readonly kind: HandlerKind,\n readonly window: number,\n ) {\n if (kind === \"in\" || kind === \"chat\") {\n this.inQueue = new AsyncValueQueue<Value>(window, () => this.onConsume?.());\n }\n if (kind === \"out\" || kind === \"chat\") this.sendCredit = new CreditGate();\n }\n\n onConsume: (() => void) | null = null;\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.abort.abort();\n this.sendCredit?.close();\n this.inQueue?.abort();\n }\n}\n\ninterface ResolvedReconnect {\n enabled: boolean;\n initialDelayMs: number;\n maxDelayMs: number;\n maxAttempts: number;\n jitter: boolean;\n}\n\n/**\n * A value-rpc client over WebSocket. Symmetric peer: it calls the server\n * (call / getStream / putStream / chat) and serves the server's reverse\n * calls (addFunction / addOutgoingStream / addIncomingStream / addChat).\n */\nexport class VrpcClient {\n readonly protocol: Protocol;\n private readonly codec: WireCodec;\n private readonly opts: ClientOptions;\n private readonly reconnect: ResolvedReconnect;\n private readonly timeoutMs: number;\n private readonly connectTimeoutMs: number;\n private readonly maxPending: number;\n private readonly dialer: Dialer;\n\n private _status: Status = \"idle\";\n private _clientId = randomClientId();\n private transport: Transport | null = null;\n private chain: HashChain | null = null;\n private established = false;\n private nextRequestId = 0;\n private reconnects = 0;\n\n private pending = new Map<number, PendingRequest>();\n private serving = new Map<number, ServingRequest>();\n private handlers = new Map<string, RegisteredHandler>();\n private listeners = new Map<keyof ClientEvents, Set<(...args: never[]) => void>>();\n\n private connectPromise: Promise<void> | null = null;\n private resumeAbort: AbortController | null = null;\n private openWaiters: Deferred<void>[] = [];\n private handshakeWaiter: Deferred<ValueMap> | null = null;\n private handshakeTransport: Transport | null = null;\n private hintsInstalled = false;\n\n constructor(options: ClientOptions) {\n this.opts = options;\n this.codec =\n typeof options.codec === \"object\" ? options.codec : codecByName(options.codec ?? \"msgpack\");\n this.protocol = new Protocol({ ...newDialect(), ...options.dialect });\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.connectTimeoutMs = options.connectTimeoutMs ?? DEFAULT_CONNECT_TIMEOUT_MS;\n this.maxPending = options.maxPending ?? DEFAULT_MAX_PENDING;\n this.dialer = options.dialer ?? webSocketDialer;\n const rc = options.reconnect;\n this.reconnect = {\n enabled: rc === false ? false : ((rc === true || rc === undefined ? undefined : rc.enabled) ?? true),\n initialDelayMs: (typeof rc === \"object\" && rc.initialDelayMs) || 300,\n maxDelayMs: (typeof rc === \"object\" && rc.maxDelayMs) || 10_000,\n maxAttempts: (typeof rc === \"object\" && rc.maxAttempts) || Infinity,\n jitter: typeof rc === \"object\" ? (rc.jitter ?? true) : true,\n };\n }\n\n get status(): Status {\n return this._status;\n }\n\n get connected(): boolean {\n return this._status === \"open\";\n }\n\n get clientId(): number {\n return this._clientId;\n }\n\n get codecName(): CodecName {\n return this.codec.name;\n }\n\n stats(): { requests: number; reconnects: number; pending: number; serving: number } {\n return {\n requests: this.nextRequestId,\n reconnects: this.reconnects,\n pending: this.pending.size,\n serving: this.serving.size,\n };\n }\n\n // ------------------------------------------------------------------ events\n\n on<E extends keyof ClientEvents>(event: E, fn: ClientEvents[E]): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(fn as (...args: never[]) => void);\n return () => set.delete(fn as (...args: never[]) => void);\n }\n\n private emit<E extends keyof ClientEvents>(event: E, ...args: Parameters<ClientEvents[E]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const fn of [...set]) {\n try {\n (fn as (...a: Parameters<ClientEvents[E]>) => void)(...args);\n } catch {\n // listener errors must not break the dispatch loop\n }\n }\n }\n\n private setStatus(s: Status): void {\n if (this._status === s) return;\n this._status = s;\n this.emit(\"status\", s);\n if (s === \"open\") {\n const waiters = this.openWaiters;\n this.openWaiters = [];\n for (const w of waiters) w.resolve();\n }\n if (s === \"closed\") {\n const waiters = this.openWaiters;\n this.openWaiters = [];\n for (const w of waiters) w.reject(errClientClosed());\n this.emit(\"close\");\n }\n }\n\n // -------------------------------------------------------------- connection\n\n /** Connects (idempotent). Calls also auto-connect on first use. */\n async connect(): Promise<void> {\n if (this._status === \"open\") return;\n if (this._status === \"closed\") throw errClientClosed();\n if (!this.connectPromise) {\n this.setStatus(this._status === \"resuming\" ? \"resuming\" : \"connecting\");\n this.connectPromise = this.doConnect().finally(() => {\n this.connectPromise = null;\n });\n }\n return this.connectPromise;\n }\n\n private async handshakeToken(): Promise<string> {\n if (this.opts.resume === false) {\n // Without resumption every connection must be a fresh session: a known\n // clientId with no valid chain link would be rejected by the server.\n if (this.established) this._clientId = randomClientId();\n return \"\";\n }\n if (!this.chain) {\n this.chain = await HashChain.create(this.opts.chainLength ?? HashChain.DEFAULT_LENGTH);\n }\n if (!this.established) return this.chain.anchor();\n const tok = this.chain.nextToken();\n if (tok !== \"\") return tok;\n // Chain exhausted: transparently start a fresh session (new identity).\n this._clientId = randomClientId();\n this.chain = await HashChain.create(this.opts.chainLength ?? HashChain.DEFAULT_LENGTH);\n this.established = false;\n return this.chain.anchor();\n }\n\n private async doConnect(): Promise<void> {\n const token = await this.handshakeToken();\n const authOpt = this.opts.auth;\n const auth = typeof authOpt === \"function\" ? await (authOpt as () => Value | Promise<Value>)() : authOpt;\n\n const dialOpts: DialOptions = {\n url: this.opts.url,\n subprotocols: this.codec.subprotocols,\n timeoutMs: this.connectTimeoutMs,\n };\n if (this.opts.webSocket) dialOpts.webSocket = this.opts.webSocket;\n const transport = await this.dialer(dialOpts);\n\n if (this._status === \"closed\") {\n transport.close();\n throw errClientClosed();\n }\n\n const hs = deferred<ValueMap>();\n this.handshakeWaiter = hs;\n this.handshakeTransport = transport;\n transport.onMessage = (data) => this.onFrame(transport, data);\n transport.onClose = (err) => this.onTransportClose(transport, err);\n try {\n transport.send(this.codec.encode(this.protocol.handshakeRequest(this._clientId, token, auth ?? null)));\n const timer = setTimeout(\n () => hs.reject(new VrpcError(Code.DeadlineExceeded, `handshake timed out after ${this.connectTimeoutMs}ms`)),\n this.connectTimeoutMs,\n );\n let resp: ValueMap;\n try {\n resp = await hs.promise;\n } finally {\n clearTimeout(timer);\n this.handshakeWaiter = null;\n this.handshakeTransport = null;\n }\n this.transport = transport;\n this.established = true;\n this.setStatus(\"open\");\n this.installBrowserHints();\n this.emit(\"open\", resp);\n } catch (err) {\n this.handshakeWaiter = null;\n this.handshakeTransport = null;\n transport.onClose = null;\n transport.close();\n throw err instanceof VrpcError\n ? err\n : new VrpcError(Code.Unavailable, `handshake failed: ${String(err)}`, { cause: err });\n }\n }\n\n /** Waits until the client is open, connecting if idle. */\n private async ensureOpen(signal?: AbortSignal): Promise<void> {\n if (this._status === \"open\") return;\n if (this._status === \"closed\") throw errClientClosed();\n if (this._status === \"idle\") {\n await this.connect();\n return;\n }\n // connecting / resuming: wait for the in-flight attempt (bounded by the\n // caller's timeout/signal, which the caller applies around the whole op).\n const d = deferred<void>();\n this.openWaiters.push(d);\n if (signal) {\n const onAbort = (): void => d.reject(new VrpcError(Code.Canceled, \"aborted while waiting for connection\"));\n if (signal.aborted) onAbort();\n else signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n await d.promise;\n }\n\n private onTransportClose(transport: Transport, err?: Error): void {\n if (transport !== this.transport) {\n // A handshake-in-progress connection failing, or a stale one closing.\n if (transport === this.handshakeTransport) {\n this.handshakeWaiter?.reject(err ?? errConnectionLost());\n }\n return;\n }\n this.transport = null;\n this.failAllInFlight(errConnectionLost());\n if (this._status === \"closed\") return;\n if (!this.reconnect.enabled) {\n this.setStatus(\"closed\");\n return;\n }\n void this.resumeLoop();\n }\n\n private async resumeLoop(): Promise<void> {\n if (this.resumeAbort) return; // already resuming\n this.setStatus(\"resuming\");\n try {\n for (let attempt = 1; attempt <= this.reconnect.maxAttempts; attempt++) {\n // One abort controller PER attempt: a wake hint (online event / tab\n // visible) aborts only the current backoff sleep so the dial happens\n // immediately — it must never terminate the loop itself, or the client\n // would be stranded in \"resuming\" with nothing left to reconnect it.\n const abort = new AbortController();\n this.resumeAbort = abort;\n await sleep(backoffDelay(attempt, this.reconnect), abort.signal);\n this.resumeAbort = null;\n if (this._status === \"closed\") return;\n if (abort.signal.aborted) attempt = 0; // wake hint: dial now, backoff afresh\n this.reconnects++;\n try {\n await this.connect();\n return;\n } catch {\n // next attempt\n }\n }\n this.setStatus(\"closed\");\n } finally {\n this.resumeAbort = null;\n }\n }\n\n /** Browser wake hints: retry immediately when connectivity likely returned. */\n private installBrowserHints(): void {\n if (this.hintsInstalled || typeof window === \"undefined\" || typeof window.addEventListener !== \"function\") {\n return;\n }\n this.hintsInstalled = true;\n const hint = (): void => {\n if (this._status === \"resuming\") this.resumeAbort?.abort();\n };\n window.addEventListener(\"online\", hint);\n if (typeof document !== \"undefined\") {\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === \"visible\") hint();\n });\n }\n }\n\n private failAllInFlight(err: VrpcError): void {\n const pending = [...this.pending.values()];\n this.pending.clear();\n for (const p of pending) p.fail(err);\n const serving = [...this.serving.values()];\n this.serving.clear();\n for (const s of serving) s.close();\n }\n\n /** Closes the client permanently. */\n close(): void {\n if (this._status === \"closed\") return;\n this.resumeAbort?.abort();\n this.handshakeWaiter?.reject(errClientClosed());\n const t = this.transport;\n this.transport = null;\n this.setStatus(\"closed\");\n this.failAllInFlight(errClientClosed());\n t?.close();\n }\n\n // ---------------------------------------------------------------- sending\n\n private sendFrame(env: ValueMap): void {\n const t = this.transport;\n if (!t) throw errConnectionLost();\n t.send(this.codec.encode(env));\n }\n\n private trySendFrame(env: ValueMap): void {\n try {\n this.sendFrame(env);\n } catch {\n // best-effort system message on a dying connection\n }\n }\n\n cancelRequest(requestId: number): void {\n this.trySendFrame(this.protocol.cancelRequest(requestId));\n }\n\n private buildMetadata(name: string, callMd?: Metadata): Metadata | undefined {\n const base =\n typeof this.opts.metadata === \"function\" ? this.opts.metadata(name) : this.opts.metadata;\n if (!base && !callMd) return undefined;\n return { ...base, ...callMd };\n }\n\n // ------------------------------------------------------------------ unary\n\n /** Calls a unary function on the server. */\n async call(name: string, args?: Value, opts: CallOptions = {}): Promise<Value> {\n await this.ensureOpen(opts.signal);\n const timeoutMs = opts.timeoutMs ?? this.timeoutMs;\n const rid = ++this.nextRequestId;\n const p = new PendingRequest(rid, \"unary\", name, 1);\n this.pending.set(rid, p);\n\n const settle = (): void => {\n if (p.timer) clearTimeout(p.timer);\n this.pending.delete(rid);\n };\n if (timeoutMs > 0) {\n p.timer = setTimeout(() => {\n this.cancelRequest(rid);\n p.fail(new VrpcError(Code.DeadlineExceeded, `call ${name} timed out after ${timeoutMs}ms`));\n settle();\n }, timeoutMs);\n }\n if (opts.signal) {\n const onAbort = (): void => {\n this.cancelRequest(rid);\n p.fail(new VrpcError(Code.Canceled, `call ${name} aborted`));\n settle();\n };\n if (opts.signal.aborted) onAbort();\n else opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n this.sendFrame(\n this.protocol.request(MessageType.FunctionRequest, rid, name, args, timeoutMs, this.buildMetadata(name, opts.metadata)),\n );\n } catch (err) {\n p.fail(err instanceof VrpcError ? err : errConnectionLost());\n settle();\n }\n\n try {\n return await (p.unary as Deferred<Value>).promise;\n } finally {\n settle();\n }\n }\n\n // ---------------------------------------------------------------- streams\n\n /**\n * Opens a server->client stream. Consume with `for await`; breaking out of\n * the loop cancels the stream. Credit is granted as values are consumed, so\n * a slow consumer applies real backpressure to the server.\n */\n getStream(name: string, args?: Value, opts: CallOptions = {}): VrpcStream {\n const rid = ++this.nextRequestId;\n const p = new PendingRequest(rid, \"get\", name, this.maxPending);\n return this.openConsumingStream(p, MessageType.GetStreamRequest, name, args, opts);\n }\n\n private openConsumingStream(\n p: PendingRequest,\n mt: MessageType.GetStreamRequest | MessageType.ChatRequest,\n name: string,\n args: Value | undefined,\n opts: CallOptions,\n ): VrpcStream {\n const rid = p.requestId;\n this.pending.set(rid, p);\n p.onConsume = () => {\n p.delivered++;\n const batch = Math.max(1, Math.floor(p.window / 2));\n if (p.delivered >= batch) {\n const n = p.delivered;\n p.delivered = 0;\n this.trySendFrame(this.protocol.streamCredit(rid, n));\n }\n };\n\n const timeoutMs = opts.timeoutMs ?? this.timeoutMs;\n void this.establishStream(p, mt, name, args, timeoutMs, opts);\n\n const self = this;\n const iterator: VrpcStream = {\n requestId: rid,\n ready: p.ready.promise,\n async next(): Promise<IteratorResult<Value>> {\n const q = p.queue as AsyncValueQueue<Value>;\n const res = await q.next();\n if (res.done) self.retireGetSide(p);\n return res;\n },\n async return(value?: Value): Promise<IteratorResult<Value>> {\n iterator.cancel();\n return { value: value as Value, done: true };\n },\n async throw(err?: unknown): Promise<IteratorResult<Value>> {\n iterator.cancel();\n throw err;\n },\n cancel(): void {\n if (p.getClosed && p.putClosed) return;\n self.cancelRequest(rid);\n p.finish();\n self.pending.delete(rid);\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n return iterator;\n }\n\n private async establishStream(\n p: PendingRequest,\n mt: MessageType,\n name: string,\n args: Value | undefined,\n timeoutMs: number,\n opts: CallOptions,\n ): Promise<void> {\n const rid = p.requestId;\n try {\n await this.ensureOpen(opts.signal);\n const establishTimer = setTimeout(() => {\n if (!p.getClosed) {\n this.cancelRequest(rid);\n p.fail(new VrpcError(Code.DeadlineExceeded, `stream ${name} was not acked within ${timeoutMs}ms`));\n this.pending.delete(rid);\n }\n }, timeoutMs);\n p.ready.promise.then(\n () => clearTimeout(establishTimer),\n () => clearTimeout(establishTimer),\n );\n if (opts.signal) {\n const onAbort = (): void => {\n this.cancelRequest(rid);\n p.fail(new VrpcError(Code.Canceled, `stream ${name} aborted`));\n this.pending.delete(rid);\n };\n if (opts.signal.aborted) onAbort();\n else opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n this.sendFrame(\n this.protocol.request(mt, rid, name, args, timeoutMs, this.buildMetadata(name, opts.metadata)),\n );\n // The initial receive window is granted once the peer acks the stream.\n if (p.queue) {\n p.ready.promise.then(\n () => this.trySendFrame(this.protocol.streamCredit(rid, p.window)),\n () => {},\n );\n }\n } catch (err) {\n p.fail(err instanceof VrpcError ? err : new VrpcError(Code.Unavailable, String(err), { cause: err }));\n this.pending.delete(rid);\n }\n }\n\n private retireGetSide(p: PendingRequest): void {\n p.getClosed = true;\n if (p.kind !== \"chat\" || p.putClosed) this.pending.delete(p.requestId);\n }\n\n /**\n * Opens a client->server stream and sends every value from source, honoring\n * the server's flow-control credit. Resolves once the stream ended cleanly.\n */\n async putStream(\n name: string,\n args: Value | undefined,\n source: Iterable<Value> | AsyncIterable<Value>,\n opts: CallOptions = {},\n ): Promise<void> {\n const timeoutMs = opts.timeoutMs ?? this.timeoutMs;\n await this.ensureOpen(opts.signal);\n const rid = ++this.nextRequestId;\n const p = new PendingRequest(rid, \"put\", name, 1);\n this.pending.set(rid, p);\n\n const abortErr = (): VrpcError => p.error ?? new VrpcError(Code.Canceled, `stream ${name} aborted`);\n if (opts.signal) {\n const onAbort = (): void => {\n this.cancelRequest(rid);\n p.fail(new VrpcError(Code.Canceled, `stream ${name} aborted`));\n this.pending.delete(rid);\n };\n if (opts.signal.aborted) onAbort();\n else opts.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n const establishTimer = setTimeout(() => {\n if (!p.putClosed) {\n this.cancelRequest(rid);\n p.fail(new VrpcError(Code.DeadlineExceeded, `stream ${name} was not acked within ${timeoutMs}ms`));\n this.pending.delete(rid);\n }\n }, timeoutMs);\n p.ready.promise.then(\n () => clearTimeout(establishTimer),\n () => clearTimeout(establishTimer),\n );\n this.sendFrame(\n this.protocol.request(MessageType.PutStreamRequest, rid, name, args, timeoutMs, this.buildMetadata(name, opts.metadata)),\n );\n await p.ready.promise;\n\n for await (const v of source) {\n const gate = p.sendCredit as CreditGate;\n const ok = await gate.acquire();\n if (!ok) throw abortErr();\n this.sendFrame(this.protocol.streamValue(rid, v));\n }\n this.sendFrame(this.protocol.streamEnd(rid));\n p.putClosed = true;\n } finally {\n p.finish();\n this.pending.delete(rid);\n }\n }\n\n /** Opens a bidirectional stream (chat). */\n chat(name: string, args?: Value, opts: CallOptions = {}): VrpcChat {\n const rid = ++this.nextRequestId;\n const p = new PendingRequest(rid, \"chat\", name, this.maxPending);\n const stream = this.openConsumingStream(p, MessageType.ChatRequest, name, args, opts);\n const self = this;\n let ended = false;\n\n return {\n requestId: rid,\n ready: p.ready.promise,\n incoming: stream,\n async send(v: Value): Promise<void> {\n if (ended) throw new VrpcError(Code.Internal, `chat ${name}: send after end`);\n await p.ready.promise;\n const ok = await (p.sendCredit as CreditGate).acquire();\n if (!ok) throw p.error ?? errConnectionLost();\n self.sendFrame(self.protocol.streamValue(rid, v));\n },\n end(): void {\n if (ended || p.putClosed) return;\n ended = true;\n p.ready.promise.then(\n () => {\n if (!p.putClosed) {\n p.putClosed = true;\n self.trySendFrame(self.protocol.streamEnd(rid));\n if (p.getClosed) self.pending.delete(rid);\n }\n },\n () => {},\n );\n },\n cancel(): void {\n ended = true;\n stream.cancel();\n },\n [Symbol.asyncIterator]() {\n return stream;\n },\n };\n }\n\n // ------------------------------------------------- reverse-call registrar\n\n /** Registers a unary function the server may call on this client. */\n addFunction(name: string, fn: UnaryHandler): void {\n this.handlers.set(name, { kind: \"unary\", fn });\n }\n\n /** Registers a stream the server can consume from this client (GetStream). */\n addOutgoingStream(name: string, fn: OutgoingStreamHandler): void {\n this.handlers.set(name, { kind: \"out\", fn });\n }\n\n /** Registers a stream the server can send to this client (PutStream). */\n addIncomingStream(name: string, fn: IncomingStreamHandler): void {\n this.handlers.set(name, { kind: \"in\", fn });\n }\n\n /** Registers a bidirectional stream the server can open (Chat). */\n addChat(name: string, fn: ChatHandler): void {\n this.handlers.set(name, { kind: \"chat\", fn });\n }\n\n removeHandler(name: string): void {\n this.handlers.delete(name);\n }\n\n // ------------------------------------------------------------- dispatch\n\n private onFrame(transport: Transport, data: Uint8Array | string): void {\n if (transport !== this.transport && transport !== this.handshakeTransport) return; // stale connection\n let msg: ValueMap;\n try {\n msg = this.codec.decode(data);\n } catch (err) {\n // A malformed frame is a broken peer or transport: mirror the Go\n // client, where a decode failure kills the connection.\n this.emit(\"error\", new VrpcError(Code.Internal, `malformed frame: ${String(err)}`, { cause: err }));\n this.handshakeWaiter?.reject(new VrpcError(Code.Internal, `malformed handshake frame: ${String(err)}`));\n transport.onClose = null;\n transport.close();\n this.onTransportClose(transport, errConnectionLost());\n return;\n }\n\n const mt = this.protocol.messageType(msg);\n if (mt === undefined) {\n this.emit(\"error\", new VrpcError(Code.Internal, \"message type not found\"));\n return;\n }\n\n if (mt === MessageType.HandshakeResponse) {\n this.handshakeWaiter?.resolve(msg);\n return;\n }\n if (mt === MessageType.FunctionRequest) {\n this.serveInboundCall(msg);\n return;\n }\n if (\n mt === MessageType.GetStreamRequest ||\n mt === MessageType.PutStreamRequest ||\n mt === MessageType.ChatRequest\n ) {\n this.serveInboundStream(mt, msg);\n return;\n }\n\n const rid = this.protocol.requestId(msg);\n if (rid === undefined) {\n this.emit(\"error\", new VrpcError(Code.Internal, \"request id not found\"));\n return;\n }\n\n const sr = this.serving.get(rid);\n if (sr) {\n this.serveRunning(sr, mt, msg);\n return;\n }\n const p = this.pending.get(rid);\n if (p) {\n this.processResponse(p, mt, msg);\n return;\n }\n // A late frame for a finished request is routine (e.g. values in flight\n // after a cancel); everything else is worth surfacing.\n if (mt !== MessageType.StreamValue && mt !== MessageType.StreamEnd && mt !== MessageType.CancelRequest) {\n this.emit(\"error\", new VrpcError(Code.Internal, `no request ${rid} for message type ${mt}`));\n }\n }\n\n private processResponse(p: PendingRequest, mt: MessageType, msg: ValueMap): void {\n switch (mt) {\n case MessageType.FunctionResponse: {\n p.unary?.resolve(this.protocol.result(msg));\n this.pending.delete(p.requestId);\n break;\n }\n case MessageType.ErrorResponse: {\n const { code, message } = this.protocol.errorOf(msg);\n p.fail(new VrpcError(code, message || \"server error\"));\n this.pending.delete(p.requestId);\n break;\n }\n case MessageType.StreamReady: {\n p.ready.resolve();\n break;\n }\n case MessageType.StreamValue: {\n const v = this.protocol.streamVal(msg);\n if (v === null || !p.queue) break;\n if (!p.queue.push(v)) {\n if (!p.queue.isEnded) {\n // The server ignored its credit and overran the window.\n const err = new VrpcError(\n Code.ResourceExhausted,\n `stream ${p.requestId} truncated: server exceeded flow-control credit`,\n );\n this.cancelRequest(p.requestId);\n p.fail(err);\n this.pending.delete(p.requestId);\n }\n }\n break;\n }\n case MessageType.StreamEnd: {\n const v = this.protocol.streamVal(msg);\n if (v !== null && p.queue) p.queue.push(v);\n p.queue?.end();\n p.getClosed = true;\n p.ready.resolve(); // a stream may legally end before delivering values\n if (p.kind !== \"chat\" || p.putClosed) this.pending.delete(p.requestId);\n break;\n }\n case MessageType.CancelRequest: {\n p.finish();\n this.pending.delete(p.requestId);\n break;\n }\n case MessageType.StreamCredit: {\n const cr = this.protocol.credit(msg);\n if (cr !== undefined) p.sendCredit?.grant(cr);\n break;\n }\n default:\n this.emit(\"error\", new VrpcError(Code.Internal, `unsupported message type ${mt}`));\n }\n }\n\n // ------------------------------------------------------- reverse serving\n\n private handlerCtx(sr: ServingRequest, msg: ValueMap): HandlerContext {\n return {\n requestId: sr.requestId,\n metadata: this.protocol.metadata(msg),\n signal: sr.abort.signal,\n };\n }\n\n private serveInboundCall(msg: ValueMap): void {\n const rid = this.protocol.requestId(msg);\n if (rid === undefined) {\n this.emit(\"error\", new VrpcError(Code.Internal, \"reverse call without request id\"));\n return;\n }\n const name = this.protocol.functionName(msg);\n if (name === undefined) {\n this.trySendFrame(this.protocol.errorResponse(rid, Code.InvalidArgument, \"function name field not found\"));\n return;\n }\n const h = this.handlers.get(name);\n if (!h) {\n this.trySendFrame(this.protocol.errorResponse(rid, Code.NotFound, `function not found ${name}`));\n return;\n }\n if (h.kind !== \"unary\") {\n this.trySendFrame(this.protocol.errorResponse(rid, Code.InvalidArgument, `function '${name}' is not unary`));\n return;\n }\n const sr = new ServingRequest(rid, \"unary\", 1);\n const args = this.protocol.args(msg);\n void (async () => {\n try {\n const res = await (h.fn as UnaryHandler)(args, this.handlerCtx(sr, msg));\n this.trySendFrame(this.protocol.functionResult(rid, res ?? null));\n } catch (err) {\n this.trySendFrame(\n this.protocol.errorResponse(rid, handlerCode(err), `function ${name}: ${errMessage(err)}`),\n );\n }\n })();\n }\n\n private serveInboundStream(mt: MessageType, msg: ValueMap): void {\n const rid = this.protocol.requestId(msg);\n if (rid === undefined) {\n this.emit(\"error\", new VrpcError(Code.Internal, \"reverse stream without request id\"));\n return;\n }\n const name = this.protocol.functionName(msg);\n if (name === undefined) {\n this.trySendFrame(this.protocol.errorResponse(rid, Code.InvalidArgument, \"function name field not found\"));\n return;\n }\n const wanted: HandlerKind =\n mt === MessageType.GetStreamRequest ? \"out\" : mt === MessageType.PutStreamRequest ? \"in\" : \"chat\";\n const h = this.handlers.get(name);\n if (!h) {\n this.trySendFrame(this.protocol.errorResponse(rid, Code.NotFound, `function not found ${name}`));\n return;\n }\n if (h.kind !== wanted) {\n this.trySendFrame(this.protocol.errorResponse(rid, Code.InvalidArgument, `function '${name}' wrong stream type`));\n return;\n }\n\n const sr = new ServingRequest(rid, wanted, this.maxPending);\n this.serving.set(rid, sr);\n const args = this.protocol.args(msg);\n const ctx = this.handlerCtx(sr, msg);\n\n // Inbound side (in/chat): grant the initial window immediately — the\n // request is registered, so a racing first value cannot be lost.\n if (sr.inQueue) {\n sr.onConsume = () => {\n sr.delivered++;\n const batch = Math.max(1, Math.floor(sr.window / 2));\n if (sr.delivered >= batch) {\n const n = sr.delivered;\n sr.delivered = 0;\n this.trySendFrame(this.protocol.streamCredit(rid, n));\n }\n };\n this.trySendFrame(this.protocol.streamCredit(rid, sr.window));\n }\n\n const incoming = sr.inQueue ? queueIterator(sr.inQueue) : emptyIterator();\n\n void (async () => {\n try {\n if (wanted === \"in\") {\n this.trySendFrame(this.protocol.streamReady(rid));\n await (h.fn as IncomingStreamHandler)(args, incoming, ctx);\n return;\n }\n const iterable = await (h.fn as OutgoingStreamHandler | ChatHandler)(args, incoming as never, ctx);\n this.trySendFrame(this.protocol.streamReady(rid));\n for await (const v of iterable as AsyncIterable<Value>) {\n const gate = sr.sendCredit as CreditGate;\n const ok = await gate.acquire();\n if (!ok || sr.closed) return;\n this.trySendFrame(this.protocol.streamValue(rid, v));\n }\n this.trySendFrame(this.protocol.streamEnd(rid));\n } catch (err) {\n if (!sr.closed) {\n this.trySendFrame(\n this.protocol.errorResponse(rid, handlerCode(err), `${kindLabel(wanted)} ${name}: ${errMessage(err)}`),\n );\n }\n } finally {\n // For chat/out, our output finishing is the terminal event (mirrors\n // the Go responder). For \"in\" the terminal is the peer's StreamEnd,\n // handled in serveRunning; a handler that returns early just stops\n // consuming.\n if (wanted !== \"in\") {\n this.serving.delete(rid);\n sr.close();\n }\n }\n })();\n }\n\n private serveRunning(sr: ServingRequest, mt: MessageType, msg: ValueMap): void {\n switch (mt) {\n case MessageType.CancelRequest: {\n this.serving.delete(sr.requestId);\n sr.close();\n break;\n }\n case MessageType.StreamValue: {\n const v = this.protocol.streamVal(msg);\n if (v === null || !sr.inQueue) break;\n if (!sr.inQueue.push(v) && !sr.inQueue.isEnded) {\n this.trySendFrame(\n this.protocol.errorResponse(\n sr.requestId,\n Code.ResourceExhausted,\n `inbound stream ${sr.requestId} truncated: peer exceeded flow-control credit`,\n ),\n );\n this.serving.delete(sr.requestId);\n sr.close();\n }\n break;\n }\n case MessageType.StreamEnd: {\n const v = this.protocol.streamVal(msg);\n if (v !== null && sr.inQueue) sr.inQueue.push(v);\n sr.inQueue?.end();\n // For chat the peer ending its input must not tear down our output.\n if (sr.kind !== \"chat\") this.serving.delete(sr.requestId);\n break;\n }\n case MessageType.StreamCredit: {\n const cr = this.protocol.credit(msg);\n if (cr !== undefined) sr.sendCredit?.grant(cr);\n break;\n }\n case MessageType.ErrorResponse: {\n const { code, message } = this.protocol.errorOf(msg);\n this.emit(\"error\", new VrpcError(code, `reverse stream ${sr.requestId}: ${message}`));\n this.serving.delete(sr.requestId);\n sr.close();\n break;\n }\n default:\n this.emit(\"error\", new VrpcError(Code.Internal, `unsupported message type ${mt} for serving request`));\n }\n }\n}\n\nfunction handlerCode(err: unknown): Code {\n const c = codeOf(err);\n return c === Code.Unknown ? Code.Internal : c;\n}\n\nfunction errMessage(err: unknown): string {\n if (err instanceof VrpcError) return err.detail;\n if (err instanceof Error) return err.message;\n return String(err);\n}\n\nfunction kindLabel(kind: HandlerKind): string {\n switch (kind) {\n case \"out\":\n return \"out stream\";\n case \"in\":\n return \"in stream\";\n case \"chat\":\n return \"chat\";\n default:\n return \"function\";\n }\n}\n\nfunction queueIterator(q: AsyncValueQueue<Value>): AsyncIterableIterator<Value> {\n return {\n next: () => q.next(),\n async return(value?: Value): Promise<IteratorResult<Value>> {\n q.abort();\n return { value: value as Value, done: true };\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\nfunction emptyIterator(): AsyncIterableIterator<Value> {\n return {\n next: () => Promise.resolve({ value: undefined as never, done: true }),\n [Symbol.asyncIterator]() {\n return this;\n },\n };\n}\n\n/** Creates a {@link VrpcClient}. The client connects lazily on first call. */\nexport function createClient(options: ClientOptions): VrpcClient {\n return new VrpcClient(options);\n}\n","/*\n * Copyright (c) 2026 Karagatan LLC.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Typed calls without codegen — the TS analogue of valuerpc.Codec[T] /\n * CallUnary. Describe your API as an interface and get compile-time checked\n * method names, argument tuples, and result types:\n *\n * ```ts\n * interface Api {\n * \"user.get\": { args: [id: number]; result: User };\n * \"events.tail\": { args: [topic: string]; stream: OrderEvent };\n * \"logs.upload\": { args: []; put: string };\n * \"support.chat\": { args: [ticket: number]; in: Message; out: string };\n * }\n * const api = typedClient<Api>(client);\n * const user = await api.call(\"user.get\", [42]);\n * for await (const ev of api.getStream(\"events.tail\", [\"orders\"])) { ... }\n * ```\n */\n\nimport type { CallOptions, VrpcChat, VrpcClient, VrpcStream } from \"./client.js\";\nimport type { Value } from \"./value.js\";\n\nexport interface UnaryShape {\n args: Value[];\n result: unknown;\n}\nexport interface GetStreamShape {\n args: Value[];\n stream: unknown;\n}\nexport interface PutStreamShape {\n args: Value[];\n put: unknown;\n}\nexport interface ChatShape {\n args: Value[];\n in: unknown;\n out: unknown;\n}\n\nexport type ApiShape = Record<string, UnaryShape | GetStreamShape | PutStreamShape | ChatShape>;\n\ntype UnaryNames<A extends ApiShape> = { [K in keyof A]: A[K] extends UnaryShape ? K : never }[keyof A];\ntype GetNames<A extends ApiShape> = { [K in keyof A]: A[K] extends GetStreamShape ? K : never }[keyof A];\ntype PutNames<A extends ApiShape> = { [K in keyof A]: A[K] extends PutStreamShape ? K : never }[keyof A];\ntype ChatNames<A extends ApiShape> = { [K in keyof A]: A[K] extends ChatShape ? K : never }[keyof A];\n\nexport interface TypedStream<T> extends AsyncIterableIterator<T> {\n readonly requestId: number;\n readonly ready: Promise<void>;\n cancel(): void;\n}\n\nexport interface TypedChat<TIn, TOut> extends AsyncIterable<TIn> {\n readonly requestId: number;\n readonly ready: Promise<void>;\n readonly incoming: AsyncIterableIterator<TIn>;\n send(v: TOut): Promise<void>;\n end(): void;\n cancel(): void;\n}\n\nexport interface TypedClient<A extends ApiShape> {\n call<K extends UnaryNames<A>>(\n name: K,\n args: A[K] extends UnaryShape ? A[K][\"args\"] : never,\n opts?: CallOptions,\n ): Promise<A[K] extends UnaryShape ? A[K][\"result\"] : never>;\n\n getStream<K extends GetNames<A>>(\n name: K,\n args: A[K] extends GetStreamShape ? A[K][\"args\"] : never,\n opts?: CallOptions,\n ): TypedStream<A[K] extends GetStreamShape ? A[K][\"stream\"] : never>;\n\n putStream<K extends PutNames<A>>(\n name: K,\n args: A[K] extends PutStreamShape ? A[K][\"args\"] : never,\n source: A[K] extends PutStreamShape\n ? Iterable<A[K][\"put\"]> | AsyncIterable<A[K][\"put\"]>\n : never,\n opts?: CallOptions,\n ): Promise<void>;\n\n chat<K extends ChatNames<A>>(\n name: K,\n args: A[K] extends ChatShape ? A[K][\"args\"] : never,\n opts?: CallOptions,\n ): TypedChat<\n A[K] extends ChatShape ? A[K][\"in\"] : never,\n A[K] extends ChatShape ? A[K][\"out\"] : never\n >;\n\n readonly client: VrpcClient;\n}\n\n/** Wraps a client with a compile-time-typed API surface (zero runtime cost). */\nexport function typedClient<A extends ApiShape>(client: VrpcClient): TypedClient<A> {\n return {\n client,\n call: (name, args, opts) => client.call(name as string, args as Value, opts) as never,\n getStream: (name, args, opts) =>\n client.getStream(name as string, args as Value, opts) as VrpcStream as never,\n putStream: (name, args, source, opts) =>\n client.putStream(name as string, args as Value, source as Iterable<Value>, opts),\n chat: (name, args, opts) => client.chat(name as string, args as Value, opts) as VrpcChat as never,\n };\n}\n"],"mappings":"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","names":["Code","MessageType","window"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arpabet/vrpc",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "value-rpc client for browsers and Node: msgpack/JSON codecs, streams with credit flow control, reconnect with hash-chain resumption, reverse calls",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"typecheck": "tsc --noEmit"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@types/node": "^26.1.0",
|
|
25
|
+
"tsup": "^8.3.0",
|
|
26
|
+
"typescript": "^5.6.0",
|
|
27
|
+
"vitest": "^4.1.10"
|
|
28
|
+
},
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=22"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"rpc",
|
|
34
|
+
"websocket",
|
|
35
|
+
"msgpack",
|
|
36
|
+
"streaming",
|
|
37
|
+
"value-rpc",
|
|
38
|
+
"vue",
|
|
39
|
+
"nuxt"
|
|
40
|
+
],
|
|
41
|
+
"publishConfig": {
|
|
42
|
+
"access": "public"
|
|
43
|
+
},
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "https://github.com/arpabet/value-rpc-js.git",
|
|
47
|
+
"directory": "packages/vrpc"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"happy-dom": "20.11.0"
|
|
51
|
+
}
|
|
52
|
+
}
|