onelobby 0.1.0 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Test doubles: a manual clock, an in-memory lobby server speaking the lk1 protocol (spec/signaling.md, the parts the\n * client uses) and an in-memory peer network. Exported as `onelobby/testing`.\n */\nimport type { Clock } from \"./clock.js\";\nimport { CROCKFORD_ALPHABET, normalizeCode } from \"./crockford.js\";\nimport type {\n ChannelName,\n LinkFactory,\n LinkOptions,\n PeerLink,\n SignalPayload,\n SocketFactory,\n SocketLike,\n} from \"./transport.js\";\n\n// ---- clock ------------------------------------------------------------------------------------------------------\n\ninterface Timer {\n at: number;\n seq: number;\n fn: () => void;\n every?: number;\n dead?: boolean;\n}\n\n/** Deterministic clock: time only moves through `advance()`. Timers fire in (time, creation) order. */\nexport class ManualClock implements Clock {\n private t = 0;\n private seq = 0;\n private timers: Timer[] = [];\n\n now(): number {\n return this.t;\n }\n\n setInterval(fn: () => void, ms: number): () => void {\n const timer: Timer = { at: this.t + ms, seq: this.seq++, fn, every: Math.max(1, ms) };\n this.timers.push(timer);\n return () => {\n timer.dead = true;\n };\n }\n\n setTimeout(fn: () => void, ms: number): () => void {\n const timer: Timer = { at: this.t + ms, seq: this.seq++, fn };\n this.timers.push(timer);\n return () => {\n timer.dead = true;\n };\n }\n\n /** Advance time, firing due timers one at a time (microtasks flush between them when awaited via `run`). */\n advance(ms: number): void {\n const end = this.t + ms;\n for (;;) {\n this.timers = this.timers.filter((x) => !x.dead);\n let next: Timer | undefined;\n for (const x of this.timers) if (x.at <= end && (!next || x.at < next.at || (x.at === next.at && x.seq < next.seq))) next = x;\n if (!next) break;\n this.t = Math.max(this.t, next.at);\n if (next.every) {\n next.at += next.every;\n next.seq = this.seq++;\n } else {\n next.dead = true;\n }\n next.fn();\n }\n this.t = end;\n }\n\n /** Advance in `step` ms slices, letting promises and queued microtasks settle between slices. */\n async run(ms: number, step = 10): Promise<void> {\n let left = ms;\n await settle();\n while (left > 0) {\n const d = Math.min(step, left);\n this.advance(d);\n left -= d;\n await settle();\n }\n }\n}\n\n/** Let all pending microtasks (and chained promise continuations) run. */\nexport async function settle(rounds = 8): Promise<void> {\n for (let i = 0; i < rounds; i++) await Promise.resolve();\n // A macrotask boundary guarantees the whole microtask queue (delivery chains) has drained.\n await new Promise<void>((r) => ((globalThis as { setImmediate?: (f: () => void) => void }).setImmediate?.(r) ?? setTimeout(r, 0)));\n}\n\n// ---- in-memory peer network ---------------------------------------------------------------------------------------\n\nlet linkSerial = 0;\n\n/**\n * Pairs `PeerLink`s through the signaling path like WebRTC would: the offerer's SDP string names it, the answerer\n * resolves that name, and both open one microtask later. Messages are delivered FIFO, one microtask later.\n */\nexport class MemoryNetwork {\n private offers = new Map<string, MemoryLink>();\n /** Every link ever created (for assertions and fault injection). */\n readonly links: MemoryLink[] = [];\n /** Set to drop all traffic in one direction pair for fault injection: key `${from}->${to}` is not tracked; use link.mute(). */\n readonly factory: LinkFactory = { create: (opts) => new MemoryLink(this, opts) };\n\n /** @internal */\n register(offer: string, link: MemoryLink): void {\n this.offers.set(offer, link);\n this.links.push(link);\n }\n /** @internal */\n lookup(offer: string): MemoryLink | undefined {\n return this.offers.get(offer);\n }\n\n /** Kill every link whose far end is this identity-tagged factory owner (set `tag` via MemoryLink.owner). */\n killOwner(owner: string): void {\n for (const l of this.links) if (l.owner === owner) l.close();\n }\n\n /** Per-owner factory so tests can tell whose link is whose and cut one peer off. */\n factoryFor(owner: string): LinkFactory {\n return {\n create: (opts) => {\n const l = new MemoryLink(this, opts);\n l.owner = owner;\n return l;\n },\n };\n }\n}\n\nexport class MemoryLink implements PeerLink {\n readonly remoteId: number;\n isOpen = false;\n owner = \"\";\n onSignal: PeerLink[\"onSignal\"] = null;\n onOpen: PeerLink[\"onOpen\"] = null;\n onClose: PeerLink[\"onClose\"] = null;\n onMessage: PeerLink[\"onMessage\"] = null;\n onPath: PeerLink[\"onPath\"] = null;\n /** Bytes sent per channel, for assertions. */\n readonly sent: Record<ChannelName, number> = { reliable: 0, fast: 0, voice: 0 };\n /** While true, outgoing messages vanish (a frozen or partitioned peer). */\n blackhole = false;\n private peer: MemoryLink | null = null;\n private closed = false;\n private id = `mem-${++linkSerial}`;\n\n constructor(private net: MemoryNetwork, opts: LinkOptions) {\n this.remoteId = opts.remoteId;\n }\n\n startOffer(): void {\n this.net.register(this.id, this);\n queueMicrotask(() => this.onSignal?.({ sdp: { type: \"offer\", sdp: this.id } }));\n }\n\n handleSignal(s: SignalPayload): void {\n if (s.sdp?.type === \"offer\") {\n const offerer = this.net.lookup(s.sdp.sdp);\n this.net.links.push(this);\n if (!offerer) return;\n this.peer = offerer;\n queueMicrotask(() => this.onSignal?.({ sdp: { type: \"answer\", sdp: this.id } }));\n queueMicrotask(() => offerer.accept(this));\n queueMicrotask(() => this.open());\n }\n }\n\n /** @internal */\n accept(answerer: MemoryLink): void {\n this.peer = answerer;\n this.open();\n }\n\n private open(): void {\n if (this.closed || this.isOpen) return;\n this.isOpen = true;\n this.onOpen?.();\n this.onPath?.(\"direct\");\n }\n\n send(channel: ChannelName, bytes: Uint8Array): void {\n if (!this.isOpen || this.closed) return;\n this.sent[channel] += bytes.length;\n if (this.blackhole) return;\n const peer = this.peer;\n const copy = bytes.slice();\n queueMicrotask(() => {\n if (peer && peer.isOpen && !peer.closed && !this.closed) peer.onMessage?.(channel, copy);\n });\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.isOpen = false;\n const peer = this.peer;\n queueMicrotask(() => {\n this.onClose?.(\"closed\");\n if (peer && !peer.closed) peer.closeFromRemote();\n });\n }\n\n private closeFromRemote(): void {\n if (this.closed) return;\n this.closed = true;\n this.isOpen = false;\n this.onClose?.(\"remote closed\");\n }\n}\n\n// ---- in-memory lobby server ---------------------------------------------------------------------------------------\n\ntype Json = Record<string, unknown>;\n\ninterface MPeer {\n peerId: number;\n name: string;\n joinedAt: number;\n sock: MemorySocket | null;\n token: string;\n}\ninterface MLobby {\n code: string;\n gameId: string;\n netVersion: string;\n name: string;\n hostId: number;\n epoch: number;\n mode: string;\n tickRate: number;\n lateJoin: boolean;\n phase: string;\n meta: Record<string, string>;\n visibility: string;\n maxPlayers: number;\n peers: Map<number, MPeer>;\n next: number;\n kicked: Set<number>;\n reserved: Map<string, MPeer>;\n}\n\n/** Minimal onelobby-server (lk1) for client tests. Not a conformance target: stream A owns the real server. */\nexport class MemoryServer {\n readonly lobbies = new Map<string, MLobby>();\n /** Every socket ever opened (to drop one from a test). */\n readonly sockets: MemorySocket[] = [];\n readonly socketFactory: SocketFactory = () => this.connect();\n private n = 0;\n iceServers = [{ urls: [\"stun:stun.example:3478\"] }];\n /** Log of every client message, for assertions. */\n readonly received: Json[] = [];\n\n connect(): MemorySocket {\n const s = new MemorySocket(this);\n this.sockets.push(s);\n return s;\n }\n\n /** @internal */\n newCode(): string {\n let x = 0x9e3779b1 * (++this.n + 17);\n let s = \"\";\n for (let i = 0; i < 6; i++) {\n x = (Math.imul(x, 1103515245) + 12345) >>> 0;\n s += CROCKFORD_ALPHABET[(x >>> 16) & 31];\n }\n return this.lobbies.has(s) ? this.newCode() : s;\n }\n}\n\nexport class MemorySocket implements SocketLike {\n readyState = 0;\n onopen: SocketLike[\"onopen\"] = null;\n onmessage: SocketLike[\"onmessage\"] = null;\n onclose: SocketLike[\"onclose\"] = null;\n onerror: SocketLike[\"onerror\"] = null;\n\n private hello: Json | null = null;\n private lobby: MLobby | null = null;\n private peer: MPeer | null = null;\n private closed = false;\n\n constructor(private srv: MemoryServer) {\n queueMicrotask(() => {\n this.readyState = 1;\n this.onopen?.();\n });\n }\n\n // ---- socket API\n send(data: string): void {\n if (this.closed) return;\n const m = JSON.parse(data) as Json;\n queueMicrotask(() => this.handle(m));\n }\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.readyState = 3;\n this.leaveLobby(\"timeout\");\n queueMicrotask(() => this.onclose?.());\n }\n\n /** @internal server -> this client */\n push(m: Json): void {\n if (this.closed) return;\n queueMicrotask(() => this.onmessage?.({ data: JSON.stringify(m) }));\n }\n\n private err(code: string, msg = \"\", data?: Json) {\n this.push({ t: \"error\", code, msg, ...(data ? { data } : {}) });\n }\n\n private lobbyMsg(l: MLobby, p: MPeer): Json {\n return {\n t: \"lobby\",\n code: l.code,\n gameId: l.gameId,\n netVersion: l.netVersion,\n hostId: l.hostId,\n you: p.peerId,\n mode: l.mode,\n tickRate: l.tickRate,\n lateJoin: l.lateJoin,\n phase: l.phase,\n meta: l.meta,\n peers: [...l.peers.values()].map((q) => ({ peerId: q.peerId, name: q.name, joinedAt: q.joinedAt })),\n resumeToken: p.token,\n name: l.name,\n maxPlayers: l.maxPlayers,\n visibility: l.visibility,\n };\n }\n\n private broadcast(l: MLobby, m: Json, except?: number) {\n for (const q of l.peers.values()) if (q.peerId !== except) q.sock?.push(m);\n }\n\n private leaveLobby(reason: string) {\n const l = this.lobby;\n const p = this.peer;\n if (!l || !p) return;\n this.lobby = null;\n this.peer = null;\n p.sock = null;\n l.peers.delete(p.peerId);\n if (reason === \"timeout\") l.reserved.set(p.token, p); // slot kept for resume\n if (l.peers.size === 0) {\n this.srv.lobbies.delete(l.code);\n return;\n }\n this.broadcast(l, { t: \"peer_left\", peerId: p.peerId, reason });\n if (l.hostId === p.peerId) {\n l.hostId = Math.min(...l.peers.keys());\n l.epoch++;\n this.broadcast(l, { t: \"host_changed\", hostId: l.hostId, epoch: l.epoch });\n }\n }\n\n private handle(m: Json) {\n if (this.closed) return;\n this.srv.received.push(m);\n const t = String(m.t);\n if (t === \"ping\") return this.push({ t: \"pong\", n: m.n });\n if (t === \"hello\") {\n if (this.hello) return this.err(\"bad_request\", \"second hello\");\n this.hello = m;\n const tok = typeof m.resumeToken === \"string\" ? m.resumeToken : \"\";\n for (const l of this.srv.lobbies.values()) {\n const rp = l.reserved.get(tok);\n if (!rp) continue;\n l.reserved.delete(tok);\n rp.sock = this;\n rp.token = tok + \"+\";\n l.peers.set(rp.peerId, rp);\n this.lobby = l;\n this.peer = rp;\n this.push({ t: \"welcome\", peerId: rp.peerId, ice: this.srv.iceServers, serverTime: Date.now(), limits: { maxMsg: 16384, maxPlayers: 64 } });\n this.push(this.lobbyMsg(l, rp));\n return this.broadcast(l, { t: \"peer_joined\", peer: { peerId: rp.peerId, name: rp.name, joinedAt: rp.joinedAt } }, rp.peerId);\n }\n return this.push({ t: \"welcome\", ice: this.srv.iceServers, serverTime: Date.now(), limits: { maxMsg: 16384, maxPlayers: 64 } });\n }\n if (!this.hello) return this.err(\"bad_request\", \"hello first\");\n const gameId = String(this.hello.gameId);\n const netVersion = String(this.hello.netVersion);\n switch (t) {\n case \"create\": {\n const code = this.srv.newCode();\n const p: MPeer = { peerId: 1, name: String(this.hello.name), joinedAt: Date.now(), sock: this, token: `tok-${code}-1` };\n const l: MLobby = {\n code, gameId, netVersion, name: String(m.name), hostId: 1, epoch: 0, mode: String(m.mode), tickRate: Number(m.tickRate),\n lateJoin: !!m.lateJoin, phase: \"lobby\", meta: (m.meta as Record<string, string>) ?? {}, visibility: String(m.visibility),\n maxPlayers: Number(m.maxPlayers), peers: new Map([[1, p]]), next: 2, kicked: new Set(), reserved: new Map(),\n };\n this.srv.lobbies.set(code, l);\n this.lobby = l;\n this.peer = p;\n return this.push(this.lobbyMsg(l, p));\n }\n case \"join\": {\n const code = normalizeCode(String(m.code));\n if (!code) return this.err(\"bad_request\", \"bad code\");\n const l = this.srv.lobbies.get(code);\n if (!l || l.gameId !== gameId) return this.err(\"unknown_code\");\n if (l.netVersion !== netVersion) return this.err(\"version_mismatch\", \"\", { hostNetVersion: l.netVersion, yourNetVersion: netVersion });\n if (l.phase === \"in_game\" && !l.lateJoin) return this.err(\"in_game\");\n if (l.peers.size >= l.maxPlayers) return this.err(\"lobby_full\");\n const id = l.next++;\n const p: MPeer = { peerId: id, name: String(this.hello.name), joinedAt: Date.now(), sock: this, token: `tok-${code}-${id}` };\n l.peers.set(id, p);\n this.lobby = l;\n this.peer = p;\n this.push(this.lobbyMsg(l, p));\n return this.broadcast(l, { t: \"peer_joined\", peer: { peerId: id, name: p.name, joinedAt: p.joinedAt } }, id);\n }\n case \"list\": {\n const items = [...this.srv.lobbies.values()]\n .filter((l) => l.gameId === gameId && l.netVersion === netVersion && l.visibility === \"public\")\n .map((l) => ({\n code: l.code, gameId: l.gameId, netVersion: l.netVersion, name: l.name, hostName: l.peers.get(l.hostId)?.name ?? \"\",\n players: l.peers.size, maxPlayers: l.maxPlayers, phase: l.phase, meta: l.meta, region: \"mem\", createdAt: 0,\n }));\n return this.push({ t: \"lobbies\", items });\n }\n case \"leave\":\n return this.leaveLobby(\"left\");\n case \"signal\": {\n const l = this.lobby;\n if (!l || !this.peer) return this.err(\"bad_request\");\n const to = l.peers.get(Number(m.to));\n if (!to) return this.err(\"bad_request\", \"no such peer\");\n return to.sock?.push({ t: \"signal\", from: this.peer.peerId, ...(m.sdp ? { sdp: m.sdp } : {}), ...(m.ice ? { ice: m.ice } : {}) });\n }\n case \"meta\":\n case \"phase\": {\n const l = this.lobby;\n if (!l || !this.peer) return;\n if (l.hostId !== this.peer.peerId) return this.err(\"not_host\");\n if (t === \"meta\") l.meta = m.meta as Record<string, string>;\n else l.phase = String(m.phase);\n for (const q of l.peers.values()) q.sock?.push(this.lobbyMsg(l, q));\n return;\n }\n case \"kick\": {\n const l = this.lobby;\n if (!l || !this.peer) return;\n if (l.hostId !== this.peer.peerId) return this.err(\"not_host\");\n const victim = l.peers.get(Number(m.peerId));\n if (!victim || victim === this.peer) return this.err(\"bad_request\");\n l.kicked.add(victim.peerId);\n l.peers.delete(victim.peerId);\n victim.sock?.push({ t: \"error\", code: \"kicked\", msg: \"kicked\" });\n this.broadcast(l, { t: \"peer_left\", peerId: victim.peerId, reason: \"kicked\" });\n return;\n }\n case \"host_changed\": {\n const l = this.lobby;\n if (!l || !this.peer) return;\n if (Number(m.hostId) === this.peer.peerId && Number(m.epoch) > l.epoch) {\n l.hostId = this.peer.peerId;\n l.epoch = Number(m.epoch);\n this.broadcast(l, { t: \"host_changed\", hostId: l.hostId, epoch: l.epoch });\n }\n return;\n }\n default:\n return;\n }\n }\n}\n\n/** Convenience: kill a socket as if the network dropped (server sees a timeout, others get peer_left). */\nexport function dropSocket(s: SocketLike): void {\n s.close();\n}\n"]}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Test doubles: a manual clock, an in-memory lobby server speaking the lk1 protocol (spec/signaling.md, the parts the\n * client uses) and an in-memory peer network. Exported as `onelobby/testing`.\n */\nimport type { Clock } from \"./clock.js\";\nimport { CROCKFORD_ALPHABET, normalizeCode } from \"./crockford.js\";\nimport type {\n ChannelName,\n LinkFactory,\n LinkOptions,\n PeerLink,\n SignalPayload,\n SocketFactory,\n SocketLike,\n} from \"./transport.js\";\n\n// ---- clock ------------------------------------------------------------------------------------------------------\n\ninterface Timer {\n at: number;\n seq: number;\n fn: () => void;\n every?: number;\n dead?: boolean;\n}\n\n/** Deterministic clock: time only moves through `advance()`. Timers fire in (time, creation) order. */\nexport class ManualClock implements Clock {\n private t = 0;\n private seq = 0;\n private timers: Timer[] = [];\n\n now(): number {\n return this.t;\n }\n\n setInterval(fn: () => void, ms: number): () => void {\n const timer: Timer = { at: this.t + ms, seq: this.seq++, fn, every: Math.max(1, ms) };\n this.timers.push(timer);\n return () => {\n timer.dead = true;\n };\n }\n\n setTimeout(fn: () => void, ms: number): () => void {\n const timer: Timer = { at: this.t + ms, seq: this.seq++, fn };\n this.timers.push(timer);\n return () => {\n timer.dead = true;\n };\n }\n\n /** Advance time, firing due timers one at a time (microtasks flush between them when awaited via `run`). */\n advance(ms: number): void {\n const end = this.t + ms;\n for (;;) {\n this.timers = this.timers.filter((x) => !x.dead);\n let next: Timer | undefined;\n for (const x of this.timers) if (x.at <= end && (!next || x.at < next.at || (x.at === next.at && x.seq < next.seq))) next = x;\n if (!next) break;\n this.t = Math.max(this.t, next.at);\n if (next.every) {\n next.at += next.every;\n next.seq = this.seq++;\n } else {\n next.dead = true;\n }\n next.fn();\n }\n this.t = end;\n }\n\n /** Advance in `step` ms slices, letting promises and queued microtasks settle between slices. */\n async run(ms: number, step = 10): Promise<void> {\n let left = ms;\n await settle();\n while (left > 0) {\n const d = Math.min(step, left);\n this.advance(d);\n left -= d;\n await settle();\n }\n }\n}\n\n/** Let all pending microtasks (and chained promise continuations) run. */\nexport async function settle(rounds = 8): Promise<void> {\n for (let i = 0; i < rounds; i++) await Promise.resolve();\n // A macrotask boundary guarantees the whole microtask queue (delivery chains) has drained.\n await new Promise<void>((r) => ((globalThis as { setImmediate?: (f: () => void) => void }).setImmediate?.(r) ?? setTimeout(r, 0)));}\n\n// ---- in-memory peer network ---------------------------------------------------------------------------------------\n\nlet linkSerial = 0;\n\n/**\n * Pairs `PeerLink`s through the signaling path like WebRTC would: the offerer's SDP string names it, the answerer\n * resolves that name, and both open one microtask later. Messages are delivered FIFO, one microtask later.\n */\nexport class MemoryNetwork {\n private offers = new Map<string, MemoryLink>();\n /** Every link ever created (for assertions and fault injection). */\n readonly links: MemoryLink[] = [];\n /** Set to drop all traffic in one direction pair for fault injection: key `${from}->${to}` is not tracked; use link.mute(). */\n readonly factory: LinkFactory = { create: (opts) => new MemoryLink(this, opts) };\n\n /** @internal */\n register(offer: string, link: MemoryLink): void {\n this.offers.set(offer, link);\n this.links.push(link);\n }\n /** @internal */\n lookup(offer: string): MemoryLink | undefined {\n return this.offers.get(offer);\n }\n\n /** Kill every link whose far end is this identity-tagged factory owner (set `tag` via MemoryLink.owner). */\n killOwner(owner: string): void {\n for (const l of this.links) if (l.owner === owner) l.close();\n }\n\n /** Per-owner factory so tests can tell whose link is whose and cut one peer off. */\n factoryFor(owner: string): LinkFactory {\n return {\n create: (opts) => {\n const l = new MemoryLink(this, opts);\n l.owner = owner;\n return l;\n },\n };\n }\n}\n\nexport class MemoryLink implements PeerLink {\n readonly remoteId: number;\n isOpen = false;\n owner = \"\";\n onSignal: PeerLink[\"onSignal\"] = null;\n onOpen: PeerLink[\"onOpen\"] = null;\n onClose: PeerLink[\"onClose\"] = null;\n onMessage: PeerLink[\"onMessage\"] = null;\n onPath: PeerLink[\"onPath\"] = null;\n /** Bytes sent per channel, for assertions. */\n readonly sent: Record<ChannelName, number> = { reliable: 0, fast: 0, voice: 0 };\n /** While true, outgoing messages vanish (a frozen or partitioned peer). */\n blackhole = false;\n private peer: MemoryLink | null = null;\n private closed = false;\n private id = `mem-${++linkSerial}`;\n\n constructor(private net: MemoryNetwork, opts: LinkOptions) {\n this.remoteId = opts.remoteId;\n }\n\n startOffer(): void {\n this.net.register(this.id, this);\n queueMicrotask(() => this.onSignal?.({ sdp: { type: \"offer\", sdp: this.id } }));\n }\n\n handleSignal(s: SignalPayload): void {\n if (s.sdp?.type === \"offer\") {\n const offerer = this.net.lookup(s.sdp.sdp);\n this.net.links.push(this);\n if (!offerer) return;\n this.peer = offerer;\n queueMicrotask(() => this.onSignal?.({ sdp: { type: \"answer\", sdp: this.id } }));\n queueMicrotask(() => offerer.accept(this));\n queueMicrotask(() => this.open());\n }\n }\n\n /** @internal */\n accept(answerer: MemoryLink): void {\n this.peer = answerer;\n this.open();\n }\n\n private open(): void {\n if (this.closed || this.isOpen) return;\n this.isOpen = true;\n this.onOpen?.();\n this.onPath?.(\"direct\");\n }\n\n send(channel: ChannelName, bytes: Uint8Array): void {\n if (!this.isOpen || this.closed) return;\n this.sent[channel] += bytes.length;\n if (this.blackhole) return;\n const peer = this.peer;\n const copy = bytes.slice();\n queueMicrotask(() => {\n if (peer && peer.isOpen && !peer.closed && !this.closed) peer.onMessage?.(channel, copy);\n });\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.isOpen = false;\n const peer = this.peer;\n queueMicrotask(() => {\n this.onClose?.(\"closed\");\n if (peer && !peer.closed) peer.closeFromRemote();\n });\n }\n\n private closeFromRemote(): void {\n if (this.closed) return;\n this.closed = true;\n this.isOpen = false;\n this.onClose?.(\"remote closed\");\n }\n}\n\n// ---- in-memory lobby server ---------------------------------------------------------------------------------------\n\ntype Json = Record<string, unknown>;\n\ninterface MPeer {\n peerId: number;\n name: string;\n joinedAt: number;\n sock: MemorySocket | null;\n token: string;\n}\ninterface MLobby {\n code: string;\n gameId: string;\n netVersion: string;\n name: string;\n hostId: number;\n epoch: number;\n mode: string;\n tickRate: number;\n lateJoin: boolean;\n phase: string;\n meta: Record<string, string>;\n visibility: string;\n maxPlayers: number;\n peers: Map<number, MPeer>;\n next: number;\n kicked: Set<number>;\n reserved: Map<string, MPeer>;\n}\n\n/** Minimal onelobby-server (lk1) for client tests. Not a conformance target: stream A owns the real server. */\nexport class MemoryServer {\n readonly lobbies = new Map<string, MLobby>();\n /** Every socket ever opened (to drop one from a test). */\n readonly sockets: MemorySocket[] = [];\n readonly socketFactory: SocketFactory = () => this.connect();\n private n = 0;\n iceServers = [{ urls: [\"stun:stun.example:3478\"] }];\n /** Log of every client message, for assertions. */\n readonly received: Json[] = [];\n\n connect(): MemorySocket {\n const s = new MemorySocket(this);\n this.sockets.push(s);\n return s;\n }\n\n /** @internal */\n newCode(): string {\n let x = 0x9e3779b1 * (++this.n + 17);\n let s = \"\";\n for (let i = 0; i < 6; i++) {\n x = (Math.imul(x, 1103515245) + 12345) >>> 0;\n s += CROCKFORD_ALPHABET[(x >>> 16) & 31];\n }\n return this.lobbies.has(s) ? this.newCode() : s;\n }\n}\n\nexport class MemorySocket implements SocketLike {\n readyState = 0;\n onopen: SocketLike[\"onopen\"] = null;\n onmessage: SocketLike[\"onmessage\"] = null;\n onclose: SocketLike[\"onclose\"] = null;\n onerror: SocketLike[\"onerror\"] = null;\n\n private hello: Json | null = null;\n private lobby: MLobby | null = null;\n private peer: MPeer | null = null;\n private closed = false;\n\n constructor(private srv: MemoryServer) {\n queueMicrotask(() => {\n this.readyState = 1;\n this.onopen?.();\n });\n }\n\n // ---- socket API\n send(data: string): void {\n if (this.closed) return;\n const m = JSON.parse(data) as Json;\n queueMicrotask(() => this.handle(m));\n }\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.readyState = 3;\n this.leaveLobby(\"timeout\");\n queueMicrotask(() => this.onclose?.());\n }\n\n /** @internal server -> this client */\n push(m: Json): void {\n if (this.closed) return;\n queueMicrotask(() => this.onmessage?.({ data: JSON.stringify(m) }));\n }\n\n private err(code: string, msg = \"\", data?: Json) {\n this.push({ t: \"error\", code, msg, ...(data ? { data } : {}) });\n }\n\n private lobbyMsg(l: MLobby, p: MPeer): Json {\n return {\n t: \"lobby\",\n code: l.code,\n gameId: l.gameId,\n netVersion: l.netVersion,\n hostId: l.hostId,\n you: p.peerId,\n mode: l.mode,\n tickRate: l.tickRate,\n lateJoin: l.lateJoin,\n phase: l.phase,\n meta: l.meta,\n peers: [...l.peers.values()].map((q) => ({ peerId: q.peerId, name: q.name, joinedAt: q.joinedAt })),\n resumeToken: p.token,\n name: l.name,\n maxPlayers: l.maxPlayers,\n visibility: l.visibility,\n };\n }\n\n private broadcast(l: MLobby, m: Json, except?: number) {\n for (const q of l.peers.values()) if (q.peerId !== except) q.sock?.push(m);\n }\n\n private leaveLobby(reason: string) {\n const l = this.lobby;\n const p = this.peer;\n if (!l || !p) return;\n this.lobby = null;\n this.peer = null;\n p.sock = null;\n l.peers.delete(p.peerId);\n if (reason === \"timeout\") l.reserved.set(p.token, p); // slot kept for resume\n if (l.peers.size === 0) {\n this.srv.lobbies.delete(l.code);\n return;\n }\n this.broadcast(l, { t: \"peer_left\", peerId: p.peerId, reason });\n if (l.hostId === p.peerId) {\n l.hostId = Math.min(...l.peers.keys());\n l.epoch++;\n this.broadcast(l, { t: \"host_changed\", hostId: l.hostId, epoch: l.epoch });\n }\n }\n\n private handle(m: Json) {\n if (this.closed) return;\n this.srv.received.push(m);\n const t = String(m.t);\n if (t === \"ping\") return this.push({ t: \"pong\", n: m.n });\n if (t === \"hello\") {\n if (this.hello) return this.err(\"bad_request\", \"second hello\");\n this.hello = m;\n const tok = typeof m.resumeToken === \"string\" ? m.resumeToken : \"\";\n for (const l of this.srv.lobbies.values()) {\n const rp = l.reserved.get(tok);\n if (!rp) continue;\n l.reserved.delete(tok);\n rp.sock = this;\n rp.token = tok + \"+\";\n l.peers.set(rp.peerId, rp);\n this.lobby = l;\n this.peer = rp;\n this.push({ t: \"welcome\", peerId: rp.peerId, ice: this.srv.iceServers, serverTime: Date.now(), limits: { maxMsg: 16384, maxPlayers: 64 } });\n this.push(this.lobbyMsg(l, rp));\n return this.broadcast(l, { t: \"peer_joined\", peer: { peerId: rp.peerId, name: rp.name, joinedAt: rp.joinedAt } }, rp.peerId);\n }\n return this.push({ t: \"welcome\", ice: this.srv.iceServers, serverTime: Date.now(), limits: { maxMsg: 16384, maxPlayers: 64 } });\n }\n if (!this.hello) return this.err(\"bad_request\", \"hello first\");\n const gameId = String(this.hello.gameId);\n const netVersion = String(this.hello.netVersion);\n switch (t) {\n case \"create\": {\n const code = this.srv.newCode();\n const p: MPeer = { peerId: 1, name: String(this.hello.name), joinedAt: Date.now(), sock: this, token: `tok-${code}-1` };\n const l: MLobby = {\n code, gameId, netVersion, name: String(m.name), hostId: 1, epoch: 0, mode: String(m.mode), tickRate: Number(m.tickRate),\n lateJoin: !!m.lateJoin, phase: \"lobby\", meta: (m.meta as Record<string, string>) ?? {}, visibility: String(m.visibility),\n maxPlayers: Number(m.maxPlayers), peers: new Map([[1, p]]), next: 2, kicked: new Set(), reserved: new Map(),\n };\n this.srv.lobbies.set(code, l);\n this.lobby = l;\n this.peer = p;\n return this.push(this.lobbyMsg(l, p));\n }\n case \"join\": {\n const code = normalizeCode(String(m.code));\n if (!code) return this.err(\"bad_request\", \"bad code\");\n const l = this.srv.lobbies.get(code);\n if (!l || l.gameId !== gameId) return this.err(\"unknown_code\");\n if (l.netVersion !== netVersion) return this.err(\"version_mismatch\", \"\", { hostNetVersion: l.netVersion, yourNetVersion: netVersion });\n if (l.phase === \"in_game\" && !l.lateJoin) return this.err(\"in_game\");\n if (l.peers.size >= l.maxPlayers) return this.err(\"lobby_full\");\n const id = l.next++;\n const p: MPeer = { peerId: id, name: String(this.hello.name), joinedAt: Date.now(), sock: this, token: `tok-${code}-${id}` };\n l.peers.set(id, p);\n this.lobby = l;\n this.peer = p;\n this.push(this.lobbyMsg(l, p));\n return this.broadcast(l, { t: \"peer_joined\", peer: { peerId: id, name: p.name, joinedAt: p.joinedAt } }, id);\n }\n case \"list\": {\n const items = [...this.srv.lobbies.values()]\n .filter((l) => l.gameId === gameId && l.netVersion === netVersion && l.visibility === \"public\")\n .map((l) => ({\n code: l.code, gameId: l.gameId, netVersion: l.netVersion, name: l.name, hostName: l.peers.get(l.hostId)?.name ?? \"\",\n players: l.peers.size, maxPlayers: l.maxPlayers, phase: l.phase, meta: l.meta, region: \"mem\", createdAt: 0,\n }));\n return this.push({ t: \"lobbies\", items });\n }\n case \"leave\":\n return this.leaveLobby(\"left\");\n case \"signal\": {\n const l = this.lobby;\n if (!l || !this.peer) return this.err(\"bad_request\");\n const to = l.peers.get(Number(m.to));\n if (!to) return this.err(\"bad_request\", \"no such peer\");\n return to.sock?.push({ t: \"signal\", from: this.peer.peerId, ...(m.sdp ? { sdp: m.sdp } : {}), ...(m.ice ? { ice: m.ice } : {}) });\n }\n case \"meta\":\n case \"phase\": {\n const l = this.lobby;\n if (!l || !this.peer) return;\n if (l.hostId !== this.peer.peerId) return this.err(\"not_host\");\n if (t === \"meta\") l.meta = m.meta as Record<string, string>;\n else l.phase = String(m.phase);\n for (const q of l.peers.values()) q.sock?.push(this.lobbyMsg(l, q));\n return;\n }\n case \"kick\": {\n const l = this.lobby;\n if (!l || !this.peer) return;\n if (l.hostId !== this.peer.peerId) return this.err(\"not_host\");\n const victim = l.peers.get(Number(m.peerId));\n if (!victim || victim === this.peer) return this.err(\"bad_request\");\n // ban:false disconnects without the ban; closeCode / closeReason go to the removed peer (spec/signaling.md)\n const ban = m.ban !== false;\n const data: Json = {};\n if (!ban) data.ban = false;\n if (typeof m.closeCode === \"number\") data.closeCode = m.closeCode;\n if (typeof m.closeReason === \"string\") data.closeReason = m.closeReason;\n if (ban) l.kicked.add(victim.peerId);\n l.peers.delete(victim.peerId);\n victim.sock?.push({ t: \"error\", code: \"kicked\", msg: \"kicked\", ...(Object.keys(data).length ? { data } : {}) });\n this.broadcast(l, { t: \"peer_left\", peerId: victim.peerId, reason: ban ? \"kicked\" : \"disconnected\" });\n return;\n }\n case \"host_changed\": {\n const l = this.lobby;\n if (!l || !this.peer) return;\n if (Number(m.hostId) === this.peer.peerId && Number(m.epoch) > l.epoch) {\n l.hostId = this.peer.peerId;\n l.epoch = Number(m.epoch);\n this.broadcast(l, { t: \"host_changed\", hostId: l.hostId, epoch: l.epoch });\n }\n return;\n }\n default:\n return;\n }\n }\n}\n\n/** Convenience: kill a socket as if the network dropped (server sees a timeout, others get peer_left). */\nexport function dropSocket(s: SocketLike): void {\n s.close();\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "onelobby",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "Multiplayer for browser games: host/join lobbies by short code, peer-to-peer WebRTC, lockstep sync, text and voice chat. Zero runtime dependencies; works from a plain <script> tag.",
5
5
  "keywords": [
6
6
  "multiplayer",