@tonytomo/gosocket-client 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 +98 -0
- package/LICENSE.md +21 -0
- package/README.md +630 -2
- package/dist/index.d.ts +880 -0
- package/dist/index.js +3060 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/clock.ts","../src/events.ts","../src/heartbeat.ts","../src/logger.ts","../src/reconnect.ts","../src/types/error-base.ts","../src/validate.ts","../src/policy.ts","../src/preflight.ts","../src/types/errors.ts","../src/transport.ts","../src/types/protocol.ts","../src/backpressure.ts","../src/coalesce.ts","../src/outbound.ts","../src/ratelimit.ts","../src/writer.ts","../src/binary.ts","../src/presence.ts","../src/seq.ts","../src/errors-policy.ts","../src/rtt.ts","../src/client.ts"],"names":["key","waiter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Clock abstraction for deterministic time testing.\n *\n * NOTE: This is the ONLY file in src/ permitted to invoke the platform's\n * global setTimeout / clearTimeout primitives. All SDK timers must be\n * scheduled via a Clock instance.\n */\n\nexport interface Timer {\n stop(): void;\n}\n\nexport interface Clock {\n now(): number;\n setTimeout(fn: () => void, ms: number): Timer;\n clearTimeout(t: Timer): void;\n}\n\nexport class RealClock implements Clock {\n now(): number {\n return Date.now();\n }\n\n setTimeout(fn: () => void, ms: number): Timer {\n const id = globalThis.setTimeout(fn, ms);\n let stopped = false;\n return {\n stop: () => {\n if (!stopped) {\n stopped = true;\n globalThis.clearTimeout(id);\n }\n },\n };\n }\n\n clearTimeout(t: Timer): void {\n t.stop();\n }\n}\n\n","import type { Capabilities, ErrorCode, ErrorFrame, MessageFrame, WelcomeFrame } from './types/protocol.js';\nimport type { ChannelPolicy } from './policy.js';\nimport type { BinaryChannelMap } from './binary.js';\nimport type { ErrorAction } from './errors-policy.js';\nimport type { RttStats } from './rtt.js';\n\nexport type State =\n | 'idle'\n | 'connecting'\n | 'awaiting_welcome'\n | 'ready'\n | 'reconnecting'\n | 'closed';\n\nexport interface StateChangeEvent {\n from: State;\n to: State;\n}\n\nexport interface ConnectedEvent {\n welcome: WelcomeFrame;\n}\n\nexport interface DisconnectedEvent {\n code: number;\n reason: string;\n wasClean: boolean;\n}\n\nexport interface ReconnectingEvent {\n attempt: number;\n delayMs: number;\n}\n\nexport interface ErrorEvent {\n error: Error;\n phase: 'connect' | 'runtime';\n}\n\nexport interface ErrorClassifiedEvent {\n code: ErrorCode;\n message: string;\n room?: string;\n channel?: string;\n action: ErrorAction;\n retryAfterMs?: number;\n rawFrame?: ErrorFrame;\n}\n\nexport interface FatalEvent {\n code: 'AUTH_FAILED' | 'POLICY_VIOLATION' | 'CLOSED';\n message: string;\n}\n\nexport interface HeartbeatTimeoutEvent {\n elapsedMs: number;\n}\n\nexport interface RttEvent {\n sample: number;\n source: 'heartbeat' | 'on_demand';\n stats: RttStats;\n}\n\nexport interface SessionRestoredEvent {\n restored: string[];\n failed: Array<{ room: string; code: ErrorCode }>;\n}\n\nexport interface IntentFailedEvent {\n room: string;\n code: ErrorCode;\n}\n\nexport interface CapabilitiesChangedEvent {\n previous?: Capabilities;\n current: Capabilities;\n previousVersion?: string;\n currentVersion?: string;\n}\n\nexport interface RateLimitedEvent {\n source: 'local' | 'server';\n room: string;\n channel: string;\n retryAfterMs: number;\n}\n\nexport interface ReliableOverflowEvent {\n room: string;\n channel: string;\n depth: number;\n action: 'dropped' | 'closed';\n}\n\nexport interface UnreliableDroppedEvent {\n room: string;\n channel: string;\n depth: number;\n}\n\nexport interface CoalescedEvent {\n room: string;\n channel: string;\n merged: boolean;\n skipped: boolean;\n}\n\nexport interface QueuesDiscardedEvent {\n reliable: number;\n unreliable: number;\n coalesced: number;\n}\n\nexport interface BackpressureEvent {\n state: 'high' | 'low';\n bufferedAmount: number;\n}\n\nexport interface PolicyAppliedEvent {\n room: string;\n channel: string;\n policy: ChannelPolicy;\n}\n\nexport interface BinaryMessageEvent {\n room: string;\n channel: string;\n payload: Uint8Array;\n}\n\nexport interface BinaryUnknownChannelEvent {\n id: number;\n}\n\nexport interface BinaryIdCollisionEvent {\n id: number;\n existing: string[];\n rejected: string[];\n}\n\nexport interface BinaryMappingChangedEvent {\n room: string;\n map: BinaryChannelMap;\n}\n\nexport interface PresenceJoinEvent {\n room: string;\n who: string;\n}\n\nexport interface PresenceLeaveEvent {\n room: string;\n who: string;\n}\n\nexport interface PresenceInvalidatedEvent {\n room: string;\n reason: string;\n}\n\nexport interface RoomDeletedEvent {\n room: string;\n who: string;\n}\n\nexport interface SequenceGapEvent {\n room: string;\n channel: string;\n prev: number;\n current: number;\n missed: number;\n reliable: boolean;\n}\n\nexport interface ProtocolViolationEvent {\n room: string;\n reason: string;\n}\n\nexport interface EventMap {\n stateChange: StateChangeEvent;\n connected: ConnectedEvent;\n disconnected: DisconnectedEvent;\n reconnecting: ReconnectingEvent;\n error: ErrorEvent;\n errorClassified: ErrorClassifiedEvent;\n fatal: FatalEvent;\n heartbeatTimeout: HeartbeatTimeoutEvent;\n rtt: RttEvent;\n sessionRestored: SessionRestoredEvent;\n intentFailed: IntentFailedEvent;\n capabilitiesChanged: CapabilitiesChangedEvent;\n message: MessageFrame;\n rateLimited: RateLimitedEvent;\n reliableOverflow: ReliableOverflowEvent;\n unreliableDropped: UnreliableDroppedEvent;\n coalesced: CoalescedEvent;\n queuesDiscarded: QueuesDiscardedEvent;\n backpressure: BackpressureEvent;\n policyApplied: PolicyAppliedEvent;\n binaryMessage: BinaryMessageEvent;\n binaryUnknownChannel: BinaryUnknownChannelEvent;\n binaryIdCollision: BinaryIdCollisionEvent;\n binaryMappingChanged: BinaryMappingChangedEvent;\n presenceJoin: PresenceJoinEvent;\n presenceLeave: PresenceLeaveEvent;\n presenceInvalidated: PresenceInvalidatedEvent;\n roomDeleted: RoomDeletedEvent;\n sequenceGap: SequenceGapEvent;\n protocolViolation: ProtocolViolationEvent;\n}\n\nexport type EventName = keyof EventMap;\nexport type EventPayload<E extends EventName> = EventMap[E];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype EventHandler = (payload: any) => void;\n\nexport class SyncEventEmitter {\n private readonly listeners = new Map<EventName, Set<EventHandler>>();\n\n on<E extends EventName>(\n event: E,\n handler: (payload: EventPayload<E>) => void\n ): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler as EventHandler);\n return () => {\n set?.delete(handler as EventHandler);\n };\n }\n\n emit<E extends EventName>(event: E, payload: EventPayload<E>): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const handler of Array.from(set)) {\n try {\n handler(payload);\n } catch {\n // Prevent user handler exceptions from breaking SDK execution\n }\n }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","import type { Clock, Timer } from './clock.js';\n\nexport interface HeartbeatConfig {\n enabled?: boolean; // default: true\n intervalMs?: number; // default: 25000\n timeoutMs?: number; // default: 10000\n trackRtt?: boolean; // default: true\n}\n\nexport interface HeartbeatActions {\n sendPing: () => void;\n onTimeout: (elapsedMs: number) => void;\n onPong?: (sample: number) => void;\n}\n\nexport class HeartbeatManager {\n private readonly enabled: boolean;\n private readonly intervalMs: number;\n private readonly timeoutMs: number;\n\n private intervalTimer: Timer | null = null;\n private pongTimer: Timer | null = null;\n private pingSentAt = 0;\n private isRunning = false;\n\n constructor(\n config: HeartbeatConfig | undefined,\n private readonly clock: Clock,\n private readonly actions: HeartbeatActions\n ) {\n this.enabled = config?.enabled ?? true;\n this.intervalMs = config?.intervalMs && config.intervalMs > 0 ? config.intervalMs : 25000;\n this.timeoutMs = config?.timeoutMs && config.timeoutMs > 0 ? config.timeoutMs : 10000;\n }\n\n start(): void {\n if (!this.enabled) return;\n this.stop();\n this.isRunning = true;\n this.scheduleNextPing();\n }\n\n stop(): void {\n this.isRunning = false;\n if (this.intervalTimer) {\n this.clock.clearTimeout(this.intervalTimer);\n this.intervalTimer = null;\n }\n if (this.pongTimer) {\n this.clock.clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n this.pingSentAt = 0;\n }\n\n handlePong(): void {\n if (!this.isRunning) return;\n if (this.pongTimer) {\n this.clock.clearTimeout(this.pongTimer);\n this.pongTimer = null;\n const sample = Math.max(0, this.clock.now() - this.pingSentAt);\n this.pingSentAt = 0;\n this.actions.onPong?.(sample);\n this.scheduleNextPing();\n }\n }\n\n private scheduleNextPing(): void {\n if (!this.isRunning) return;\n this.intervalTimer = this.clock.setTimeout(() => {\n this.intervalTimer = null;\n this.tick();\n }, this.intervalMs);\n }\n\n private tick(): void {\n if (!this.isRunning) return;\n this.pingSentAt = this.clock.now();\n try {\n this.actions.sendPing();\n } catch {\n // Send failure will be handled by transport / connection lifecycle\n return;\n }\n\n this.pongTimer = this.clock.setTimeout(() => {\n this.pongTimer = null;\n if (!this.isRunning) return;\n const elapsed = this.clock.now() - this.pingSentAt;\n this.stop();\n this.actions.onTimeout(elapsed > 0 ? elapsed : this.timeoutMs);\n }, this.timeoutMs);\n }\n}\n\n","/**\n * Structured logger interface and redaction utilities.\n */\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport type Logger = (\n level: LogLevel,\n msg: string,\n fields?: Record<string, unknown>\n) => void;\n\nexport function redactUrl(rawUrl: string): string {\n if (!rawUrl) return rawUrl;\n try {\n const u = new URL(rawUrl);\n if (u.searchParams.has('key')) {\n u.searchParams.set('key', '***');\n }\n return u.toString();\n } catch {\n return rawUrl.replace(/([?&]key=)[^& \\s'\"]*/g, '$1***');\n }\n}\n\nexport function redactString(str: string, secrets: Iterable<string>): string {\n if (!str) return str;\n let result = redactUrl(str);\n for (const secret of secrets) {\n if (secret && secret.length > 0) {\n result = result.split(secret).join('***');\n }\n }\n return result;\n}\n\nexport function redactValue(value: unknown, secrets: Iterable<string>): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n if (typeof value === 'string') {\n return redactString(value, secrets);\n }\n if (Array.isArray(value)) {\n return value.map((item) => redactValue(item, secrets));\n }\n if (typeof value === 'object') {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = redactValue(v, secrets);\n }\n return out;\n }\n return value;\n}\n\nexport class RedactingLogger {\n constructor(\n private readonly logger: Logger | undefined,\n private readonly getSecrets: () => string[]\n ) {}\n\n log(level: LogLevel, msg: string, fields?: Record<string, unknown>): void {\n if (!this.logger) return;\n const secrets = this.getSecrets().filter((s) => Boolean(s && s.length > 0));\n const redactedMsg = redactString(msg, secrets);\n const redactedFields = fields\n ? (redactValue(fields, secrets) as Record<string, unknown>)\n : undefined;\n this.logger(level, redactedMsg, redactedFields);\n }\n\n debug(msg: string, fields?: Record<string, unknown>): void {\n this.log('debug', msg, fields);\n }\n\n info(msg: string, fields?: Record<string, unknown>): void {\n this.log('info', msg, fields);\n }\n\n warn(msg: string, fields?: Record<string, unknown>): void {\n this.log('warn', msg, fields);\n }\n\n error(msg: string, fields?: Record<string, unknown>): void {\n this.log('error', msg, fields);\n }\n}\n\n","/**\n * Reconnection backoff curves and jitter algorithms.\n */\n\nexport type JitterMode = 'full' | 'equal' | 'none';\n\nexport interface ReconnectConfig {\n baseDelayMs?: number; // 500\n maxDelayMs?: number; // 30000\n maxAttempts?: number; // Infinity\n jitter?: JitterMode; // 'full'\n shouldReconnect?: (ctx: { closeCode: number; firstConnect: boolean }) => boolean;\n}\n\nexport function computeReconnectDelay(\n attempt: number,\n config: {\n baseDelayMs?: number;\n maxDelayMs?: number;\n jitter?: JitterMode;\n random?: () => number;\n } = {}\n): number {\n const base = config.baseDelayMs && config.baseDelayMs > 0 ? config.baseDelayMs : 500;\n const max = config.maxDelayMs && config.maxDelayMs > 0 ? config.maxDelayMs : 30000;\n const jitter = config.jitter ?? 'full';\n const rand = config.random ?? Math.random;\n\n const shift = Math.min(Math.max(0, attempt), 30);\n const backoff = Math.min(max, base * Math.pow(2, shift));\n\n if (jitter === 'none') {\n return backoff;\n }\n\n if (jitter === 'equal') {\n const half = backoff / 2;\n return half + rand() * half;\n }\n\n // 'full' jitter: random(0, ceiling)\n return rand() * backoff;\n}\n\n","export function redactSecrets(text: string): string {\r\n if (!text) return text;\r\n return text.replace(/([?&]key=)[^& \\s'\"]*/g, '$1***');\r\n}\r\n\r\nexport class SdkError extends Error {\r\n constructor(message: string, options?: ErrorOptions) {\r\n super(redactSecrets(message), options);\r\n this.name = 'SdkError';\r\n }\r\n}","import { SdkError } from './types/error-base.js';\n\nexport const ROOM_NAME_RE = /^[a-zA-Z0-9_-]{1,64}$/;\nexport const CHANNEL_NAME_RE = /^[a-zA-Z0-9_-]{1,32}$/;\n\nexport interface ValidationConfig {\n enabled?: boolean; // default: true\n maxTextPayloadBytes?: number; // default: 65024 (65536 - 512)\n maxBinaryPayloadBytes?: number; // default: 65535\n}\n\nexport type ValidationField = 'room' | 'channel' | 'payload' | 'binary_payload';\nexport type ValidationRule = 'name_syntax' | 'reserved_channel' | 'too_large';\n\nexport class ValidationError extends SdkError {\n readonly field: ValidationField;\n readonly rule: ValidationRule;\n readonly value: string;\n readonly limit?: number;\n\n constructor(\n field: ValidationField,\n rule: ValidationRule,\n value: string,\n limit?: number\n ) {\n let msg: string;\n if (rule === 'too_large') {\n msg = `Validation failed on ${field}: ${rule} (limit ${limit} bytes, got ${value})`;\n } else {\n msg = `Validation failed on ${field}: ${rule} (\"${value}\")`;\n }\n super(msg);\n this.name = 'ValidationError';\n this.field = field;\n this.rule = rule;\n this.value = value;\n this.limit = limit;\n }\n}\n\nexport class BinaryPayloadTooLargeError extends ValidationError {\n readonly byteLength: number;\n readonly maxBytes: number;\n\n constructor(byteLength: number, maxBytes: number) {\n super('binary_payload', 'too_large', `${byteLength} bytes`, maxBytes);\n this.name = 'BinaryPayloadTooLargeError';\n this.byteLength = byteLength;\n this.maxBytes = maxBytes;\n }\n}\n\nfunction truncateString(s: string, maxLen: number): string {\n if (s.length <= maxLen) {\n return s;\n }\n return s.slice(0, maxLen) + '...';\n}\n\nexport function validateRoomName(room: string, config?: ValidationConfig): void {\n if (config?.enabled === false) {\n return;\n }\n if (!ROOM_NAME_RE.test(room)) {\n throw new ValidationError('room', 'name_syntax', truncateString(room, 64));\n }\n}\n\nexport function validateChannelName(channel: string, config?: ValidationConfig): void {\n if (config?.enabled === false) {\n return;\n }\n if (channel === 'presence') {\n throw new ValidationError('channel', 'reserved_channel', channel);\n }\n if (!CHANNEL_NAME_RE.test(channel)) {\n throw new ValidationError('channel', 'name_syntax', truncateString(channel, 32));\n }\n}\n\nexport function validateTextPayloadSize(\n marshaledLength: number,\n config?: ValidationConfig\n): void {\n if (config?.enabled === false) {\n return;\n }\n const max = config?.maxTextPayloadBytes ?? (65536 - 512);\n if (marshaledLength > max) {\n throw new ValidationError('payload', 'too_large', `${marshaledLength} bytes`, max);\n }\n}\n\nexport function validateBinaryPayloadSize(\n byteLength: number,\n config?: ValidationConfig\n): void {\n if (config?.enabled === false) {\n return;\n }\n const max = config?.maxBinaryPayloadBytes ?? 65535;\n if (byteLength > max) {\n throw new BinaryPayloadTooLargeError(byteLength, max);\n }\n}\n","export interface ChannelPolicy {\n reliable: boolean;\n maxRate: number; // 0 = unlimited\n coalesce: boolean; // only consulted on unreliable lane\n coalesceDriver?: 'timer' | 'raf'; // default 'timer'\n merge?: (prev: unknown, next: unknown) => { value: unknown; skip: boolean };\n}\n\nexport interface PolicyProvider {\n channelPolicy(room: string, channel: string): ChannelPolicy | undefined;\n}\n\nexport type RoomKind = 'chat' | 'game' | 'custom';\n\nexport function presetsFor(\n kind: RoomKind,\n overrides?: Record<string, Partial<ChannelPolicy>>\n): Record<string, ChannelPolicy> {\n const presets: Record<string, ChannelPolicy> = {};\n\n // Presence channel is auto-provisioned for all room kinds (PROTOCOL.md §5.2)\n presets['presence'] = {\n reliable: true,\n maxRate: 0,\n coalesce: false,\n };\n\n switch (kind) {\n case 'chat':\n presets['chat'] = {\n reliable: true,\n maxRate: 5,\n coalesce: false,\n };\n break;\n\n case 'game':\n presets['state'] = {\n reliable: false,\n maxRate: 60,\n coalesce: false,\n };\n presets['chat'] = {\n reliable: true,\n maxRate: 5,\n coalesce: false,\n };\n presets['actions'] = {\n reliable: true,\n maxRate: 20,\n coalesce: false,\n };\n break;\n\n case 'custom':\n default:\n presets['default'] = {\n reliable: true,\n maxRate: 0,\n coalesce: false,\n };\n break;\n }\n\n if (overrides) {\n for (const [ch, override] of Object.entries(overrides)) {\n presets[ch] = {\n ...(presets[ch] ?? { reliable: true, maxRate: 0, coalesce: false }),\n ...override,\n };\n }\n }\n\n return presets;\n}\n\nexport function resolvePolicy(\n room: string,\n channel: string,\n provider: PolicyProvider | undefined,\n overrides: Record<string, ChannelPolicy>\n): ChannelPolicy {\n const overrideKey = `${room}:${channel}`;\n if (overrides[overrideKey]) {\n return overrides[overrideKey];\n }\n\n if (provider) {\n const policy = provider.channelPolicy(room, channel);\n if (policy) {\n return policy;\n }\n }\n\n return {\n reliable: true,\n maxRate: 0,\n coalesce: false,\n };\n}\n\n","import type { Capabilities, CreateRoomRequest } from './types/protocol.js';\nimport { presetsFor } from './policy.js';\nimport { SdkError } from './types/error-base.js';\n\nexport class CapabilityLimitError extends SdkError {\n readonly limit: 'max_metadata_bytes' | 'max_channels_per_room' | 'max_rooms_per_key';\n readonly requested: number;\n readonly allowed: number;\n\n constructor(\n limit: 'max_metadata_bytes' | 'max_channels_per_room' | 'max_rooms_per_key',\n requested: number,\n allowed: number\n ) {\n super(`Capability limit exceeded for \"${limit}\": requested ${requested}, allowed ${allowed}`);\n this.name = 'CapabilityLimitError';\n this.limit = limit;\n this.requested = requested;\n this.allowed = allowed;\n }\n}\n\nexport function checkCapabilityPreflight(\n capabilities: Capabilities | undefined,\n req: CreateRoomRequest,\n ownedRoomsCount: number\n): void {\n if (!capabilities || !capabilities.limits) {\n return;\n }\n\n const limits = capabilities.limits;\n\n // 1. Metadata byte size\n if (\n req.metadata !== undefined &&\n req.metadata !== null &&\n limits.max_metadata_bytes !== null &&\n limits.max_metadata_bytes !== undefined\n ) {\n const metaBytes = new TextEncoder().encode(JSON.stringify(req.metadata)).length;\n if (metaBytes > limits.max_metadata_bytes) {\n throw new CapabilityLimitError(\n 'max_metadata_bytes',\n metaBytes,\n limits.max_metadata_bytes\n );\n }\n }\n\n // 2. Effective channel count (preset ∪ overrides ∪ presence)\n if (\n limits.max_channels_per_room !== null &&\n limits.max_channels_per_room !== undefined\n ) {\n const effective = new Set<string>(['presence']);\n const preset = presetsFor((req.kind as 'chat' | 'game' | 'custom') ?? 'custom');\n for (const ch of Object.keys(preset)) {\n effective.add(ch);\n }\n if (req.channels) {\n for (const ch of Object.keys(req.channels)) {\n effective.add(ch);\n }\n }\n if (effective.size > limits.max_channels_per_room) {\n throw new CapabilityLimitError(\n 'max_channels_per_room',\n effective.size,\n limits.max_channels_per_room\n );\n }\n }\n\n // 3. Max rooms per key\n if (\n limits.max_rooms_per_key !== null &&\n limits.max_rooms_per_key !== undefined\n ) {\n if (ownedRoomsCount >= limits.max_rooms_per_key) {\n throw new CapabilityLimitError(\n 'max_rooms_per_key',\n ownedRoomsCount + 1,\n limits.max_rooms_per_key\n );\n }\n }\n}\n","import type { ErrorCode } from './protocol.js';\nimport { redactSecrets, SdkError } from './error-base.js';\nexport { SdkError } from './error-base.js';\n\nexport class AuthError extends SdkError {\n readonly code = 'AUTH_FAILED' as const;\n\n constructor(message = 'Authentication failed', options?: ErrorOptions) {\n super(message, options);\n this.name = 'AuthError';\n }\n}\n\nexport interface ConnectErrorCause {\n closeCode?: number;\n reason?: string;\n [key: string]: unknown;\n}\n\nexport class ConnectError extends SdkError {\n override readonly cause?: ConnectErrorCause | unknown;\n\n constructor(message: string, cause?: ConnectErrorCause | unknown) {\n super(message);\n this.name = 'ConnectError';\n if (cause && typeof cause === 'object') {\n const sanitizedCause: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(cause as Record<string, unknown>)) {\n if (typeof v === 'string') {\n sanitizedCause[k] = redactSecrets(v);\n } else {\n sanitizedCause[k] = v;\n }\n }\n this.cause = sanitizedCause;\n } else {\n this.cause = cause;\n }\n }\n\n get closeCode(): number | undefined {\n if (this.cause && typeof this.cause === 'object' && 'closeCode' in this.cause) {\n return (this.cause as ConnectErrorCause).closeCode;\n }\n return undefined;\n }\n\n get reason(): string | undefined {\n if (this.cause && typeof this.cause === 'object' && 'reason' in this.cause) {\n return (this.cause as ConnectErrorCause).reason;\n }\n return undefined;\n }\n}\n\nexport class PolicyViolationError extends SdkError {\n readonly code = 'POLICY_VIOLATION' as const;\n readonly closeCode: number;\n readonly reason?: string;\n\n constructor(message = 'Policy violation', closeCode = 1008, reason?: string) {\n super(message);\n this.name = 'PolicyViolationError';\n this.closeCode = closeCode;\n this.reason = reason;\n }\n}\n\nexport class RequestTimeoutError extends SdkError {\n constructor(message = 'Request timed out') {\n super(message);\n this.name = 'RequestTimeoutError';\n }\n}\n\nexport class ConcurrentRequestError extends SdkError {\n constructor(message = 'Concurrent request for the same operation and room is not permitted') {\n super(message);\n this.name = 'ConcurrentRequestError';\n }\n}\n\nexport class ServerError extends SdkError {\n readonly code: ErrorCode;\n readonly channel?: string;\n readonly retryAfterMs?: number;\n\n constructor(code: ErrorCode, message: string, channel?: string, retryAfterMs?: number) {\n super(message);\n this.name = 'ServerError';\n this.code = code;\n this.channel = channel;\n this.retryAfterMs = retryAfterMs;\n }\n}\n\nexport class NotReadyError extends SdkError {\n constructor(message = 'Client is not ready for outbound operations') {\n super(message);\n this.name = 'NotReadyError';\n }\n}\n\nexport class ChannelNotReliableError extends SdkError {\n readonly channel: string;\n\n constructor(channel: string, message = `Channel \"${channel}\" does not support reliable delivery`) {\n super(message);\n this.name = 'ChannelNotReliableError';\n this.channel = channel;\n }\n}\n\nexport class RateLimitedError extends SdkError {\n readonly retryAfterMs: number;\n readonly channel: string;\n readonly source: 'local' | 'server';\n\n constructor(\n retryAfterMs: number,\n channel: string,\n source: 'local' | 'server',\n message = `Rate limit exceeded on channel \"${channel}\"; retry after ${retryAfterMs}ms (${source})`\n ) {\n super(message);\n this.name = 'RateLimitedError';\n this.retryAfterMs = retryAfterMs;\n this.channel = channel;\n this.source = source;\n }\n}\n\nexport type BinaryMapValidationReason =\n | 'out_of_range'\n | 'reserved_channel'\n | 'duplicate_id'\n | 'duplicate_channel';\n\nexport class BinaryMapValidationError extends SdkError {\n readonly channel: string;\n readonly id: number;\n readonly reason: BinaryMapValidationReason;\n\n constructor(channel: string, id: number, reason: BinaryMapValidationReason) {\n super(`Binary map validation failed for channel \"${channel}\" (id ${id}): ${reason}`);\n this.name = 'BinaryMapValidationError';\n this.channel = channel;\n this.id = id;\n this.reason = reason;\n }\n}\n\nexport class BinaryMapExhaustedError extends SdkError {\n constructor(message = 'All 254 binary channel IDs are in use') {\n super(message);\n this.name = 'BinaryMapExhaustedError';\n }\n}\n\nexport class BinaryIdCollisionError extends SdkError {\n readonly id: number;\n readonly existing: string[];\n readonly rejected: string[];\n\n constructor(id: number, existing: string[], rejected: string[]) {\n super(`Binary channel ID ${id} collides with existing assignment (${existing.join(', ')})`);\n this.name = 'BinaryIdCollisionError';\n this.id = id;\n this.existing = existing;\n this.rejected = rejected;\n }\n}\n\nexport class BinaryChannelUnmappedError extends SdkError {\n readonly room: string;\n readonly channel: string;\n\n constructor(room: string, channel: string) {\n super(`Channel \"${channel}\" in room \"${room}\" is not mapped to a binary channel ID`);\n this.name = 'BinaryChannelUnmappedError';\n this.room = room;\n this.channel = channel;\n }\n}\n\nexport {\n ValidationError,\n BinaryPayloadTooLargeError,\n type ValidationField,\n type ValidationRule,\n} from '../validate.js';\nexport { CapabilityLimitError } from '../preflight.js';\n\n\n\n","import { ConnectError } from './types/errors.js';\nimport { redactUrl } from './logger.js';\n\nexport interface Transport {\n connect(url: string): Promise<void>; // resolves on open\n send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n readonly readyState: number; // mirrors WebSocket.readyState\n bufferedAmount(): number; // count of bytes buffered in transport\n onopen: (() => void) | null;\n onmessage: (ev: { data: unknown }) => void;\n onclose: (ev: { code: number; reason: string; wasClean: boolean }) => void;\n onerror: (ev: unknown) => void;\n}\n\nexport class BrowserWebSocketTransport implements Transport {\n private ws: WebSocket | null = null;\n onopen: (() => void) | null = null;\n onmessage: (ev: { data: unknown }) => void = () => {};\n onclose: (ev: { code: number; reason: string; wasClean: boolean }) => void = () => {};\n onerror: (ev: unknown) => void = () => {};\n\n bufferedAmount(): number {\n return this.ws ? this.ws.bufferedAmount : 0;\n }\n\n get readyState(): number {\n return this.ws ? this.ws.readyState : 3; // 3 = CLOSED\n }\n\n connect(url: string): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n let settled = false;\n const redacted = redactUrl(url);\n\n try {\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n } catch (err) {\n settled = true;\n reject(\n new ConnectError(`Failed to construct WebSocket for ${redacted}`, err)\n );\n return;\n }\n\n const handleOpen = () => {\n if (!settled) {\n settled = true;\n this.cleanupPreOpen();\n this.onopen?.();\n resolve();\n }\n };\n\n const handleErrorPreOpen = (ev: Event) => {\n this.onerror(ev);\n };\n\n const handleClosePreOpen = (ev: CloseEvent) => {\n if (!settled) {\n settled = true;\n this.cleanupPreOpen();\n const cause = {\n closeCode: ev.code,\n reason: ev.reason,\n wasClean: ev.wasClean,\n };\n const err = new ConnectError(\n `Connection closed before open for ${redacted} (code: ${ev.code}, reason: ${ev.reason || 'none'})`,\n cause\n );\n this.onclose({ code: ev.code, reason: ev.reason, wasClean: ev.wasClean });\n reject(err);\n }\n };\n\n this.cleanupPreOpen = () => {\n this.ws?.removeEventListener('open', handleOpen);\n this.ws?.removeEventListener('error', handleErrorPreOpen);\n this.ws?.removeEventListener('close', handleClosePreOpen);\n };\n\n this.ws.addEventListener('open', handleOpen);\n this.ws.addEventListener('error', handleErrorPreOpen);\n this.ws.addEventListener('close', handleClosePreOpen);\n\n this.ws.onmessage = (ev: MessageEvent) => {\n this.onmessage({ data: ev.data });\n };\n\n this.ws.onclose = (ev: CloseEvent) => {\n if (settled) {\n this.onclose({ code: ev.code, reason: ev.reason, wasClean: ev.wasClean });\n }\n };\n\n this.ws.onerror = (ev: Event) => {\n if (settled) {\n this.onerror(ev);\n }\n };\n });\n }\n\n private cleanupPreOpen: () => void = () => {};\n\n send(data: string | ArrayBufferLike | Blob): void {\n if (!this.ws || this.ws.readyState !== 1) {\n throw new ConnectError('Cannot send on closed WebSocket');\n }\n this.ws.send(data);\n }\n\n close(code?: number, reason?: string): void {\n if (this.ws) {\n try {\n this.ws.close(code, reason);\n } catch {\n // no-op\n }\n }\n }\n}\n","/**\n * Wire protocol types mirroring PROTOCOL.md and Go client/types.go.\n */\n\nexport type ErrorCode =\n | 'UNAUTHORIZED'\n | 'FORBIDDEN_SCOPE'\n | 'NOT_ROOM_OWNER'\n | 'BAD_REQUEST'\n | 'ROOM_NOT_FOUND'\n | 'ROOM_ALREADY_EXISTS'\n | 'ROOM_FULL'\n | 'INVALID_PASSCODE'\n | 'PASSCODE_RATE_LIMITED'\n | 'MAX_ROOMS_REACHED'\n | 'BINARY_NOT_ALLOWED'\n | 'CHANNEL_NOT_RELIABLE'\n | 'CHANNEL_NOT_FOUND'\n | 'RESERVED_CHANNEL_NAME'\n | 'CHANNEL_READ_ONLY'\n | 'RATE_LIMITED'\n | 'INTERNAL_ERROR';\n\nexport interface ChannelConfig {\n name: string;\n reliable: boolean;\n max_rate: number; // msgs/sec/conn, 0 = unlimited\n}\n\nexport interface ChannelConfigInput {\n reliable?: boolean;\n max_rate?: number;\n}\n\nexport interface RoomSummary {\n name: string;\n members: number;\n protected: boolean;\n kind?: string;\n channels?: string[];\n channel_configs?: Record<string, ChannelConfig>;\n max_members?: number;\n created_at: number; // Unix epoch seconds\n metadata?: unknown;\n}\n\nexport type BinaryChannelMap = Record<string, number>;\n\nexport interface CapabilityLimits {\n max_rooms: number;\n max_members_per_room: number | null;\n max_message_bytes: number;\n max_rooms_per_key: number | null;\n max_channels_per_room: number | null;\n max_metadata_bytes: number | null;\n list_rooms_max_limit: number | null;\n list_rooms_default_limit: number | null;\n}\n\nexport interface ListRoomsFeatures {\n pagination?: boolean;\n detail_levels?: string[];\n filters?: string[];\n}\n\nexport interface CapabilityFeatures {\n binary_frames?: boolean;\n room_kinds?: string[];\n list_rooms?: ListRoomsFeatures;\n}\n\nexport interface Capabilities {\n limits?: CapabilityLimits;\n features?: CapabilityFeatures;\n}\n\n// Client -> Server request frames\n\nexport interface CreateRoomRequest {\n type?: 'create_room';\n room: string;\n kind?: 'chat' | 'game' | 'custom' | string;\n passcode?: string;\n max_members?: number;\n ephemeral?: boolean;\n channels?: Record<string, ChannelConfigInput>;\n metadata?: unknown;\n}\n\nexport interface JoinRoomRequest {\n type?: 'join_room';\n room: string;\n passcode?: string;\n binary_channels?: BinaryChannelMap;\n}\n\nexport interface LeaveRoomRequest {\n type?: 'leave_room';\n room: string;\n}\n\nexport interface DeleteRoomRequest {\n type?: 'delete_room';\n room: string;\n}\n\nexport interface ListRoomsRequest {\n type?: 'list_rooms';\n limit?: number;\n cursor?: string;\n filters?: unknown;\n detail?: string;\n}\n\nexport interface PublishRequest {\n type?: 'publish';\n room: string;\n channel?: string;\n reliable?: boolean;\n payload?: unknown;\n include_sender?: boolean;\n}\n\nexport interface PingRequest {\n type?: 'ping';\n}\n\nexport type ClientFrame =\n | CreateRoomRequest\n | JoinRoomRequest\n | LeaveRoomRequest\n | DeleteRoomRequest\n | ListRoomsRequest\n | PublishRequest\n | PingRequest;\n\n// Server -> Client frames\n\nexport interface WelcomeFrame {\n type: 'welcome';\n client_id: string;\n label: string;\n server_version: string;\n capabilities?: Capabilities;\n}\n\nexport interface RoomCreatedFrame {\n type: 'room_created';\n room: string;\n channels: string[];\n}\n\nexport interface RoomJoinedFrame {\n type: 'room_joined';\n room: string;\n channels: string[];\n members: number;\n}\n\nexport interface RoomLeftFrame {\n type: 'room_left';\n room: string;\n}\n\nexport interface RoomListFrame {\n type: 'room_list';\n rooms: RoomSummary[];\n next_cursor?: string;\n truncated?: boolean;\n filters_applied?: unknown;\n detail?: string;\n}\n\nexport interface MessageFrame {\n type: 'message';\n room: string;\n channel: string;\n from: string;\n seq: number;\n ts: number;\n payload: unknown;\n}\n\nexport interface ErrorFrame {\n type: 'error';\n code: ErrorCode;\n message: string;\n channel?: string;\n retry_after_ms?: number;\n room?: string; // J3: correlation, currently server-optional\n}\n\nexport interface PongFrame {\n type: 'pong';\n}\n\nexport type ServerFrame =\n | WelcomeFrame\n | RoomCreatedFrame\n | RoomJoinedFrame\n | RoomLeftFrame\n | RoomListFrame\n | MessageFrame\n | ErrorFrame\n | PongFrame;\n\n// Type guards for structural inspection\n\nexport function isErrorFrame(x: unknown): x is ErrorFrame {\n return typeof x === 'object' && x !== null && (x as { type?: unknown }).type === 'error';\n}\n\nexport function isMessageFrame(x: unknown): x is MessageFrame {\n return typeof x === 'object' && x !== null && (x as { type?: unknown }).type === 'message';\n}\n\nexport function isWelcomeFrame(x: unknown): x is WelcomeFrame {\n return typeof x === 'object' && x !== null && (x as { type?: unknown }).type === 'welcome';\n}\n","import type { Clock, Timer } from './clock.js';\nimport type { Transport } from './transport.js';\n\nexport interface BackpressureConfig {\n enabled?: boolean; // default: true\n highWaterMarkBytes?: number; // default: 1 << 20 (1 MiB = 1048576)\n lowWaterMarkBytes?: number; // default: 1 << 19 (512 KiB = 524288)\n pollIntervalMs?: number; // default: 50\n}\n\nexport type BackpressureEventCallback = (ev: {\n state: 'high' | 'low';\n bufferedAmount: number;\n}) => void;\n\nexport class BackpressureManager {\n readonly enabled: boolean;\n readonly highWaterMarkBytes: number;\n readonly lowWaterMarkBytes: number;\n readonly pollIntervalMs: number;\n\n private blocked = false;\n private pollTimer: Timer | null = null;\n private readonly transport: Transport;\n private readonly clock: Clock;\n private readonly onStateChange: BackpressureEventCallback;\n private readonly onWakeWriter: () => void;\n\n constructor(\n transport: Transport,\n clock: Clock,\n config: BackpressureConfig | undefined,\n onStateChange: BackpressureEventCallback,\n onWakeWriter: () => void\n ) {\n this.transport = transport;\n this.clock = clock;\n this.enabled = config?.enabled ?? true;\n this.highWaterMarkBytes = config?.highWaterMarkBytes ?? (1 << 20); // 1 MiB\n this.lowWaterMarkBytes = config?.lowWaterMarkBytes ?? (1 << 19); // 512 KiB\n this.pollIntervalMs = config?.pollIntervalMs ?? 50;\n this.onStateChange = onStateChange;\n this.onWakeWriter = onWakeWriter;\n }\n\n start(): void {\n if (!this.enabled || this.highWaterMarkBytes <= 0) {\n return;\n }\n this.stop();\n this.scheduleNextPoll();\n }\n\n private scheduleNextPoll(): void {\n this.pollTimer = this.clock.setTimeout(() => {\n this.check();\n if (this.pollTimer) {\n this.scheduleNextPoll();\n }\n }, this.pollIntervalMs);\n }\n\n stop(): void {\n if (this.pollTimer) {\n this.clock.clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n this.blocked = false;\n }\n\n isBlocked(): boolean {\n if (!this.enabled || this.highWaterMarkBytes <= 0) {\n return false;\n }\n return this.blocked;\n }\n\n check(): boolean {\n if (!this.enabled || this.highWaterMarkBytes <= 0) {\n return false;\n }\n\n const current = this.transport.bufferedAmount();\n\n if (!this.blocked && current >= this.highWaterMarkBytes) {\n this.blocked = true;\n this.onStateChange({\n state: 'high',\n bufferedAmount: current,\n });\n } else if (this.blocked && current <= this.lowWaterMarkBytes) {\n this.blocked = false;\n this.onStateChange({\n state: 'low',\n bufferedAmount: current,\n });\n this.onWakeWriter();\n }\n\n return this.blocked;\n }\n}\n","import type { Clock, Timer } from './clock.js';\nimport type { ChannelPolicy } from './policy.js';\n\nexport interface CoalesceSlot {\n room: string;\n channel: string;\n frameType: 'text' | 'binary';\n latestWire: string | Uint8Array;\n latestPayload: unknown;\n includeSender?: boolean;\n hasNew: boolean;\n isReady: boolean;\n timerHandle?: Timer | null;\n rafHandle?: number | null;\n}\n\nexport interface CoalesceItem {\n room: string;\n channel: string;\n frameType: 'text' | 'binary';\n wire: string | Uint8Array;\n}\n\nexport type CoalesceEventCallback = (ev: {\n room: string;\n channel: string;\n merged: boolean;\n skipped: boolean;\n}) => void;\n\nexport class CoalesceManager {\n private readonly slots = new Map<string, CoalesceSlot>();\n private readonly slotKeys: string[] = [];\n private rrIndex = 0;\n private readonly clock: Clock;\n private readonly onWake: () => void;\n private readonly onCoalesced: CoalesceEventCallback;\n\n constructor(clock: Clock, onWake: () => void, onCoalesced: CoalesceEventCallback) {\n this.clock = clock;\n this.onWake = onWake;\n this.onCoalesced = onCoalesced;\n }\n\n private makeKey(room: string, channel: string, frameType: 'text' | 'binary'): string {\n return `${room}:${channel}:${frameType}`;\n }\n\n update(\n room: string,\n channel: string,\n frameType: 'text' | 'binary',\n payload: unknown,\n wire: string | Uint8Array,\n policy: ChannelPolicy,\n includeSender?: boolean\n ): void {\n const key = this.makeKey(room, channel, frameType);\n let slot = this.slots.get(key);\n\n if (!slot) {\n slot = {\n room,\n channel,\n frameType,\n latestWire: wire,\n latestPayload: payload,\n includeSender,\n hasNew: true,\n isReady: false,\n };\n this.slots.set(key, slot);\n this.slotKeys.push(key);\n this.scheduleSlotFlush(slot, policy);\n return;\n }\n\n if (slot.hasNew) {\n if (policy.merge && frameType === 'text') {\n const result = policy.merge(slot.latestPayload, payload);\n if (result.skip) {\n this.onCoalesced({\n room,\n channel,\n merged: false,\n skipped: true,\n });\n return;\n }\n\n slot.latestPayload = result.value;\n const frameObj: Record<string, unknown> = {\n type: 'publish',\n room,\n channel,\n payload: result.value,\n reliable: false,\n };\n if (includeSender !== undefined) {\n frameObj.include_sender = includeSender;\n }\n slot.latestWire = JSON.stringify(frameObj);\n this.onCoalesced({\n room,\n channel,\n merged: true,\n skipped: false,\n });\n } else {\n slot.latestPayload = payload;\n slot.latestWire = wire;\n slot.includeSender = includeSender;\n this.onCoalesced({\n room,\n channel,\n merged: false,\n skipped: false,\n });\n }\n } else {\n slot.latestPayload = payload;\n slot.latestWire = wire;\n slot.includeSender = includeSender;\n slot.hasNew = true;\n slot.isReady = false;\n this.scheduleSlotFlush(slot, policy);\n }\n }\n\n private scheduleSlotFlush(slot: CoalesceSlot, policy: ChannelPolicy): void {\n const driver = policy.coalesceDriver ?? 'timer';\n\n if (driver === 'raf') {\n if (typeof requestAnimationFrame === 'function') {\n if (slot.rafHandle) {\n cancelAnimationFrame(slot.rafHandle);\n }\n slot.rafHandle = requestAnimationFrame(() => {\n slot.rafHandle = null;\n slot.isReady = true;\n this.onWake();\n });\n return;\n }\n\n // Fallback in Node / test environments: 16ms timer routed through Clock\n if (slot.timerHandle) {\n this.clock.clearTimeout(slot.timerHandle);\n }\n slot.timerHandle = this.clock.setTimeout(() => {\n slot.timerHandle = null;\n slot.isReady = true;\n this.onWake();\n }, 16);\n return;\n }\n\n // Default 'timer' driver: flush on next microtask\n queueMicrotask(() => {\n if (slot.hasNew) {\n slot.isReady = true;\n this.onWake();\n }\n });\n }\n\n takeReady(): CoalesceItem | undefined {\n const n = this.slotKeys.length;\n if (n === 0) return undefined;\n\n for (let i = 0; i < n; i++) {\n const idx = (this.rrIndex + i) % n;\n const key = this.slotKeys[idx];\n const slot = this.slots.get(key);\n\n if (slot && slot.hasNew && slot.isReady) {\n const item: CoalesceItem = {\n room: slot.room,\n channel: slot.channel,\n frameType: slot.frameType,\n wire: slot.latestWire,\n };\n slot.hasNew = false;\n slot.isReady = false;\n slot.latestPayload = undefined;\n slot.latestWire = '';\n this.rrIndex = (idx + 1) % n;\n return item;\n }\n }\n\n return undefined;\n }\n\n readyAllPending(): void {\n for (const slot of this.slots.values()) {\n if (slot.hasNew) {\n slot.isReady = true;\n }\n }\n }\n\n flushChannel(\n room: string,\n channel: string,\n onFlush: (wire: string | Uint8Array) => void\n ): void {\n for (const slot of this.slots.values()) {\n if (slot.room === room && slot.channel === channel && slot.hasNew) {\n const wire = slot.latestWire;\n slot.hasNew = false;\n slot.isReady = false;\n slot.latestPayload = undefined;\n slot.latestWire = '';\n if (slot.timerHandle) {\n this.clock.clearTimeout(slot.timerHandle);\n slot.timerHandle = null;\n }\n if (slot.rafHandle && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(slot.rafHandle);\n slot.rafHandle = null;\n }\n onFlush(wire);\n }\n }\n }\n\n clearRoom(room: string): void {\n const toDelete: string[] = [];\n for (const [key, slot] of this.slots.entries()) {\n if (slot.room === room) {\n if (slot.timerHandle) {\n this.clock.clearTimeout(slot.timerHandle);\n slot.timerHandle = null;\n }\n if (slot.rafHandle && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(slot.rafHandle);\n slot.rafHandle = null;\n }\n toDelete.push(key);\n }\n }\n for (const key of toDelete) {\n this.slots.delete(key);\n const idx = this.slotKeys.indexOf(key);\n if (idx !== -1) {\n this.slotKeys.splice(idx, 1);\n }\n }\n }\n\n countPending(): number {\n let count = 0;\n for (const slot of this.slots.values()) {\n if (slot.hasNew) {\n count++;\n }\n }\n return count;\n }\n\n clear(): number {\n const count = this.countPending();\n for (const slot of this.slots.values()) {\n if (slot.timerHandle) {\n this.clock.clearTimeout(slot.timerHandle);\n slot.timerHandle = null;\n }\n if (slot.rafHandle && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(slot.rafHandle);\n slot.rafHandle = null;\n }\n }\n this.slots.clear();\n this.slotKeys.length = 0;\n this.rrIndex = 0;\n return count;\n }\n}\n\n","import type { PolicyProvider } from './policy.js';\n\nexport interface OutboundConfig {\n reliableQueueSize?: number; // default: 256\n unreliableQueueSize?: number; // default: 16\n reliableOverflow?: 'drop' | 'close'; // default: 'drop'\n reliableBurst?: number; // default: 32\n unreliableBurst?: number; // default: 8\n policyProvider?: PolicyProvider; // default: undefined\n enableClientRateLimit?: boolean; // default: true\n}\n\nexport interface OutboundFrame {\n room: string;\n channel: string;\n reliable: boolean;\n wire: string | ArrayBufferLike | Uint8Array;\n frameType?: 'text' | 'binary';\n coalesceKey?: string;\n}\n\n/**\n * Bounded FIFO queue utilizing a sliding head index to maintain O(1) dequeue\n * performance without invoking Array.prototype.shift() which incurs O(n) re-indexing.\n */\nexport class OutboundQueue<T> {\n private items: (T | undefined)[] = [];\n private head = 0;\n readonly capacity: number;\n\n constructor(capacity: number) {\n this.capacity = capacity;\n }\n\n get size(): number {\n return this.items.length - this.head;\n }\n\n enqueue(item: T): void {\n this.items.push(item);\n }\n\n dequeue(): T | undefined {\n if (this.head >= this.items.length) {\n return undefined;\n }\n const item = this.items[this.head];\n this.items[this.head] = undefined;\n this.head++;\n\n // Compact periodically when head pointer exceeds threshold\n if (this.head > 64 && this.head * 2 >= this.items.length) {\n this.items = this.items.slice(this.head);\n this.head = 0;\n }\n return item;\n }\n\n dropOldest(): T | undefined {\n return this.dequeue();\n }\n\n peek(): T | undefined {\n if (this.head >= this.items.length) {\n return undefined;\n }\n return this.items[this.head];\n }\n\n clear(): number {\n const count = this.size;\n this.items = [];\n this.head = 0;\n return count;\n }\n}\n\n","import type { Clock } from './clock.js';\n\nexport class TokenBucket {\n readonly ratePerSec: number;\n readonly burst: number;\n private tokens: number;\n private lastRefillMs: number;\n private readonly clock: Clock;\n\n constructor(ratePerSec: number, burst: number, clock: Clock) {\n this.ratePerSec = ratePerSec;\n this.burst = burst;\n this.clock = clock;\n this.tokens = burst;\n this.lastRefillMs = clock.now();\n }\n\n advanceTo(now: number): void {\n if (now > this.lastRefillMs) {\n const elapsedSec = (now - this.lastRefillMs) / 1000;\n this.tokens = Math.min(this.burst, this.tokens + elapsedSec * this.ratePerSec);\n this.lastRefillMs = now;\n }\n }\n\n tryConsume(): boolean {\n const now = this.clock.now();\n this.advanceTo(now);\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n return false;\n }\n\n retryAfterMs(now: number): number {\n this.advanceTo(now);\n if (this.tokens >= 1) {\n return 0;\n }\n const needed = 1 - this.tokens;\n const ms = Math.ceil((needed / this.ratePerSec) * 1000);\n return Math.max(1, ms);\n }\n}\n\nexport class RateLimiterRegistry {\n private readonly limiters = new Map<string, TokenBucket>();\n private readonly serverBackoffs = new Map<string, number>();\n private readonly recentRoomByChan = new Map<string, string>();\n private readonly clock: Clock;\n\n constructor(clock: Clock) {\n this.clock = clock;\n }\n\n private makeKey(room: string, channel: string): string {\n return `${room}:${channel}`;\n }\n\n get(room: string, channel: string, ratePerSec: number): TokenBucket {\n const key = this.makeKey(room, channel);\n let bucket = this.limiters.get(key);\n if (!bucket || bucket.ratePerSec !== ratePerSec) {\n const burst = Math.max(2, ratePerSec * 2);\n bucket = new TokenBucket(ratePerSec, burst, this.clock);\n this.limiters.set(key, bucket);\n }\n return bucket;\n }\n\n recordPublish(room: string, channel: string): void {\n this.recentRoomByChan.set(channel, room);\n }\n\n getRecentRoom(channel: string): string | undefined {\n return this.recentRoomByChan.get(channel);\n }\n\n pause(room: string, channel: string, untilMs: number): void {\n const key = this.makeKey(room, channel);\n const existing = this.serverBackoffs.get(key) ?? 0;\n if (untilMs > existing) {\n this.serverBackoffs.set(key, untilMs);\n }\n }\n\n isPaused(room: string, channel: string, now: number): { paused: boolean; retryAfterMs: number } {\n const key = this.makeKey(room, channel);\n const until = this.serverBackoffs.get(key);\n if (until !== undefined && until > now) {\n return {\n paused: true,\n retryAfterMs: Math.max(1, until - now),\n };\n }\n // Check fallback for inferred room if room was specified as empty\n if (room !== '') {\n const fallbackKey = this.makeKey('', channel);\n const fallbackUntil = this.serverBackoffs.get(fallbackKey);\n if (fallbackUntil !== undefined && fallbackUntil > now) {\n return {\n paused: true,\n retryAfterMs: Math.max(1, fallbackUntil - now),\n };\n }\n }\n return { paused: false, retryAfterMs: 0 };\n }\n\n clearRoom(room: string): void {\n const prefix = `${room}:`;\n for (const key of this.limiters.keys()) {\n if (key.startsWith(prefix)) {\n this.limiters.delete(key);\n }\n }\n for (const key of this.serverBackoffs.keys()) {\n if (key.startsWith(prefix)) {\n this.serverBackoffs.delete(key);\n }\n }\n for (const [ch, r] of this.recentRoomByChan.entries()) {\n if (r === room) {\n this.recentRoomByChan.delete(ch);\n }\n }\n }\n\n clearAll(): void {\n this.limiters.clear();\n this.serverBackoffs.clear();\n this.recentRoomByChan.clear();\n }\n}\n\n","import type { BackpressureManager } from './backpressure.js';\nimport type { CoalesceManager } from './coalesce.js';\nimport type { OutboundFrame, OutboundQueue } from './outbound.js';\nimport type { Transport } from './transport.js';\n\nexport interface WriterLoopOptions {\n transport: Transport;\n reliableQueue: OutboundQueue<OutboundFrame>;\n unreliableQueue: OutboundQueue<OutboundFrame>;\n coalesceManager: CoalesceManager;\n backpressure: BackpressureManager;\n reliableBurst?: number; // default: 32\n unreliableBurst?: number; // default: 8\n canWrite: () => boolean;\n onError: (err: unknown) => void;\n}\n\nexport class WriterLoop {\n private readonly transport: Transport;\n private readonly reliableQueue: OutboundQueue<OutboundFrame>;\n private readonly unreliableQueue: OutboundQueue<OutboundFrame>;\n private readonly coalesceManager: CoalesceManager;\n private readonly backpressure: BackpressureManager;\n private readonly reliableBurst: number;\n private readonly unreliableBurst: number;\n private readonly canWrite: () => boolean;\n private readonly onError: (err: unknown) => void;\n\n private pumping = false;\n private scheduled = false;\n private stopped = false;\n private activePumpPromise: Promise<void> | null = null;\n\n constructor(options: WriterLoopOptions) {\n this.transport = options.transport;\n this.reliableQueue = options.reliableQueue;\n this.unreliableQueue = options.unreliableQueue;\n this.coalesceManager = options.coalesceManager;\n this.backpressure = options.backpressure;\n this.reliableBurst = options.reliableBurst ?? 32;\n this.unreliableBurst = options.unreliableBurst ?? 8;\n this.canWrite = options.canWrite;\n this.onError = options.onError;\n }\n\n hasWork(): boolean {\n return (\n this.reliableQueue.size > 0 ||\n this.unreliableQueue.size > 0 ||\n this.coalesceManager.countPending() > 0\n );\n }\n\n wake(): void {\n if (\n this.stopped ||\n this.scheduled ||\n this.pumping ||\n !this.canWrite() ||\n this.backpressure.isBlocked()\n ) {\n return;\n }\n\n this.pump().catch((err) => {\n this.onError(err);\n });\n }\n\n async pump(): Promise<void> {\n if (this.stopped || this.pumping || !this.canWrite() || this.backpressure.isBlocked()) {\n return;\n }\n\n this.pumping = true;\n let writeErrorOccurred = false;\n let resolveActive: () => void = () => {};\n this.activePumpPromise = new Promise<void>((resolve) => {\n resolveActive = resolve;\n });\n\n try {\n // 1. Drain up to reliableBurst reliable frames\n for (let i = 0; i < this.reliableBurst && this.canWrite(); i++) {\n if (this.backpressure.isBlocked()) break;\n const frame = this.reliableQueue.dequeue();\n if (!frame) break;\n\n try {\n this.transport.send(frame.wire);\n } catch (err) {\n writeErrorOccurred = true;\n this.stop();\n this.onError(err);\n return;\n }\n\n this.backpressure.check();\n await Promise.resolve(); // Microtask yield per frame\n }\n\n // 2. Drain up to unreliableBurst unreliable frames\n for (let i = 0; i < this.unreliableBurst && this.canWrite(); i++) {\n if (this.backpressure.isBlocked()) break;\n\n // Prefer ready coalesce slot if present (fresher data)\n const slot = this.coalesceManager.takeReady();\n if (slot) {\n try {\n this.transport.send(slot.wire);\n } catch (err) {\n writeErrorOccurred = true;\n this.stop();\n this.onError(err);\n return;\n }\n\n this.backpressure.check();\n await Promise.resolve();\n } else {\n const frame = this.unreliableQueue.dequeue();\n if (!frame) break;\n\n try {\n this.transport.send(frame.wire);\n } catch (err) {\n writeErrorOccurred = true;\n this.stop();\n this.onError(err);\n return;\n }\n\n this.backpressure.check();\n await Promise.resolve();\n }\n }\n } finally {\n this.pumping = false;\n this.activePumpPromise = null;\n resolveActive();\n }\n\n if (\n !writeErrorOccurred &&\n !this.stopped &&\n this.hasWork() &&\n !this.backpressure.isBlocked() &&\n this.canWrite()\n ) {\n queueMicrotask(() => {\n this.wake();\n });\n }\n }\n\n async flushNow(): Promise<void> {\n this.coalesceManager.readyAllPending();\n while (\n !this.stopped &&\n this.hasWork() &&\n !this.backpressure.isBlocked() &&\n this.canWrite()\n ) {\n if (this.activePumpPromise) {\n await this.activePumpPromise;\n } else {\n await this.pump();\n }\n }\n }\n\n stop(): void {\n this.stopped = true;\n this.scheduled = false;\n this.pumping = false;\n }\n\n resume(): void {\n this.stopped = false;\n this.wake();\n }\n}\n","import {\n BinaryMapExhaustedError,\n BinaryMapValidationError,\n} from './types/errors.js';\n\nexport type BinaryChannelMap = Readonly<Record<string, number>>;\n\nexport class BinaryMapBuilder {\n private readonly byChannel = new Map<string, number>();\n private readonly byId = new Map<number, string>();\n\n set(channel: string, id: number): this {\n if (channel === '' || channel === 'presence') {\n throw new BinaryMapValidationError(channel, id, 'reserved_channel');\n }\n\n if (!Number.isInteger(id) || id < 1 || id > 254) {\n throw new BinaryMapValidationError(channel, id, 'out_of_range');\n }\n\n const existingId = this.byChannel.get(channel);\n if (existingId !== undefined) {\n if (existingId === id) {\n return this; // Idempotent\n }\n throw new BinaryMapValidationError(channel, id, 'duplicate_channel');\n }\n\n const existingChannel = this.byId.get(id);\n if (existingChannel !== undefined) {\n if (existingChannel === channel) {\n return this; // Idempotent\n }\n throw new BinaryMapValidationError(channel, id, 'duplicate_id');\n }\n\n this.byChannel.set(channel, id);\n this.byId.set(id, channel);\n return this;\n }\n\n autoSet(channel: string): this {\n if (channel === '' || channel === 'presence') {\n throw new BinaryMapValidationError(channel, 0, 'reserved_channel');\n }\n\n const existingId = this.byChannel.get(channel);\n if (existingId !== undefined) {\n throw new BinaryMapValidationError(channel, existingId, 'duplicate_channel');\n }\n\n for (let id = 1; id <= 254; id++) {\n if (!this.byId.has(id)) {\n this.byChannel.set(channel, id);\n this.byId.set(id, channel);\n return this;\n }\n }\n\n throw new BinaryMapExhaustedError();\n }\n\n build(): BinaryChannelMap {\n return Object.freeze(Object.fromEntries(this.byChannel));\n }\n}\n\nexport function validateBinaryMap(map: BinaryChannelMap): void {\n if (!map || Object.keys(map).length === 0) {\n return;\n }\n\n const builder = new BinaryMapBuilder();\n const sortedChannels = Object.keys(map).sort();\n\n for (const ch of sortedChannels) {\n builder.set(ch, map[ch]);\n }\n}\n\n","export interface PresenceState {\n known: Set<string>;\n serverCount: number;\n invalidated: boolean;\n invalidReason: 'reconnected' | 'reliable presence gap' | '';\n}\n\nexport interface PresenceConfig {\n autoInvalidateOnReliableGap?: boolean; // default false\n}\n\nexport class PresenceManager {\n private readonly states = new Map<string, PresenceState>();\n readonly autoInvalidateOnReliableGap: boolean;\n\n constructor(config?: PresenceConfig) {\n this.autoInvalidateOnReliableGap = config?.autoInvalidateOnReliableGap ?? false;\n }\n\n get(room: string): PresenceState | undefined {\n return this.states.get(room);\n }\n\n init(room: string, members: number): void {\n const existing = this.states.get(room);\n if (!existing) {\n this.states.set(room, {\n known: new Set<string>(),\n serverCount: members,\n invalidated: false,\n invalidReason: '',\n });\n } else {\n existing.serverCount = members;\n }\n }\n\n remove(room: string): void {\n this.states.delete(room);\n }\n\n clear(): void {\n this.states.clear();\n }\n\n invalidateAll(): string[] {\n const rooms: string[] = [];\n for (const [room, state] of this.states.entries()) {\n state.invalidated = true;\n state.invalidReason = 'reconnected';\n rooms.push(room);\n }\n return rooms;\n }\n\n knownMembers(room: string, selfLabel: string): string[] {\n const state = this.states.get(room);\n if (!state) return [];\n const list = Array.from(state.known).filter((m) => m !== selfLabel);\n list.sort();\n return list;\n }\n\n lastServerMemberCount(room: string): { count: number; ok: boolean } {\n const state = this.states.get(room);\n if (!state) return { count: 0, ok: false };\n return { count: state.serverCount, ok: true };\n }\n\n presenceInvalidated(room: string): boolean {\n const state = this.states.get(room);\n if (!state) return false;\n return state.invalidated;\n }\n\n resetPresence(room: string): void {\n const state = this.states.get(room);\n if (state) {\n state.known.clear();\n state.invalidated = false;\n state.invalidReason = '';\n }\n }\n}\n\n","export interface SeqState {\n last: number;\n hasBase: boolean;\n}\n\nexport interface SequenceGapResult {\n prev: number;\n current: number;\n missed: number;\n reliable: boolean;\n}\n\nexport class SeqTracker {\n private readonly states = new Map<string, SeqState>();\n\n private makeKey(room: string, channel: string): string {\n return `${room}:${channel}`;\n }\n\n lastSeq(room: string, channel: string): { seq: number; ok: boolean } {\n const key = this.makeKey(room, channel);\n const state = this.states.get(key);\n if (!state || !state.hasBase) {\n return { seq: 0, ok: false };\n }\n return { seq: state.last, ok: true };\n }\n\n process(\n room: string,\n channel: string,\n seq: number,\n reliable: boolean\n ): { gap?: SequenceGapResult } {\n const key = this.makeKey(room, channel);\n let state = this.states.get(key);\n\n if (!state || !state.hasBase) {\n state = { last: seq, hasBase: true };\n this.states.set(key, state);\n return {};\n }\n\n if (seq === 0) {\n return {};\n }\n\n if (seq > state.last) {\n let gap: SequenceGapResult | undefined;\n if (seq > state.last + 1) {\n const missed = seq - state.last - 1;\n gap = {\n prev: state.last,\n current: seq,\n missed,\n reliable,\n };\n }\n state.last = seq;\n return { gap };\n }\n\n if (seq === state.last) {\n return {};\n }\n\n // seq < state.last: silent re-baseline (e.g. room recreation)\n state.last = seq;\n return {};\n }\n\n rebaselineAll(): void {\n for (const state of this.states.values()) {\n state.hasBase = false;\n }\n }\n\n clearRoom(room: string): void {\n const prefix = `${room}:`;\n for (const key of this.states.keys()) {\n if (key.startsWith(prefix)) {\n this.states.delete(key);\n }\n }\n }\n\n clear(): void {\n this.states.clear();\n }\n}\n\n","import type { ErrorCode, ErrorFrame } from './types/protocol.js';\n\nexport type ErrorAction =\n | 'ignore'\n | 'drop_intent'\n | 'retry_backoff'\n | 'reconnect'\n | 'fatal'\n | 'app_prompt';\n\nexport interface ErrorClassification {\n action: ErrorAction;\n retryAfterMs?: number; // only meaningful when action === 'retry_backoff'\n}\n\nexport interface ErrorPolicyConfig {\n overrides?: Partial<Record<ErrorCode, ErrorClassification>>;\n}\n\n/**\n * Pure function that maps an ErrorCode and optional ErrorFrame to the SDK's\n * recommended recovery action based on PROTOCOL.md §4.7.\n */\nexport function classifyError(\n code: ErrorCode,\n frame?: Partial<Pick<ErrorFrame, 'message' | 'channel' | 'retry_after_ms'>>,\n overrides?: ErrorPolicyConfig['overrides']\n): ErrorClassification {\n if (overrides && overrides[code]) {\n const custom = overrides[code]!;\n return {\n action: custom.action,\n retryAfterMs: custom.retryAfterMs,\n };\n }\n\n switch (code) {\n case 'UNAUTHORIZED':\n case 'FORBIDDEN_SCOPE':\n return { action: 'fatal' };\n\n case 'NOT_ROOM_OWNER':\n case 'BAD_REQUEST':\n case 'ROOM_NOT_FOUND':\n return { action: 'drop_intent' };\n\n case 'ROOM_ALREADY_EXISTS':\n case 'INVALID_PASSCODE':\n return { action: 'app_prompt' };\n\n case 'ROOM_FULL':\n return { action: 'retry_backoff', retryAfterMs: 1000 };\n\n case 'PASSCODE_RATE_LIMITED': {\n const retry =\n frame?.retry_after_ms && frame.retry_after_ms > 0\n ? frame.retry_after_ms\n : 60000;\n return { action: 'retry_backoff', retryAfterMs: retry };\n }\n\n case 'MAX_ROOMS_REACHED':\n return { action: 'retry_backoff', retryAfterMs: 5000 };\n\n case 'BINARY_NOT_ALLOWED':\n case 'CHANNEL_NOT_RELIABLE':\n case 'CHANNEL_NOT_FOUND':\n case 'RESERVED_CHANNEL_NAME':\n case 'CHANNEL_READ_ONLY':\n return { action: 'ignore' };\n\n case 'RATE_LIMITED': {\n const retry =\n frame?.retry_after_ms && frame.retry_after_ms > 0\n ? frame.retry_after_ms\n : 250;\n return { action: 'retry_backoff', retryAfterMs: retry };\n }\n\n case 'INTERNAL_ERROR':\n return { action: 'retry_backoff', retryAfterMs: 2000 };\n\n default:\n return { action: 'ignore' };\n }\n}\n\n","export interface RttStats {\n last: number; // ms\n min: number;\n max: number;\n mean: number; // EMA with alpha = 0.2\n samples: number;\n}\n\nexport interface RttEvent {\n sample: number; // ms\n source: 'heartbeat' | 'on_demand';\n stats: RttStats;\n}\n\nexport class RttTracker {\n private stats: RttStats | undefined;\n\n getStats(): RttStats | undefined {\n return this.stats ? { ...this.stats } : undefined;\n }\n\n recordSample(sampleMs: number): RttStats {\n if (!this.stats || this.stats.samples === 0) {\n this.stats = {\n last: sampleMs,\n min: sampleMs,\n max: sampleMs,\n mean: sampleMs,\n samples: 1,\n };\n } else {\n this.stats.last = sampleMs;\n this.stats.samples += 1;\n if (sampleMs < this.stats.min) {\n this.stats.min = sampleMs;\n }\n if (sampleMs > this.stats.max) {\n this.stats.max = sampleMs;\n }\n // EMA alpha = 0.2: mean = 0.8 * oldMean + 0.2 * sampleMs\n this.stats.mean = 0.8 * this.stats.mean + 0.2 * sampleMs;\n }\n return { ...this.stats };\n }\n\n reset(): void {\n this.stats = undefined;\n }\n}\n\n","import { RealClock, type Clock, type Timer } from './clock.js';\nimport { SyncEventEmitter, type EventName, type EventPayload, type State } from './events.js';\nimport { HeartbeatManager, type HeartbeatConfig } from './heartbeat.js';\nimport { redactUrl, RedactingLogger, type Logger } from './logger.js';\nimport { computeReconnectDelay, type ReconnectConfig } from './reconnect.js';\nimport type { FailedIntent, RestoreConfig, RoomIntent } from './restore.js';\nimport { BrowserWebSocketTransport, type Transport } from './transport.js';\nimport {\n AuthError,\n BinaryChannelUnmappedError,\n BinaryIdCollisionError,\n ChannelNotReliableError,\n ConcurrentRequestError,\n ConnectError,\n NotReadyError,\n PolicyViolationError,\n RateLimitedError,\n RequestTimeoutError,\n SdkError,\n ServerError,\n} from './types/errors.js';\nimport {\n isErrorFrame,\n isMessageFrame,\n isWelcomeFrame,\n type Capabilities,\n type ClientFrame,\n type CreateRoomRequest,\n type DeleteRoomRequest,\n type ErrorCode,\n type ErrorFrame,\n type JoinRoomRequest,\n type ListRoomsRequest,\n type MessageFrame,\n type RoomCreatedFrame,\n type RoomJoinedFrame,\n type RoomLeftFrame,\n type RoomListFrame,\n type ServerFrame,\n type WelcomeFrame,\n} from './types/protocol.js';\nimport { BackpressureManager, type BackpressureConfig } from './backpressure.js';\nimport { CoalesceManager } from './coalesce.js';\nimport { OutboundQueue, type OutboundConfig, type OutboundFrame } from './outbound.js';\nimport { resolvePolicy, type ChannelPolicy } from './policy.js';\nimport { RateLimiterRegistry } from './ratelimit.js';\nimport { WriterLoop } from './writer.js';\nimport { validateBinaryMap, type BinaryChannelMap } from './binary.js';\nimport { PresenceManager, type PresenceConfig } from './presence.js';\nimport { SeqTracker } from './seq.js';\nimport { classifyError, type ErrorPolicyConfig } from './errors-policy.js';\nimport { RttTracker, type RttStats } from './rtt.js';\nimport {\n validateRoomName,\n validateChannelName,\n validateTextPayloadSize,\n validateBinaryPayloadSize,\n type ValidationConfig,\n} from './validate.js';\nimport { checkCapabilityPreflight } from './preflight.js';\n\nexport type AuthFailureMode = 'heuristic' | 'never-fatal' | 'always-fatal';\nexport type AuthMode = 'query';\n\nexport interface PublishRequest {\n room: string;\n channel?: string; // default: 'default'\n payload: unknown;\n reliable?: boolean; // undefined -> inherit policy\n includeSender?: boolean; // default: false\n}\n\nexport interface ClientConfig {\n url: string;\n apiKey: string;\n authFailureMode?: AuthFailureMode;\n onAmbiguousAuth?: (closeCode: number, reason: string) => 'fatal' | 'retry';\n reconnect?: ReconnectConfig;\n heartbeat?: HeartbeatConfig;\n restore?: RestoreConfig;\n outbound?: OutboundConfig;\n backpressure?: BackpressureConfig;\n presence?: PresenceConfig;\n errorPolicy?: ErrorPolicyConfig;\n validation?: ValidationConfig;\n maxBinaryPayloadBytes?: number; // default: 65535\n welcomeTimeoutMs?: number; // 10000\n requestTimeoutMs?: number; // 10000\n logger?: Logger;\n clock?: Clock;\n transport?: Transport; // optional injection for testing\n}\n\nexport function buildWsUrl(baseUrl: string, apiKey: string): string {\n const u = new URL(baseUrl);\n u.searchParams.set('key', apiKey);\n return u.toString();\n}\n\ninterface Waiter<T = unknown> {\n resolve: (value: T) => void;\n reject: (reason?: unknown) => void;\n timer: Timer;\n room?: string;\n responseType: string;\n}\n\nconst ROOM_NAME_REGEX = /room\\s+\"([^\"]+)\"/;\n\nfunction extractRoomFromMessage(message: string): string | null {\n const match = message.match(ROOM_NAME_REGEX);\n return match ? match[1] : null;\n}\n\nexport class Client {\n private readonly config: ClientConfig;\n private readonly clock: Clock;\n private readonly emitter = new SyncEventEmitter();\n private readonly logger: RedactingLogger;\n private transport: Transport;\n\n private _state: State = 'idle';\n private _capabilities: Capabilities | undefined;\n private serverVersion: string | undefined;\n\n private firstConnectDone = false;\n private currentConnWelcomeReceived = false;\n private isRestoringSession = false;\n private reconnectAttempts = 0;\n private reconnectTimer: Timer | null = null;\n private welcomeTimer: Timer | null = null;\n\n private readonly intents = new Map<string, RoomIntent>();\n private readonly waiters = new Map<string, Waiter>();\n private listRoomsLock: Promise<unknown> = Promise.resolve();\n\n private heartbeatManager: HeartbeatManager;\n private readonly reliableQueue: OutboundQueue<OutboundFrame>;\n private readonly unreliableQueue: OutboundQueue<OutboundFrame>;\n private readonly coalesceManager: CoalesceManager;\n private readonly backpressureManager: BackpressureManager;\n private readonly rateLimiters: RateLimiterRegistry;\n private readonly writer: WriterLoop;\n private readonly policyOverrides: Record<string, ChannelPolicy> = {};\n private readonly appliedPolicies = new Set<string>();\n\n private _selfLabel = '';\n private readonly binaryOwner = new Map<number, { room: string; channel: string }>();\n private readonly presenceManager: PresenceManager;\n private readonly seqTracker = new SeqTracker();\n private readonly rttTracker = new RttTracker();\n private readonly createdRooms = new Set<string>();\n private pingChain: Promise<number> = Promise.resolve(0);\n\n private pendingConnectResolve: ((welcome: WelcomeFrame) => void) | null = null;\n private pendingConnectReject: ((err: unknown) => void) | null = null;\n\n constructor(config: ClientConfig) {\n if (!config.url) {\n throw new SdkError('WebSocket URL is required');\n }\n if (!config.apiKey) {\n throw new SdkError('API key is required');\n }\n\n this.config = config;\n this.clock = config.clock ?? new RealClock();\n this.transport = config.transport ?? new BrowserWebSocketTransport();\n this.presenceManager = new PresenceManager(config.presence);\n\n this.logger = new RedactingLogger(config.logger, () => [\n this.config.apiKey,\n ...Array.from(this.intents.values()).map((i) => i.passcode),\n ]);\n\n this.heartbeatManager = new HeartbeatManager(config.heartbeat, this.clock, {\n sendPing: () => {\n this.send({ type: 'ping' });\n },\n onTimeout: (elapsedMs) => {\n this.logger.warn('Heartbeat timeout; closing connection', { elapsedMs });\n this.emitter.emit('heartbeatTimeout', { elapsedMs });\n this.transport.close(1008, 'heartbeat timeout');\n },\n onPong: (sample) => {\n if (this.config.heartbeat?.trackRtt !== false) {\n const stats = this.rttTracker.recordSample(sample);\n this.emitter.emit('rtt', {\n sample,\n source: 'heartbeat',\n stats,\n });\n }\n },\n });\n\n const outboundCfg = config.outbound;\n this.reliableQueue = new OutboundQueue<OutboundFrame>(outboundCfg?.reliableQueueSize ?? 256);\n this.unreliableQueue = new OutboundQueue<OutboundFrame>(outboundCfg?.unreliableQueueSize ?? 16);\n\n this.coalesceManager = new CoalesceManager(\n this.clock,\n () => {\n this.writer.wake();\n },\n (ev) => {\n this.emitter.emit('coalesced', ev);\n }\n );\n\n this.backpressureManager = new BackpressureManager(\n this.transport,\n this.clock,\n config.backpressure,\n (ev) => {\n this.emitter.emit('backpressure', ev);\n },\n () => {\n this.writer.wake();\n }\n );\n\n this.rateLimiters = new RateLimiterRegistry(this.clock);\n\n this.writer = new WriterLoop({\n transport: this.transport,\n reliableQueue: this.reliableQueue,\n unreliableQueue: this.unreliableQueue,\n coalesceManager: this.coalesceManager,\n backpressure: this.backpressureManager,\n reliableBurst: outboundCfg?.reliableBurst ?? 32,\n unreliableBurst: outboundCfg?.unreliableBurst ?? 8,\n canWrite: () =>\n (this._state === 'ready' || this.isRestoringSession) &&\n this.transport.readyState === 1,\n onError: (err) => {\n this.emitter.emit('error', {\n error: err instanceof Error ? err : new Error(String(err)),\n phase: 'runtime',\n });\n },\n });\n }\n\n get state(): State {\n return this._state;\n }\n\n get capabilities(): Readonly<Capabilities> | undefined {\n return this._capabilities;\n }\n\n get selfLabel(): string {\n return this._selfLabel;\n }\n\n knownMembers(room: string): string[] {\n return this.presenceManager.knownMembers(room, this._selfLabel);\n }\n\n lastServerMemberCount(room: string): { count: number; ok: boolean } {\n return this.presenceManager.lastServerMemberCount(room);\n }\n\n presenceInvalidated(room: string): boolean {\n return this.presenceManager.presenceInvalidated(room);\n }\n\n resetPresence(room: string): void {\n if (!this.intents.has(room)) {\n throw new NotReadyError(`Room \"${room}\" has no live intent`);\n }\n this.presenceManager.resetPresence(room);\n }\n\n lastSeq(room: string, channel: string): { seq: number; ok: boolean } {\n return this.seqTracker.lastSeq(room, channel);\n }\n\n rttStats(): RttStats | undefined {\n return this.rttTracker.getStats();\n }\n\n ping(timeoutMs?: number): Promise<number> {\n if (this._state !== 'ready') {\n return Promise.reject(new NotReadyError());\n }\n\n const runPing = (): Promise<number> => {\n if (this._state !== 'ready') {\n return Promise.reject(new NotReadyError());\n }\n\n const key = 'pong:';\n if (this.waiters.has(key)) {\n return Promise.reject(\n new ConcurrentRequestError('Concurrent ping request is not permitted')\n );\n }\n\n const start = this.clock.now();\n const timeout = timeoutMs ?? this.config.heartbeat?.timeoutMs ?? 10000;\n\n return new Promise<number>((resolve, reject) => {\n const timer = this.clock.setTimeout(() => {\n this.waiters.delete(key);\n reject(new RequestTimeoutError('Timed out waiting for pong frame'));\n }, timeout);\n\n this.waiters.set(key, {\n resolve: () => {\n const sample = Math.max(0, this.clock.now() - start);\n const stats = this.rttTracker.recordSample(sample);\n this.emitter.emit('rtt', {\n sample,\n source: 'on_demand',\n stats,\n });\n resolve(sample);\n },\n reject,\n timer,\n room: '',\n responseType: 'pong',\n });\n\n try {\n this.send({ type: 'ping' });\n } catch (err) {\n this.clock.clearTimeout(timer);\n this.waiters.delete(key);\n reject(err);\n }\n });\n };\n\n const next = this.pingChain.then(runPing, runPing);\n this.pingChain = next.then(\n () => 0,\n () => 0\n );\n return next;\n }\n\n private clearRoomState(room: string): void {\n for (const [id, owner] of Array.from(this.binaryOwner.entries())) {\n if (owner.room === room) {\n this.binaryOwner.delete(id);\n }\n }\n this.presenceManager.remove(room);\n this.seqTracker.clearRoom(room);\n this.rateLimiters.clearRoom(room);\n this.coalesceManager.clearRoom(room);\n const prefix = `${room}:`;\n for (const key of Array.from(this.appliedPolicies)) {\n if (key.startsWith(prefix)) {\n this.appliedPolicies.delete(key);\n }\n }\n }\n\n private isClosed(): boolean {\n return this._state === 'closed';\n }\n\n on<E extends EventName>(\n event: E,\n handler: (payload: EventPayload<E>) => void\n ): () => void {\n return this.emitter.on(event, handler);\n }\n\n connect(): Promise<WelcomeFrame> {\n if (\n this._state === 'connecting' ||\n this._state === 'awaiting_welcome' ||\n this._state === 'ready' ||\n this._state === 'reconnecting'\n ) {\n return Promise.reject(\n new SdkError(`Client is already in state: ${this._state}`)\n );\n }\n\n if (this._state === 'closed') {\n // New generation after clean close resets heuristic and reconnect counters\n this.firstConnectDone = false;\n this.reconnectAttempts = 0;\n this.intents.clear();\n this._capabilities = undefined;\n this.serverVersion = undefined;\n this._selfLabel = '';\n this.appliedPolicies.clear();\n this.rateLimiters.clearAll();\n this.coalesceManager.clear();\n this.discardOutboundQueues();\n this.binaryOwner.clear();\n this.presenceManager.clear();\n this.seqTracker.clear();\n this.rttTracker.reset();\n this.createdRooms.clear();\n this._state = 'idle';\n }\n\n return new Promise<WelcomeFrame>((resolve, reject) => {\n this.pendingConnectResolve = resolve;\n this.pendingConnectReject = reject;\n this.initiateConnect(false);\n });\n }\n\n async close(): Promise<void> {\n if (this._state === 'closed') {\n return;\n }\n\n this.transitionState('closed');\n this.clearTimers();\n this.heartbeatManager.stop();\n this.backpressureManager.stop();\n this.writer.stop();\n this.rateLimiters.clearAll();\n this.coalesceManager.clear();\n this.discardOutboundQueues();\n this.appliedPolicies.clear();\n this.intents.clear();\n this.binaryOwner.clear();\n this.presenceManager.clear();\n this.seqTracker.clear();\n this.rttTracker.reset();\n this.createdRooms.clear();\n\n try {\n this.transport.close(1000, 'client closed');\n } catch {\n // ignore\n }\n\n this.emitter.emit('disconnected', {\n code: 1000,\n reason: 'client closed',\n wasClean: true,\n });\n\n this.failPendingWaiters(new ConnectError('Client closed'));\n\n if (this.pendingConnectReject) {\n const reject = this.pendingConnectReject;\n this.pendingConnectResolve = null;\n this.pendingConnectReject = null;\n reject(new ConnectError('Client closed'));\n }\n }\n\n createRoom(req: CreateRoomRequest): Promise<RoomCreatedFrame> {\n try {\n validateRoomName(req.room, this.config.validation);\n checkCapabilityPreflight(this._capabilities, req, this.createdRooms.size);\n } catch (err) {\n return Promise.reject(err);\n }\n\n return this.sendWithCorrelation<RoomCreatedFrame>('room_created', req.room, {\n ...req,\n type: 'create_room',\n }).then((res) => {\n this.createdRooms.add(req.room);\n return res;\n });\n }\n\n joinRoomWithBinary(\n roomOrReq: string | (JoinRoomRequest & { binaryChannels?: BinaryChannelMap }),\n passcodeOrNothing?: string,\n binaryChannelsOrNothing?: BinaryChannelMap\n ): Promise<RoomJoinedFrame> {\n let room: string;\n let passcode: string;\n let binaryChannels: BinaryChannelMap;\n\n if (typeof roomOrReq === 'string') {\n room = roomOrReq;\n passcode = passcodeOrNothing ?? '';\n binaryChannels = binaryChannelsOrNothing ?? {};\n } else {\n room = roomOrReq.room;\n passcode = roomOrReq.passcode ?? '';\n binaryChannels = roomOrReq.binaryChannels ?? roomOrReq.binary_channels ?? {};\n }\n\n try {\n validateRoomName(room, this.config.validation);\n validateBinaryMap(binaryChannels);\n } catch (err) {\n return Promise.reject(err);\n }\n\n if (this._state !== 'ready' && !this.isRestoringSession) {\n return Promise.reject(new SdkError(`Client not ready (state: ${this._state})`));\n }\n\n const sorted = Object.entries(binaryChannels)\n .map(([ch, id]) => ({ ch, id }))\n .sort((a, b) => a.id - b.id);\n\n let hasCollision = false;\n let collidingId = 0;\n const existingList: string[] = [];\n const rejectedList: string[] = [];\n\n for (const item of sorted) {\n const owner = this.binaryOwner.get(item.id);\n if (owner && owner.room !== room) {\n if (!hasCollision) {\n hasCollision = true;\n collidingId = item.id;\n }\n existingList.push(`${owner.room}/${owner.channel}`);\n rejectedList.push(`${room}/${item.ch}`);\n }\n }\n\n if (hasCollision) {\n this.emitter.emit('binaryIdCollision', {\n id: collidingId,\n existing: existingList,\n rejected: rejectedList,\n });\n return Promise.reject(\n new BinaryIdCollisionError(collidingId, existingList, rejectedList)\n );\n }\n\n // Transactional reservation\n const prevOwners = new Map<number, { room: string; channel: string }>();\n for (const [id, owner] of Array.from(this.binaryOwner.entries())) {\n if (owner.room === room) {\n prevOwners.set(id, owner);\n this.binaryOwner.delete(id);\n }\n }\n for (const item of sorted) {\n this.binaryOwner.set(item.id, { room, channel: item.ch });\n }\n\n const req: JoinRoomRequest = {\n type: 'join_room',\n room,\n passcode: passcode || undefined,\n binary_channels: Object.keys(binaryChannels).length > 0 ? { ...binaryChannels } : undefined,\n };\n\n return this.sendWithCorrelation<RoomJoinedFrame>('room_joined', room, req)\n .then((res) => {\n let effectivePasscode = passcode;\n if (!effectivePasscode && this.intents.has(room)) {\n effectivePasscode = this.intents.get(room)!.passcode;\n }\n this.intents.set(room, {\n room,\n passcode: effectivePasscode,\n binaryChannels: Object.keys(binaryChannels).length > 0 ? { ...binaryChannels } : undefined,\n });\n\n this.presenceManager.init(room, res.members);\n\n for (const item of sorted) {\n this.rateLimiters.recordPublish(room, item.ch);\n }\n\n if (Object.keys(binaryChannels).length > 0 || prevOwners.size > 0) {\n this.emitter.emit('binaryMappingChanged', {\n room,\n map: { ...binaryChannels },\n });\n }\n\n return res;\n })\n .catch((err) => {\n // Roll back reservations\n for (const item of sorted) {\n const owner = this.binaryOwner.get(item.id);\n if (owner && owner.room === room) {\n this.binaryOwner.delete(item.id);\n }\n }\n for (const [id, owner] of prevOwners.entries()) {\n this.binaryOwner.set(id, owner);\n }\n throw err;\n });\n }\n\n joinRoom(req: JoinRoomRequest): Promise<RoomJoinedFrame> {\n return this.joinRoomWithBinary({\n ...req,\n binaryChannels: req.binary_channels,\n });\n }\n\n leaveRoom(room: string): Promise<RoomLeftFrame> {\n return this.sendWithCorrelation<RoomLeftFrame>('room_left', room, {\n type: 'leave_room',\n room,\n }).then((res) => {\n this.intents.delete(room);\n this.clearRoomState(room);\n return res;\n });\n }\n\n deleteRoom(room: string): Promise<void> {\n try {\n validateRoomName(room, this.config.validation);\n } catch (err) {\n return Promise.reject(err);\n }\n\n const key = `delete_room:${room}`;\n if (this.waiters.has(key)) {\n return Promise.reject(\n new ConcurrentRequestError(\n `Concurrent delete_room request for room \"${room}\" is not permitted`\n )\n );\n }\n\n if (this._state !== 'ready') {\n return Promise.reject(new SdkError(`Client not ready (state: ${this._state})`));\n }\n\n const timeoutMs = this.config.requestTimeoutMs ?? 10000;\n\n return new Promise<void>((resolve, reject) => {\n const timer = this.clock.setTimeout(() => {\n this.waiters.delete(key);\n reject(\n new RequestTimeoutError(\n `Timed out waiting for room_deleted presence event on \"${room}\"`\n )\n );\n }, timeoutMs);\n\n this.waiters.set(key, {\n resolve: () => {\n this.createdRooms.delete(room);\n resolve();\n },\n reject: (err) => {\n reject(err);\n },\n timer,\n room,\n responseType: 'delete_room',\n });\n\n try {\n const frame: DeleteRoomRequest = { type: 'delete_room', room };\n this.send(frame);\n } catch (err) {\n this.clock.clearTimeout(timer);\n this.waiters.delete(key);\n reject(err);\n }\n });\n }\n\n listRooms(): Promise<RoomListFrame> {\n const execute = (): Promise<RoomListFrame> => {\n const frame: ListRoomsRequest = { type: 'list_rooms' };\n return this.sendWithCorrelation<RoomListFrame>('room_list', '', frame);\n };\n\n const next = this.listRoomsLock.then(execute, execute);\n this.listRoomsLock = next.then(\n () => { },\n () => { }\n );\n return next;\n }\n\n send(frame: ClientFrame): void {\n if (this._state === 'closed') {\n throw new SdkError('Cannot send frame on closed client');\n }\n\n const room = (frame as { room?: string }).room ?? '';\n const channel = (frame as { channel?: string }).channel ?? 'default';\n const wire = JSON.stringify(frame);\n\n if (this.reliableQueue.size >= this.reliableQueue.capacity) {\n const action = this.config.outbound?.reliableOverflow ?? 'drop';\n if (action === 'close') {\n this.emitter.emit('reliableOverflow', {\n room,\n channel,\n depth: this.reliableQueue.capacity,\n action: 'closed',\n });\n this.transport.close(1008, 'reliable queue overflow');\n return;\n } else {\n this.emitter.emit('reliableOverflow', {\n room,\n channel,\n depth: this.reliableQueue.capacity,\n action: 'dropped',\n });\n return;\n }\n }\n\n this.reliableQueue.enqueue({\n room,\n channel,\n reliable: true,\n wire,\n });\n this.writer.wake();\n }\n\n publish(req: PublishRequest): Promise<void> {\n const channel = req.channel ?? 'default';\n try {\n validateRoomName(req.room, this.config.validation);\n validateChannelName(channel, this.config.validation);\n const marshaled = JSON.stringify(req.payload);\n const payloadBytes = new TextEncoder().encode(marshaled).length;\n validateTextPayloadSize(payloadBytes, this.config.validation);\n } catch (err) {\n return Promise.reject(err);\n }\n\n if (this._state !== 'ready') {\n return Promise.reject(new NotReadyError());\n }\n\n const policy = this.getPolicy(req.room, channel);\n\n const appliedKey = `${req.room}:${channel}`;\n if (!this.appliedPolicies.has(appliedKey)) {\n this.appliedPolicies.add(appliedKey);\n this.emitter.emit('policyApplied', {\n room: req.room,\n channel,\n policy,\n });\n }\n\n const reliable = req.reliable ?? policy.reliable;\n if (reliable === true && policy.reliable === false) {\n return Promise.reject(new ChannelNotReliableError(channel));\n }\n\n // Rate limiting check\n const paused = this.rateLimiters.isPaused(req.room, channel, this.clock.now());\n if (paused.paused) {\n const err = new RateLimitedError(paused.retryAfterMs, channel, 'local');\n this.emitter.emit('rateLimited', {\n source: 'local',\n room: req.room,\n channel,\n retryAfterMs: paused.retryAfterMs,\n });\n return Promise.reject(err);\n }\n\n if (policy.maxRate > 0 && this.config.outbound?.enableClientRateLimit !== false) {\n const bucket = this.rateLimiters.get(req.room, channel, policy.maxRate);\n if (!bucket.tryConsume()) {\n const retryAfterMs = bucket.retryAfterMs(this.clock.now());\n const err = new RateLimitedError(retryAfterMs, channel, 'local');\n this.emitter.emit('rateLimited', {\n source: 'local',\n room: req.room,\n channel,\n retryAfterMs,\n });\n return Promise.reject(err);\n }\n }\n\n this.rateLimiters.recordPublish(req.room, channel);\n\n const frameObj: Record<string, unknown> = {\n type: 'publish',\n room: req.room,\n channel,\n payload: req.payload,\n reliable,\n };\n if (req.includeSender !== undefined) {\n frameObj.include_sender = req.includeSender;\n }\n const wire = JSON.stringify(frameObj);\n\n if (reliable) {\n if (this.reliableQueue.size >= this.reliableQueue.capacity) {\n const action = this.config.outbound?.reliableOverflow ?? 'drop';\n if (action === 'close') {\n this.emitter.emit('reliableOverflow', {\n room: req.room,\n channel,\n depth: this.reliableQueue.capacity,\n action: 'closed',\n });\n this.transport.close(1008, 'reliable queue overflow');\n return Promise.resolve();\n } else {\n this.emitter.emit('reliableOverflow', {\n room: req.room,\n channel,\n depth: this.reliableQueue.capacity,\n action: 'dropped',\n });\n return Promise.resolve();\n }\n }\n\n this.reliableQueue.enqueue({\n room: req.room,\n channel,\n reliable: true,\n wire,\n });\n } else {\n if (policy.coalesce) {\n this.coalesceManager.update(\n req.room,\n channel,\n 'text',\n req.payload,\n wire,\n policy,\n req.includeSender\n );\n } else {\n if (this.unreliableQueue.size >= this.unreliableQueue.capacity) {\n this.unreliableQueue.dropOldest();\n this.emitter.emit('unreliableDropped', {\n room: req.room,\n channel,\n depth: this.unreliableQueue.capacity,\n });\n }\n this.unreliableQueue.enqueue({\n room: req.room,\n channel,\n reliable: false,\n wire,\n });\n }\n }\n\n this.writer.wake();\n return Promise.resolve();\n }\n\n publishBinary(\n roomOrReq:\n | string\n | {\n room: string;\n channel: string;\n payload: ArrayBuffer | Uint8Array;\n reliable?: boolean;\n },\n channelOrNothing?: string,\n payloadOrNothing?: ArrayBuffer | Uint8Array\n ): Promise<void> {\n let room: string;\n let channel: string;\n let payloadRaw: ArrayBuffer | Uint8Array;\n let reqReliable: boolean | undefined;\n\n if (typeof roomOrReq === 'string') {\n room = roomOrReq;\n channel = channelOrNothing!;\n payloadRaw = payloadOrNothing!;\n } else {\n room = roomOrReq.room;\n channel = roomOrReq.channel;\n payloadRaw = roomOrReq.payload;\n reqReliable = roomOrReq.reliable;\n }\n\n const pBytes = payloadRaw instanceof Uint8Array ? payloadRaw : new Uint8Array(payloadRaw);\n\n const maxBytes =\n this.config.validation?.maxBinaryPayloadBytes ??\n this.config.maxBinaryPayloadBytes ??\n 65535;\n\n try {\n validateRoomName(room, this.config.validation);\n validateChannelName(channel, this.config.validation);\n validateBinaryPayloadSize(pBytes.byteLength, {\n enabled: this.config.validation?.enabled,\n maxBinaryPayloadBytes: maxBytes,\n });\n } catch (err) {\n return Promise.reject(err);\n }\n\n if (this._state !== 'ready') {\n return Promise.reject(new NotReadyError());\n }\n\n let mappedId: number | undefined;\n for (const [id, owner] of this.binaryOwner.entries()) {\n if (owner.room === room && owner.channel === channel) {\n mappedId = id;\n break;\n }\n }\n\n if (mappedId === undefined) {\n return Promise.reject(new BinaryChannelUnmappedError(room, channel));\n }\n\n const policy = this.getPolicy(room, channel);\n const appliedKey = `${room}:${channel}`;\n if (!this.appliedPolicies.has(appliedKey)) {\n this.appliedPolicies.add(appliedKey);\n this.emitter.emit('policyApplied', { room, channel, policy });\n }\n\n const reliable = reqReliable ?? policy.reliable;\n if (reliable === true && policy.reliable === false) {\n return Promise.reject(new ChannelNotReliableError(channel));\n }\n\n const paused = this.rateLimiters.isPaused(room, channel, this.clock.now());\n if (paused.paused) {\n const err = new RateLimitedError(paused.retryAfterMs, channel, 'local');\n this.emitter.emit('rateLimited', {\n source: 'local',\n room,\n channel,\n retryAfterMs: paused.retryAfterMs,\n });\n return Promise.reject(err);\n }\n\n if (policy.maxRate > 0 && this.config.outbound?.enableClientRateLimit !== false) {\n const bucket = this.rateLimiters.get(room, channel, policy.maxRate);\n if (!bucket.tryConsume()) {\n const retryAfterMs = bucket.retryAfterMs(this.clock.now());\n const err = new RateLimitedError(retryAfterMs, channel, 'local');\n this.emitter.emit('rateLimited', {\n source: 'local',\n room,\n channel,\n retryAfterMs,\n });\n return Promise.reject(err);\n }\n }\n\n this.rateLimiters.recordPublish(room, channel);\n\n const wire = new Uint8Array(1 + pBytes.byteLength);\n wire[0] = mappedId;\n wire.set(pBytes, 1);\n\n if (reliable) {\n if (this.reliableQueue.size >= this.reliableQueue.capacity) {\n const action = this.config.outbound?.reliableOverflow ?? 'drop';\n if (action === 'close') {\n this.emitter.emit('reliableOverflow', {\n room,\n channel,\n depth: this.reliableQueue.capacity,\n action: 'closed',\n });\n this.transport.close(1008, 'reliable queue overflow');\n return Promise.resolve();\n } else {\n this.emitter.emit('reliableOverflow', {\n room,\n channel,\n depth: this.reliableQueue.capacity,\n action: 'dropped',\n });\n return Promise.resolve();\n }\n }\n\n this.reliableQueue.enqueue({\n room,\n channel,\n reliable: true,\n wire,\n frameType: 'binary',\n });\n } else {\n if (policy.coalesce) {\n this.coalesceManager.update(\n room,\n channel,\n 'binary',\n pBytes,\n wire,\n policy\n );\n } else {\n if (this.unreliableQueue.size >= this.unreliableQueue.capacity) {\n this.unreliableQueue.dropOldest();\n this.emitter.emit('unreliableDropped', {\n room,\n channel,\n depth: this.unreliableQueue.capacity,\n });\n }\n this.unreliableQueue.enqueue({\n room,\n channel,\n reliable: false,\n wire,\n frameType: 'binary',\n });\n }\n }\n\n this.writer.wake();\n return Promise.resolve();\n }\n\n setChannelPolicy(room: string, channel: string, policy: ChannelPolicy): void {\n const key = `${room}:${channel}`;\n this.policyOverrides[key] = policy;\n\n if (!policy.coalesce) {\n this.coalesceManager.flushChannel(room, channel, (wire) => {\n try {\n this.transport.send(wire);\n } catch (err) {\n this.emitter.emit('error', {\n error: err instanceof Error ? err : new Error(String(err)),\n phase: 'runtime',\n });\n }\n });\n }\n }\n\n queueDepth(): { reliable: number; unreliable: number; coalesced: number } {\n return {\n reliable: this.reliableQueue.size,\n unreliable: this.unreliableQueue.size,\n coalesced: this.coalesceManager.countPending(),\n };\n }\n\n bufferedAmount(): number {\n return this.transport.bufferedAmount();\n }\n\n // @internal — test seam\n async __flushNow(): Promise<void> {\n await this.writer.flushNow();\n }\n\n private getPolicy(room: string, channel: string): ChannelPolicy {\n return resolvePolicy(\n room,\n channel,\n this.config.outbound?.policyProvider,\n this.policyOverrides\n );\n }\n\n private discardOutboundQueues(): {\n reliable: number;\n unreliable: number;\n coalesced: number;\n } {\n const reliable = this.reliableQueue.clear();\n const unreliable = this.unreliableQueue.clear();\n const coalesced = this.coalesceManager.clear();\n return { reliable, unreliable, coalesced };\n }\n\n getRoomIntents(): RoomIntent[] {\n return Array.from(this.intents.values()).map((intent) => ({\n room: intent.room,\n passcode: intent.passcode,\n binaryChannels: intent.binaryChannels\n ? { ...intent.binaryChannels }\n : undefined,\n }));\n }\n\n forgetRoom(room: string): void {\n validateRoomName(room, this.config.validation);\n this.intents.delete(room);\n this.clearRoomState(room);\n }\n\n // --- Private lifecycle and state machine ---\n\n private transitionState(to: State): void {\n const from = this._state;\n if (from === to) return;\n this._state = to;\n this.emitter.emit('stateChange', { from, to });\n }\n\n private initiateConnect(isReconnect: boolean): void {\n if (this._state === 'closed') return;\n\n this.currentConnWelcomeReceived = false;\n this.transitionState(isReconnect ? 'reconnecting' : 'connecting');\n\n // Build URL with query param\n let url: string;\n try {\n url = buildWsUrl(this.config.url, this.config.apiKey);\n } catch (err) {\n const redacted = redactUrl(this.config.url);\n const connErr = new ConnectError(\n `Invalid URL: ${redacted}`,\n err instanceof Error ? err : undefined\n );\n this.transitionState('closed');\n this.rejectPendingConnect(connErr);\n return;\n }\n\n // Attach transport handlers\n this.setupTransportHandlers(isReconnect);\n\n this.transport\n .connect(url)\n .catch((err) => {\n if (this._state === 'closed') return;\n this.handlePreOpenFailure(err, isReconnect);\n });\n }\n\n private setupTransportHandlers(isReconnect: boolean): void {\n this.transport.onopen = () => {\n if (this._state === 'closed') return;\n if (this._state === 'connecting' || this._state === 'reconnecting') {\n this.transitionState('awaiting_welcome');\n }\n if (!this.welcomeTimer) {\n const welcomeTimeoutMs = this.config.welcomeTimeoutMs ?? 10000;\n this.welcomeTimer = this.clock.setTimeout(() => {\n this.welcomeTimer = null;\n this.handleWelcomeTimeout(isReconnect);\n }, welcomeTimeoutMs);\n }\n };\n\n this.transport.onmessage = (ev) => {\n this.handleIncomingData(ev.data, isReconnect);\n };\n\n this.transport.onclose = (ev) => {\n this.handleSocketClose(ev.code, ev.reason, ev.wasClean, isReconnect);\n };\n\n this.transport.onerror = (ev) => {\n this.logger.debug('Transport onerror', { error: ev });\n };\n }\n\n private handleIncomingData(rawData: unknown, isReconnect: boolean): void {\n if (rawData instanceof ArrayBuffer || rawData instanceof Uint8Array) {\n const bytes = rawData instanceof Uint8Array ? rawData : new Uint8Array(rawData);\n if (bytes.length === 0) {\n this.emitter.emit('protocolViolation', {\n room: '',\n reason: 'empty binary frame',\n });\n return;\n }\n\n const id = bytes[0];\n const owner = this.binaryOwner.get(id);\n if (!owner) {\n this.emitter.emit('binaryUnknownChannel', { id });\n return;\n }\n\n if (owner.channel === 'presence') {\n this.emitter.emit('protocolViolation', {\n room: owner.room,\n reason: 'binary frame on presence channel',\n });\n return;\n }\n\n const payload = bytes.slice(1);\n this.emitter.emit('binaryMessage', {\n room: owner.room,\n channel: owner.channel,\n payload,\n });\n return;\n }\n\n let frame: ServerFrame;\n try {\n const str = typeof rawData === 'string' ? rawData : String(rawData);\n frame = JSON.parse(str) as ServerFrame;\n } catch (err) {\n this.emitter.emit('error', {\n error: err instanceof Error ? err : new SdkError(String(err)),\n phase: 'runtime',\n });\n return;\n }\n\n if (isWelcomeFrame(frame)) {\n this.handleWelcome(frame, isReconnect);\n return;\n }\n\n if (isMessageFrame(frame)) {\n // Sequence gap detection across all text message frames for joined rooms\n if (this.intents.has(frame.room)) {\n const policy = this.getPolicy(frame.room, frame.channel);\n const { gap } = this.seqTracker.process(\n frame.room,\n frame.channel,\n frame.seq,\n policy.reliable\n );\n if (gap) {\n this.emitter.emit('sequenceGap', {\n room: frame.room,\n channel: frame.channel,\n prev: gap.prev,\n current: gap.current,\n missed: gap.missed,\n reliable: gap.reliable,\n });\n\n if (\n frame.channel === 'presence' &&\n gap.reliable &&\n this.presenceManager.autoInvalidateOnReliableGap\n ) {\n const ps = this.presenceManager.get(frame.room);\n if (ps) {\n ps.invalidated = true;\n ps.invalidReason = 'reliable presence gap';\n }\n this.emitter.emit('presenceInvalidated', {\n room: frame.room,\n reason: 'reliable presence gap',\n });\n }\n }\n }\n\n if (frame.channel === 'presence' && frame.from === 'server') {\n this.handlePresenceMessage(frame);\n } else {\n this.emitter.emit('message', frame);\n }\n return;\n }\n\n if (frame.type === 'pong') {\n this.heartbeatManager.handlePong();\n const key = 'pong:';\n const waiter = this.waiters.get(key);\n if (waiter) {\n this.clock.clearTimeout(waiter.timer);\n this.waiters.delete(key);\n waiter.resolve(frame);\n }\n return;\n }\n\n if (isErrorFrame(frame)) {\n this.handleErrorFrame(frame);\n return;\n }\n\n // Correlate success responses\n const key = `${frame.type}:${(frame as { room?: string }).room ?? ''}`;\n const waiter = this.waiters.get(key);\n if (waiter) {\n this.clock.clearTimeout(waiter.timer);\n this.waiters.delete(key);\n waiter.resolve(frame);\n }\n }\n\n private handlePresenceMessage(frame: MessageFrame): void {\n const payload = frame.payload as { event?: string; who?: string } | null;\n if (!payload || typeof payload !== 'object' || !payload.event) {\n this.emitter.emit('protocolViolation', {\n room: frame.room,\n reason: 'malformed presence payload',\n });\n return;\n }\n\n const evt = payload.event;\n if (evt !== 'join' && evt !== 'leave' && evt !== 'room_deleted') {\n this.emitter.emit('protocolViolation', {\n room: frame.room,\n reason: 'unknown presence event',\n });\n return;\n }\n\n if (!payload.who || typeof payload.who !== 'string' || payload.who === '') {\n this.emitter.emit('protocolViolation', {\n room: frame.room,\n reason: 'presence event missing who',\n });\n return;\n }\n\n // Self-presence check: client never receives join/leave for self\n if ((evt === 'join' || evt === 'leave') && payload.who === this._selfLabel) {\n this.emitter.emit('protocolViolation', {\n room: frame.room,\n reason: 'self presence event',\n });\n return;\n }\n\n const deleteKey = `delete_room:${frame.room}`;\n const hasDeleteWaiter = this.waiters.has(deleteKey);\n\n if (!this.intents.has(frame.room) && !hasDeleteWaiter) {\n this.logger.debug('Dropping presence event for unjoined room', {\n room: frame.room,\n event: evt,\n });\n return;\n }\n\n if (evt === 'room_deleted') {\n this.createdRooms.delete(frame.room);\n this.intents.delete(frame.room);\n this.clearRoomState(frame.room);\n this.emitter.emit('roomDeleted', { room: frame.room, who: payload.who });\n\n const waiter = this.waiters.get(deleteKey);\n if (waiter) {\n this.clock.clearTimeout(waiter.timer);\n this.waiters.delete(deleteKey);\n waiter.resolve(undefined);\n }\n return;\n }\n\n const ps = this.presenceManager.get(frame.room);\n if (evt === 'join') {\n if (!ps) {\n this.presenceManager.init(frame.room, 1);\n const newPs = this.presenceManager.get(frame.room)!;\n newPs.known.add(payload.who);\n this.emitter.emit('presenceJoin', { room: frame.room, who: payload.who });\n } else {\n if (!ps.known.has(payload.who)) {\n ps.known.add(payload.who);\n ps.serverCount++;\n this.emitter.emit('presenceJoin', { room: frame.room, who: payload.who });\n }\n }\n } else if (evt === 'leave') {\n if (ps) {\n if (ps.known.has(payload.who)) {\n ps.known.delete(payload.who);\n if (ps.serverCount > 0) {\n ps.serverCount--;\n }\n this.emitter.emit('presenceLeave', { room: frame.room, who: payload.who });\n }\n }\n }\n }\n\n private handleWelcome(frame: WelcomeFrame, isReconnect: boolean): void {\n this.currentConnWelcomeReceived = true;\n if (this.welcomeTimer) {\n this.clock.clearTimeout(this.welcomeTimer);\n this.welcomeTimer = null;\n }\n\n const previousCapabilities = this._capabilities;\n const previousVersion = this.serverVersion;\n const capabilitiesChanged =\n this._capabilities !== undefined &&\n (this.serverVersion !== frame.server_version ||\n JSON.stringify(this._capabilities) !== JSON.stringify(frame.capabilities));\n\n this._selfLabel = frame.label;\n this._capabilities = frame.capabilities;\n this.serverVersion = frame.server_version;\n this.reconnectAttempts = 0;\n this.rttTracker.reset();\n\n if (capabilitiesChanged) {\n this.emitter.emit('capabilitiesChanged', {\n previous: previousCapabilities,\n current: frame.capabilities ?? {},\n previousVersion,\n currentVersion: frame.server_version,\n });\n }\n\n this.emitter.emit('connected', { welcome: frame });\n this.writer.resume();\n\n const proceedToReady = () => {\n this.firstConnectDone = true;\n this.transitionState('ready');\n this.heartbeatManager.start();\n this.backpressureManager.start();\n\n if (this.pendingConnectResolve) {\n const resolve = this.pendingConnectResolve;\n this.pendingConnectResolve = null;\n this.pendingConnectReject = null;\n resolve(frame);\n }\n };\n\n if (isReconnect || this.firstConnectDone) {\n const discarded = this.discardOutboundQueues();\n this.appliedPolicies.clear();\n this.emitter.emit('queuesDiscarded', discarded);\n\n // Reconnect invalidates presence and re-baselines seq\n for (const room of this.intents.keys()) {\n if (!this.presenceManager.get(room)) {\n this.presenceManager.init(room, 0);\n }\n }\n const invalidatedRooms = this.presenceManager.invalidateAll();\n for (const room of invalidatedRooms) {\n this.emitter.emit('presenceInvalidated', { room, reason: 'reconnected' });\n }\n this.seqTracker.rebaselineAll();\n\n this.isRestoringSession = true;\n this.restoreSession()\n .finally(() => {\n this.isRestoringSession = false;\n if (this._state === 'closed') return;\n proceedToReady();\n });\n } else {\n proceedToReady();\n }\n }\n\n private handleWelcomeTimeout(isReconnect: boolean): void {\n this.logger.warn('Welcome timeout exceeded');\n\n const timeoutErr = new RequestTimeoutError(\n `Timed out waiting for welcome frame (${this.config.welcomeTimeoutMs ?? 10000}ms)`\n );\n\n if (!isReconnect && !this.firstConnectDone) {\n this.transitionState('closed');\n this.rejectPendingConnect(timeoutErr);\n try {\n this.transport.close(1000, 'welcome timeout');\n } catch {\n // ignore\n }\n } else {\n this.emitter.emit('error', { error: timeoutErr, phase: 'connect' });\n try {\n this.transport.close(1008, 'welcome timeout');\n } catch {\n // ignore\n }\n this.triggerReconnect();\n }\n }\n\n private handlePreOpenFailure(err: unknown, isReconnect: boolean): void {\n if (this._state === 'closed' || this._state === 'reconnecting') return;\n\n const connErr =\n err instanceof ConnectError\n ? err\n : new ConnectError('Failed to establish connection', err);\n\n const closeCode = connErr.closeCode ?? 1006;\n const reason = connErr.reason ?? '';\n\n this.classifyAndDispatch(closeCode, reason, connErr, isReconnect);\n }\n\n private handleSocketClose(\n closeCode: number,\n reason: string,\n _wasClean: boolean,\n isReconnect: boolean\n ): void {\n if (this._state === 'closed') return;\n\n if (this.welcomeTimer) {\n this.clock.clearTimeout(this.welcomeTimer);\n this.welcomeTimer = null;\n }\n this.heartbeatManager.stop();\n this.backpressureManager.stop();\n this.writer.stop();\n this.failPendingWaiters(\n new ConnectError(\n `Socket closed (code: ${closeCode}, reason: ${reason || 'none'})`,\n { closeCode, reason }\n )\n );\n\n const connErr = new ConnectError(\n `WebSocket closed before welcome (code: ${closeCode}, reason: ${reason || 'none'})`,\n { closeCode, reason }\n );\n\n if (!this.currentConnWelcomeReceived && !this.firstConnectDone) {\n this.classifyAndDispatch(closeCode, reason, connErr, isReconnect);\n return;\n }\n\n // Post-welcome closure or reconnect generation closure\n if (closeCode === 1008 && reason !== 'heartbeat timeout' && reason !== 'welcome timeout') {\n this.transitionState('closed');\n this.emitter.emit('fatal', {\n code: 'POLICY_VIOLATION',\n message: reason || 'Policy violation',\n });\n if (this.pendingConnectReject) {\n this.rejectPendingConnect(\n new PolicyViolationError(reason || 'Policy violation', closeCode, reason)\n );\n }\n return;\n }\n\n // Check shouldReconnect override\n if (this.config.reconnect?.shouldReconnect) {\n const allow = this.config.reconnect.shouldReconnect({\n closeCode,\n firstConnect: false,\n });\n if (!allow) {\n this.transitionState('closed');\n this.emitter.emit('fatal', {\n code: 'CLOSED',\n message: reason || 'Reconnect denied by shouldReconnect',\n });\n if (this.pendingConnectReject) {\n this.rejectPendingConnect(\n new ConnectError(reason || 'Reconnect denied by shouldReconnect', {\n closeCode,\n reason,\n })\n );\n }\n return;\n }\n }\n\n this.emitter.emit('disconnected', {\n code: closeCode,\n reason,\n wasClean: closeCode === 1000,\n });\n\n this.triggerReconnect();\n }\n\n private classifyAndDispatch(\n closeCode: number,\n reason: string,\n err: Error,\n isReconnect: boolean\n ): void {\n // Critical browser 401 heuristic (§3.2 and §4.2)\n let isFatal = false;\n let fatalCode: 'AUTH_FAILED' | 'POLICY_VIOLATION' | 'CLOSED' = 'AUTH_FAILED';\n\n if (closeCode === 1008) {\n isFatal = true;\n fatalCode = 'POLICY_VIOLATION';\n } else if (this.config.onAmbiguousAuth) {\n const decision = this.config.onAmbiguousAuth(closeCode, reason);\n isFatal = decision === 'fatal';\n } else {\n const mode = this.config.authFailureMode ?? 'heuristic';\n if (mode === 'always-fatal') {\n isFatal = true;\n } else if (mode === 'never-fatal') {\n isFatal = false;\n } else {\n // 'heuristic'\n isFatal = closeCode === 1006;\n }\n }\n\n if (this.config.reconnect?.shouldReconnect) {\n const allow = this.config.reconnect.shouldReconnect({\n closeCode,\n firstConnect: !this.firstConnectDone,\n });\n if (!allow) {\n isFatal = true;\n fatalCode = 'CLOSED';\n }\n }\n\n if (isFatal) {\n if (fatalCode === 'AUTH_FAILED') {\n this.emitter.emit('errorClassified', {\n code: 'UNAUTHORIZED',\n message: 'browser auth heuristic classified pre-welcome 1006 as auth failure',\n action: 'fatal',\n rawFrame: undefined,\n });\n }\n\n this.transitionState('closed');\n this.emitter.emit('fatal', {\n code: fatalCode,\n message:\n fatalCode === 'AUTH_FAILED'\n ? 'Authentication failed (pre-upgrade rejection)'\n : reason || 'Connection halted',\n });\n\n const outErr =\n fatalCode === 'AUTH_FAILED'\n ? new AuthError('Authentication failed (pre-upgrade rejection)')\n : fatalCode === 'POLICY_VIOLATION'\n ? new PolicyViolationError(reason || 'Policy violation', closeCode, reason)\n : new ConnectError(reason || 'Connection rejected', { closeCode, reason });\n\n this.rejectPendingConnect(outErr);\n return;\n }\n\n // Retryable pre-welcome close\n this.emitter.emit('error', { error: err, phase: isReconnect ? 'runtime' : 'connect' });\n this.triggerReconnect();\n }\n\n private triggerReconnect(): void {\n if (this._state === 'closed') return;\n\n this.transitionState('reconnecting');\n const maxAttempts = this.config.reconnect?.maxAttempts ?? Infinity;\n\n if (this.reconnectAttempts >= maxAttempts) {\n this.transitionState('closed');\n const msg = `Exceeded maximum reconnect attempts (${maxAttempts})`;\n this.emitter.emit('fatal', { code: 'CLOSED', message: msg });\n this.rejectPendingConnect(new ConnectError(msg));\n return;\n }\n\n const attemptNumber = this.reconnectAttempts + 1;\n const delayMs = computeReconnectDelay(\n this.reconnectAttempts,\n this.config.reconnect\n );\n\n this.emitter.emit('reconnecting', { attempt: attemptNumber, delayMs });\n\n this.reconnectTimer = this.clock.setTimeout(() => {\n this.reconnectTimer = null;\n if (this._state === 'closed') return;\n\n this.emitter.emit('reconnecting', { attempt: attemptNumber, delayMs: 0 });\n this.reconnectAttempts++;\n\n this.initiateConnect(true);\n }, delayMs);\n }\n\n private async restoreSession(): Promise<void> {\n const intentsList = Array.from(this.intents.values()).sort((a, b) =>\n a.room.localeCompare(b.room)\n );\n\n const restored: string[] = [];\n const failed: FailedIntent[] = [];\n const roomFullPolicy = this.config.restore?.roomFullPolicy ?? 'drop';\n const perRoomTimeout = this.config.restore?.restorePerRoomTimeoutMs ?? 5000;\n\n for (const intent of intentsList) {\n if (this.isClosed()) break;\n\n const maxAttempts = roomFullPolicy === 'retry' ? 3 : 1;\n let outcome: 'joined' | 'drop' | 'keep' = 'drop';\n let outcomeCode: ErrorCode = 'INTERNAL_ERROR';\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n if (this.isClosed()) break;\n\n if (attempt > 0) {\n const backoff = 50 * Math.pow(2, attempt);\n await new Promise<void>((res) => {\n const t = this.clock.setTimeout(res, backoff);\n if (this.isClosed()) {\n this.clock.clearTimeout(t);\n res();\n }\n });\n }\n\n const joinReq: JoinRoomRequest = {\n type: 'join_room',\n room: intent.room,\n passcode: intent.passcode,\n binary_channels: intent.binaryChannels,\n };\n\n try {\n const res = await this.sendWithCorrelation<RoomJoinedFrame>(\n 'room_joined',\n intent.room,\n joinReq,\n perRoomTimeout\n );\n outcome = 'joined';\n this.presenceManager.init(intent.room, res.members);\n if (intent.binaryChannels) {\n for (const [ch, id] of Object.entries(intent.binaryChannels)) {\n this.binaryOwner.set(id, { room: intent.room, channel: ch });\n }\n }\n break;\n } catch (err) {\n if (err instanceof ServerError) {\n outcomeCode = err.code;\n if (err.code === 'ROOM_NOT_FOUND' || err.code === 'FORBIDDEN_SCOPE') {\n outcome = 'drop';\n break;\n }\n if (\n err.code === 'INVALID_PASSCODE' ||\n err.code === 'PASSCODE_RATE_LIMITED'\n ) {\n outcome = 'keep';\n break;\n }\n if (err.code === 'ROOM_FULL') {\n if (roomFullPolicy === 'retry' && attempt < maxAttempts - 1) {\n continue;\n }\n outcome = roomFullPolicy === 'drop' ? 'drop' : 'keep';\n break;\n }\n outcome = 'keep';\n break;\n } else {\n // RequestTimeoutError or other\n outcome = 'keep';\n outcomeCode = 'INTERNAL_ERROR';\n break;\n }\n }\n }\n\n if (outcome === 'joined') {\n restored.push(intent.room);\n } else {\n if (outcome === 'drop') {\n this.intents.delete(intent.room);\n this.clearRoomState(intent.room);\n }\n failed.push({ room: intent.room, code: outcomeCode });\n this.emitter.emit('intentFailed', { room: intent.room, code: outcomeCode });\n }\n }\n\n this.emitter.emit('sessionRestored', { restored, failed });\n }\n\n private sendWithCorrelation<T>(\n responseType: string,\n room: string,\n frame: ClientFrame,\n customTimeoutMs?: number\n ): Promise<T> {\n const key = `${responseType}:${room}`;\n if (this.waiters.has(key)) {\n return Promise.reject(\n new ConcurrentRequestError(\n `Concurrent request for ${responseType} on room \"${room}\" is not permitted`\n )\n );\n }\n\n if (this._state !== 'ready' && !this.isRestoringSession) {\n return Promise.reject(new SdkError(`Client not ready (state: ${this._state})`));\n }\n\n const timeoutMs = customTimeoutMs ?? this.config.requestTimeoutMs ?? 10000;\n\n return new Promise<T>((resolve, reject) => {\n const timer = this.clock.setTimeout(() => {\n this.waiters.delete(key);\n reject(\n new RequestTimeoutError(\n `Timed out waiting for ${responseType} on \"${room}\"`\n )\n );\n }, timeoutMs);\n\n this.waiters.set(key, {\n resolve: (val) => resolve(val as T),\n reject,\n timer,\n room,\n responseType,\n });\n\n try {\n this.send(frame);\n } catch (err) {\n this.clock.clearTimeout(timer);\n this.waiters.delete(key);\n reject(err);\n }\n });\n }\n\n private handleErrorFrame(frame: ErrorFrame): void {\n const classification = classifyError(\n frame.code,\n frame,\n this.config.errorPolicy?.overrides\n );\n\n this.emitter.emit('errorClassified', {\n code: frame.code,\n message: frame.message,\n room: frame.room,\n channel: frame.channel,\n action: classification.action,\n retryAfterMs: classification.retryAfterMs,\n rawFrame: frame,\n });\n\n if (frame.code === 'RATE_LIMITED' && frame.channel) {\n const channel = frame.channel;\n const retryAfterMs = frame.retry_after_ms ?? 250;\n let room = frame.room;\n if (!room) {\n room = this.rateLimiters.getRecentRoom(channel) ?? '';\n }\n const untilMs = this.clock.now() + retryAfterMs;\n this.rateLimiters.pause(room, channel, untilMs);\n\n this.emitter.emit('rateLimited', {\n source: 'server',\n room,\n channel,\n retryAfterMs,\n });\n }\n\n const serverErr = new ServerError(\n frame.code,\n frame.message,\n frame.channel,\n frame.retry_after_ms\n );\n\n this.emitter.emit('error', { error: serverErr, phase: 'runtime' });\n\n // Correlation fallback: match by frame.room, extracted room, or single in-flight waiter\n let matchedKey: string | null = null;\n\n if (frame.room) {\n for (const [key, waiter] of this.waiters.entries()) {\n if (waiter.room === frame.room) {\n matchedKey = key;\n break;\n }\n }\n }\n\n if (!matchedKey) {\n const extractedRoom = extractRoomFromMessage(frame.message);\n if (extractedRoom) {\n for (const [key, waiter] of this.waiters.entries()) {\n if (waiter.room === extractedRoom) {\n matchedKey = key;\n break;\n }\n }\n }\n }\n\n if (!matchedKey && this.waiters.size === 1) {\n matchedKey = Array.from(this.waiters.keys())[0];\n }\n\n if (matchedKey) {\n const waiter = this.waiters.get(matchedKey)!;\n this.clock.clearTimeout(waiter.timer);\n this.waiters.delete(matchedKey);\n waiter.reject(serverErr);\n }\n }\n\n private failPendingWaiters(err: Error): void {\n for (const [key, waiter] of this.waiters.entries()) {\n this.clock.clearTimeout(waiter.timer);\n this.waiters.delete(key);\n waiter.reject(err);\n }\n }\n\n private clearTimers(): void {\n if (this.reconnectTimer) {\n this.clock.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n if (this.welcomeTimer) {\n this.clock.clearTimeout(this.welcomeTimer);\n this.welcomeTimer = null;\n }\n }\n\n private rejectPendingConnect(err: unknown): void {\n if (this.pendingConnectReject) {\n const reject = this.pendingConnectReject;\n this.pendingConnectResolve = null;\n this.pendingConnectReject = null;\n reject(err);\n }\n }\n}\n"]}
|