twinwire 0.0.0-stage → 1.0.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/CHANGELOG.md +29 -0
- package/LICENSE +21 -0
- package/README.md +128 -2
- package/dist/browser/twinwire.js +2075 -0
- package/dist/browser/twinwire.js.map +7 -0
- package/dist/browser/twinwire.min.js +1 -0
- package/dist/browser/twinwire.mjs +2052 -0
- package/dist/browser/twinwire.mjs.map +7 -0
- package/dist/browser.d.ts +5 -0
- package/dist/browser.js +6 -0
- package/dist/browser.js.map +1 -0
- package/dist/client/client.d.ts +128 -0
- package/dist/client/client.js +470 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/lobby.d.ts +40 -0
- package/dist/client/lobby.js +122 -0
- package/dist/client/lobby.js.map +1 -0
- package/dist/client/rtc.d.ts +17 -0
- package/dist/client/rtc.js +102 -0
- package/dist/client/rtc.js.map +1 -0
- package/dist/core/budget.d.ts +27 -0
- package/dist/core/budget.js +39 -0
- package/dist/core/budget.js.map +1 -0
- package/dist/core/endpoint.d.ts +144 -0
- package/dist/core/endpoint.js +501 -0
- package/dist/core/endpoint.js.map +1 -0
- package/dist/core/lobby.d.ts +59 -0
- package/dist/core/lobby.js +53 -0
- package/dist/core/lobby.js.map +1 -0
- package/dist/core/protocol.d.ts +52 -0
- package/dist/core/protocol.js +100 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/reliable.d.ts +52 -0
- package/dist/core/reliable.js +116 -0
- package/dist/core/reliable.js.map +1 -0
- package/dist/core/rtc.d.ts +28 -0
- package/dist/core/rtc.js +21 -0
- package/dist/core/rtc.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/netcode/clock.d.ts +15 -0
- package/dist/netcode/clock.js +37 -0
- package/dist/netcode/clock.js.map +1 -0
- package/dist/netcode/codec.d.ts +10 -0
- package/dist/netcode/codec.js +95 -0
- package/dist/netcode/codec.js.map +1 -0
- package/dist/netcode/index.d.ts +9 -0
- package/dist/netcode/index.js +10 -0
- package/dist/netcode/index.js.map +1 -0
- package/dist/netcode/inputs.d.ts +7 -0
- package/dist/netcode/inputs.js +43 -0
- package/dist/netcode/inputs.js.map +1 -0
- package/dist/netcode/interpolation.d.ts +44 -0
- package/dist/netcode/interpolation.js +101 -0
- package/dist/netcode/interpolation.js.map +1 -0
- package/dist/netcode/prediction.d.ts +40 -0
- package/dist/netcode/prediction.js +97 -0
- package/dist/netcode/prediction.js.map +1 -0
- package/dist/netcode/replication.d.ts +36 -0
- package/dist/netcode/replication.js +90 -0
- package/dist/netcode/replication.js.map +1 -0
- package/dist/netcode/snapshots.d.ts +29 -0
- package/dist/netcode/snapshots.js +78 -0
- package/dist/netcode/snapshots.js.map +1 -0
- package/dist/netcode/spatial.d.ts +16 -0
- package/dist/netcode/spatial.js +63 -0
- package/dist/netcode/spatial.js.map +1 -0
- package/dist/netcode/timing.d.ts +37 -0
- package/dist/netcode/timing.js +41 -0
- package/dist/netcode/timing.js.map +1 -0
- package/dist/server/index.d.ts +4 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lobby.d.ts +134 -0
- package/dist/server/lobby.js +462 -0
- package/dist/server/lobby.js.map +1 -0
- package/dist/server/rtc.d.ts +38 -0
- package/dist/server/rtc.js +102 -0
- package/dist/server/rtc.js.map +1 -0
- package/dist/server/server.d.ts +145 -0
- package/dist/server/server.js +457 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/turn.d.ts +22 -0
- package/dist/server/turn.js +52 -0
- package/dist/server/turn.js.map +1 -0
- package/docs/ADOPTING.md +64 -0
- package/docs/API.md +181 -0
- package/docs/ARCHITECTURE.md +101 -0
- package/docs/OPERATIONS.md +93 -0
- package/docs/RELEASE-CHECKLIST.md +25 -0
- package/package.json +100 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/browser.ts", "../../src/core/budget.ts", "../../src/core/protocol.ts", "../../src/core/reliable.ts", "../../src/core/endpoint.ts", "../../src/core/rtc.ts", "../../src/netcode/clock.ts", "../../src/client/rtc.ts", "../../src/client/client.ts", "../../src/core/lobby.ts", "../../src/client/lobby.ts", "../../src/netcode/timing.ts", "../../src/netcode/interpolation.ts", "../../src/netcode/prediction.ts", "../../src/netcode/spatial.ts", "../../src/netcode/codec.ts", "../../src/netcode/replication.ts", "../../src/netcode/inputs.ts", "../../src/netcode/snapshots.ts"],
|
|
4
|
+
"sourcesContent": ["/** Everything a browser page needs, for a script tag or a single-file build: window.Twinwire. */\nexport * from './client/index.js';\nexport * from './netcode/index.js';\nexport { LOBBY_KEY, normalizeCode, cleanName } from './core/lobby.js';\nexport { VERSION, MTU_STATE_BYTES, DEFAULT_STATE_BYTES } from './core/protocol.js';\n", "export class TokenBucket {\n private tokens: number;\n private at: number;\n constructor(readonly rate: number, readonly capacity: number, now: number) {\n if (!(rate > 0) || !Number.isFinite(rate) || !(capacity > 0) || !Number.isFinite(capacity)) throw new RangeError('Invalid budget');\n this.tokens = capacity; this.at = now;\n }\n available(now: number): number {\n this.tokens = Math.min(this.capacity, this.tokens + Math.max(0, now - this.at) * this.rate / 1000);\n this.at = Math.max(this.at, now); return this.tokens;\n }\n /** A message larger than the burst may go once the bucket is full; the debt then delays what follows. */\n take(bytes: number, now: number): boolean {\n if (!Number.isFinite(bytes) || bytes < 0) throw new RangeError('Invalid byte count');\n if (this.available(now) < Math.min(bytes, this.capacity)) return false;\n this.tokens -= bytes; return true;\n }\n}\nexport interface EgressEstimate { payloadGB: number; plannedGB: number; bill: number; withinBudget: boolean }\n/** Planning estimate, not a bill or a hard cap. Provider prices/allowances are supplied by the caller. */\nexport function estimateEgress(o: {\n bytesPerSecondPerPlayer: number; averagePlayers: number; activeHours: number;\n baseMonthlyUSD: number; includedGB: number; overageUSDPerGB: number; budgetUSD?: number; overheadFraction?: number;\n}): EgressEstimate {\n for (const v of Object.values(o)) if (!Number.isFinite(v) || v < 0) throw new RangeError('Invalid cost input');\n const payloadGB = o.bytesPerSecondPerPlayer * o.averagePlayers * o.activeHours * 3600 / 1e9;\n const plannedGB = payloadGB * (1 + (o.overheadFraction ?? 0.2));\n const bill = o.baseMonthlyUSD + Math.max(0, plannedGB - o.includedGB) * o.overageUSDPerGB;\n return { payloadGB, plannedGB, bill, withinBudget: bill <= (o.budgetUSD ?? 5) };\n}\n", "/** Versioned binary frames. All integer fields are little-endian. */\nexport const VERSION = 3;\nexport const HEADER_BYTES = 22;\n/** A payload this size or smaller fits one datagram on any path we target (no SCTP/IP fragmentation). */\nexport const MTU_STATE_BYTES = 1100 - HEADER_BYTES;\n/** Hard protocol ceiling for one frame. Endpoints choose a lower `maxStateBytes`. */\nexport const MAX_FRAME_BYTES = 256 * 1024;\nexport const MAX_STATE_BYTES = MAX_FRAME_BYTES - HEADER_BYTES;\nexport const DEFAULT_STATE_BYTES = 64 * 1024;\n/** Upper bound of one JSON control/event message on the WebSocket. */\nexport const MAX_CONTROL_BYTES = 128 * 1024;\n/** Kept for API compatibility: the largest datagram that avoids fragmentation. */\nexport const MAX_DATAGRAM_BYTES = 1100;\nconst MAGIC = 0x5754; // \"TW\"\n/**\n * state: latest-wins application bytes. stateAcked: the same, and the receiver reports the newest seq it saw (kind sack).\n * probe/reply: datagram liveness. events: reliable events mirrored on the datagram path (seq field = receiver ack).\n */\nexport const FrameKind = { state: 1, probe: 2, reply: 3, events: 4, sack: 5, stateAcked: 6 } as const;\nexport type FrameKind = typeof FrameKind[keyof typeof FrameKind];\nconst KINDS = new Set<number>(Object.values(FrameKind));\nexport type Json = null | boolean | number | string | Json[] | { [key: string]: Json };\nexport interface Frame {\n kind: FrameKind; epoch: number; stream: number; seq: number; time: number; payload: Uint8Array;\n}\nexport const isUint = (v: unknown, max = 0xffffffff): v is number =>\n typeof v === 'number' && Number.isInteger(v) && v >= 0 && v <= max;\nconst empty = (k: number) => k === FrameKind.probe || k === FrameKind.reply;\nconst streamed = (k: number) => k === FrameKind.state || k === FrameKind.stateAcked;\nexport function encodeFrame(f: Frame): Uint8Array {\n if (!KINDS.has(f.kind) || !isUint(f.epoch) || !f.epoch || !isUint(f.stream, 65535) ||\n !isUint(f.seq) || !Number.isFinite(f.time) || f.payload.length > MAX_STATE_BYTES ||\n (empty(f.kind) && f.payload.length !== 0) || (!streamed(f.kind) && f.stream !== 0)) throw new RangeError('Invalid frame');\n const b = new Uint8Array(HEADER_BYTES + f.payload.length), v = new DataView(b.buffer);\n v.setUint16(0, MAGIC, true); v.setUint8(2, VERSION); v.setUint8(3, f.kind);\n v.setUint32(4, f.epoch, true); v.setUint16(8, f.stream, true);\n v.setUint32(10, f.seq, true); v.setFloat64(14, f.time, true); b.set(f.payload, HEADER_BYTES);\n return b;\n}\nexport function decodeFrame(b: Uint8Array, maxBytes = MAX_FRAME_BYTES): Frame | null {\n if (b.byteLength < HEADER_BYTES || b.byteLength > Math.min(maxBytes, MAX_FRAME_BYTES)) return null;\n const v = new DataView(b.buffer, b.byteOffset, b.byteLength);\n if (v.getUint16(0, true) !== MAGIC || v.getUint8(2) !== VERSION) return null;\n const kind = v.getUint8(3), epoch = v.getUint32(4, true), time = v.getFloat64(14, true), stream = v.getUint16(8, true);\n if (!KINDS.has(kind) || !epoch || !Number.isFinite(time) ||\n (empty(kind) && b.byteLength !== HEADER_BYTES) || (!streamed(kind) && stream !== 0)) return null;\n return { kind: kind as FrameKind, epoch, stream, seq: v.getUint32(10, true), time, payload: b.slice(HEADER_BYTES) };\n}\n/** RFC-1982-style comparison. Live windows must be smaller than half the sequence space. */\nexport function newer(a: number, b: number): boolean { return a !== b && ((a - b) >>> 0) < 0x80000000; }\nexport function record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nconst encoder = new TextEncoder(), decoder = new TextDecoder();\nexport const utf8 = (s: string) => encoder.encode(s);\nexport const fromUtf8 = (b: Uint8Array) => decoder.decode(b);\n/** UTF-8 byte length without allocating. */\nexport function utf8Length(s: string): number {\n let n = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c < 0x80) n += 1; else if (c < 0x800) n += 2;\n else if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) { n += 4; i++; } else n += 3;\n }\n return n;\n}\nexport function readControl(raw: string, maxBytes = MAX_CONTROL_BYTES): Record<string, unknown> | null {\n if (raw.length > maxBytes || utf8Length(raw) > maxBytes) return null;\n try { const m: unknown = JSON.parse(raw); return record(m) && typeof m.t === 'string' ? m : null; } catch { return null; }\n}\n/** Standard JSON semantics, as games expect from JSON.stringify: undefined, functions and symbols inside objects are\n * left out (null in arrays) and NaN/Infinity become null. A top-level value that isn't JSON, a BigInt or an oversized\n * result throws. */\nexport function stringify(value: unknown, maxBytes = MAX_CONTROL_BYTES): string {\n const s = JSON.stringify(value) as string | undefined;\n if (s === undefined) throw new TypeError('Value is not JSON');\n if (utf8Length(s) > maxBytes) throw new RangeError('Control frame too large');\n return s;\n}\n", "import { stringify, utf8Length, type Json } from './protocol.js';\nexport interface PendingEvent { seq: number; data: Json; bytes: number; text: string; datagramAt: number; datagramTries: number }\nexport interface ReliableCheckpoint { next: number; received: number; acknowledged: number; pending: { seq: number; data: Json }[] }\nexport interface ReliableOptions { maxEvents?: number; maxBytes?: number; maxEventBytes?: number; maxEarly?: number }\n/** Ordered event delivery with replay/deduplication within a retained logical session.\n * Copies may arrive on two paths (WebSocket and datagrams), so early events wait in a bounded buffer.\n * An ACK means the synchronous receiver accepted the event, NOT that a database transaction committed. */\nexport class ReliableEvents {\n private next = 1;\n received = 0;\n acknowledged = 0;\n private highestSent = 0;\n private bytes = 0;\n private pending = new Map<number, PendingEvent>();\n private early = new Map<number, Json>();\n readonly maxEvents: number;\n readonly maxBytes: number;\n readonly maxEventBytes: number;\n readonly maxEarly: number;\n constructor(o: ReliableOptions | number = {}, maxBytes?: number) {\n const opts: ReliableOptions = typeof o === 'number' ? { maxEvents: o, maxBytes } : o;\n this.maxEvents = opts.maxEvents ?? 512; this.maxBytes = opts.maxBytes ?? 1024 * 1024;\n this.maxEventBytes = opts.maxEventBytes ?? 64 * 1024; this.maxEarly = opts.maxEarly ?? 256;\n if (![this.maxEvents, this.maxBytes, this.maxEventBytes, this.maxEarly].every(v => Number.isInteger(v) && v > 0)) throw new RangeError('Invalid event limits');\n }\n push(data: Json): number {\n const text = stringify(data, this.maxEventBytes), bytes = utf8Length(text) + 64;\n if (bytes > this.maxEventBytes + 64) throw new RangeError('Event payload too large');\n if (this.pending.size >= this.maxEvents || this.bytes + bytes > this.maxBytes) throw new Error('Reliable outbox full');\n if (!Number.isSafeInteger(this.next + 1)) throw new Error('Reliable sequence exhausted');\n const seq = this.next++;\n this.pending.set(seq, { seq, data: JSON.parse(text) as Json, bytes, text, datagramAt: -Infinity, datagramTries: 0 }); this.bytes += bytes; return seq;\n }\n get size() { return this.pending.size; }\n get queuedBytes() { return this.bytes; }\n get sentThrough() { return this.highestSent; }\n entries(): IterableIterator<PendingEvent> { return this.pending.values(); }\n sent(seq: number) { this.highestSent = Math.max(this.highestSent, seq); }\n ack(seq: number): boolean {\n if (!Number.isSafeInteger(seq) || seq < 0 || seq > this.highestSent) throw new Error('Invalid event acknowledgement');\n if (seq <= this.acknowledged) return false;\n this.acknowledged = seq;\n for (const [id, e] of this.pending) { if (id > seq) break; this.pending.delete(id); this.bytes -= e.bytes; }\n return true;\n }\n /** Returns how many events were delivered. Early events wait (bounded); duplicates are dropped. */\n receive(seq: number, data: Json, deliver: (data: Json, seq: number) => void): number {\n if (!Number.isSafeInteger(seq) || seq < 1) throw new Error('Invalid event sequence');\n if (seq <= this.received) return 0;\n if (seq !== this.received + 1) {\n if (seq - this.received > this.maxEarly) throw new Error('Event sequence gap');\n if (!this.early.has(seq)) this.early.set(seq, data);\n return 0;\n }\n deliver(data, seq); this.received = seq;\n let n = 1;\n for (let s = seq + 1; this.early.has(s); s++) {\n deliver(this.early.get(s) as Json, s); this.early.delete(s); this.received = s; n++;\n }\n for (const s of this.early.keys()) if (s <= this.received) this.early.delete(s);\n return n;\n }\n checkpoint(): ReliableCheckpoint {\n return { next: this.next, received: this.received, acknowledged: this.acknowledged,\n pending: Array.from(this.pending.values(), e => ({ seq: e.seq, data: structuredClone(e.data) })) };\n }\n restore(s: ReliableCheckpoint): void {\n if (this.next !== 1 || this.received || this.pending.size) throw new Error('Restore requires a fresh channel');\n if (![s.next, s.received, s.acknowledged].every(v => Number.isSafeInteger(v) && v >= 0) ||\n s.next < 1 || s.acknowledged >= s.next || !Array.isArray(s.pending) || s.pending.length > this.maxEvents)\n throw new Error('Invalid checkpoint');\n if (s.pending.length !== s.next - s.acknowledged - 1) throw new Error('Incomplete checkpoint');\n const saved: PendingEvent[] = []; let total = 0, expected = s.acknowledged + 1;\n for (const e of s.pending) {\n if (e.seq !== expected++) throw new Error('Invalid checkpoint sequence');\n const text = stringify(e.data, this.maxEventBytes), bytes = utf8Length(text) + 64;\n saved.push({ seq: e.seq, data: JSON.parse(text) as Json, bytes, text, datagramAt: -Infinity, datagramTries: 0 }); total += bytes;\n }\n if (total > this.maxBytes) throw new Error('Checkpoint exceeds outbox limit');\n this.next = s.next; this.received = s.received; this.acknowledged = s.acknowledged; this.highestSent = s.next - 1;\n this.pending = new Map(saved.map(e => [e.seq, e])); this.bytes = total;\n }\n}\n", "import { TokenBucket } from './budget.js';\nimport { ReliableEvents, type ReliableOptions } from './reliable.js';\nimport {\n decodeFrame, encodeFrame, FrameKind, DEFAULT_STATE_BYTES, HEADER_BYTES, MAX_STATE_BYTES, MTU_STATE_BYTES, newer, stringify,\n isUint, utf8, fromUtf8, utf8Length, type Frame, type Json,\n} from './protocol.js';\nexport interface ReliableLink {\n readonly open: boolean; readonly bufferedAmount: number;\n send(data: string | Uint8Array): boolean; close(): void;\n}\nexport interface DatagramLink {\n readonly open: boolean; readonly bufferedAmount: number;\n send(data: Uint8Array): boolean; close(): void;\n}\nexport interface StateMessage { stream: number; seq: number; time: number; data: Uint8Array; via: 'ws' | 'rtc' }\n/** Simulated network trouble on this endpoint's outgoing traffic (tests and tuning). lagMs is one way. */\nexport interface Impairment { lagMs?: number; jitterMs?: number; loss?: number; duplicate?: number }\nexport interface StateOptions { ttlMs?: number; priority?: number; ack?: boolean }\ninterface QueuedState { frame: Frame; deadline: number; first: number; priority: number }\nexport interface EndpointOptions {\n now?: () => number; bytesPerSecond?: number; burstBytes?: number; maxBufferedBytes?: number;\n maxStreams?: number; probeIntervalMs?: number; probeTimeoutMs?: number;\n /** Largest state payload accepted (default 64 KiB, at most 256 KiB). */\n maxStateBytes?: number;\n /** States larger than this use the WebSocket even when datagrams are up (default 8 KiB). */\n datagramStateBytes?: number;\n /** Mirror reliable events on the datagram path so they arrive at UDP latency (default true). */\n datagramEvents?: boolean;\n /** How often state acknowledgements go back to the sender (default 50 ms). */\n stateAckIntervalMs?: number;\n events?: ReliableOptions;\n impair?: Impairment;\n}\nconst DATAGRAM_EVENT_BYTES = 960;\nexport class Endpoint {\n readonly events: ReliableEvents;\n readonly stats = { bytesSent: 0, bytesReceived: 0, statesSent: 0, statesReceived: 0,\n stale: 0, expired: 0, coalesced: 0, congested: 0, invalid: 0, fastTransitions: 0, datagramRttMs: 0,\n eventsViaDatagram: 0, datagramEventFrames: 0, stateAcksSent: 0, stateAcksReceived: 0, impairedDrops: 0 };\n onState: (state: StateMessage) => void = () => {};\n onEvent: (data: Json, seq: number) => void = () => {};\n onFastDown: () => void = () => {};\n onFastChange: (fast: boolean) => void = () => {};\n onEventAck: (seq: number) => void = () => {};\n /** The peer has seen state `seq` on `stream` (only for states sent with `ack: true`). */\n onStateAck: (stream: number, seq: number) => void = () => {};\n private reliable?: ReliableLink;\n private datagram?: DatagramLink;\n private epoch = 0;\n private sequence = new Map<number, number>();\n private received = new Map<number, number>();\n private queued = new Map<number, QueuedState>();\n private acksOut = new Map<number, number>();\n private acksIn = new Map<number, number>();\n private lastAckSentAt = -Infinity;\n private lastEventSent = 0;\n private datagramAcked = 0;\n private ackDue = false;\n private lastProbe = -Infinity;\n private proofAt = -Infinity;\n private attachedAt = 0;\n private probes = new Map<number, number>();\n private probeSeq = 0;\n private fast = false;\n readonly now: () => number;\n private budget: TokenBucket;\n private highWater: number;\n private maxStreams: number;\n private probeInterval: number;\n private probeTimeout: number;\n readonly maxStateBytes: number;\n private datagramStateBytes: number;\n private datagramEvents: boolean;\n private stateAckInterval: number;\n private impairment?: Impairment;\n constructor(o: EndpointOptions = {}) {\n this.now = o.now ?? (() => performance.now());\n const rate = o.bytesPerSecond ?? 32 * 1024;\n this.budget = new TokenBucket(rate, o.burstBytes ?? Math.max(rate / 2, 16 * 1024), this.now());\n this.highWater = o.maxBufferedBytes ?? 64 * 1024; this.maxStreams = o.maxStreams ?? 1024;\n this.probeInterval = o.probeIntervalMs ?? 250; this.probeTimeout = o.probeTimeoutMs ?? 1500;\n this.maxStateBytes = o.maxStateBytes ?? DEFAULT_STATE_BYTES;\n this.datagramStateBytes = o.datagramStateBytes ?? 8 * 1024;\n this.datagramEvents = o.datagramEvents ?? true;\n this.stateAckInterval = o.stateAckIntervalMs ?? 50;\n this.events = new ReliableEvents(o.events);\n if (!(this.highWater > 0) || !isUint(this.maxStreams, 65536) || this.maxStreams < 1 ||\n !(this.probeInterval >= 10) || !(this.probeTimeout >= this.probeInterval * 2) ||\n !isUint(this.maxStateBytes, MAX_STATE_BYTES) || this.maxStateBytes < 1 ||\n !(this.datagramStateBytes >= MTU_STATE_BYTES) || !(this.stateAckInterval >= 0)) throw new RangeError('Invalid endpoint limits');\n if (o.impair) this.setImpairment(o.impair);\n }\n get active() { return !!this.reliable?.open; }\n get fastActive() { return this.fast && !!this.datagram?.open && this.now() - this.proofAt <= this.probeTimeout; }\n get pendingStates() { return this.queued.size; }\n get connectionEpoch() { return this.epoch; }\n get maxFrameBytes() { return this.maxStateBytes + HEADER_BYTES; }\n /** Newest seq the peer reported for an acknowledged stream in this connection epoch. */\n stateAck(stream: number): number | undefined { return this.acksIn.get(stream); }\n setImpairment(i: Impairment | null): void {\n if (!i) { this.impairment = undefined; return; }\n const { lagMs = 0, jitterMs = 0, loss = 0, duplicate = 0 } = i;\n if (![lagMs, jitterMs].every(v => Number.isFinite(v) && v >= 0 && v <= 10000) ||\n ![loss, duplicate].every(v => Number.isFinite(v) && v >= 0 && v <= 1)) throw new RangeError('Invalid impairment');\n this.impairment = lagMs || jitterMs || loss || duplicate ? { lagMs, jitterMs, loss, duplicate } : undefined;\n }\n get impaired(): Impairment | undefined { return this.impairment && { ...this.impairment }; }\n attach(epoch: number, reliable: ReliableLink): void {\n if (!isUint(epoch) || !epoch) throw new Error('Invalid epoch');\n this.detach(); this.epoch = epoch; this.reliable = this.impairReliable(reliable);\n this.ackDue = this.events.received > 0; this.lastEventSent = this.events.acknowledged; this.datagramAcked = 0;\n this.sequence.clear(); this.received.clear(); this.acksOut.clear(); this.acksIn.clear();\n for (const e of this.events.entries()) { e.datagramAt = -Infinity; e.datagramTries = 0; }\n }\n detach(): void {\n this.dropDatagram(false); this.reliable = undefined; this.queued.clear();\n }\n attachDatagram(link: DatagramLink): void {\n this.dropDatagram(false); this.datagram = this.impairDatagram(link); this.attachedAt = this.now();\n this.lastProbe = -Infinity; this.proofAt = -Infinity; this.probes.clear();\n }\n dropDatagram(notify = true): void {\n const d = this.datagram; this.datagram = undefined;\n this.proofAt = -Infinity; this.probes.clear(); this.setFast(false);\n try { d?.close(); } catch { /* already closed */ }\n if (d && notify) this.onFastDown();\n }\n private setFast(next: boolean) {\n if (next !== this.fast) { this.fast = next; this.stats.fastTransitions++; this.onFastChange(next); }\n }\n sendControl(m: unknown): boolean {\n const data = stringify(m), ws = this.reliable;\n if (!ws?.open || ws.bufferedAmount > this.highWater) return false;\n try { if (!ws.send(data)) return false; } catch { return false; }\n this.stats.bytesSent += utf8Length(data); return true;\n }\n sendEvent(data: Json): number { const seq = this.events.push(data); this.flush(); return seq; }\n /** Retains only the newest unsent payload per stream. Returns the state's seq (0 when offline).\n * An accepted enqueue is not a delivery guarantee; use `ack: true` and onStateAck to learn what arrived. */\n sendState(stream: number, data: Uint8Array, time: number, o: StateOptions = {}): number {\n if (!this.active) return 0;\n if (!isUint(stream, 65535) || !Number.isFinite(time) || data.length > this.maxStateBytes ||\n !(o.ttlMs === undefined || Number.isFinite(o.ttlMs) && o.ttlMs > 0) ||\n !(o.priority === undefined || Number.isFinite(o.priority) && o.priority >= 0)) throw new RangeError('Invalid state');\n if (!this.sequence.has(stream) && this.sequence.size >= this.maxStreams) throw new Error('State stream limit');\n const seq = ((this.sequence.get(stream) ?? 0) + 1) >>> 0 || 1; this.sequence.set(stream, seq);\n const old = this.queued.get(stream); if (old) this.stats.coalesced++;\n const now = this.now();\n this.queued.set(stream, { frame: { kind: o.ack ? FrameKind.stateAcked : FrameKind.state, epoch: this.epoch, stream, seq, time, payload: data.slice() },\n first: old?.first ?? now, deadline: now + (o.ttlMs ?? 100), priority: o.priority ?? 1 });\n return seq;\n }\n receiveControl(m: Record<string, unknown>): boolean {\n if (m.e !== this.epoch || !this.active) return false;\n if (m.t === 'event') {\n if (typeof m.s !== 'number' || !('d' in m)) throw new Error('Invalid event');\n this.events.receive(m.s, m.d as Json, this.onEvent);\n this.ackDue = !this.sendControl({ t: 'ack', e: this.epoch, s: this.events.received }); return true;\n }\n if (m.t === 'ack') {\n if (typeof m.s !== 'number') throw new Error('Invalid acknowledgement');\n if (this.events.ack(m.s)) this.onEventAck(m.s); return true;\n }\n return false;\n }\n receiveBinary(bytes: Uint8Array, via: 'ws' | 'rtc'): void {\n this.stats.bytesReceived += bytes.length;\n if (!this.active) return;\n const f = decodeFrame(bytes, this.maxFrameBytes);\n if (!f) { this.stats.invalid++; return; }\n if (f.epoch !== this.epoch || (via === 'rtc' && !this.datagram)) { this.stats.stale++; return; }\n switch (f.kind) {\n case FrameKind.probe:\n if (via === 'rtc') this.sendFast(encodeFrame({ ...f, kind: FrameKind.reply }));\n return;\n case FrameKind.reply: {\n if (via !== 'rtc') return;\n const sent = this.probes.get(f.seq);\n if (sent === undefined || sent !== f.time) return;\n this.probes.delete(f.seq);\n const rtt = this.now() - sent;\n if (rtt < 0 || rtt > this.probeTimeout) return;\n this.proofAt = this.now(); this.stats.datagramRttMs = rtt; this.setFast(true); return;\n }\n case FrameKind.events: return this.receiveDatagramEvents(f);\n case FrameKind.sack: return this.receiveStateAcks(f);\n }\n const prior = this.received.get(f.stream);\n if (prior !== undefined && !newer(f.seq, prior)) { this.stats.stale++; return; }\n if (prior === undefined && this.received.size >= this.maxStreams) { this.stats.invalid++; return; }\n this.received.set(f.stream, f.seq); this.stats.statesReceived++;\n if (f.kind === FrameKind.stateAcked) this.acksOut.set(f.stream, f.seq);\n this.onState({ stream: f.stream, seq: f.seq, time: f.time, data: f.payload, via });\n }\n private receiveDatagramEvents(f: Frame): void {\n if (f.seq <= this.events.sentThrough && this.events.ack(f.seq)) this.onEventAck(f.seq);\n if (!f.payload.length) return;\n let list: unknown;\n try { list = JSON.parse(fromUtf8(f.payload)); } catch { this.stats.invalid++; return; }\n if (!Array.isArray(list) || list.length > 64) { this.stats.invalid++; return; }\n let delivered = 0;\n for (const item of list) {\n if (!Array.isArray(item) || item.length !== 2 || !Number.isSafeInteger(item[0])) { this.stats.invalid++; return; }\n try { delivered += this.events.receive(item[0] as number, item[1] as Json, this.onEvent); }\n catch { this.stats.invalid++; return; }\n }\n if (delivered) { this.stats.eventsViaDatagram += delivered; this.ackDue = true; }\n }\n private receiveStateAcks(f: Frame): void {\n const p = f.payload;\n if (p.length % 6) { this.stats.invalid++; return; }\n const v = new DataView(p.buffer, p.byteOffset, p.byteLength);\n for (let at = 0; at < p.length; at += 6) {\n const stream = v.getUint16(at, true), seq = v.getUint32(at + 2, true), sent = this.sequence.get(stream);\n if (sent === undefined || newer(seq, sent)) continue;\n const prior = this.acksIn.get(stream);\n if (prior !== undefined && !newer(seq, prior)) continue;\n this.acksIn.set(stream, seq); this.stats.stateAcksReceived++; this.onStateAck(stream, seq);\n }\n }\n private sendFast(b: Uint8Array): boolean {\n const d = this.datagram;\n if (!d?.open || d.bufferedAmount > this.highWater) return false;\n try { if (!d.send(b)) return false; } catch { return false; }\n this.stats.bytesSent += b.length; return true;\n }\n /** Binary on the datagram path when it is proven, else the WebSocket. */\n private sendBinary(b: Uint8Array, preferFast: boolean): boolean {\n const ws = this.reliable;\n if (preferFast && this.fastActive && this.datagram && this.datagram.bufferedAmount <= this.highWater) return this.sendFast(b);\n if (!ws?.open || ws.bufferedAmount > this.highWater) return false;\n try { if (!ws.send(b)) return false; } catch { return false; }\n this.stats.bytesSent += b.length; return true;\n }\n pump(): void {\n const now = this.now(), d = this.datagram;\n if (d) {\n if ((!d.open && now - this.attachedAt > this.probeTimeout) ||\n (this.fast && now - this.proofAt > this.probeTimeout) ||\n (!this.fast && now - this.attachedAt > this.probeTimeout * 2)) this.dropDatagram();\n else if (d.open && now - this.lastProbe >= this.probeInterval) {\n this.lastProbe = now;\n const seq = this.probeSeq = (this.probeSeq + 1) >>> 0;\n this.probes.set(seq, now);\n for (const [s, at] of this.probes) if (now - at > this.probeTimeout) this.probes.delete(s);\n this.sendFast(encodeFrame({ kind: FrameKind.probe, epoch: this.epoch, stream: 0, seq, time: now, payload: new Uint8Array() }));\n }\n }\n this.flush();\n }\n flush(maxPackets = 8): void {\n const ws = this.reliable, now = this.now();\n if (!ws?.open) return;\n if (this.ackDue) this.ackDue = !this.sendControl({ t: 'ack', e: this.epoch, s: this.events.received });\n for (const e of this.events.entries()) {\n if (e.seq <= this.lastEventSent) continue;\n const encoded = `{\"t\":\"event\",\"e\":${this.epoch},\"s\":${e.seq},\"d\":${e.text}}`;\n const size = utf8Length(encoded);\n if (ws.bufferedAmount > this.highWater || !this.budget.take(size, now)) break;\n try { if (!ws.send(encoded)) break; } catch { break; }\n this.events.sent(e.seq); this.lastEventSent = e.seq; this.stats.bytesSent += size;\n }\n if (this.fastActive) this.flushDatagramEvents(now);\n if (this.acksOut.size && now - this.lastAckSentAt >= this.stateAckInterval) this.flushStateAcks(now);\n for (const [id, q] of this.queued) if (q.deadline <= now) { this.queued.delete(id); this.stats.expired++; }\n if (!this.queued.size) return;\n const queue = [...this.queued.values()].sort((a, b) =>\n (b.priority + (now - b.first) / 100) - (a.priority + (now - a.first) / 100));\n let count = 0;\n for (const q of queue) {\n if (count++ >= maxPackets) break;\n const b = encodeFrame(q.frame);\n if (!this.budget.take(b.length, now)) break;\n if (!this.sendBinary(b, q.frame.payload.length <= this.datagramStateBytes)) { this.stats.congested++; break; }\n this.stats.statesSent++; this.queued.delete(q.frame.stream);\n }\n }\n /** Copies of WebSocket-sent, unacknowledged events, retried on the datagram path for UDP-like latency. */\n private flushDatagramEvents(now: number): void {\n const retry = Math.max(40, Math.min(200, this.stats.datagramRttMs * 1.5 + 10));\n const items: string[] = []; let bytes = 2;\n if (this.datagramEvents) for (const e of this.events.entries()) {\n if (e.seq > this.lastEventSent) break;\n if (e.datagramTries >= 6 || now - e.datagramAt < retry || e.bytes - 64 > DATAGRAM_EVENT_BYTES) continue;\n const item = `[${e.seq},${e.text}]`, size = utf8Length(item) + 1;\n if (bytes + size > DATAGRAM_EVENT_BYTES || items.length >= 64) break;\n items.push(item); bytes += size; e.datagramAt = now; e.datagramTries++;\n }\n const ackChanged = this.events.received !== this.datagramAcked;\n if (!items.length && !ackChanged) return;\n const payload = utf8('[' + items.join(',') + ']');\n if (this.sendFast(encodeFrame({ kind: FrameKind.events, epoch: this.epoch, stream: 0, seq: this.events.received >>> 0, time: now, payload }))) {\n this.datagramAcked = this.events.received; this.stats.datagramEventFrames++;\n }\n }\n private flushStateAcks(now: number): void {\n const pairs = [...this.acksOut].slice(0, 150), p = new Uint8Array(pairs.length * 6), v = new DataView(p.buffer);\n pairs.forEach(([stream, seq], i) => { v.setUint16(i * 6, stream, true); v.setUint32(i * 6 + 2, seq, true); });\n if (this.sendBinary(encodeFrame({ kind: FrameKind.sack, epoch: this.epoch, stream: 0, seq: 0, time: now, payload: p }), true)) {\n for (const [stream, seq] of pairs) if (this.acksOut.get(stream) === seq) this.acksOut.delete(stream);\n this.lastAckSentAt = now; this.stats.stateAcksSent++;\n }\n }\n /** Delays a stream-like link without ever reordering it: one queue, one timer. */\n private impairReliable(link: ReliableLink): ReliableLink {\n let tail = 0, timer: ReturnType<typeof setTimeout> | undefined;\n const queue: { at: number; data: string | Uint8Array }[] = [];\n const drain = () => {\n timer = undefined;\n const t = performance.now();\n while (queue.length && queue[0]!.at <= t + 1) {\n const { data } = queue.shift()!;\n if (link.open) try { link.send(data); } catch { /* reconnect owns recovery */ }\n }\n if (queue.length) timer = setTimeout(drain, queue[0]!.at - t);\n };\n const self = this;\n return {\n get open() { return link.open; }, get bufferedAmount() { return link.bufferedAmount; },\n close: () => { queue.length = 0; clearTimeout(timer); timer = undefined; link.close(); },\n send(data) {\n const i = self.impairment;\n if (!i && !queue.length) return link.send(data);\n if (!link.open) return false;\n const t = performance.now(), at = Math.max(tail, t + (i?.lagMs ?? 0) + Math.random() * (i?.jitterMs ?? 0)); tail = at;\n queue.push({ at, data: typeof data === 'string' ? data : data.slice() });\n if (!timer) timer = setTimeout(drain, at - t);\n return true;\n },\n };\n }\n private impairDatagram(link: DatagramLink): DatagramLink {\n const self = this;\n return {\n get open() { return link.open; }, get bufferedAmount() { return link.bufferedAmount; }, close: () => link.close(),\n send(data) {\n const i = self.impairment;\n if (!i) return link.send(data);\n if (!link.open) return false;\n const copies = Math.random() < i.loss! ? 0 : Math.random() < i.duplicate! ? 2 : 1;\n if (!copies) self.stats.impairedDrops++;\n for (let n = 0; n < copies; n++) {\n const copy = data.slice();\n setTimeout(() => { if (link.open) try { link.send(copy); } catch { /* dropped */ } }, i.lagMs! + Math.random() * i.jitterMs!);\n }\n return true;\n },\n };\n }\n}\n", "import type { DatagramLink } from './endpoint.js';\nexport type RtcSignal = { kind: 'offer' | 'answer'; sdp: string } | { kind: 'candidate'; candidate: string; mid: string };\nexport interface RtcCallbacks {\n signal: (message: RtcSignal) => void;\n open: (link: DatagramLink) => void;\n data: (bytes: Uint8Array) => void;\n closed: () => void;\n error: (error: Error) => void;\n}\nexport interface RtcPeer { signal(message: RtcSignal): void | Promise<void>; close(): void }\n/** The browser's RTCIceServer shape: STUN, or TURN with credentials. */\nexport interface IceServer { urls: string | string[]; username?: string; credential?: string }\nexport function validSignal(m: unknown): m is RtcSignal {\n if (!m || typeof m !== 'object') return false;\n const v = m as Record<string, unknown>;\n if (v.kind === 'offer' || v.kind === 'answer') return typeof v.sdp === 'string' && v.sdp.length > 0 && v.sdp.length <= 12000;\n return v.kind === 'candidate' && typeof v.candidate === 'string' && v.candidate.length <= 1500 &&\n typeof v.mid === 'string' && v.mid.length <= 128;\n}\nconst ICE_URL = /^(stuns?|turns?):[^\\s]{1,250}$/;\nexport function validIceServers(v: unknown): v is IceServer[] {\n return Array.isArray(v) && v.length <= 8 && v.every(s => {\n if (!s || typeof s !== 'object') return false;\n const o = s as Record<string, unknown>, urls = Array.isArray(o.urls) ? o.urls : [o.urls];\n return urls.length >= 1 && urls.length <= 8 && urls.every(u => typeof u === 'string' && ICE_URL.test(u)) &&\n (o.username === undefined || typeof o.username === 'string' && o.username.length <= 256) &&\n (o.credential === undefined || typeof o.credential === 'string' && o.credential.length <= 256);\n });\n}\n", "/** Offset estimator using low-RTT exchanges. RTT/2 is NOT a measured one-way latency. */\nexport class NetworkClock {\n private samples: { rtt: number; offset: number }[] = [];\n private offset = 0;\n private target = 0;\n private initialized = false;\n private last = -Infinity;\n get synced() { return this.initialized; }\n rttMs = 0;\n uncertaintyMs = Infinity;\n reset() { this.samples = []; this.offset = this.target = 0; this.initialized = false; this.last = -Infinity; this.uncertaintyMs = Infinity; }\n observe(sent: number, received: number, remoteTime: number): boolean {\n const rtt = received - sent;\n if (![sent, received, remoteTime].every(Number.isFinite) || rtt < 0 || rtt > 15000) return false;\n this.samples.push({ rtt, offset: remoteTime - (sent + received) / 2 });\n if (this.samples.length > 16) this.samples.shift();\n const best = [...this.samples].sort((a, b) => a.rtt - b.rtt).slice(0, 3);\n this.target = best.reduce((sum, s) => sum + s.offset, 0) / best.length;\n this.rttMs = best[0]!.rtt;\n this.uncertaintyMs = Math.max(...best.map(s => Math.abs(s.offset - this.target) + s.rtt / 2));\n if (!this.initialized) { this.offset = this.target; this.initialized = true; }\n return true;\n }\n advance(dtMs: number) {\n if (!Number.isFinite(dtMs) || dtMs < 0) throw new RangeError('Invalid time step');\n const max = dtMs * 0.05; this.offset += Math.max(-max, Math.min(max, this.target - this.offset));\n }\n serverTime(localTime: number): number { this.last = Math.max(this.last, localTime + this.offset); return this.last; }\n}\n", "import { validSignal, type RtcCallbacks, type RtcPeer, type RtcSignal } from '../core/rtc.js';\n/** Browser adapter. Candidates are buffered until the remote description has finished applying. */\nexport class BrowserRtcPeer implements RtcPeer {\n private pc: RTCPeerConnection;\n private dc: RTCDataChannel;\n private alive = true;\n private offered = false;\n private remoteReady = false;\n private localCandidates: RtcSignal[] = [];\n private remoteCandidates: RTCIceCandidateInit[] = [];\n private chain = Promise.resolve();\n constructor(private cb: RtcCallbacks, config: RTCConfiguration = { iceServers: [] }) {\n this.pc = new RTCPeerConnection(config);\n this.dc = this.pc.createDataChannel('twinwire', { negotiated: true, id: 0, ordered: false, maxRetransmits: 0 });\n const pc = this.pc, dc = this.dc; dc.binaryType = 'arraybuffer';\n dc.onopen = () => { if (this.alive) cb.open({\n get open() { return dc.readyState === 'open'; }, get bufferedAmount() { return dc.bufferedAmount; },\n send(bytes) { if (dc.readyState !== 'open') return false; dc.send(bytes.slice().buffer); return true; },\n close: () => this.close(),\n }); };\n dc.onmessage = e => { if (this.alive && e.data instanceof ArrayBuffer) cb.data(new Uint8Array(e.data)); };\n dc.onclose = () => { if (this.alive) { this.close(); cb.closed(); } };\n dc.onerror = () => { if (this.alive) cb.error(new Error('RTC data channel error')); };\n pc.onconnectionstatechange = () => { if (this.alive && pc.connectionState === 'failed') { this.close(); cb.closed(); } };\n pc.onicecandidate = e => {\n if (!this.alive || !e.candidate?.candidate) return;\n const m: RtcSignal = { kind: 'candidate', candidate: e.candidate.candidate, mid: e.candidate.sdpMid ?? '0' };\n if (this.offered) cb.signal(m); else if (this.localCandidates.length < 64) this.localCandidates.push(m);\n };\n }\n async offer(): Promise<void> {\n await this.pc.setLocalDescription(await this.pc.createOffer());\n if (!this.alive) return;\n this.cb.signal({ kind: 'offer', sdp: this.pc.localDescription!.sdp }); this.offered = true;\n for (const c of this.localCandidates) this.cb.signal(c); this.localCandidates = [];\n }\n signal(message: RtcSignal): Promise<void> {\n this.chain = this.chain.then(async () => {\n if (!this.alive || !validSignal(message)) return;\n if (message.kind === 'answer') {\n await this.pc.setRemoteDescription({ type: 'answer', sdp: message.sdp });\n if (!this.alive) return;\n this.remoteReady = true;\n for (const c of this.remoteCandidates) await this.pc.addIceCandidate(c);\n this.remoteCandidates = [];\n } else if (message.kind === 'candidate') {\n const c = { candidate: message.candidate, sdpMid: message.mid };\n if (this.remoteReady) await this.pc.addIceCandidate(c);\n else { if (this.remoteCandidates.length >= 64) throw new Error('Too many ICE candidates'); this.remoteCandidates.push(c); }\n }\n }).catch(e => { if (this.alive) this.cb.error(e instanceof Error ? e : new Error(String(e))); });\n return this.chain;\n }\n close(): void {\n if (!this.alive) return; this.alive = false;\n this.localCandidates = []; this.remoteCandidates = [];\n this.dc.onopen = this.dc.onmessage = this.dc.onclose = this.dc.onerror = null;\n this.pc.onicecandidate = this.pc.onconnectionstatechange = null;\n try { this.dc.close(); this.pc.close(); } catch { /* no-op after disposal */ }\n }\n}\n", "import { Endpoint, type EndpointOptions, type Impairment, type StateMessage, type StateOptions } from '../core/endpoint.js';\nimport { type ReliableCheckpoint } from '../core/reliable.js';\nimport { isUint, readControl, stringify, utf8Length, VERSION, type Json } from '../core/protocol.js';\nimport { validIceServers, validSignal, type IceServer } from '../core/rtc.js';\nimport { NetworkClock } from '../netcode/clock.js';\nimport { BrowserRtcPeer } from './rtc.js';\nexport type ClientStatus = 'idle' | 'connecting' | 'online' | 'paused' | 'closed' | 'lost';\nexport type Transport = 'rtc' | 'ws' | 'none';\nexport interface ClientCheckpoint { url: string; room: string; token: string; id: string; events: ReliableCheckpoint }\nexport interface LifecycleOptions {\n /** Pause after the page has been hidden this long (default 20 s). Page unload/bfcache pauses at once. */\n hiddenPauseMs?: number;\n /** After the page comes back, a socket that stays silent this long is replaced (default 1500 ms). */\n wakeCheckMs?: number;\n}\nexport interface ClientOptions {\n url: string; room: string; auth?: Json;\n /** false: WebSocket only. An RTCConfiguration with iceServers overrides the servers the room server suggests. */\n rtc?: false | RTCConfiguration;\n endpoint?: EndpointOptions; websocket?: (url: string) => WebSocket;\n reconnectBaseMs?: number; reconnectMaxMs?: number; heartbeatTimeoutMs?: number;\n rtcRetryMs?: number; rtcConnectTimeoutMs?: number; pumpHz?: number; checkpoint?: ClientCheckpoint;\n /** Simulated trouble on this client's sends; also asked of the server (honoured only with allowImpairment). */\n impair?: Impairment;\n}\nexport class GameClient {\n endpoint: Endpoint;\n readonly clock = new NetworkClock();\n status: ClientStatus = 'idle';\n id: string | null = null;\n /** ICE servers suggested by the room server (STUN/TURN), used unless options.rtc names its own. */\n iceServers: IceServer[] = [];\n onStatus: (status: ClientStatus) => void = () => {};\n onSession: (info: { id: string; resumed: boolean }) => void = () => {};\n onSessionLost: (info: { pendingEvents: number; reason: string }) => void = () => {};\n onState: (state: StateMessage) => void = () => {};\n onEvent: (data: Json, seq: number) => void = () => {};\n onStateAck: (stream: number, seq: number) => void = () => {};\n onTransport: (transport: Transport) => void = () => {};\n onError: (error: Error) => void = () => {};\n private token: string | null = null;\n private socket?: WebSocket;\n private generation = 0;\n private epoch = 0;\n private peer?: BrowserRtcPeer;\n private rtcAttempt = 0;\n private rtcStartedAt = 0;\n private rtcRetryAt = Infinity;\n private rtcFailures = 0;\n private reconnects = 0;\n private retryTimer?: ReturnType<typeof setTimeout>;\n private pumpTimer?: ReturnType<typeof setInterval>;\n private lastPump = 0;\n private lastPing = -Infinity;\n private lastMessage = 0;\n private openedAt = 0;\n private wakeDeadline = Infinity;\n private pendingPings = new Map<number, number>();\n private pingId = 0;\n private stopped = true;\n private serverRtc = false;\n private lastTransport: Transport = 'none';\n private waiters: { resolve: () => void; reject: (e: Error) => void }[] = [];\n private lifecycle?: () => void;\n private interceptors: ((data: Json, seq: number) => boolean)[] = [];\n private listeners: { session: ((info: { id: string; resumed: boolean }) => void)[]; lost: ((info: { pendingEvents: number; reason: string }) => void)[] } = { session: [], lost: [] };\n constructor(readonly options: ClientOptions) {\n const u = new URL(options.url);\n if (!['ws:', 'wss:'].includes(u.protocol) || !/^[\\w:.-]{1,64}$/.test(options.room)) throw new Error('Invalid URL or room');\n this.endpoint = this.makeEndpoint();\n const cp = options.checkpoint;\n if (cp) {\n if (cp.url !== options.url || cp.room !== options.room || !/^[\\w-]{20,128}$/.test(cp.token) || typeof cp.id !== 'string')\n throw new Error('Checkpoint belongs to a different endpoint or is invalid');\n this.endpoint.events.restore(cp.events); this.token = cp.token; this.id = cp.id;\n }\n }\n private makeEndpoint(): Endpoint {\n const e = new Endpoint({ ...this.options.endpoint, impair: this.options.impair ?? this.options.endpoint?.impair });\n e.onState = s => this.onState(s);\n e.onEvent = (d, s) => { for (const f of this.interceptors) if (f(d, s)) return; this.onEvent(d, s); };\n e.onStateAck = (stream, seq) => this.onStateAck(stream, seq);\n e.onFastDown = () => this.stopRtc(true);\n e.onFastChange = () => this.noteTransport();\n return e;\n }\n /** Consume some events before onEvent sees them (return true to consume). Used by LobbyClient. Returns removal. */\n intercept(fn: (data: Json, seq: number) => boolean): () => void {\n this.interceptors.push(fn); return () => { const i = this.interceptors.indexOf(fn); if (i >= 0) this.interceptors.splice(i, 1); };\n }\n /** Extra listeners next to onSession/onSessionLost. Returns removal. */\n on<K extends 'session' | 'lost'>(kind: K, fn: GameClient['listeners'][K][number]): () => void {\n const list = this.listeners[kind] as unknown[]; list.push(fn);\n return () => { const i = list.indexOf(fn); if (i >= 0) list.splice(i, 1); };\n }\n private lost(info: { pendingEvents: number; reason: string }) {\n for (const f of this.listeners.lost) try { f(info); } catch (e) { this.report(e); }\n this.onSessionLost(info);\n }\n /** Which path state messages take right now. */\n get transport(): Transport { return this.status !== 'online' ? 'none' : this.endpoint.fastActive ? 'rtc' : 'ws'; }\n private noteTransport() {\n const t = this.transport;\n if (t !== this.lastTransport) { this.lastTransport = t; try { this.onTransport(t); } catch (e) { this.report(e); } }\n }\n private report(error: unknown) { this.onError(error instanceof Error ? error : new Error(String(error))); }\n private setStatus(s: ClientStatus) {\n if (s === this.status) return;\n this.status = s; this.onStatus(s); this.noteTransport();\n if (s === 'online') for (const w of this.waiters.splice(0)) w.resolve();\n else if (s === 'lost' || s === 'closed') for (const w of this.waiters.splice(0)) w.reject(new Error(`Session ${s}`));\n }\n /** Resolves when the session is online (at once if it already is); rejects if it is lost or closed first. */\n whenOnline(): Promise<void> {\n if (this.status === 'online') return Promise.resolve();\n if (this.status === 'lost' || this.status === 'closed') return Promise.reject(new Error(`Session ${this.status}`));\n return new Promise((resolve, reject) => this.waiters.push({ resolve, reject }));\n }\n connect(): void {\n if (this.status === 'online' || this.status === 'connecting') return;\n if (this.status === 'lost') throw new Error('Call newSession() after session expiry');\n this.stopped = false; this.setStatus('connecting');\n clearInterval(this.pumpTimer); this.lastPump = performance.now();\n this.pumpTimer = setInterval(() => this.pump(), 1000 / (this.options.pumpHz ?? 60));\n this.open();\n }\n private open(): void {\n if (this.stopped) return;\n clearTimeout(this.retryTimer); this.retryTimer = undefined;\n const generation = ++this.generation;\n const now = performance.now(); this.openedAt = this.lastMessage = now;\n let ws: WebSocket;\n try { ws = (this.options.websocket ?? (u => new WebSocket(u)))(this.options.url); }\n catch (error) { this.report(error); this.retry(); return; }\n this.socket = ws; ws.binaryType = 'arraybuffer';\n ws.onopen = () => {\n if (generation !== this.generation || this.stopped) { ws.close(); return; }\n ws.send(stringify({ t: 'hello', v: VERSION, room: this.options.room, token: this.token, auth: this.options.auth ?? null,\n impair: (this.options.impair ?? null) as Json }));\n };\n ws.onmessage = ev => {\n if (generation !== this.generation || this.stopped) return;\n this.lastMessage = performance.now(); this.wakeDeadline = Infinity;\n try {\n if (ev.data instanceof ArrayBuffer) this.endpoint.receiveBinary(new Uint8Array(ev.data), 'ws');\n else if (typeof ev.data === 'string') this.message(ev.data, ws);\n } catch (error) { this.report(error); ws.close(4004, 'protocol'); }\n };\n ws.onerror = () => {}; // close/retry is the single failure path\n ws.onclose = ev => {\n if (generation !== this.generation) return;\n this.socket = undefined; this.endpoint.detach(); this.stopRtc(false); this.clock.reset(); this.pendingPings.clear();\n if (!this.stopped) {\n if ([1002, 1008, 4001, 4002, 4004].includes(ev.code)) {\n this.stopped = true; clearInterval(this.pumpTimer); clearTimeout(this.retryTimer); this.setStatus('lost');\n this.lost({ pendingEvents: this.endpoint.events.size, reason: ev.reason || `connection rejected (${ev.code})` });\n } else { this.setStatus('connecting'); this.retry(); }\n }\n };\n }\n private message(raw: string, ws: WebSocket): void {\n this.endpoint.stats.bytesReceived += utf8Length(raw);\n const m = readControl(raw); if (!m) throw new Error('Invalid control message');\n if (m.t === 'reset') {\n this.stopped = true; clearInterval(this.pumpTimer); clearTimeout(this.retryTimer);\n this.stopRtc(false); this.endpoint.detach(); ws.close(); this.setStatus('lost');\n this.lost({ pendingEvents: this.endpoint.events.size, reason: typeof m.reason === 'string' ? m.reason : 'expired' }); return;\n }\n if (m.t === 'welcome') {\n if (this.status !== 'connecting' || !isUint(m.e) || !m.e || typeof m.id !== 'string' ||\n typeof m.token !== 'string' || !/^[\\w-]{20,128}$/.test(m.token) || typeof m.resumed !== 'boolean' || m.v !== VERSION)\n throw new Error('Invalid welcome');\n this.token = m.token; this.id = m.id; this.epoch = m.e; this.reconnects = 0; this.serverRtc = m.rtc === true;\n this.iceServers = validIceServers(m.ice) ? m.ice : [];\n this.endpoint.attach(this.epoch, {\n get open() { return ws.readyState === 1; }, get bufferedAmount() { return ws.bufferedAmount; },\n send(data) { if (ws.readyState !== 1) return false; ws.send(typeof data === 'string' ? data : data.slice().buffer); return true; },\n close() { ws.close(); },\n });\n this.lastPing = -Infinity; this.clock.reset(); this.setStatus('online');\n const info = { id: this.id, resumed: m.resumed };\n for (const f of this.listeners.session) try { f(info); } catch (e) { this.report(e); }\n this.onSession(info); this.rtcFailures = 0; this.rtcRetryAt = performance.now();\n this.pump(); return;\n }\n if (m.e !== this.epoch || this.status !== 'online') return;\n if (this.endpoint.receiveControl(m)) return;\n if (m.t === 'pong' && isUint(m.n) && typeof m.s === 'number' && Number.isFinite(m.s)) {\n const at = this.pendingPings.get(m.n); if (at === undefined) return;\n this.pendingPings.delete(m.n); this.clock.observe(at, performance.now(), m.s); return;\n }\n if (m.t === 'signal' && m.a === this.rtcAttempt && validSignal(m.d)) { void this.peer?.signal(m.d); return; }\n if (m.t === 'rtc-reset' && m.a === this.rtcAttempt) this.stopRtc(false);\n }\n private retry(): void {\n if (this.stopped) return;\n clearTimeout(this.retryTimer);\n const cap = Math.min(this.options.reconnectMaxMs ?? 8000, (this.options.reconnectBaseMs ?? 200) * 2 ** Math.min(this.reconnects++, 8));\n this.retryTimer = setTimeout(() => this.open(), cap * (0.5 + Math.random() / 2));\n }\n /** Testing: drop the connection as a network failure would (the session resumes by itself). */\n simulateDrop(): void { this.socket?.close(4000, \"simulated drop\"); }\n /** Skip the backoff wait (the network just came back, the page woke up). */\n reconnectNow(): void {\n if (this.stopped || this.status === 'online') return;\n this.reconnects = 0;\n if (this.retryTimer !== undefined || !this.socket) this.open();\n }\n private rtcConfig(): RTCConfiguration {\n const own = this.options.rtc || undefined;\n return own?.iceServers ? own : { ...own, iceServers: this.iceServers as RTCIceServer[] };\n }\n private startRtc(): void {\n if (!this.serverRtc || this.peer || this.options.rtc === false || typeof RTCPeerConnection === 'undefined' || this.status !== 'online') return;\n const a = ++this.rtcAttempt, e = this.epoch; this.rtcStartedAt = performance.now(); this.rtcRetryAt = Infinity;\n try {\n const peer = new BrowserRtcPeer({\n signal: d => { if (a === this.rtcAttempt && e === this.epoch) this.endpoint.sendControl({ t: 'signal', e, a, d }); },\n open: link => { if (a === this.rtcAttempt && e === this.epoch && !this.stopped) this.endpoint.attachDatagram(link); else link.close(); },\n data: data => { if (a === this.rtcAttempt && e === this.epoch) this.endpoint.receiveBinary(data, 'rtc'); },\n closed: () => { if (a === this.rtcAttempt && e === this.epoch) this.stopRtc(true); },\n error: error => { if (a === this.rtcAttempt && e === this.epoch) { this.report(error); this.stopRtc(true); } },\n }, this.rtcConfig());\n this.peer = peer;\n void peer.offer().catch(error => { if (this.peer === peer) { this.report(error); this.stopRtc(true); } });\n } catch (error) { this.report(error); this.stopRtc(true); }\n }\n private stopRtc(notify: boolean): void {\n const a = this.rtcAttempt, peer = this.peer; this.peer = undefined;\n if (notify && peer) this.endpoint.sendControl({ t: 'rtc-reset', e: this.epoch, a });\n this.endpoint.dropDatagram(false); peer?.close();\n this.rtcRetryAt = performance.now() + Math.min(60000, (this.options.rtcRetryMs ?? 3000) * 2 ** Math.min(this.rtcFailures++, 4));\n this.noteTransport();\n }\n private pump(): void {\n if (this.stopped) return;\n const now = performance.now(); this.clock.advance(Math.max(0, now - this.lastPump)); this.lastPump = now;\n if (this.status === 'online') {\n if (now - this.lastMessage > (this.options.heartbeatTimeoutMs ?? 8000) || now > this.wakeDeadline) {\n this.wakeDeadline = Infinity; this.socket?.close(4000, 'heartbeat timeout'); return;\n }\n if (now - this.lastPing >= (this.pendingPings.size < 4 && this.clock.uncertaintyMs === Infinity ? 200 : 1000)) this.ping(now);\n if (this.peer && now - this.rtcStartedAt > (this.options.rtcConnectTimeoutMs ?? 8000) && !this.endpoint.fastActive) this.stopRtc(true);\n if (!this.peer && now >= this.rtcRetryAt) this.startRtc();\n this.endpoint.pump();\n this.noteTransport();\n } else if (this.socket && now - this.openedAt > 10000) { this.socket.close(4000, 'handshake timeout'); }\n }\n private ping(now: number) {\n const n = this.pingId = (this.pingId + 1) >>> 0;\n if (this.endpoint.sendControl({ t: 'ping', e: this.epoch, n })) { this.pendingPings.set(n, now); this.lastPing = now; }\n for (const [id, at] of this.pendingPings) if (now - at > 10000) this.pendingPings.delete(id);\n }\n sendEvent(data: Json): number { return this.endpoint.sendEvent(data); }\n /** Queue the newest state for a stream. Returns its seq, or 0 before the session is online and the clock synced. */\n sendState(stream: number, data: Uint8Array, options?: StateOptions): number {\n if (!this.clock.synced) return 0;\n return this.endpoint.sendState(stream, data, this.clock.serverTime(performance.now()), options);\n }\n flush(): void { this.endpoint.flush(); }\n /** Stop the physical connection, retaining event counters and resume credentials in this instance. */\n pause(): void {\n this.stopped = true; ++this.generation; clearTimeout(this.retryTimer); clearInterval(this.pumpTimer);\n this.stopRtc(false); this.endpoint.detach(); this.socket?.close(4003, 'paused'); this.socket = undefined; this.setStatus('paused');\n }\n resume(): void { if (this.status === 'paused') this.connect(); }\n /** Explicitly discard the old logical session after expiry. Pending actions are NOT replayed into a new session. */\n newSession(): void {\n this.pause(); this.endpoint = this.makeEndpoint(); this.token = this.id = null; this.epoch = 0; this.connect();\n }\n close(): void {\n if (this.status === 'closed') return;\n try { this.endpoint.sendControl({ t: 'leave', e: this.epoch }); } catch { /* best effort */ }\n this.pause(); this.lifecycle?.(); this.lifecycle = undefined; this.setStatus('closed');\n }\n checkpoint(): ClientCheckpoint | null {\n return this.token && this.id ? { url: this.options.url, room: this.options.room, token: this.token, id: this.id, events: this.endpoint.events.checkpoint() } : null;\n }\n /** Opt-in page lifecycle integration: pause when the page goes away or stays hidden, reconnect fast when it is back,\n * and replace a socket that died while the phone slept. Returns cleanup. */\n bindPageLifecycle(o: LifecycleOptions = {}): () => void {\n this.lifecycle?.();\n const hiddenPause = o.hiddenPauseMs ?? 20000, wakeCheck = o.wakeCheckMs ?? 1500;\n let hideTimer: ReturnType<typeof setTimeout> | undefined;\n const pauseNow = () => { clearTimeout(hideTimer); if (this.status === 'online' || this.status === 'connecting') this.pause(); };\n const back = () => {\n clearTimeout(hideTimer);\n if (this.status === 'paused') { this.resume(); return; }\n if (this.status === 'online') { this.wakeDeadline = performance.now() + wakeCheck; this.ping(performance.now()); }\n else this.reconnectNow();\n };\n const visible = () => {\n if (document.visibilityState === 'visible') back();\n else { clearTimeout(hideTimer); hideTimer = setTimeout(pauseNow, hiddenPause); }\n };\n const pagehide = () => pauseNow(), pageshow = () => back(), online = () => this.reconnectNow();\n window.addEventListener('pagehide', pagehide); window.addEventListener('pageshow', pageshow);\n window.addEventListener('online', online); document.addEventListener('visibilitychange', visible);\n const off = () => {\n clearTimeout(hideTimer);\n window.removeEventListener('pagehide', pagehide); window.removeEventListener('pageshow', pageshow);\n window.removeEventListener('online', online); document.removeEventListener('visibilitychange', visible);\n };\n this.lifecycle = off; return off;\n }\n}\n", "import type { Json } from './protocol.js';\n/** Lobby messages ride on reliable events under this key; the application's own events never use it. */\nexport const LOBBY_KEY = '$lobby';\nexport type Visibility = 'public' | 'private';\nexport interface MemberView {\n seat: number; name: string; ready: boolean; connected: boolean; host: boolean; meta: Record<string, Json>;\n}\nexport interface RoomView {\n code: string; mode: string; visibility: Visibility; phase: string; maxMembers: number;\n meta: Record<string, Json>;\n /** The viewer's own seat. */\n you: number;\n members: MemberView[];\n /** Server clock (ms) when the ready countdown ends, or null. Compare with client.clock.serverTime(). */\n countdownEndsAt: number | null;\n}\nexport interface CreateRequest {\n mode?: string; visibility?: Visibility; maxMembers?: number; meta?: Record<string, Json>; name?: string; memberMeta?: Record<string, Json>;\n /** Anything the game needs to set the room up (a save, a course). Goes to onCreate; never shown to other members. */\n init?: Json;\n}\nexport interface JoinRequest { code: string; name?: string; memberMeta?: Record<string, Json> }\nexport interface QuickPlayRequest {\n mode?: string;\n /** Only rooms whose meta has these exact values (a build id, a region). */\n match?: Record<string, Json>;\n name?: string; memberMeta?: Record<string, Json>;\n /** Used when no room fits and a new public one is made. */\n create?: Omit<CreateRequest, 'visibility' | 'mode' | 'name' | 'memberMeta'>;\n}\n/** Readable room codes: no I/O (they look like 1/0). */\nexport const CODE_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ';\nexport function normalizeCode(code: unknown): string | null {\n if (typeof code !== 'string') return null;\n const c = code.trim().toUpperCase();\n return /^[A-Z0-9]{3,12}$/.test(c) ? c : null;\n}\nconst range = (a: number, b: number) => String.fromCharCode(a) + '-' + String.fromCharCode(b);\n/** Control, zero-width and bidi-override characters: never allowed in a shown name. */\nconst INVISIBLE = new RegExp('[' + [range(0, 31), range(127, 159), range(0x200b, 0x200f), range(0x2028, 0x202e), range(0x2066, 0x2069)].join('') + ']', 'g');\nexport function cleanName(name: unknown, max = 16): string {\n if (typeof name !== 'string') return '';\n return name.replace(/\\s+/g, ' ').replace(INVISIBLE, '').replace(/ +/g, ' ').trim().slice(0, max);\n}\n/** Small flat JSON maps (meta) only: bounded keys, scalar values or short arrays. */\nexport function cleanMeta(v: unknown, maxBytes = 1024): Record<string, Json> | null {\n if (v === undefined || v === null) return {};\n if (typeof v !== 'object' || Array.isArray(v)) return null;\n let text: string;\n try { text = JSON.stringify(v); } catch { return null; }\n if (text.length > maxBytes) return null;\n const out: Record<string, Json> = {};\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) {\n if (!/^[\\w.-]{1,32}$/.test(k) || ['__proto__', 'constructor', 'prototype'].includes(k)) return null;\n out[k] = JSON.parse(JSON.stringify(x ?? null)) as Json;\n }\n return out;\n}\nexport function metaMatches(meta: Record<string, Json>, match: Record<string, Json> | undefined): boolean {\n if (!match) return true;\n for (const k of Object.keys(match)) if (JSON.stringify(meta[k] ?? null) !== JSON.stringify(match[k] ?? null)) return false;\n return true;\n}\nexport function isLobbyMessage(d: Json): d is { [LOBBY_KEY]: string } & Record<string, Json> {\n return !!d && typeof d === 'object' && !Array.isArray(d) && typeof (d as Record<string, Json>)[LOBBY_KEY] === 'string';\n}\n", "import type { Json } from '../core/protocol.js';\nimport {\n LOBBY_KEY, isLobbyMessage, normalizeCode,\n type CreateRequest, type MemberView, type QuickPlayRequest, type RoomView,\n} from '../core/lobby.js';\nimport type { GameClient } from './client.js';\nexport type { CreateRequest, MemberView, QuickPlayRequest, RoomView } from '../core/lobby.js';\ninterface Pending { resolve: (room: RoomView | null) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }\n/**\n * Rooms on top of a GameClient: create a private room with a code, join by code, quick play into a public room,\n * ready up, and follow who is in the room. Requests ride on reliable events, so they survive reconnects.\n */\nexport class LobbyClient {\n room: RoomView | null = null;\n onRoom: (room: RoomView | null) => void = () => {};\n /** The room was left without asking (kicked, replaced, closed, session expired). */\n onLeft: (reason: string) => void = () => {};\n private pending = new Map<number, Pending>();\n private nextId = 1;\n private off: (() => void)[];\n constructor(readonly client: GameClient, readonly requestTimeoutMs = 20000) {\n this.off = [\n client.intercept(d => {\n if (!isLobbyMessage(d)) return false;\n this.message(d as Record<string, Json>); return true;\n }),\n client.on('session', ({ resumed }) => { if (!resumed) this.drop('new session'); }),\n client.on('lost', ({ reason }) => this.drop(reason)),\n ];\n }\n dispose() { for (const f of this.off) f(); this.drop('disposed', false); }\n get me(): MemberView | null { return this.room?.members.find(m => m.seat === this.room!.you) ?? null; }\n get isHost(): boolean { return !!this.me?.host; }\n /** Milliseconds until the ready countdown ends, or null when none is running. */\n countdownMs(): number | null {\n const end = this.room?.countdownEndsAt;\n if (end == null || !this.client.clock.synced) return null;\n return Math.max(0, end - this.client.clock.serverTime(performance.now()));\n }\n create(o: CreateRequest = {}) { return this.request({ [LOBBY_KEY]: 'create', ...o } as Record<string, Json>); }\n join(code: string, o: { name?: string; memberMeta?: Record<string, Json> } = {}) {\n const c = normalizeCode(code);\n if (!c) return Promise.reject(new Error('That is not a room code'));\n return this.request({ [LOBBY_KEY]: 'join', code: c, ...o } as Record<string, Json>);\n }\n quickPlay(o: QuickPlayRequest = {}) { return this.request({ [LOBBY_KEY]: 'quick', ...o } as unknown as Record<string, Json>); }\n async leave() { await this.request({ [LOBBY_KEY]: 'leave' }); this.set(null); }\n setReady(ready: boolean) { return this.request({ [LOBBY_KEY]: 'ready', ready }); }\n setName(name: string) { return this.request({ [LOBBY_KEY]: 'name', name }); }\n setMeta(meta: Record<string, Json>) { return this.request({ [LOBBY_KEY]: 'meta', meta }); }\n kick(seat: number) { return this.request({ [LOBBY_KEY]: 'kick', seat }); }\n private request(body: Record<string, Json>): Promise<RoomView | null> {\n const id = this.nextId++;\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => { this.pending.delete(id); reject(new Error('The room server did not answer')); }, this.requestTimeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n try { this.client.sendEvent({ ...body, id }); }\n catch (e) { clearTimeout(timer); this.pending.delete(id); reject(e instanceof Error ? e : new Error(String(e))); }\n });\n }\n private set(room: RoomView | null) { this.room = room; try { this.onRoom(room); } catch { /* app callback */ } }\n private message(d: Record<string, Json>) {\n const op = d[LOBBY_KEY];\n if (op === 'res' && typeof d.id === 'number') {\n const p = this.pending.get(d.id); if (!p) return;\n this.pending.delete(d.id); clearTimeout(p.timer);\n if (d.ok === true) {\n const room = (d.room ?? null) as unknown as RoomView | null;\n if (room || this.room) this.set(room);\n p.resolve(room);\n } else p.reject(new Error(typeof d.error === 'string' ? d.error : 'Request refused'));\n return;\n }\n if (op === 'room' && d.room && typeof d.room === 'object') { this.set(d.room as unknown as RoomView); return; }\n if (op === 'left') { const had = !!this.room; this.set(null); if (had) try { this.onLeft(typeof d.reason === 'string' ? d.reason : 'left'); } catch { /* app */ } }\n }\n private drop(reason: string, notify = true) {\n for (const p of this.pending.values()) { clearTimeout(p.timer); p.reject(new Error(reason)); }\n this.pending.clear();\n if (this.room) { this.set(null); if (notify) try { this.onLeft(reason); } catch { /* app */ } }\n }\n}\n", "export class FixedStepper {\n tick = 0; overruns = 0; droppedMs = 0;\n private accumulator = 0;\n readonly dtMs: number;\n constructor(hz = 30, readonly maxCatchUp = 4) {\n if (!(hz > 0) || !Number.isFinite(hz) || !Number.isInteger(maxCatchUp) || maxCatchUp < 1) throw new RangeError('Invalid tick policy');\n this.dtMs = 1000 / hz;\n }\n advance(elapsedMs: number, step: (dtSeconds: number, tick: number) => void): number {\n if (!Number.isFinite(elapsedMs) || elapsedMs < 0) throw new RangeError('Invalid elapsed time');\n this.accumulator += elapsedMs;\n let n = 0;\n while (this.accumulator + 1e-8 >= this.dtMs && n < this.maxCatchUp) {\n this.accumulator -= this.dtMs; this.tick++; n++; step(this.dtMs / 1000, this.tick);\n }\n if (this.accumulator >= this.dtMs) {\n const discard = Math.floor(this.accumulator / this.dtMs) * this.dtMs;\n this.accumulator -= discard; this.droppedMs += discard; this.overruns++;\n }\n return n;\n }\n get alpha() { return Math.max(0, this.accumulator / this.dtMs); }\n}\nexport const PROFILES = Object.freeze({\n social: { simulationHz: 20, sendHz: 20, bytesPerSecond: 12 * 1024, interpolationMinMs: 50 },\n action: { simulationHz: 60, sendHz: 30, bytesPerSecond: 24 * 1024, interpolationMinMs: 35 },\n strategy: { simulationHz: 10, sendHz: 10, bytesPerSecond: 12 * 1024, interpolationMinMs: 100 },\n turnBased: { simulationHz: 0, sendHz: 0, bytesPerSecond: 8 * 1024, interpolationMinMs: 0 },\n});\n", "export interface Timed<T> { time: number; seq: number; value: T; discontinuity?: boolean }\nexport interface SampleResult<T> { value: T; mode: 'hold' | 'interpolate' | 'extrapolate'; sourceTime: number }\n/** Per-entity history. Discontinuities take effect at their timestamp; they are never blended across. */\nexport class Timeline<T> {\n private samples: Timed<T>[] = [];\n constructor(readonly capacity = 64, readonly clone: (value: T) => T = (v: any) => structuredClone(v)) {\n if (!Number.isInteger(capacity) || capacity < 2 || capacity > 4096) throw new RangeError('Invalid history capacity');\n }\n get size() { return this.samples.length; }\n clear() { this.samples = []; }\n insert(sample: Timed<T>): boolean {\n if (!Number.isFinite(sample.time) || !Number.isSafeInteger(sample.seq) || sample.seq < 0) throw new RangeError('Invalid snapshot');\n if (this.samples.some(s => s.seq === sample.seq)) return false;\n const same = this.samples.findIndex(s => s.time === sample.time);\n if (same >= 0) {\n if (this.samples[same]!.seq > sample.seq) return false;\n this.samples.splice(same, 1);\n }\n const copy = { ...sample, value: this.clone(sample.value) };\n const i = this.samples.findIndex(s => s.time > sample.time);\n if (i < 0) this.samples.push(copy); else this.samples.splice(i, 0, copy);\n while (this.samples.length > this.capacity) this.samples.shift(); return true;\n }\n sample(at: number, interpolate: (a: T, b: T, fraction: number) => T,\n extrapolate?: (last: T, previous: T, aheadMs: number, sampleIntervalMs: number) => T,\n maxExtrapolationMs = 100): SampleResult<T> | null {\n if (!Number.isFinite(at) || !Number.isFinite(maxExtrapolationMs) || maxExtrapolationMs < 0) throw new RangeError('Invalid sample time');\n const s = this.samples;\n if (!s.length || s[0]!.time > at) return null;\n let i = s.length - 1; while (i > 0 && s[i]!.time > at) i--;\n const a = s[i]!, b = s[i + 1];\n if (b && !b.discontinuity) return { value: interpolate(this.clone(a.value), this.clone(b.value), (at - a.time) / (b.time - a.time)), mode: 'interpolate', sourceTime: a.time };\n if (!b && extrapolate && i > 0 && at > a.time && !a.discontinuity) {\n const p = s[i - 1]!;\n return { value: extrapolate(this.clone(a.value), this.clone(p.value), Math.min(at - a.time, maxExtrapolationMs), a.time - p.time), mode: 'extrapolate', sourceTime: a.time };\n }\n return { value: this.clone(a.value), mode: 'hold', sourceTime: a.time };\n }\n}\nexport class AdaptivePlayback {\n private lateness: number[] = [];\n private cursor = -Infinity;\n delayMs: number;\n constructor(readonly intervalMs: number, readonly minMs = intervalMs, readonly maxMs = 400) {\n if (!(intervalMs > 0) || minMs < 0 || maxMs < minMs) throw new RangeError('Invalid playback policy');\n this.delayMs = minMs;\n }\n observe(arrivalOnServerClock: number, sampleTime: number) {\n const late = arrivalOnServerClock - sampleTime;\n if (!Number.isFinite(late) || late < -1000 || late > 30000) return;\n this.lateness.push(Math.max(0, late)); if (this.lateness.length > 128) this.lateness.shift();\n }\n advance(serverNow: number, dtMs: number): number {\n if (!Number.isFinite(serverNow) || !Number.isFinite(dtMs) || dtMs < 0) throw new RangeError('Invalid clock');\n if (this.lateness.length) {\n const sorted = [...this.lateness].sort((a, b) => a - b);\n const p95 = sorted[Math.floor((sorted.length - 1) * 0.95)]!;\n const target = Math.max(this.minMs, Math.min(this.maxMs, p95 + this.intervalMs));\n const rate = target > this.delayMs ? 8 : 0.5;\n this.delayMs += (target - this.delayMs) * (1 - Math.exp(-rate * dtMs / 1000));\n }\n this.cursor = Math.max(this.cursor, serverNow - this.delayMs); return this.cursor;\n }\n reset() { this.lateness = []; this.cursor = -Infinity; this.delayMs = this.minMs; }\n}\nexport const lerp = (a: number, b: number, t: number) => a + (b - a) * t;\nexport const lerpAngle = (a: number, b: number, t: number) => a + Math.atan2(Math.sin(b - a), Math.cos(b - a)) * t;\nexport interface Vec3 { x: number; y: number; z: number }\nexport const lerpVec3 = (a: Vec3, b: Vec3, t: number): Vec3 => ({ x: lerp(a.x, b.x, t), y: lerp(a.y, b.y, t), z: lerp(a.z, b.z, t) });\n/** Validate rewind requests against a server-owned time window. This does not itself validate hits or authority. */\nexport function rewindTime(requested: number, now: number, maxRewindMs: number): number {\n if (![requested, now, maxRewindMs].every(Number.isFinite) || maxRewindMs < 0) throw new RangeError('Invalid rewind');\n return Math.max(now - maxRewindMs, Math.min(now, requested));\n}\n", "export interface Input<I> { seq: number; value: I }\n/** Game-owned step/clone functions keep physics, collision and authority policy outside the transport. */\nexport class Predictor<S, I> {\n state: S;\n private pending: Input<I>[] = [];\n private seq = 0;\n private ack = 0;\n private serverTick = -1;\n constructor(initial: S, readonly step: (state: S, input: I, dtSeconds: number) => S,\n readonly dtSeconds = 1 / 60, readonly maxPending = 256,\n readonly cloneState: (s: S) => S = (v: any) => structuredClone(v), readonly cloneInput: (i: I) => I = (v: any) => structuredClone(v)) {\n if (!(dtSeconds > 0) || !Number.isFinite(dtSeconds) || !Number.isInteger(maxPending) || maxPending < 1) throw new RangeError('Invalid prediction options');\n this.state = cloneState(initial);\n }\n get lastInput() { return this.seq; }\n get pendingCount() { return this.pending.length; }\n push(value: I): Input<I> {\n if (this.pending.length >= this.maxPending) throw new Error('Prediction history full: resync required');\n if (this.seq >= 0xffffffff) throw new Error('Input sequence exhausted: resync required');\n const frame = { seq: ++this.seq, value: this.cloneInput(value) };\n this.pending.push(frame);\n this.state = this.step(this.cloneState(this.state), this.cloneInput(value), this.dtSeconds);\n return { seq: frame.seq, value: this.cloneInput(frame.value) };\n }\n reconcile(snapshot: { ack: number; tick: number; state: S }): boolean {\n const { ack, tick } = snapshot;\n if (!Number.isSafeInteger(ack) || ack < 0 || ack > this.seq || !Number.isSafeInteger(tick) || tick < 0) throw new Error('Invalid authoritative snapshot');\n if (tick <= this.serverTick) return false;\n if (ack < this.ack) throw new Error('Authoritative acknowledgement regressed');\n this.serverTick = tick; this.ack = ack;\n this.pending = this.pending.filter(i => i.seq > ack);\n let state = this.cloneState(snapshot.state);\n for (const i of this.pending) state = this.step(state, this.cloneInput(i.value), this.dtSeconds);\n this.state = state; return true;\n }\n recent(count = 3): Input<I>[] { return (count <= 0 ? [] : this.pending.slice(-Math.floor(count))).map(i => ({ seq: i.seq, value: this.cloneInput(i.value) })); }\n resync(state: S, tick: number, ack = 0): void {\n if (!Number.isSafeInteger(tick) || tick < 0 || !Number.isSafeInteger(ack) || ack < 0 || ack > 0xffffffff) throw new RangeError('Invalid resync');\n this.state = this.cloneState(state); this.pending = []; this.serverTick = tick; this.ack = this.seq = ack;\n }\n}\n/** Receiver for redundant input bundles. ACK only the last input actually taken by the simulation. */\nexport class InputInbox<I> {\n applied = 0;\n private queued = new Map<number, I>();\n constructor(readonly capacity = 256, readonly clone: (i: I) => I = (v: any) => structuredClone(v)) {}\n add(input: Input<I>): boolean {\n if (!Number.isSafeInteger(input.seq) || input.seq <= this.applied || input.seq > this.applied + this.capacity || this.queued.has(input.seq)) return false;\n this.queued.set(input.seq, this.clone(input.value)); return true;\n }\n next(): Input<I> | null {\n const seq = this.applied + 1; if (!this.queued.has(seq)) return null;\n const value = this.queued.get(seq)!; this.queued.delete(seq); this.applied = seq; return { seq, value };\n }\n /** Explicit game policy after an expired input gap. Never called automatically. */\n skipThrough(seq: number) {\n if (!Number.isSafeInteger(seq) || seq < this.applied || seq > this.applied + this.capacity) throw new RangeError('Invalid input skip');\n for (const n of this.queued.keys()) if (n <= seq) this.queued.delete(n); this.applied = seq;\n }\n}\n", "export interface Point { x: number; y: number }\n/** Server-side visibility candidate lookup. Apply authorization/room filters before serializing entities. */\nexport class SpatialGrid<Id extends string | number> {\n private items = new Map<Id, Point & { key: string }>();\n private cells = new Map<string, Set<Id>>();\n constructor(readonly cellSize = 32, readonly maxEntities = 10000) {\n if (!(cellSize > 0) || !Number.isFinite(cellSize)) throw new RangeError('Invalid cell size');\n }\n private validate(p: Point) { if (![p.x, p.y].every(v => Number.isFinite(v) && Math.abs(v) <= 1e8)) throw new RangeError('Invalid position'); }\n upsert(id: Id, p: Point) {\n this.validate(p);\n if (!this.items.has(id) && this.items.size >= this.maxEntities) throw new Error('Spatial entity limit');\n const key = `${Math.floor(p.x / this.cellSize)},${Math.floor(p.y / this.cellSize)}`;\n const old = this.items.get(id);\n if (old && old.key !== key) { const c = this.cells.get(old.key)!; c.delete(id); if (!c.size) this.cells.delete(old.key); }\n let c = this.cells.get(key); if (!c) this.cells.set(key, c = new Set()); c.add(id);\n this.items.set(id, { ...p, key });\n }\n remove(id: Id): void {\n const p = this.items.get(id); if (!p) return;\n this.items.delete(id); const c = this.cells.get(p.key)!; c.delete(id); if (!c.size) this.cells.delete(p.key);\n }\n query(center: Point, radius: number): Set<Id> {\n this.validate(center);\n if (!Number.isFinite(radius) || radius < 0) throw new RangeError('Invalid radius');\n const minX = Math.floor((center.x - radius) / this.cellSize), maxX = Math.floor((center.x + radius) / this.cellSize);\n const minY = Math.floor((center.y - radius) / this.cellSize), maxY = Math.floor((center.y + radius) / this.cellSize);\n if ((maxX - minX + 1) * (maxY - minY + 1) > 4096) throw new RangeError('Query exceeds cell budget');\n const found = new Set<Id>(), r2 = radius * radius;\n for (let x = minX; x <= maxX; x++) for (let y = minY; y <= maxY; y++) {\n for (const id of this.cells.get(`${x},${y}`) ?? []) {\n const p = this.items.get(id)!; if ((p.x - center.x) ** 2 + (p.y - center.y) ** 2 <= r2) found.add(id);\n }\n }\n return found;\n }\n}\n", "export type Scalar = 'u8' | 'i8' | 'u16' | 'i16' | 'u32' | 'f32' | 'f64';\nexport interface Field { type: Scalar; scale?: number }\nconst sizes: Record<Scalar, number> = { u8: 1, i8: 1, u16: 2, i16: 2, u32: 4, f32: 4, f64: 8 };\nconst bounds: Record<Scalar, [number, number]> = {\n u8: [0, 255], i8: [-128, 127], u16: [0, 65535], i16: [-32768, 32767], u32: [0, 4294967295],\n f32: [-3.4028234663852886e38, 3.4028234663852886e38], f64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport function defineSchema<F extends Record<string, Field>>(schema: F) {\n type State = { [K in keyof F]: number };\n const fields = Object.entries(schema).map(([key, f]) => ({ key, type: f.type, scale: f.scale ?? 1 }));\n for (const f of fields) if (!Object.hasOwn(sizes, f.type) || !(f.scale > 0) || !Number.isFinite(f.scale) || ['__proto__', 'prototype', 'constructor'].includes(f.key)) throw new RangeError('Invalid field');\n const byteLength = fields.reduce((n, f) => n + sizes[f.type], 0);\n if (!byteLength || byteLength > 1078) throw new RangeError('Schema must fit one state payload');\n return {\n byteLength,\n encode(value: State): Uint8Array {\n const b = new Uint8Array(byteLength), v = new DataView(b.buffer); let at = 0;\n for (const f of fields) {\n const source = value[f.key as keyof F];\n if (!Number.isFinite(source)) throw new RangeError(`Invalid ${f.key}`);\n let n = source * f.scale;\n if (!f.type.startsWith('f')) n = Math.round(n);\n const [min, max] = bounds[f.type]; if (!Number.isFinite(n) || n < min || n > max) throw new RangeError(`Out of range: ${f.key}`);\n switch (f.type) {\n case 'u8': v.setUint8(at, n); break; case 'i8': v.setInt8(at, n); break;\n case 'u16': v.setUint16(at, n, true); break; case 'i16': v.setInt16(at, n, true); break;\n case 'u32': v.setUint32(at, n, true); break; case 'f32': v.setFloat32(at, n, true); break; case 'f64': v.setFloat64(at, n, true); break;\n }\n at += sizes[f.type];\n }\n return b;\n },\n decode(b: Uint8Array): State | null {\n if (b.length !== byteLength) return null;\n const v = new DataView(b.buffer, b.byteOffset, b.byteLength), out = Object.create(null) as State; let at = 0;\n for (const f of fields) {\n let n: number;\n switch (f.type) {\n case 'u8': n = v.getUint8(at); break; case 'i8': n = v.getInt8(at); break;\n case 'u16': n = v.getUint16(at, true); break; case 'i16': n = v.getInt16(at, true); break;\n case 'u32': n = v.getUint32(at, true); break; case 'f32': n = v.getFloat32(at, true); break; case 'f64': n = v.getFloat64(at, true); break;\n }\n if (!Number.isFinite(n) || !Number.isFinite(n / f.scale)) return null; out[f.key as keyof F] = n / f.scale; at += sizes[f.type];\n }\n return out;\n },\n };\n}\n", "import { isUint } from '../core/protocol.js';\nexport interface Version { id: number; generation: number; revision: number }\nexport interface ReplicaUpdate extends Version { deleted: boolean; data: Uint8Array }\ninterface Retained { update: ReplicaUpdate; ack: number; sent: number; sentAt: number }\nconst sameBytes = (a: Uint8Array, b: Uint8Array) => a.length === b.length && a.every((v, i) => b[i] === v);\n/** One instance per receiver. Whole small entity records are resent until acknowledged.\n * This intentionally does not depend on an unacknowledged delta baseline. */\nexport class ReplicaSender {\n private records = new Map<number, Retained>();\n constructor(readonly maxEntities = 1024, readonly retryMs = 100) {}\n publish(id: number, generation: number, data: Uint8Array | null): Version {\n if (!isUint(id, 65535) || !isUint(generation) || generation < 1 || (data?.length ?? 0) > 1067) throw new RangeError('Invalid entity');\n const old = this.records.get(id), deleted = data === null, bytes = data?.slice() ?? new Uint8Array();\n if (!old && this.records.size >= this.maxEntities) throw new Error('Replica entity limit');\n if (old && generation < old.update.generation) throw new Error('Entity generation regressed');\n if (old && generation === old.update.generation && old.update.deleted === deleted && sameBytes(old.update.data, bytes)) return { id, generation, revision: old.update.revision };\n const revision = old && generation === old.update.generation ? old.update.revision + 1 : 1;\n if (revision > 0xffffffff) throw new Error('Entity revision exhausted');\n const update = { id, generation, revision, deleted, data: bytes };\n this.records.set(id, { update, ack: old && generation === old.update.generation ? old.ack : 0, sent: 0, sentAt: -Infinity });\n return { id, generation, revision };\n }\n due(now: number, limit = 64): ReplicaUpdate[] {\n return [...this.records.values()].filter(r => r.ack < r.update.revision && now - r.sentAt >= this.retryMs)\n .sort((a, b) => a.sentAt - b.sentAt).slice(0, limit).map(r => ({ ...r.update, data: r.update.data.slice() }));\n }\n markSent(v: Version, now: number): void {\n const r = this.records.get(v.id); if (!r || r.update.generation !== v.generation || r.update.revision !== v.revision) return;\n r.sent = v.revision; r.sentAt = now;\n }\n acknowledge(v: Version): boolean {\n const r = this.records.get(v.id);\n if (!r || r.update.generation !== v.generation || !isUint(v.revision) || v.revision > r.sent) return false;\n r.ack = Math.max(r.ack, v.revision); return true;\n }\n /** Reset both sender and receiver under a new world/session generation, not while old packets remain valid. */\n clear(): void { this.records.clear(); }\n}\nexport class ReplicaReceiver {\n private records = new Map<number, ReplicaUpdate>();\n constructor(readonly maxEntities = 1024) {}\n apply(u: ReplicaUpdate): { changed: boolean; ack: Version } {\n if (!isUint(u.id, 65535) || !isUint(u.generation) || !u.generation || !isUint(u.revision) || !u.revision || u.data.length > 1067) throw new Error('Invalid entity update');\n const old = this.records.get(u.id);\n if (!old && this.records.size >= this.maxEntities) throw new Error('Replica receiver full');\n const changed = !old || u.generation > old.generation || u.generation === old.generation && u.revision > old.revision;\n if (changed) this.records.set(u.id, { ...u, data: u.data.slice() });\n return { changed, ack: { id: u.id, generation: u.generation, revision: u.revision } };\n }\n get(id: number): Uint8Array | null { const r = this.records.get(id); return r && !r.deleted ? r.data.slice() : null; }\n clear(): void { this.records.clear(); }\n}\nexport function encodeReplica(u: ReplicaUpdate): Uint8Array {\n if (!isUint(u.id, 65535) || !isUint(u.generation) || !u.generation || !isUint(u.revision) || !u.revision || u.data.length > 1067 || u.deleted && u.data.length)\n throw new Error('Invalid entity update');\n const b = new Uint8Array(11 + u.data.length), v = new DataView(b.buffer);\n v.setUint16(0, u.id, true); v.setUint32(2, u.generation, true); v.setUint32(6, u.revision, true); v.setUint8(10, +u.deleted);\n b.set(u.data, 11); return b;\n}\nexport function decodeReplica(b: Uint8Array): ReplicaUpdate | null {\n if (b.length < 11 || b.length > 1078) return null;\n const v = new DataView(b.buffer, b.byteOffset, b.byteLength), flag = v.getUint8(10), generation = v.getUint32(2, true), revision = v.getUint32(6, true);\n if (flag > 1 || !generation || !revision || flag && b.length !== 11) return null;\n return { id: v.getUint16(0, true), generation, revision, deleted: !!flag, data: b.slice(11) };\n}\n", "import { isUint, MAX_STATE_BYTES } from '../core/protocol.js';\nexport interface BinaryInput { seq: number; data: Uint8Array }\n/** Bundle recent inputs as redundancy without enabling retransmission of stale movement. */\nexport function encodeInputs(inputs: readonly BinaryInput[]): Uint8Array {\n if (!inputs.length || inputs.length > 32) throw new RangeError('Invalid input count');\n let size = 1, previous = -1;\n for (const input of inputs) {\n if (!isUint(input.seq) || input.seq <= previous || input.data.length > 1024) throw new RangeError('Invalid input');\n previous = input.seq; size += 6 + input.data.length;\n }\n if (size > MAX_STATE_BYTES) throw new RangeError('Input bundle exceeds one state frame');\n const b = new Uint8Array(size), v = new DataView(b.buffer); b[0] = inputs.length; let at = 1;\n for (const i of inputs) { v.setUint32(at, i.seq, true); v.setUint16(at + 4, i.data.length, true); b.set(i.data, at + 6); at += 6 + i.data.length; }\n return b;\n}\nexport function decodeInputs(b: Uint8Array): BinaryInput[] | null {\n if (!b.length || b.length > MAX_STATE_BYTES || !b[0] || b[0] > 32) return null;\n const v = new DataView(b.buffer, b.byteOffset, b.byteLength), out: BinaryInput[] = []; let at = 1, previous = -1;\n for (let n = 0; n < b[0]; n++) {\n if (at + 6 > b.length) return null;\n const seq = v.getUint32(at, true), size = v.getUint16(at + 4, true);\n if (seq <= previous || size > 1024 || at + 6 + size > b.length) return null;\n out.push({ seq, data: b.slice(at + 6, at + 6 + size) }); previous = seq; at += 6 + size;\n }\n return at === b.length ? out : null;\n}\n", "import { newer } from '../core/protocol.js';\nimport type { Json } from '../core/protocol.js';\n/**\n * What was sent, by state seq, so the next snapshot can be a delta against the newest one the receiver acknowledged\n * (send with `ack: true`, feed onStateAck to acknowledge). Lost snapshots cost nothing but a larger next delta.\n * Reset on a new connection epoch (the seqs restart) or a world reset.\n */\nexport class SnapshotHistory<T> {\n private sent = new Map<number, T>();\n private acked: { seq: number; value: T } | null = null;\n constructor(readonly capacity = 64) {\n if (!Number.isInteger(capacity) || capacity < 1) throw new RangeError('Invalid history capacity');\n }\n record(seq: number, value: T): void {\n if (!seq) return;\n this.sent.set(seq, value);\n while (this.sent.size > this.capacity) this.sent.delete(this.sent.keys().next().value!);\n }\n acknowledge(seq: number): boolean {\n const value = this.sent.get(seq);\n if (value === undefined || this.acked && !newer(seq, this.acked.seq)) return false;\n this.acked = { seq, value };\n for (const k of [...this.sent.keys()]) if (!newer(k, seq)) this.sent.delete(k);\n return true;\n }\n /** The acknowledged snapshot to diff against, or null for a whole snapshot. */\n get baseline(): { seq: number; value: T } | null { return this.acked; }\n reset(): void { this.sent.clear(); this.acked = null; }\n}\nexport type Entities = Record<string, Record<string, Json>>;\n/** Field-level difference between two entity maps: changed fields per entity, and removed entities. */\nexport interface EntityDelta { set?: Entities; del?: string[] }\nconst same = (a: Json | undefined, b: Json | undefined) => a === b || (typeof a === 'object' && a !== null && typeof b === 'object' && b !== null && JSON.stringify(a) === JSON.stringify(b));\nexport function diffEntities(base: Entities | null, next: Entities): EntityDelta {\n const out: EntityDelta = {};\n for (const id of Object.keys(next)) {\n const n = next[id]!, b = base?.[id];\n let fields: Record<string, Json> | undefined;\n for (const k of Object.keys(n)) if (!b || !same(b[k], n[k])) (fields ??= {})[k] = n[k]!;\n if (b) for (const k of Object.keys(b)) if (!(k in n)) (fields ??= {})[k] = null;\n if (fields) (out.set ??= {})[id] = fields;\n }\n if (base) for (const id of Object.keys(base)) if (!(id in next)) (out.del ??= []).push(id);\n return out;\n}\n/** Rebuild the full map from the baseline the delta was made against. Inputs are not modified. */\nexport function applyEntityDelta(base: Entities | null, delta: EntityDelta): Entities {\n const out: Entities = {};\n if (base) for (const id of Object.keys(base)) out[id] = { ...base[id] };\n for (const id of delta.del ?? []) delete out[id];\n for (const [id, fields] of Object.entries(delta.set ?? {})) {\n const e = out[id] ??= {};\n for (const [k, v] of Object.entries(fields)) { if (v === null && base?.[id] && k in base[id]!) delete e[k]; else e[k] = v; }\n }\n return out;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["same", "c"]
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var Twinwire=(()=>{var x=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var se=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var ae=(r,e,t)=>e in r?x(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var ce=(r,e)=>{for(var t in e)x(r,t,{get:e[t],enumerable:!0})},he=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of se(e))!oe.call(r,i)&&i!==t&&x(r,i,{get:()=>e[i],enumerable:!(n=re(e,i))||n.enumerable});return r};var le=r=>he(x({},"__esModule",{value:!0}),r);var s=(r,e,t)=>ae(r,typeof e!="symbol"?e+"":e,t);var Ce={};ce(Ce,{AdaptivePlayback:()=>J,BrowserRtcPeer:()=>E,DEFAULT_STATE_BYTES:()=>T,FixedStepper:()=>O,GameClient:()=>D,InputInbox:()=>L,LOBBY_KEY:()=>p,LobbyClient:()=>N,MTU_STATE_BYTES:()=>A,NetworkClock:()=>k,PROFILES:()=>ve,Predictor:()=>_,ReplicaReceiver:()=>j,ReplicaSender:()=>z,SnapshotHistory:()=>Y,SpatialGrid:()=>V,Timeline:()=>P,VERSION:()=>w,applyEntityDelta:()=>qe,cleanName:()=>ne,decodeInputs:()=>Te,decodeReplica:()=>Re,defineSchema:()=>Ee,diffEntities:()=>Me,encodeInputs:()=>Ae,encodeReplica:()=>xe,lerp:()=>U,lerpAngle:()=>ye,lerpVec3:()=>be,normalizeCode:()=>B,rewindTime:()=>we});var R=class{constructor(e,t,n){s(this,"rate",e);s(this,"capacity",t);s(this,"tokens");s(this,"at");if(!(e>0)||!Number.isFinite(e)||!(t>0)||!Number.isFinite(t))throw new RangeError("Invalid budget");this.tokens=t,this.at=n}available(e){return this.tokens=Math.min(this.capacity,this.tokens+Math.max(0,e-this.at)*this.rate/1e3),this.at=Math.max(this.at,e),this.tokens}take(e,t){if(!Number.isFinite(e)||e<0)throw new RangeError("Invalid byte count");return this.available(t)<Math.min(e,this.capacity)?!1:(this.tokens-=e,!0)}};var w=3;var A=1078;var T=65536;var d={state:1,probe:2,reply:3,events:4,sack:5,stateAcked:6},$=new Set(Object.values(d)),u=(r,e=4294967295)=>typeof r=="number"&&Number.isInteger(r)&&r>=0&&r<=e,K=r=>r===d.probe||r===d.reply,X=r=>r===d.state||r===d.stateAcked;function b(r){if(!$.has(r.kind)||!u(r.epoch)||!r.epoch||!u(r.stream,65535)||!u(r.seq)||!Number.isFinite(r.time)||r.payload.length>262122||K(r.kind)&&r.payload.length!==0||!X(r.kind)&&r.stream!==0)throw new RangeError("Invalid frame");let e=new Uint8Array(22+r.payload.length),t=new DataView(e.buffer);return t.setUint16(0,22356,!0),t.setUint8(2,3),t.setUint8(3,r.kind),t.setUint32(4,r.epoch,!0),t.setUint16(8,r.stream,!0),t.setUint32(10,r.seq,!0),t.setFloat64(14,r.time,!0),e.set(r.payload,22),e}function G(r,e=262144){if(r.byteLength<22||r.byteLength>Math.min(e,262144))return null;let t=new DataView(r.buffer,r.byteOffset,r.byteLength);if(t.getUint16(0,!0)!==22356||t.getUint8(2)!==3)return null;let n=t.getUint8(3),i=t.getUint32(4,!0),o=t.getFloat64(14,!0),a=t.getUint16(8,!0);return!$.has(n)||!i||!Number.isFinite(o)||K(n)&&r.byteLength!==22||!X(n)&&a!==0?null:{kind:n,epoch:i,stream:a,seq:t.getUint32(10,!0),time:o,payload:r.slice(22)}}function v(r,e){return r!==e&&r-e>>>0<2147483648}function ue(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)}var de=new TextEncoder,pe=new TextDecoder,W=r=>de.encode(r),Q=r=>pe.decode(r);function f(r){let e=0;for(let t=0;t<r.length;t++){let n=r.charCodeAt(t);n<128?e+=1:n<2048?e+=2:n>=55296&&n<=56319&&t+1<r.length?(e+=4,t++):e+=3}return e}function Z(r,e=131072){if(r.length>e||f(r)>e)return null;try{let t=JSON.parse(r);return ue(t)&&typeof t.t=="string"?t:null}catch{return null}}function y(r,e=131072){let t=JSON.stringify(r);if(t===void 0)throw new TypeError("Value is not JSON");if(f(t)>e)throw new RangeError("Control frame too large");return t}var I=class{constructor(e={},t){s(this,"next",1);s(this,"received",0);s(this,"acknowledged",0);s(this,"highestSent",0);s(this,"bytes",0);s(this,"pending",new Map);s(this,"early",new Map);s(this,"maxEvents");s(this,"maxBytes");s(this,"maxEventBytes");s(this,"maxEarly");let n=typeof e=="number"?{maxEvents:e,maxBytes:t}:e;if(this.maxEvents=n.maxEvents??512,this.maxBytes=n.maxBytes??1024*1024,this.maxEventBytes=n.maxEventBytes??64*1024,this.maxEarly=n.maxEarly??256,![this.maxEvents,this.maxBytes,this.maxEventBytes,this.maxEarly].every(i=>Number.isInteger(i)&&i>0))throw new RangeError("Invalid event limits")}push(e){let t=y(e,this.maxEventBytes),n=f(t)+64;if(n>this.maxEventBytes+64)throw new RangeError("Event payload too large");if(this.pending.size>=this.maxEvents||this.bytes+n>this.maxBytes)throw new Error("Reliable outbox full");if(!Number.isSafeInteger(this.next+1))throw new Error("Reliable sequence exhausted");let i=this.next++;return this.pending.set(i,{seq:i,data:JSON.parse(t),bytes:n,text:t,datagramAt:-1/0,datagramTries:0}),this.bytes+=n,i}get size(){return this.pending.size}get queuedBytes(){return this.bytes}get sentThrough(){return this.highestSent}entries(){return this.pending.values()}sent(e){this.highestSent=Math.max(this.highestSent,e)}ack(e){if(!Number.isSafeInteger(e)||e<0||e>this.highestSent)throw new Error("Invalid event acknowledgement");if(e<=this.acknowledged)return!1;this.acknowledged=e;for(let[t,n]of this.pending){if(t>e)break;this.pending.delete(t),this.bytes-=n.bytes}return!0}receive(e,t,n){if(!Number.isSafeInteger(e)||e<1)throw new Error("Invalid event sequence");if(e<=this.received)return 0;if(e!==this.received+1){if(e-this.received>this.maxEarly)throw new Error("Event sequence gap");return this.early.has(e)||this.early.set(e,t),0}n(t,e),this.received=e;let i=1;for(let o=e+1;this.early.has(o);o++)n(this.early.get(o),o),this.early.delete(o),this.received=o,i++;for(let o of this.early.keys())o<=this.received&&this.early.delete(o);return i}checkpoint(){return{next:this.next,received:this.received,acknowledged:this.acknowledged,pending:Array.from(this.pending.values(),e=>({seq:e.seq,data:structuredClone(e.data)}))}}restore(e){if(this.next!==1||this.received||this.pending.size)throw new Error("Restore requires a fresh channel");if(![e.next,e.received,e.acknowledged].every(o=>Number.isSafeInteger(o)&&o>=0)||e.next<1||e.acknowledged>=e.next||!Array.isArray(e.pending)||e.pending.length>this.maxEvents)throw new Error("Invalid checkpoint");if(e.pending.length!==e.next-e.acknowledged-1)throw new Error("Incomplete checkpoint");let t=[],n=0,i=e.acknowledged+1;for(let o of e.pending){if(o.seq!==i++)throw new Error("Invalid checkpoint sequence");let a=y(o.data,this.maxEventBytes),c=f(a)+64;t.push({seq:o.seq,data:JSON.parse(a),bytes:c,text:a,datagramAt:-1/0,datagramTries:0}),n+=c}if(n>this.maxBytes)throw new Error("Checkpoint exceeds outbox limit");this.next=e.next,this.received=e.received,this.acknowledged=e.acknowledged,this.highestSent=e.next-1,this.pending=new Map(t.map(o=>[o.seq,o])),this.bytes=n}};var ee=960,M=class{constructor(e={}){s(this,"events");s(this,"stats",{bytesSent:0,bytesReceived:0,statesSent:0,statesReceived:0,stale:0,expired:0,coalesced:0,congested:0,invalid:0,fastTransitions:0,datagramRttMs:0,eventsViaDatagram:0,datagramEventFrames:0,stateAcksSent:0,stateAcksReceived:0,impairedDrops:0});s(this,"onState",()=>{});s(this,"onEvent",()=>{});s(this,"onFastDown",()=>{});s(this,"onFastChange",()=>{});s(this,"onEventAck",()=>{});s(this,"onStateAck",()=>{});s(this,"reliable");s(this,"datagram");s(this,"epoch",0);s(this,"sequence",new Map);s(this,"received",new Map);s(this,"queued",new Map);s(this,"acksOut",new Map);s(this,"acksIn",new Map);s(this,"lastAckSentAt",-1/0);s(this,"lastEventSent",0);s(this,"datagramAcked",0);s(this,"ackDue",!1);s(this,"lastProbe",-1/0);s(this,"proofAt",-1/0);s(this,"attachedAt",0);s(this,"probes",new Map);s(this,"probeSeq",0);s(this,"fast",!1);s(this,"now");s(this,"budget");s(this,"highWater");s(this,"maxStreams");s(this,"probeInterval");s(this,"probeTimeout");s(this,"maxStateBytes");s(this,"datagramStateBytes");s(this,"datagramEvents");s(this,"stateAckInterval");s(this,"impairment");this.now=e.now??(()=>performance.now());let t=e.bytesPerSecond??32*1024;if(this.budget=new R(t,e.burstBytes??Math.max(t/2,16*1024),this.now()),this.highWater=e.maxBufferedBytes??64*1024,this.maxStreams=e.maxStreams??1024,this.probeInterval=e.probeIntervalMs??250,this.probeTimeout=e.probeTimeoutMs??1500,this.maxStateBytes=e.maxStateBytes??65536,this.datagramStateBytes=e.datagramStateBytes??8*1024,this.datagramEvents=e.datagramEvents??!0,this.stateAckInterval=e.stateAckIntervalMs??50,this.events=new I(e.events),!(this.highWater>0)||!u(this.maxStreams,65536)||this.maxStreams<1||!(this.probeInterval>=10)||!(this.probeTimeout>=this.probeInterval*2)||!u(this.maxStateBytes,262122)||this.maxStateBytes<1||!(this.datagramStateBytes>=1078)||!(this.stateAckInterval>=0))throw new RangeError("Invalid endpoint limits");e.impair&&this.setImpairment(e.impair)}get active(){return!!this.reliable?.open}get fastActive(){return this.fast&&!!this.datagram?.open&&this.now()-this.proofAt<=this.probeTimeout}get pendingStates(){return this.queued.size}get connectionEpoch(){return this.epoch}get maxFrameBytes(){return this.maxStateBytes+22}stateAck(e){return this.acksIn.get(e)}setImpairment(e){if(!e){this.impairment=void 0;return}let{lagMs:t=0,jitterMs:n=0,loss:i=0,duplicate:o=0}=e;if(![t,n].every(a=>Number.isFinite(a)&&a>=0&&a<=1e4)||![i,o].every(a=>Number.isFinite(a)&&a>=0&&a<=1))throw new RangeError("Invalid impairment");this.impairment=t||n||i||o?{lagMs:t,jitterMs:n,loss:i,duplicate:o}:void 0}get impaired(){return this.impairment&&{...this.impairment}}attach(e,t){if(!u(e)||!e)throw new Error("Invalid epoch");this.detach(),this.epoch=e,this.reliable=this.impairReliable(t),this.ackDue=this.events.received>0,this.lastEventSent=this.events.acknowledged,this.datagramAcked=0,this.sequence.clear(),this.received.clear(),this.acksOut.clear(),this.acksIn.clear();for(let n of this.events.entries())n.datagramAt=-1/0,n.datagramTries=0}detach(){this.dropDatagram(!1),this.reliable=void 0,this.queued.clear()}attachDatagram(e){this.dropDatagram(!1),this.datagram=this.impairDatagram(e),this.attachedAt=this.now(),this.lastProbe=-1/0,this.proofAt=-1/0,this.probes.clear()}dropDatagram(e=!0){let t=this.datagram;this.datagram=void 0,this.proofAt=-1/0,this.probes.clear(),this.setFast(!1);try{t?.close()}catch{}t&&e&&this.onFastDown()}setFast(e){e!==this.fast&&(this.fast=e,this.stats.fastTransitions++,this.onFastChange(e))}sendControl(e){let t=y(e),n=this.reliable;if(!n?.open||n.bufferedAmount>this.highWater)return!1;try{if(!n.send(t))return!1}catch{return!1}return this.stats.bytesSent+=f(t),!0}sendEvent(e){let t=this.events.push(e);return this.flush(),t}sendState(e,t,n,i={}){if(!this.active)return 0;if(!u(e,65535)||!Number.isFinite(n)||t.length>this.maxStateBytes||!(i.ttlMs===void 0||Number.isFinite(i.ttlMs)&&i.ttlMs>0)||!(i.priority===void 0||Number.isFinite(i.priority)&&i.priority>=0))throw new RangeError("Invalid state");if(!this.sequence.has(e)&&this.sequence.size>=this.maxStreams)throw new Error("State stream limit");let o=(this.sequence.get(e)??0)+1>>>0||1;this.sequence.set(e,o);let a=this.queued.get(e);a&&this.stats.coalesced++;let c=this.now();return this.queued.set(e,{frame:{kind:i.ack?d.stateAcked:d.state,epoch:this.epoch,stream:e,seq:o,time:n,payload:t.slice()},first:a?.first??c,deadline:c+(i.ttlMs??100),priority:i.priority??1}),o}receiveControl(e){if(e.e!==this.epoch||!this.active)return!1;if(e.t==="event"){if(typeof e.s!="number"||!("d"in e))throw new Error("Invalid event");return this.events.receive(e.s,e.d,this.onEvent),this.ackDue=!this.sendControl({t:"ack",e:this.epoch,s:this.events.received}),!0}if(e.t==="ack"){if(typeof e.s!="number")throw new Error("Invalid acknowledgement");return this.events.ack(e.s)&&this.onEventAck(e.s),!0}return!1}receiveBinary(e,t){if(this.stats.bytesReceived+=e.length,!this.active)return;let n=G(e,this.maxFrameBytes);if(!n){this.stats.invalid++;return}if(n.epoch!==this.epoch||t==="rtc"&&!this.datagram){this.stats.stale++;return}switch(n.kind){case d.probe:t==="rtc"&&this.sendFast(b({...n,kind:d.reply}));return;case d.reply:{if(t!=="rtc")return;let o=this.probes.get(n.seq);if(o===void 0||o!==n.time)return;this.probes.delete(n.seq);let a=this.now()-o;if(a<0||a>this.probeTimeout)return;this.proofAt=this.now(),this.stats.datagramRttMs=a,this.setFast(!0);return}case d.events:return this.receiveDatagramEvents(n);case d.sack:return this.receiveStateAcks(n)}let i=this.received.get(n.stream);if(i!==void 0&&!v(n.seq,i)){this.stats.stale++;return}if(i===void 0&&this.received.size>=this.maxStreams){this.stats.invalid++;return}this.received.set(n.stream,n.seq),this.stats.statesReceived++,n.kind===d.stateAcked&&this.acksOut.set(n.stream,n.seq),this.onState({stream:n.stream,seq:n.seq,time:n.time,data:n.payload,via:t})}receiveDatagramEvents(e){if(e.seq<=this.events.sentThrough&&this.events.ack(e.seq)&&this.onEventAck(e.seq),!e.payload.length)return;let t;try{t=JSON.parse(Q(e.payload))}catch{this.stats.invalid++;return}if(!Array.isArray(t)||t.length>64){this.stats.invalid++;return}let n=0;for(let i of t){if(!Array.isArray(i)||i.length!==2||!Number.isSafeInteger(i[0])){this.stats.invalid++;return}try{n+=this.events.receive(i[0],i[1],this.onEvent)}catch{this.stats.invalid++;return}}n&&(this.stats.eventsViaDatagram+=n,this.ackDue=!0)}receiveStateAcks(e){let t=e.payload;if(t.length%6){this.stats.invalid++;return}let n=new DataView(t.buffer,t.byteOffset,t.byteLength);for(let i=0;i<t.length;i+=6){let o=n.getUint16(i,!0),a=n.getUint32(i+2,!0),c=this.sequence.get(o);if(c===void 0||v(a,c))continue;let h=this.acksIn.get(o);h!==void 0&&!v(a,h)||(this.acksIn.set(o,a),this.stats.stateAcksReceived++,this.onStateAck(o,a))}}sendFast(e){let t=this.datagram;if(!t?.open||t.bufferedAmount>this.highWater)return!1;try{if(!t.send(e))return!1}catch{return!1}return this.stats.bytesSent+=e.length,!0}sendBinary(e,t){let n=this.reliable;if(t&&this.fastActive&&this.datagram&&this.datagram.bufferedAmount<=this.highWater)return this.sendFast(e);if(!n?.open||n.bufferedAmount>this.highWater)return!1;try{if(!n.send(e))return!1}catch{return!1}return this.stats.bytesSent+=e.length,!0}pump(){let e=this.now(),t=this.datagram;if(t){if(!t.open&&e-this.attachedAt>this.probeTimeout||this.fast&&e-this.proofAt>this.probeTimeout||!this.fast&&e-this.attachedAt>this.probeTimeout*2)this.dropDatagram();else if(t.open&&e-this.lastProbe>=this.probeInterval){this.lastProbe=e;let n=this.probeSeq=this.probeSeq+1>>>0;this.probes.set(n,e);for(let[i,o]of this.probes)e-o>this.probeTimeout&&this.probes.delete(i);this.sendFast(b({kind:d.probe,epoch:this.epoch,stream:0,seq:n,time:e,payload:new Uint8Array}))}}this.flush()}flush(e=8){let t=this.reliable,n=this.now();if(!t?.open)return;this.ackDue&&(this.ackDue=!this.sendControl({t:"ack",e:this.epoch,s:this.events.received}));for(let a of this.events.entries()){if(a.seq<=this.lastEventSent)continue;let c=`{"t":"event","e":${this.epoch},"s":${a.seq},"d":${a.text}}`,h=f(c);if(t.bufferedAmount>this.highWater||!this.budget.take(h,n))break;try{if(!t.send(c))break}catch{break}this.events.sent(a.seq),this.lastEventSent=a.seq,this.stats.bytesSent+=h}this.fastActive&&this.flushDatagramEvents(n),this.acksOut.size&&n-this.lastAckSentAt>=this.stateAckInterval&&this.flushStateAcks(n);for(let[a,c]of this.queued)c.deadline<=n&&(this.queued.delete(a),this.stats.expired++);if(!this.queued.size)return;let i=[...this.queued.values()].sort((a,c)=>c.priority+(n-c.first)/100-(a.priority+(n-a.first)/100)),o=0;for(let a of i){if(o++>=e)break;let c=b(a.frame);if(!this.budget.take(c.length,n))break;if(!this.sendBinary(c,a.frame.payload.length<=this.datagramStateBytes)){this.stats.congested++;break}this.stats.statesSent++,this.queued.delete(a.frame.stream)}}flushDatagramEvents(e){let t=Math.max(40,Math.min(200,this.stats.datagramRttMs*1.5+10)),n=[],i=2;if(this.datagramEvents)for(let c of this.events.entries()){if(c.seq>this.lastEventSent)break;if(c.datagramTries>=6||e-c.datagramAt<t||c.bytes-64>ee)continue;let h=`[${c.seq},${c.text}]`,l=f(h)+1;if(i+l>ee||n.length>=64)break;n.push(h),i+=l,c.datagramAt=e,c.datagramTries++}let o=this.events.received!==this.datagramAcked;if(!n.length&&!o)return;let a=W("["+n.join(",")+"]");this.sendFast(b({kind:d.events,epoch:this.epoch,stream:0,seq:this.events.received>>>0,time:e,payload:a}))&&(this.datagramAcked=this.events.received,this.stats.datagramEventFrames++)}flushStateAcks(e){let t=[...this.acksOut].slice(0,150),n=new Uint8Array(t.length*6),i=new DataView(n.buffer);if(t.forEach(([o,a],c)=>{i.setUint16(c*6,o,!0),i.setUint32(c*6+2,a,!0)}),this.sendBinary(b({kind:d.sack,epoch:this.epoch,stream:0,seq:0,time:e,payload:n}),!0)){for(let[o,a]of t)this.acksOut.get(o)===a&&this.acksOut.delete(o);this.lastAckSentAt=e,this.stats.stateAcksSent++}}impairReliable(e){let t=0,n,i=[],o=()=>{n=void 0;let c=performance.now();for(;i.length&&i[0].at<=c+1;){let{data:h}=i.shift();if(e.open)try{e.send(h)}catch{}}i.length&&(n=setTimeout(o,i[0].at-c))},a=this;return{get open(){return e.open},get bufferedAmount(){return e.bufferedAmount},close:()=>{i.length=0,clearTimeout(n),n=void 0,e.close()},send(c){let h=a.impairment;if(!h&&!i.length)return e.send(c);if(!e.open)return!1;let l=performance.now(),m=Math.max(t,l+(h?.lagMs??0)+Math.random()*(h?.jitterMs??0));return t=m,i.push({at:m,data:typeof c=="string"?c:c.slice()}),n||(n=setTimeout(o,m-l)),!0}}}impairDatagram(e){let t=this;return{get open(){return e.open},get bufferedAmount(){return e.bufferedAmount},close:()=>e.close(),send(n){let i=t.impairment;if(!i)return e.send(n);if(!e.open)return!1;let o=Math.random()<i.loss?0:Math.random()<i.duplicate?2:1;o||t.stats.impairedDrops++;for(let a=0;a<o;a++){let c=n.slice();setTimeout(()=>{if(e.open)try{e.send(c)}catch{}},i.lagMs+Math.random()*i.jitterMs)}return!0}}}};function C(r){if(!r||typeof r!="object")return!1;let e=r;return e.kind==="offer"||e.kind==="answer"?typeof e.sdp=="string"&&e.sdp.length>0&&e.sdp.length<=12e3:e.kind==="candidate"&&typeof e.candidate=="string"&&e.candidate.length<=1500&&typeof e.mid=="string"&&e.mid.length<=128}var fe=/^(stuns?|turns?):[^\s]{1,250}$/;function te(r){return Array.isArray(r)&&r.length<=8&&r.every(e=>{if(!e||typeof e!="object")return!1;let t=e,n=Array.isArray(t.urls)?t.urls:[t.urls];return n.length>=1&&n.length<=8&&n.every(i=>typeof i=="string"&&fe.test(i))&&(t.username===void 0||typeof t.username=="string"&&t.username.length<=256)&&(t.credential===void 0||typeof t.credential=="string"&&t.credential.length<=256)})}var k=class{constructor(){s(this,"samples",[]);s(this,"offset",0);s(this,"target",0);s(this,"initialized",!1);s(this,"last",-1/0);s(this,"rttMs",0);s(this,"uncertaintyMs",1/0)}get synced(){return this.initialized}reset(){this.samples=[],this.offset=this.target=0,this.initialized=!1,this.last=-1/0,this.uncertaintyMs=1/0}observe(e,t,n){let i=t-e;if(![e,t,n].every(Number.isFinite)||i<0||i>15e3)return!1;this.samples.push({rtt:i,offset:n-(e+t)/2}),this.samples.length>16&&this.samples.shift();let o=[...this.samples].sort((a,c)=>a.rtt-c.rtt).slice(0,3);return this.target=o.reduce((a,c)=>a+c.offset,0)/o.length,this.rttMs=o[0].rtt,this.uncertaintyMs=Math.max(...o.map(a=>Math.abs(a.offset-this.target)+a.rtt/2)),this.initialized||(this.offset=this.target,this.initialized=!0),!0}advance(e){if(!Number.isFinite(e)||e<0)throw new RangeError("Invalid time step");let t=e*.05;this.offset+=Math.max(-t,Math.min(t,this.target-this.offset))}serverTime(e){return this.last=Math.max(this.last,e+this.offset),this.last}};var E=class{constructor(e,t={iceServers:[]}){s(this,"cb",e);s(this,"pc");s(this,"dc");s(this,"alive",!0);s(this,"offered",!1);s(this,"remoteReady",!1);s(this,"localCandidates",[]);s(this,"remoteCandidates",[]);s(this,"chain",Promise.resolve());this.pc=new RTCPeerConnection(t),this.dc=this.pc.createDataChannel("twinwire",{negotiated:!0,id:0,ordered:!1,maxRetransmits:0});let n=this.pc,i=this.dc;i.binaryType="arraybuffer",i.onopen=()=>{this.alive&&e.open({get open(){return i.readyState==="open"},get bufferedAmount(){return i.bufferedAmount},send(o){return i.readyState!=="open"?!1:(i.send(o.slice().buffer),!0)},close:()=>this.close()})},i.onmessage=o=>{this.alive&&o.data instanceof ArrayBuffer&&e.data(new Uint8Array(o.data))},i.onclose=()=>{this.alive&&(this.close(),e.closed())},i.onerror=()=>{this.alive&&e.error(new Error("RTC data channel error"))},n.onconnectionstatechange=()=>{this.alive&&n.connectionState==="failed"&&(this.close(),e.closed())},n.onicecandidate=o=>{if(!this.alive||!o.candidate?.candidate)return;let a={kind:"candidate",candidate:o.candidate.candidate,mid:o.candidate.sdpMid??"0"};this.offered?e.signal(a):this.localCandidates.length<64&&this.localCandidates.push(a)}}async offer(){if(await this.pc.setLocalDescription(await this.pc.createOffer()),!!this.alive){this.cb.signal({kind:"offer",sdp:this.pc.localDescription.sdp}),this.offered=!0;for(let e of this.localCandidates)this.cb.signal(e);this.localCandidates=[]}}signal(e){return this.chain=this.chain.then(async()=>{if(!(!this.alive||!C(e))){if(e.kind==="answer"){if(await this.pc.setRemoteDescription({type:"answer",sdp:e.sdp}),!this.alive)return;this.remoteReady=!0;for(let t of this.remoteCandidates)await this.pc.addIceCandidate(t);this.remoteCandidates=[]}else if(e.kind==="candidate"){let t={candidate:e.candidate,sdpMid:e.mid};if(this.remoteReady)await this.pc.addIceCandidate(t);else{if(this.remoteCandidates.length>=64)throw new Error("Too many ICE candidates");this.remoteCandidates.push(t)}}}}).catch(t=>{this.alive&&this.cb.error(t instanceof Error?t:new Error(String(t)))}),this.chain}close(){if(this.alive){this.alive=!1,this.localCandidates=[],this.remoteCandidates=[],this.dc.onopen=this.dc.onmessage=this.dc.onclose=this.dc.onerror=null,this.pc.onicecandidate=this.pc.onconnectionstatechange=null;try{this.dc.close(),this.pc.close()}catch{}}}};var D=class{constructor(e){s(this,"options",e);s(this,"endpoint");s(this,"clock",new k);s(this,"status","idle");s(this,"id",null);s(this,"iceServers",[]);s(this,"onStatus",()=>{});s(this,"onSession",()=>{});s(this,"onSessionLost",()=>{});s(this,"onState",()=>{});s(this,"onEvent",()=>{});s(this,"onStateAck",()=>{});s(this,"onTransport",()=>{});s(this,"onError",()=>{});s(this,"token",null);s(this,"socket");s(this,"generation",0);s(this,"epoch",0);s(this,"peer");s(this,"rtcAttempt",0);s(this,"rtcStartedAt",0);s(this,"rtcRetryAt",1/0);s(this,"rtcFailures",0);s(this,"reconnects",0);s(this,"retryTimer");s(this,"pumpTimer");s(this,"lastPump",0);s(this,"lastPing",-1/0);s(this,"lastMessage",0);s(this,"openedAt",0);s(this,"wakeDeadline",1/0);s(this,"pendingPings",new Map);s(this,"pingId",0);s(this,"stopped",!0);s(this,"serverRtc",!1);s(this,"lastTransport","none");s(this,"waiters",[]);s(this,"lifecycle");s(this,"interceptors",[]);s(this,"listeners",{session:[],lost:[]});let t=new URL(e.url);if(!["ws:","wss:"].includes(t.protocol)||!/^[\w:.-]{1,64}$/.test(e.room))throw new Error("Invalid URL or room");this.endpoint=this.makeEndpoint();let n=e.checkpoint;if(n){if(n.url!==e.url||n.room!==e.room||!/^[\w-]{20,128}$/.test(n.token)||typeof n.id!="string")throw new Error("Checkpoint belongs to a different endpoint or is invalid");this.endpoint.events.restore(n.events),this.token=n.token,this.id=n.id}}makeEndpoint(){let e=new M({...this.options.endpoint,impair:this.options.impair??this.options.endpoint?.impair});return e.onState=t=>this.onState(t),e.onEvent=(t,n)=>{for(let i of this.interceptors)if(i(t,n))return;this.onEvent(t,n)},e.onStateAck=(t,n)=>this.onStateAck(t,n),e.onFastDown=()=>this.stopRtc(!0),e.onFastChange=()=>this.noteTransport(),e}intercept(e){return this.interceptors.push(e),()=>{let t=this.interceptors.indexOf(e);t>=0&&this.interceptors.splice(t,1)}}on(e,t){let n=this.listeners[e];return n.push(t),()=>{let i=n.indexOf(t);i>=0&&n.splice(i,1)}}lost(e){for(let t of this.listeners.lost)try{t(e)}catch(n){this.report(n)}this.onSessionLost(e)}get transport(){return this.status!=="online"?"none":this.endpoint.fastActive?"rtc":"ws"}noteTransport(){let e=this.transport;if(e!==this.lastTransport){this.lastTransport=e;try{this.onTransport(e)}catch(t){this.report(t)}}}report(e){this.onError(e instanceof Error?e:new Error(String(e)))}setStatus(e){if(e!==this.status){if(this.status=e,this.onStatus(e),this.noteTransport(),e==="online")for(let t of this.waiters.splice(0))t.resolve();else if(e==="lost"||e==="closed")for(let t of this.waiters.splice(0))t.reject(new Error(`Session ${e}`))}}whenOnline(){return this.status==="online"?Promise.resolve():this.status==="lost"||this.status==="closed"?Promise.reject(new Error(`Session ${this.status}`)):new Promise((e,t)=>this.waiters.push({resolve:e,reject:t}))}connect(){if(!(this.status==="online"||this.status==="connecting")){if(this.status==="lost")throw new Error("Call newSession() after session expiry");this.stopped=!1,this.setStatus("connecting"),clearInterval(this.pumpTimer),this.lastPump=performance.now(),this.pumpTimer=setInterval(()=>this.pump(),1e3/(this.options.pumpHz??60)),this.open()}}open(){if(this.stopped)return;clearTimeout(this.retryTimer),this.retryTimer=void 0;let e=++this.generation,t=performance.now();this.openedAt=this.lastMessage=t;let n;try{n=(this.options.websocket??(i=>new WebSocket(i)))(this.options.url)}catch(i){this.report(i),this.retry();return}this.socket=n,n.binaryType="arraybuffer",n.onopen=()=>{if(e!==this.generation||this.stopped){n.close();return}n.send(y({t:"hello",v:3,room:this.options.room,token:this.token,auth:this.options.auth??null,impair:this.options.impair??null}))},n.onmessage=i=>{if(!(e!==this.generation||this.stopped)){this.lastMessage=performance.now(),this.wakeDeadline=1/0;try{i.data instanceof ArrayBuffer?this.endpoint.receiveBinary(new Uint8Array(i.data),"ws"):typeof i.data=="string"&&this.message(i.data,n)}catch(o){this.report(o),n.close(4004,"protocol")}}},n.onerror=()=>{},n.onclose=i=>{e===this.generation&&(this.socket=void 0,this.endpoint.detach(),this.stopRtc(!1),this.clock.reset(),this.pendingPings.clear(),this.stopped||([1002,1008,4001,4002,4004].includes(i.code)?(this.stopped=!0,clearInterval(this.pumpTimer),clearTimeout(this.retryTimer),this.setStatus("lost"),this.lost({pendingEvents:this.endpoint.events.size,reason:i.reason||`connection rejected (${i.code})`})):(this.setStatus("connecting"),this.retry())))}}message(e,t){this.endpoint.stats.bytesReceived+=f(e);let n=Z(e);if(!n)throw new Error("Invalid control message");if(n.t==="reset"){this.stopped=!0,clearInterval(this.pumpTimer),clearTimeout(this.retryTimer),this.stopRtc(!1),this.endpoint.detach(),t.close(),this.setStatus("lost"),this.lost({pendingEvents:this.endpoint.events.size,reason:typeof n.reason=="string"?n.reason:"expired"});return}if(n.t==="welcome"){if(this.status!=="connecting"||!u(n.e)||!n.e||typeof n.id!="string"||typeof n.token!="string"||!/^[\w-]{20,128}$/.test(n.token)||typeof n.resumed!="boolean"||n.v!==3)throw new Error("Invalid welcome");this.token=n.token,this.id=n.id,this.epoch=n.e,this.reconnects=0,this.serverRtc=n.rtc===!0,this.iceServers=te(n.ice)?n.ice:[],this.endpoint.attach(this.epoch,{get open(){return t.readyState===1},get bufferedAmount(){return t.bufferedAmount},send(o){return t.readyState!==1?!1:(t.send(typeof o=="string"?o:o.slice().buffer),!0)},close(){t.close()}}),this.lastPing=-1/0,this.clock.reset(),this.setStatus("online");let i={id:this.id,resumed:n.resumed};for(let o of this.listeners.session)try{o(i)}catch(a){this.report(a)}this.onSession(i),this.rtcFailures=0,this.rtcRetryAt=performance.now(),this.pump();return}if(!(n.e!==this.epoch||this.status!=="online")&&!this.endpoint.receiveControl(n)){if(n.t==="pong"&&u(n.n)&&typeof n.s=="number"&&Number.isFinite(n.s)){let i=this.pendingPings.get(n.n);if(i===void 0)return;this.pendingPings.delete(n.n),this.clock.observe(i,performance.now(),n.s);return}if(n.t==="signal"&&n.a===this.rtcAttempt&&C(n.d)){this.peer?.signal(n.d);return}n.t==="rtc-reset"&&n.a===this.rtcAttempt&&this.stopRtc(!1)}}retry(){if(this.stopped)return;clearTimeout(this.retryTimer);let e=Math.min(this.options.reconnectMaxMs??8e3,(this.options.reconnectBaseMs??200)*2**Math.min(this.reconnects++,8));this.retryTimer=setTimeout(()=>this.open(),e*(.5+Math.random()/2))}simulateDrop(){this.socket?.close(4e3,"simulated drop")}reconnectNow(){this.stopped||this.status==="online"||(this.reconnects=0,(this.retryTimer!==void 0||!this.socket)&&this.open())}rtcConfig(){let e=this.options.rtc||void 0;return e?.iceServers?e:{...e,iceServers:this.iceServers}}startRtc(){if(!this.serverRtc||this.peer||this.options.rtc===!1||typeof RTCPeerConnection>"u"||this.status!=="online")return;let e=++this.rtcAttempt,t=this.epoch;this.rtcStartedAt=performance.now(),this.rtcRetryAt=1/0;try{let n=new E({signal:i=>{e===this.rtcAttempt&&t===this.epoch&&this.endpoint.sendControl({t:"signal",e:t,a:e,d:i})},open:i=>{e===this.rtcAttempt&&t===this.epoch&&!this.stopped?this.endpoint.attachDatagram(i):i.close()},data:i=>{e===this.rtcAttempt&&t===this.epoch&&this.endpoint.receiveBinary(i,"rtc")},closed:()=>{e===this.rtcAttempt&&t===this.epoch&&this.stopRtc(!0)},error:i=>{e===this.rtcAttempt&&t===this.epoch&&(this.report(i),this.stopRtc(!0))}},this.rtcConfig());this.peer=n,n.offer().catch(i=>{this.peer===n&&(this.report(i),this.stopRtc(!0))})}catch(n){this.report(n),this.stopRtc(!0)}}stopRtc(e){let t=this.rtcAttempt,n=this.peer;this.peer=void 0,e&&n&&this.endpoint.sendControl({t:"rtc-reset",e:this.epoch,a:t}),this.endpoint.dropDatagram(!1),n?.close(),this.rtcRetryAt=performance.now()+Math.min(6e4,(this.options.rtcRetryMs??3e3)*2**Math.min(this.rtcFailures++,4)),this.noteTransport()}pump(){if(this.stopped)return;let e=performance.now();if(this.clock.advance(Math.max(0,e-this.lastPump)),this.lastPump=e,this.status==="online"){if(e-this.lastMessage>(this.options.heartbeatTimeoutMs??8e3)||e>this.wakeDeadline){this.wakeDeadline=1/0,this.socket?.close(4e3,"heartbeat timeout");return}e-this.lastPing>=(this.pendingPings.size<4&&this.clock.uncertaintyMs===1/0?200:1e3)&&this.ping(e),this.peer&&e-this.rtcStartedAt>(this.options.rtcConnectTimeoutMs??8e3)&&!this.endpoint.fastActive&&this.stopRtc(!0),!this.peer&&e>=this.rtcRetryAt&&this.startRtc(),this.endpoint.pump(),this.noteTransport()}else this.socket&&e-this.openedAt>1e4&&this.socket.close(4e3,"handshake timeout")}ping(e){let t=this.pingId=this.pingId+1>>>0;this.endpoint.sendControl({t:"ping",e:this.epoch,n:t})&&(this.pendingPings.set(t,e),this.lastPing=e);for(let[n,i]of this.pendingPings)e-i>1e4&&this.pendingPings.delete(n)}sendEvent(e){return this.endpoint.sendEvent(e)}sendState(e,t,n){return this.clock.synced?this.endpoint.sendState(e,t,this.clock.serverTime(performance.now()),n):0}flush(){this.endpoint.flush()}pause(){this.stopped=!0,++this.generation,clearTimeout(this.retryTimer),clearInterval(this.pumpTimer),this.stopRtc(!1),this.endpoint.detach(),this.socket?.close(4003,"paused"),this.socket=void 0,this.setStatus("paused")}resume(){this.status==="paused"&&this.connect()}newSession(){this.pause(),this.endpoint=this.makeEndpoint(),this.token=this.id=null,this.epoch=0,this.connect()}close(){if(this.status!=="closed"){try{this.endpoint.sendControl({t:"leave",e:this.epoch})}catch{}this.pause(),this.lifecycle?.(),this.lifecycle=void 0,this.setStatus("closed")}}checkpoint(){return this.token&&this.id?{url:this.options.url,room:this.options.room,token:this.token,id:this.id,events:this.endpoint.events.checkpoint()}:null}bindPageLifecycle(e={}){this.lifecycle?.();let t=e.hiddenPauseMs??2e4,n=e.wakeCheckMs??1500,i,o=()=>{clearTimeout(i),(this.status==="online"||this.status==="connecting")&&this.pause()},a=()=>{if(clearTimeout(i),this.status==="paused"){this.resume();return}this.status==="online"?(this.wakeDeadline=performance.now()+n,this.ping(performance.now())):this.reconnectNow()},c=()=>{document.visibilityState==="visible"?a():(clearTimeout(i),i=setTimeout(o,t))},h=()=>o(),l=()=>a(),m=()=>this.reconnectNow();window.addEventListener("pagehide",h),window.addEventListener("pageshow",l),window.addEventListener("online",m),document.addEventListener("visibilitychange",c);let g=()=>{clearTimeout(i),window.removeEventListener("pagehide",h),window.removeEventListener("pageshow",l),window.removeEventListener("online",m),document.removeEventListener("visibilitychange",c)};return this.lifecycle=g,g}};var p="$lobby";function B(r){if(typeof r!="string")return null;let e=r.trim().toUpperCase();return/^[A-Z0-9]{3,12}$/.test(e)?e:null}var S=(r,e)=>String.fromCharCode(r)+"-"+String.fromCharCode(e),ge=new RegExp("["+[S(0,31),S(127,159),S(8203,8207),S(8232,8238),S(8294,8297)].join("")+"]","g");function ne(r,e=16){return typeof r!="string"?"":r.replace(/\s+/g," ").replace(ge,"").replace(/ +/g," ").trim().slice(0,e)}function ie(r){return!!r&&typeof r=="object"&&!Array.isArray(r)&&typeof r[p]=="string"}var N=class{constructor(e,t=2e4){s(this,"client",e);s(this,"requestTimeoutMs",t);s(this,"room",null);s(this,"onRoom",()=>{});s(this,"onLeft",()=>{});s(this,"pending",new Map);s(this,"nextId",1);s(this,"off");this.off=[e.intercept(n=>ie(n)?(this.message(n),!0):!1),e.on("session",({resumed:n})=>{n||this.drop("new session")}),e.on("lost",({reason:n})=>this.drop(n))]}dispose(){for(let e of this.off)e();this.drop("disposed",!1)}get me(){return this.room?.members.find(e=>e.seat===this.room.you)??null}get isHost(){return!!this.me?.host}countdownMs(){let e=this.room?.countdownEndsAt;return e==null||!this.client.clock.synced?null:Math.max(0,e-this.client.clock.serverTime(performance.now()))}create(e={}){return this.request({[p]:"create",...e})}join(e,t={}){let n=B(e);return n?this.request({[p]:"join",code:n,...t}):Promise.reject(new Error("That is not a room code"))}quickPlay(e={}){return this.request({[p]:"quick",...e})}async leave(){await this.request({[p]:"leave"}),this.set(null)}setReady(e){return this.request({[p]:"ready",ready:e})}setName(e){return this.request({[p]:"name",name:e})}setMeta(e){return this.request({[p]:"meta",meta:e})}kick(e){return this.request({[p]:"kick",seat:e})}request(e){let t=this.nextId++;return new Promise((n,i)=>{let o=setTimeout(()=>{this.pending.delete(t),i(new Error("The room server did not answer"))},this.requestTimeoutMs);this.pending.set(t,{resolve:n,reject:i,timer:o});try{this.client.sendEvent({...e,id:t})}catch(a){clearTimeout(o),this.pending.delete(t),i(a instanceof Error?a:new Error(String(a)))}})}set(e){this.room=e;try{this.onRoom(e)}catch{}}message(e){let t=e[p];if(t==="res"&&typeof e.id=="number"){let n=this.pending.get(e.id);if(!n)return;if(this.pending.delete(e.id),clearTimeout(n.timer),e.ok===!0){let i=e.room??null;(i||this.room)&&this.set(i),n.resolve(i)}else n.reject(new Error(typeof e.error=="string"?e.error:"Request refused"));return}if(t==="room"&&e.room&&typeof e.room=="object"){this.set(e.room);return}if(t==="left"){let n=!!this.room;if(this.set(null),n)try{this.onLeft(typeof e.reason=="string"?e.reason:"left")}catch{}}}drop(e,t=!0){for(let n of this.pending.values())clearTimeout(n.timer),n.reject(new Error(e));if(this.pending.clear(),this.room&&(this.set(null),t))try{this.onLeft(e)}catch{}}};var O=class{constructor(e=30,t=4){s(this,"maxCatchUp",t);s(this,"tick",0);s(this,"overruns",0);s(this,"droppedMs",0);s(this,"accumulator",0);s(this,"dtMs");if(!(e>0)||!Number.isFinite(e)||!Number.isInteger(t)||t<1)throw new RangeError("Invalid tick policy");this.dtMs=1e3/e}advance(e,t){if(!Number.isFinite(e)||e<0)throw new RangeError("Invalid elapsed time");this.accumulator+=e;let n=0;for(;this.accumulator+1e-8>=this.dtMs&&n<this.maxCatchUp;)this.accumulator-=this.dtMs,this.tick++,n++,t(this.dtMs/1e3,this.tick);if(this.accumulator>=this.dtMs){let i=Math.floor(this.accumulator/this.dtMs)*this.dtMs;this.accumulator-=i,this.droppedMs+=i,this.overruns++}return n}get alpha(){return Math.max(0,this.accumulator/this.dtMs)}},ve=Object.freeze({social:{simulationHz:20,sendHz:20,bytesPerSecond:12*1024,interpolationMinMs:50},action:{simulationHz:60,sendHz:30,bytesPerSecond:24*1024,interpolationMinMs:35},strategy:{simulationHz:10,sendHz:10,bytesPerSecond:12*1024,interpolationMinMs:100},turnBased:{simulationHz:0,sendHz:0,bytesPerSecond:8*1024,interpolationMinMs:0}});var P=class{constructor(e=64,t=n=>structuredClone(n)){s(this,"capacity",e);s(this,"clone",t);s(this,"samples",[]);if(!Number.isInteger(e)||e<2||e>4096)throw new RangeError("Invalid history capacity")}get size(){return this.samples.length}clear(){this.samples=[]}insert(e){if(!Number.isFinite(e.time)||!Number.isSafeInteger(e.seq)||e.seq<0)throw new RangeError("Invalid snapshot");if(this.samples.some(o=>o.seq===e.seq))return!1;let t=this.samples.findIndex(o=>o.time===e.time);if(t>=0){if(this.samples[t].seq>e.seq)return!1;this.samples.splice(t,1)}let n={...e,value:this.clone(e.value)},i=this.samples.findIndex(o=>o.time>e.time);for(i<0?this.samples.push(n):this.samples.splice(i,0,n);this.samples.length>this.capacity;)this.samples.shift();return!0}sample(e,t,n,i=100){if(!Number.isFinite(e)||!Number.isFinite(i)||i<0)throw new RangeError("Invalid sample time");let o=this.samples;if(!o.length||o[0].time>e)return null;let a=o.length-1;for(;a>0&&o[a].time>e;)a--;let c=o[a],h=o[a+1];if(h&&!h.discontinuity)return{value:t(this.clone(c.value),this.clone(h.value),(e-c.time)/(h.time-c.time)),mode:"interpolate",sourceTime:c.time};if(!h&&n&&a>0&&e>c.time&&!c.discontinuity){let l=o[a-1];return{value:n(this.clone(c.value),this.clone(l.value),Math.min(e-c.time,i),c.time-l.time),mode:"extrapolate",sourceTime:c.time}}return{value:this.clone(c.value),mode:"hold",sourceTime:c.time}}},J=class{constructor(e,t=e,n=400){s(this,"intervalMs",e);s(this,"minMs",t);s(this,"maxMs",n);s(this,"lateness",[]);s(this,"cursor",-1/0);s(this,"delayMs");if(!(e>0)||t<0||n<t)throw new RangeError("Invalid playback policy");this.delayMs=t}observe(e,t){let n=e-t;!Number.isFinite(n)||n<-1e3||n>3e4||(this.lateness.push(Math.max(0,n)),this.lateness.length>128&&this.lateness.shift())}advance(e,t){if(!Number.isFinite(e)||!Number.isFinite(t)||t<0)throw new RangeError("Invalid clock");if(this.lateness.length){let n=[...this.lateness].sort((c,h)=>c-h),i=n[Math.floor((n.length-1)*.95)],o=Math.max(this.minMs,Math.min(this.maxMs,i+this.intervalMs)),a=o>this.delayMs?8:.5;this.delayMs+=(o-this.delayMs)*(1-Math.exp(-a*t/1e3))}return this.cursor=Math.max(this.cursor,e-this.delayMs),this.cursor}reset(){this.lateness=[],this.cursor=-1/0,this.delayMs=this.minMs}},U=(r,e,t)=>r+(e-r)*t,ye=(r,e,t)=>r+Math.atan2(Math.sin(e-r),Math.cos(e-r))*t,be=(r,e,t)=>({x:U(r.x,e.x,t),y:U(r.y,e.y,t),z:U(r.z,e.z,t)});function we(r,e,t){if(![r,e,t].every(Number.isFinite)||t<0)throw new RangeError("Invalid rewind");return Math.max(e-t,Math.min(e,r))}var _=class{constructor(e,t,n=1/60,i=256,o=c=>structuredClone(c),a=c=>structuredClone(c)){s(this,"step",t);s(this,"dtSeconds",n);s(this,"maxPending",i);s(this,"cloneState",o);s(this,"cloneInput",a);s(this,"state");s(this,"pending",[]);s(this,"seq",0);s(this,"ack",0);s(this,"serverTick",-1);if(!(n>0)||!Number.isFinite(n)||!Number.isInteger(i)||i<1)throw new RangeError("Invalid prediction options");this.state=o(e)}get lastInput(){return this.seq}get pendingCount(){return this.pending.length}push(e){if(this.pending.length>=this.maxPending)throw new Error("Prediction history full: resync required");if(this.seq>=4294967295)throw new Error("Input sequence exhausted: resync required");let t={seq:++this.seq,value:this.cloneInput(e)};return this.pending.push(t),this.state=this.step(this.cloneState(this.state),this.cloneInput(e),this.dtSeconds),{seq:t.seq,value:this.cloneInput(t.value)}}reconcile(e){let{ack:t,tick:n}=e;if(!Number.isSafeInteger(t)||t<0||t>this.seq||!Number.isSafeInteger(n)||n<0)throw new Error("Invalid authoritative snapshot");if(n<=this.serverTick)return!1;if(t<this.ack)throw new Error("Authoritative acknowledgement regressed");this.serverTick=n,this.ack=t,this.pending=this.pending.filter(o=>o.seq>t);let i=this.cloneState(e.state);for(let o of this.pending)i=this.step(i,this.cloneInput(o.value),this.dtSeconds);return this.state=i,!0}recent(e=3){return(e<=0?[]:this.pending.slice(-Math.floor(e))).map(t=>({seq:t.seq,value:this.cloneInput(t.value)}))}resync(e,t,n=0){if(!Number.isSafeInteger(t)||t<0||!Number.isSafeInteger(n)||n<0||n>4294967295)throw new RangeError("Invalid resync");this.state=this.cloneState(e),this.pending=[],this.serverTick=t,this.ack=this.seq=n}},L=class{constructor(e=256,t=n=>structuredClone(n)){s(this,"capacity",e);s(this,"clone",t);s(this,"applied",0);s(this,"queued",new Map)}add(e){return!Number.isSafeInteger(e.seq)||e.seq<=this.applied||e.seq>this.applied+this.capacity||this.queued.has(e.seq)?!1:(this.queued.set(e.seq,this.clone(e.value)),!0)}next(){let e=this.applied+1;if(!this.queued.has(e))return null;let t=this.queued.get(e);return this.queued.delete(e),this.applied=e,{seq:e,value:t}}skipThrough(e){if(!Number.isSafeInteger(e)||e<this.applied||e>this.applied+this.capacity)throw new RangeError("Invalid input skip");for(let t of this.queued.keys())t<=e&&this.queued.delete(t);this.applied=e}};var V=class{constructor(e=32,t=1e4){s(this,"cellSize",e);s(this,"maxEntities",t);s(this,"items",new Map);s(this,"cells",new Map);if(!(e>0)||!Number.isFinite(e))throw new RangeError("Invalid cell size")}validate(e){if(![e.x,e.y].every(t=>Number.isFinite(t)&&Math.abs(t)<=1e8))throw new RangeError("Invalid position")}upsert(e,t){if(this.validate(t),!this.items.has(e)&&this.items.size>=this.maxEntities)throw new Error("Spatial entity limit");let n=`${Math.floor(t.x/this.cellSize)},${Math.floor(t.y/this.cellSize)}`,i=this.items.get(e);if(i&&i.key!==n){let a=this.cells.get(i.key);a.delete(e),a.size||this.cells.delete(i.key)}let o=this.cells.get(n);o||this.cells.set(n,o=new Set),o.add(e),this.items.set(e,{...t,key:n})}remove(e){let t=this.items.get(e);if(!t)return;this.items.delete(e);let n=this.cells.get(t.key);n.delete(e),n.size||this.cells.delete(t.key)}query(e,t){if(this.validate(e),!Number.isFinite(t)||t<0)throw new RangeError("Invalid radius");let n=Math.floor((e.x-t)/this.cellSize),i=Math.floor((e.x+t)/this.cellSize),o=Math.floor((e.y-t)/this.cellSize),a=Math.floor((e.y+t)/this.cellSize);if((i-n+1)*(a-o+1)>4096)throw new RangeError("Query exceeds cell budget");let c=new Set,h=t*t;for(let l=n;l<=i;l++)for(let m=o;m<=a;m++)for(let g of this.cells.get(`${l},${m}`)??[]){let H=this.items.get(g);(H.x-e.x)**2+(H.y-e.y)**2<=h&&c.add(g)}return c}};var F={u8:1,i8:1,u16:2,i16:2,u32:4,f32:4,f64:8},ke={u8:[0,255],i8:[-128,127],u16:[0,65535],i16:[-32768,32767],u32:[0,4294967295],f32:[-34028234663852886e22,34028234663852886e22],f64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function Ee(r){let e=Object.entries(r).map(([n,i])=>({key:n,type:i.type,scale:i.scale??1}));for(let n of e)if(!Object.hasOwn(F,n.type)||!(n.scale>0)||!Number.isFinite(n.scale)||["__proto__","prototype","constructor"].includes(n.key))throw new RangeError("Invalid field");let t=e.reduce((n,i)=>n+F[i.type],0);if(!t||t>1078)throw new RangeError("Schema must fit one state payload");return{byteLength:t,encode(n){let i=new Uint8Array(t),o=new DataView(i.buffer),a=0;for(let c of e){let h=n[c.key];if(!Number.isFinite(h))throw new RangeError(`Invalid ${c.key}`);let l=h*c.scale;c.type.startsWith("f")||(l=Math.round(l));let[m,g]=ke[c.type];if(!Number.isFinite(l)||l<m||l>g)throw new RangeError(`Out of range: ${c.key}`);switch(c.type){case"u8":o.setUint8(a,l);break;case"i8":o.setInt8(a,l);break;case"u16":o.setUint16(a,l,!0);break;case"i16":o.setInt16(a,l,!0);break;case"u32":o.setUint32(a,l,!0);break;case"f32":o.setFloat32(a,l,!0);break;case"f64":o.setFloat64(a,l,!0);break}a+=F[c.type]}return i},decode(n){if(n.length!==t)return null;let i=new DataView(n.buffer,n.byteOffset,n.byteLength),o=Object.create(null),a=0;for(let c of e){let h;switch(c.type){case"u8":h=i.getUint8(a);break;case"i8":h=i.getInt8(a);break;case"u16":h=i.getUint16(a,!0);break;case"i16":h=i.getInt16(a,!0);break;case"u32":h=i.getUint32(a,!0);break;case"f32":h=i.getFloat32(a,!0);break;case"f64":h=i.getFloat64(a,!0);break}if(!Number.isFinite(h)||!Number.isFinite(h/c.scale))return null;o[c.key]=h/c.scale,a+=F[c.type]}return o}}}var Se=(r,e)=>r.length===e.length&&r.every((t,n)=>e[n]===t),z=class{constructor(e=1024,t=100){s(this,"maxEntities",e);s(this,"retryMs",t);s(this,"records",new Map)}publish(e,t,n){if(!u(e,65535)||!u(t)||t<1||(n?.length??0)>1067)throw new RangeError("Invalid entity");let i=this.records.get(e),o=n===null,a=n?.slice()??new Uint8Array;if(!i&&this.records.size>=this.maxEntities)throw new Error("Replica entity limit");if(i&&t<i.update.generation)throw new Error("Entity generation regressed");if(i&&t===i.update.generation&&i.update.deleted===o&&Se(i.update.data,a))return{id:e,generation:t,revision:i.update.revision};let c=i&&t===i.update.generation?i.update.revision+1:1;if(c>4294967295)throw new Error("Entity revision exhausted");let h={id:e,generation:t,revision:c,deleted:o,data:a};return this.records.set(e,{update:h,ack:i&&t===i.update.generation?i.ack:0,sent:0,sentAt:-1/0}),{id:e,generation:t,revision:c}}due(e,t=64){return[...this.records.values()].filter(n=>n.ack<n.update.revision&&e-n.sentAt>=this.retryMs).sort((n,i)=>n.sentAt-i.sentAt).slice(0,t).map(n=>({...n.update,data:n.update.data.slice()}))}markSent(e,t){let n=this.records.get(e.id);!n||n.update.generation!==e.generation||n.update.revision!==e.revision||(n.sent=e.revision,n.sentAt=t)}acknowledge(e){let t=this.records.get(e.id);return!t||t.update.generation!==e.generation||!u(e.revision)||e.revision>t.sent?!1:(t.ack=Math.max(t.ack,e.revision),!0)}clear(){this.records.clear()}},j=class{constructor(e=1024){s(this,"maxEntities",e);s(this,"records",new Map)}apply(e){if(!u(e.id,65535)||!u(e.generation)||!e.generation||!u(e.revision)||!e.revision||e.data.length>1067)throw new Error("Invalid entity update");let t=this.records.get(e.id);if(!t&&this.records.size>=this.maxEntities)throw new Error("Replica receiver full");let n=!t||e.generation>t.generation||e.generation===t.generation&&e.revision>t.revision;return n&&this.records.set(e.id,{...e,data:e.data.slice()}),{changed:n,ack:{id:e.id,generation:e.generation,revision:e.revision}}}get(e){let t=this.records.get(e);return t&&!t.deleted?t.data.slice():null}clear(){this.records.clear()}};function xe(r){if(!u(r.id,65535)||!u(r.generation)||!r.generation||!u(r.revision)||!r.revision||r.data.length>1067||r.deleted&&r.data.length)throw new Error("Invalid entity update");let e=new Uint8Array(11+r.data.length),t=new DataView(e.buffer);return t.setUint16(0,r.id,!0),t.setUint32(2,r.generation,!0),t.setUint32(6,r.revision,!0),t.setUint8(10,+r.deleted),e.set(r.data,11),e}function Re(r){if(r.length<11||r.length>1078)return null;let e=new DataView(r.buffer,r.byteOffset,r.byteLength),t=e.getUint8(10),n=e.getUint32(2,!0),i=e.getUint32(6,!0);return t>1||!n||!i||t&&r.length!==11?null:{id:e.getUint16(0,!0),generation:n,revision:i,deleted:!!t,data:r.slice(11)}}function Ae(r){if(!r.length||r.length>32)throw new RangeError("Invalid input count");let e=1,t=-1;for(let a of r){if(!u(a.seq)||a.seq<=t||a.data.length>1024)throw new RangeError("Invalid input");t=a.seq,e+=6+a.data.length}if(e>262122)throw new RangeError("Input bundle exceeds one state frame");let n=new Uint8Array(e),i=new DataView(n.buffer);n[0]=r.length;let o=1;for(let a of r)i.setUint32(o,a.seq,!0),i.setUint16(o+4,a.data.length,!0),n.set(a.data,o+6),o+=6+a.data.length;return n}function Te(r){if(!r.length||r.length>262122||!r[0]||r[0]>32)return null;let e=new DataView(r.buffer,r.byteOffset,r.byteLength),t=[],n=1,i=-1;for(let o=0;o<r[0];o++){if(n+6>r.length)return null;let a=e.getUint32(n,!0),c=e.getUint16(n+4,!0);if(a<=i||c>1024||n+6+c>r.length)return null;t.push({seq:a,data:r.slice(n+6,n+6+c)}),i=a,n+=6+c}return n===r.length?t:null}var Y=class{constructor(e=64){s(this,"capacity",e);s(this,"sent",new Map);s(this,"acked",null);if(!Number.isInteger(e)||e<1)throw new RangeError("Invalid history capacity")}record(e,t){if(e)for(this.sent.set(e,t);this.sent.size>this.capacity;)this.sent.delete(this.sent.keys().next().value)}acknowledge(e){let t=this.sent.get(e);if(t===void 0||this.acked&&!v(e,this.acked.seq))return!1;this.acked={seq:e,value:t};for(let n of[...this.sent.keys()])v(n,e)||this.sent.delete(n);return!0}get baseline(){return this.acked}reset(){this.sent.clear(),this.acked=null}},Ie=(r,e)=>r===e||typeof r=="object"&&r!==null&&typeof e=="object"&&e!==null&&JSON.stringify(r)===JSON.stringify(e);function Me(r,e){let t={};for(let n of Object.keys(e)){let i=e[n],o=r?.[n],a;for(let c of Object.keys(i))(!o||!Ie(o[c],i[c]))&&((a??(a={}))[c]=i[c]);if(o)for(let c of Object.keys(o))c in i||((a??(a={}))[c]=null);a&&((t.set??(t.set={}))[n]=a)}if(r)for(let n of Object.keys(r))n in e||(t.del??(t.del=[])).push(n);return t}function qe(r,e){let t={};if(r)for(let n of Object.keys(r))t[n]={...r[n]};for(let n of e.del??[])delete t[n];for(let[n,i]of Object.entries(e.set??{})){let o=t[n]??(t[n]={});for(let[a,c]of Object.entries(i))c===null&&r?.[n]&&a in r[n]?delete o[a]:o[a]=c}return t}return le(Ce);})();
|