@genex-ai/multiplayer 0.16.1 → 0.17.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.
@@ -0,0 +1,419 @@
1
+ /** The protocol this SDK speaks, sent as the `protocol` join option. Bumped on any change a
2
+ * client of the previous version would misread — a schema field inserted/retyped, a message
3
+ * reshaped, a semantic change. Appending a schema field or adding a message is not a bump. */
4
+ declare const PROTOCOL_VERSION = 3;
5
+ /** The oldest protocol the relay still seats. A join below it (or without one) is refused with
6
+ * {@link JoinError.PROTOCOL_UNSUPPORTED}. Protocol 3 is a hard cut: 2 (`__v`) is not served. */
7
+ declare const MIN_PROTOCOL_VERSION = 3;
8
+ /** Colyseus room types. Every game shares them; games are isolated by the `gameId` filter. */
9
+ declare const RoomType: {
10
+ /** The plain relay room: joinOrCreate, fullest-first placement. */
11
+ readonly PLAY: "play";
12
+ /** The matchmaking search pool. No game session — it only hands out seat reservations. */
13
+ readonly QUEUE: "queue";
14
+ /** A capped match arena: seat reservation (matchmade), create (private lobby) or joinById (invite). */
15
+ readonly MATCH: "match";
16
+ };
17
+ /** Join option keys (every room type). Anything else is ignored, except the server-owned names in
18
+ * {@link SERVER_OWNED_JOIN_OPTIONS}, which refuse the join. */
19
+ declare const JoinOption: {
20
+ /** The game's slug. Must equal the embed token's `slug` claim. */
21
+ readonly GAME_ID: "gameId";
22
+ /** A fresh `embed:play` JWT. Required — there is no anonymous join. */
23
+ readonly EMBED_TOKEN: "embedToken";
24
+ /** Display-name fallback when the token carries none. */
25
+ readonly NAME: "name";
26
+ /** {@link PROTOCOL_VERSION}. Required. */
27
+ readonly PROTOCOL: "protocol";
28
+ };
29
+ /** Join options only the relay itself may set; a client sending any of them is refused (400). */
30
+ declare const SERVER_OWNED_JOIN_OPTIONS: readonly ["clients", "preset", "winCondition", "config", "matchmade"];
31
+ /** Join refusal codes (the matchmaking error's `code`; the message names the reason). */
32
+ declare const JoinError: {
33
+ /** A server-owned option was sent. */
34
+ readonly BAD_OPTION: 400;
35
+ /** No token, an invalid/expired token, or a revoked session. */
36
+ readonly AUTH_REQUIRED: 401;
37
+ /** Token for another game ('wrong game'), or the room's guest cap is full. */
38
+ readonly FORBIDDEN: 403;
39
+ /** `protocol` missing or outside [MIN_PROTOCOL_VERSION, PROTOCOL_VERSION]. Update the client. */
40
+ readonly PROTOCOL_UNSUPPORTED: 426;
41
+ };
42
+ /** A preview (staging) build's rooms: the relay keys them `preview--<slug>`, apart from the live
43
+ * game's rooms, so testers on a preview link play together and never meet real players. The
44
+ * client always sends the plain slug as `gameId`; the relay picks the room from the token's
45
+ * channel (PROTOCOL.md §3.4). No game can be named into this form: slugs never hold `--`. */
46
+ declare const STAGING_ROOM_PREFIX = "preview--";
47
+ /** The room key the relay files a join under, from the token's slug and channel. */
48
+ declare const roomKeyFor: (slug: string, channel: "production" | "staging") => string;
49
+ /** The game slug behind a room key (the key itself for a live room). */
50
+ declare const slugOfRoomKey: (key: string) => string;
51
+ /** Client → relay message types. Each row's payload and lane are in PROTOCOL.md §5. */
52
+ declare const ClientMessage: {
53
+ readonly STATE: "state";
54
+ readonly STATE_SNAP: "__state:snap";
55
+ readonly SHARED: "shared";
56
+ readonly CLAIM: "claim";
57
+ readonly RELEASE: "release";
58
+ readonly DESTROY: "destroy";
59
+ readonly OBJECT: "obj";
60
+ readonly OBJECT_SNAP: "__object:snap";
61
+ readonly INPUT: "__input";
62
+ readonly ROOM_OPEN: "__room:open";
63
+ readonly CHAT: "__chat";
64
+ readonly CHAT_HISTORY_REQUEST: "__chat:history:request";
65
+ readonly VOICE_ICE_REQUEST: "__voice:ice:request";
66
+ readonly VOICE_JOIN: "__voice:join";
67
+ readonly VOICE_LEAVE: "__voice:leave";
68
+ readonly VOICE_SIGNAL: "__voice:signal";
69
+ readonly MATCH_ELIMINATED: "match:eliminated";
70
+ readonly MATCH_SCORE: "match:score";
71
+ readonly MATCH_FINISH: "match:finish";
72
+ readonly POSE: "__pose";
73
+ readonly POSE_SNAP: "__pose:snap";
74
+ };
75
+ /** Relay → client message types. */
76
+ declare const ServerMessage: {
77
+ readonly OBJECT_RESULT: "__object:result";
78
+ readonly INPUT: "__input";
79
+ readonly ROOM_OPEN: "__room:open";
80
+ readonly CHAT: "__chat";
81
+ readonly CHAT_HISTORY: "__chat:history";
82
+ readonly VOICE_ICE: "__voice:ice";
83
+ readonly VOICE_SIGNAL: "__voice:signal";
84
+ readonly VOICE_REJECTED: "__voice:rejected";
85
+ readonly RATE_DROP: "rate:drop";
86
+ readonly SERVER_RESTART: "server:restart";
87
+ readonly MATCH_START: "match:start";
88
+ readonly MATCH_ENDED: "match:ended";
89
+ readonly MATCH_REQUEUE: "match:requeue";
90
+ readonly QUEUE: "queue";
91
+ readonly SEAT: "seat";
92
+ };
93
+ type ClientMessageType = (typeof ClientMessage)[keyof typeof ClientMessage];
94
+ type ServerMessageType = (typeof ServerMessage)[keyof typeof ServerMessage];
95
+ /** Prefixes a game event may not use. The relay drops (and counts) a client message with one of
96
+ * these that it has no handler for — it is never relayed to peers. */
97
+ declare const RESERVED_EVENT_PREFIXES: readonly ["__", "match:", "server:", "rate:"];
98
+ /** Exact names a game event may not use: the relay's own unprefixed verbs. */
99
+ declare const RESERVED_EVENT_TYPES: readonly ["state", "shared", "claim", "release", "destroy", "obj", "queue", "seat"];
100
+ /** Whether `type` belongs to the relay rather than the game. A game event (any other string of
101
+ * 1..MAX_EVENT_TYPE_CHARS) is relayed verbatim to every other client in the room. */
102
+ declare function isReservedEventType(type: string): boolean;
103
+ /** Shared-map keys with this prefix are refused from clients (kept free for the relay). */
104
+ declare const RESERVED_SHARED_PREFIX = "__";
105
+ /** The key a sender stamps into its own `PlayerState.data` JSON: its send clock in ms (§10). */
106
+ declare const SEND_TIME_KEY = "__t";
107
+ /** Every inbound message spends a token from one lane. An empty lane drops the message (never a
108
+ * kick) and earns a `rate:drop` notice, at most one per second. `bulk` and `input` additionally
109
+ * share {@link GLOBAL_RATE}; the others are reserved capacity outside it. `bulk` also drops
110
+ * probabilistically below `softZone` tokens, so overload loss spreads across streams. */
111
+ declare const RATE_LANES: {
112
+ readonly state: {
113
+ readonly rate: 30;
114
+ readonly burst: 60;
115
+ readonly softZone: 0;
116
+ };
117
+ readonly control: {
118
+ readonly rate: 40;
119
+ readonly burst: 80;
120
+ readonly softZone: 0;
121
+ };
122
+ readonly input: {
123
+ readonly rate: 60;
124
+ readonly burst: 120;
125
+ readonly softZone: 0;
126
+ };
127
+ readonly bulk: {
128
+ readonly rate: 120;
129
+ readonly burst: 240;
130
+ readonly softZone: 60;
131
+ };
132
+ readonly chat: {
133
+ readonly rate: 2;
134
+ readonly burst: 5;
135
+ readonly softZone: 0;
136
+ };
137
+ readonly voice: {
138
+ readonly rate: 25;
139
+ readonly burst: 60;
140
+ readonly softZone: 0;
141
+ };
142
+ /** `__pose` / `__pose:snap` (§6.6). Its own reserved lane, outside the global bucket like
143
+ * `state`: a posed player publishes pose AND (low-rate) `data`, and neither may starve the other. */
144
+ readonly pose: {
145
+ readonly rate: 30;
146
+ readonly burst: 60;
147
+ readonly softZone: 0;
148
+ };
149
+ };
150
+ type RateLane = keyof typeof RATE_LANES;
151
+ declare const GLOBAL_RATE: {
152
+ readonly rate: 180;
153
+ readonly burst: 360;
154
+ };
155
+ /** Colyseus's own per-socket ceiling. Unlike the lanes this CLOSES the socket (4002); it exists
156
+ * only to stop a raw socket hammering far past anything the lanes accept. */
157
+ declare const MAX_MESSAGES_PER_SECOND = 1200;
158
+ /** The lane each relay-handled client message spends. Game events and anything unhandled: bulk. */
159
+ declare const MESSAGE_LANE: Readonly<Record<ClientMessageType, RateLane>>;
160
+ /** WebSocket close codes a client can observe. Terminal = the seat is gone; do not reconnect. */
161
+ declare const CloseCode: {
162
+ readonly GOING_AWAY: 1001;
163
+ readonly NO_STATUS: 1005;
164
+ readonly ABNORMAL: 1006;
165
+ /** Colyseus: the server is going down, come back. The one ≥4000 code that is not terminal. */
166
+ readonly MAY_TRY_RECONNECT: 4010;
167
+ readonly NORMAL: 1000;
168
+ /** A deliberate leave (Colyseus CONSENTED) — and the code a match room boots a requeued player
169
+ * with when it ignored `match:requeue` (Genex MATCH_BOOT). Same number, same meaning: seat gone. */
170
+ readonly CONSENTED: 4000;
171
+ readonly MATCH_BOOT: 4000;
172
+ readonly SERVER_SHUTDOWN: 4001;
173
+ /** Colyseus: protocol error, or the socket exceeded MAX_MESSAGES_PER_SECOND. */
174
+ readonly WITH_ERROR: 4002;
175
+ /** Colyseus SDK: every reconnection attempt failed (the grace expired). */
176
+ readonly FAILED_TO_RECONNECT: 4003;
177
+ /** The player's session was revoked (signed out from the dashboard). Do not rejoin with it. */
178
+ readonly REVOKED: 4401;
179
+ /** A newer session of the same player took the seat (second tab, or the page reloaded). */
180
+ readonly SUPERSEDED: 4409;
181
+ };
182
+ declare const Limits: {
183
+ readonly ROOM_MAX_CLIENTS: 64;
184
+ readonly MAX_NAME_CHARS: 64;
185
+ readonly MAX_AVATAR_URL_CHARS: 512;
186
+ readonly MAX_UID_CHARS: 64;
187
+ /** `state` / `__state:snap` payload (the JSON text). */
188
+ readonly MAX_STATE_BYTES: number;
189
+ readonly MAX_SHARED_KEY_CHARS: 256;
190
+ readonly MAX_SHARED_VALUE_BYTES: number;
191
+ /** Distinct game keys a room's `shared` map may ever hold (keys are never deleted). */
192
+ readonly MAX_SHARED_KEYS: 256;
193
+ readonly MAX_OBJECT_ID_CHARS: 128;
194
+ /** An object's `d` as stored (JSON text). */
195
+ readonly MAX_OBJECT_STATE_BYTES: number;
196
+ /** Live objects per room (an id counts from its first accepted claim until `destroy`). */
197
+ readonly MAX_OBJECTS: 128;
198
+ readonly MAX_REQUEST_ID_CHARS: 96;
199
+ /** Game events and `__input`: the payload's JSON encoding. */
200
+ readonly MAX_EVENT_BYTES: number;
201
+ readonly MAX_EVENT_TYPE_CHARS: 128;
202
+ /** JSON payload shape bounds: nesting depth and total node count. */
203
+ readonly MAX_JSON_DEPTH: 32;
204
+ readonly MAX_JSON_NODES: 4096;
205
+ /** Code points per chat line after normalization. */
206
+ readonly MAX_CHAT_CHARS: 500;
207
+ readonly CHAT_HISTORY_MAX: 50;
208
+ readonly CHAT_HISTORY_MAX_BYTES: number;
209
+ readonly MAX_VOICE_PARTICIPANTS: 6;
210
+ readonly MAX_VOICE_SIGNAL_BYTES: number;
211
+ /** `match:score` delta is clamped to ±this. */
212
+ readonly MAX_SCORE_DELTA: 1000;
213
+ /** Results kept per session for request-id replay, and how long. */
214
+ readonly CONTROL_RESULTS_PER_SESSION: 128;
215
+ readonly CONTROL_RESULT_TTL_MS: 60000;
216
+ /** Open preset `teams` knob range (0 = no teams). */
217
+ readonly MAX_TEAMS: 8;
218
+ /** `__pose` `anim` string (§6.6). */
219
+ readonly MAX_ANIM_CHARS: 64;
220
+ /** Every `__pose` number must be finite with |v| ≤ this (float32 holds it without overflowing to
221
+ * Infinity; past ~1e7 a float32 position is coarser than a metre anyway). */
222
+ readonly MAX_POSE_ABS: 1000000000;
223
+ };
224
+ declare const RelayTiming: {
225
+ /** State patch cadence: every accumulated change goes out on this tick. */
226
+ readonly PATCH_INTERVAL_MS: number;
227
+ /** Seat grace after an abnormal drop (1006 etc.). */
228
+ readonly RECONNECT_GRACE_S: 30;
229
+ /** Seat grace after a 1001 close (reload/navigate) — long enough to rejoin and supersede. */
230
+ readonly GOING_AWAY_GRACE_S: 5;
231
+ /** A dropped host keeps host for this long before the relay fails over. */
232
+ readonly HOST_FAILOVER_GRACE_MS: 1500;
233
+ /** A freshly changed owner cannot be displaced by an ordinary claim for this long. */
234
+ readonly MIN_OWNERSHIP_HOLD_MS: 300;
235
+ /** After `server:restart`, clients are dropped this much later. */
236
+ readonly SHUTDOWN_DRAIN_MS: 3000;
237
+ /** A requeued match player that has not left is booted (MATCH_BOOT) after this. */
238
+ readonly REQUEUE_GRACE_MS: 5000;
239
+ /** A seat reservation must be consumed within this. */
240
+ readonly SEAT_RESERVATION_S: 15;
241
+ /** The queue room's matchmaking pass. */
242
+ readonly QUEUE_TICK_MS: 1000;
243
+ /** Embed tokens are re-checked for revocation on this cadence (REVOKED close on hit). */
244
+ readonly REVOCATION_SWEEP_MS: 30000;
245
+ };
246
+ /** One owner of reconnection: the Colyseus SDK's in-place auto-reconnect, on from the first
247
+ * millisecond (`minUptime: 0`), sized so the last attempt (~23.75s of backoff) lands inside the
248
+ * 30s seat grace, and with no send queue — a stale queued pose or event must never replay. */
249
+ declare const ClientReconnection: {
250
+ readonly enabled: true;
251
+ readonly minUptime: 0;
252
+ readonly delay: 125;
253
+ readonly minDelay: 100;
254
+ readonly maxDelay: 4000;
255
+ readonly maxRetries: 9;
256
+ readonly maxEnqueuedMessages: 0;
257
+ /** After the SDK reports reconnected, wait at most this for the first state decode (§8). */
258
+ readonly firstStateTimeoutMs: 2000;
259
+ };
260
+ type ObjectControlOperation = 'claim' | 'release' | 'remove';
261
+ type ObjectControlReason = 'accepted' | 'already-owner' | 'held' | 'rate-limited' | 'not-owner' | 'capacity' | 'invalid' | 'missing' | 'host-authority' | 'not-host';
262
+ /** `claim` / `release` / `destroy` payload. `authority: 'host'` is claim-only and host-only. */
263
+ type ObjectControlRequest = {
264
+ id: string;
265
+ requestId: string;
266
+ authority?: 'host';
267
+ };
268
+ /** `__object:result` payload — exactly one per request id (rate-limited answers are not cached). */
269
+ type ObjectControlResult = {
270
+ requestId: string;
271
+ operation: ObjectControlOperation;
272
+ id: string;
273
+ accepted: boolean;
274
+ /** Owner after the operation, when there is one. */
275
+ owner?: string;
276
+ /** `ObjectState.seq` after the operation (0 when the object does not exist). */
277
+ sequence: number;
278
+ reason: ObjectControlReason;
279
+ /** On `held` / `rate-limited`: earliest sensible retry. */
280
+ retryAfterMs?: number;
281
+ };
282
+ /** `obj` / `__object:snap`: `d` is a JSON object, `t` the sender's clock in ms. */
283
+ type ObjectPublish = {
284
+ id: string;
285
+ d: Record<string, unknown>;
286
+ t: number;
287
+ };
288
+ /** `shared`: `value` is JSON text. */
289
+ type SharedWrite = {
290
+ key: string;
291
+ value: string;
292
+ };
293
+ /** `__input` as delivered to the host. */
294
+ type InputEnvelope = {
295
+ from: string;
296
+ d: unknown;
297
+ };
298
+ /** `__chat` as broadcast (the client sends only `{ text }`). */
299
+ type ChatMessage = {
300
+ id: number;
301
+ from: string;
302
+ name: string;
303
+ text: string;
304
+ at: number;
305
+ };
306
+ type VoiceSignal = {
307
+ to: string;
308
+ data: unknown;
309
+ };
310
+ type VoiceSignalEnvelope = {
311
+ from: string;
312
+ data: unknown;
313
+ };
314
+ type IceServer = {
315
+ urls: string | string[];
316
+ username?: string;
317
+ credential?: string;
318
+ };
319
+ type IceConfig = {
320
+ iceServers: IceServer[];
321
+ ttl: number;
322
+ };
323
+ type MatchEnded = {
324
+ winnerId: string | null;
325
+ losers: string[];
326
+ draw: boolean;
327
+ scores: Record<string, number>;
328
+ };
329
+ /** The `PlayerState` pose keys, in schema order. An SDK that offers pose routes exactly these keys of
330
+ * a game's player state into `__pose` and everything else into `data`; a posed player's `data` never
331
+ * carries them (§6.6). `anim` is discrete; the rest interpolate (`yaw` along the shortest arc). */
332
+ declare const POSE_KEYS: readonly ["x", "y", "z", "yaw", "vx", "vy", "vz", "anim"];
333
+ type PoseKey = (typeof POSE_KEYS)[number];
334
+ /** `__pose` / `__pose:snap` payload. Every key but `t` is optional; an absent key keeps the stored
335
+ * value (so a 2D game may never send `z`). Numbers: finite, |v| ≤ {@link Limits.MAX_POSE_ABS};
336
+ * `t`: the sender's clock in ms (same clock as `__t`), finite and nonzero. Unknown keys are ignored;
337
+ * a known key of the wrong type drops the whole message. */
338
+ type PosePublish = {
339
+ x?: number;
340
+ y?: number;
341
+ z?: number;
342
+ /** Radians, any finite value. */
343
+ yaw?: number;
344
+ /** World units per second. */
345
+ vx?: number;
346
+ vy?: number;
347
+ vz?: number;
348
+ /** ≤ {@link Limits.MAX_ANIM_CHARS}. */
349
+ anim?: string;
350
+ t: number;
351
+ };
352
+ declare const Interpolation: {
353
+ /** Render delay target = RATIO × median publish interval of that sender… */
354
+ readonly RATIO: 1.5;
355
+ /** …but at least JITTER_SAFETY × (p90 − min) of that sender's (arrival − sendTime)… */
356
+ readonly JITTER_SAFETY: 1.25;
357
+ /** …clamped to [MIN_MS, MAX_MS], and DEFAULT_MS before anything is measured. */
358
+ readonly MIN_MS: 90;
359
+ readonly MAX_MS: 300;
360
+ readonly DEFAULT_MS: 100;
361
+ /** Per-sample fraction the delay moves toward its target (no pops). */
362
+ readonly EASE: 0.1;
363
+ /**
364
+ * The min-filtered clock-offset window, kept PER SENDER: it holds at least the last CLOCK_WINDOW
365
+ * samples AND at least CLOCK_WINDOW_MS of them, whichever reaches further back, so a sender that
366
+ * owns many streams never shrinks the time the window covers. The jitter term reads each stream's
367
+ * own last CLOCK_WINDOW samples.
368
+ */
369
+ readonly CLOCK_WINDOW: 80;
370
+ readonly CLOCK_WINDOW_MS: 5000;
371
+ /** Hard cap on one sender's window (memory bound for a sender publishing very many streams). */
372
+ readonly CLOCK_WINDOW_MAX: 4096;
373
+ /** Publish-gap history for the median; gaps outside (MIN_GAP_MS, MAX_GAP_MS) are ignored. */
374
+ readonly INTERVAL_WINDOW: 30;
375
+ readonly MIN_GAP_MS: 5;
376
+ readonly MAX_GAP_MS: 2000;
377
+ /** Snapshot history kept per stream (never fewer than 2). */
378
+ readonly HISTORY_MS: 1500;
379
+ /** Past the newest snapshot: dead-reckon position at most this far, rotation this far. */
380
+ readonly MAX_EXTRAP_MS: 250;
381
+ readonly ROT_EXTRAP_MS: 150;
382
+ /** Output smoothing time constants (alpha = 1 − e^(−dt/τ), dt clamped to 250 ms). */
383
+ readonly SMOOTH_TAU_POS_MS: 30;
384
+ readonly SMOOTH_TAU_ROT_MS: 70;
385
+ /** A head snapshot this far in the future of the newest is a foreign-clock poison: drop it. */
386
+ readonly POISON_GUARD_MS: 2000;
387
+ /** A reconnect gap longer than this discards every stream's history (one deliberate rebase). */
388
+ readonly REBASE_AFTER_GAP_MS: 1000;
389
+ /** Host tick dt is clamped to this (a backgrounded tab must not tunnel the simulation). */
390
+ readonly MAX_HOST_TICK_DT_MS: 250;
391
+ };
392
+ /** The relay's clock heartbeat (§16). The relay declares `HeartbeatInput` (schema.ts) with
393
+ * `defineInput` purely so every state frame carries the TIMED `[u32 sNow][u32 ackSeq]` prefix; it
394
+ * consumes every buffered heartbeat right before each patch, so `ackSeq` advances one patch after
395
+ * arrival and each client measures RTT on its own heartbeats. No fixed timestep, no simulation, no
396
+ * rewind stamps, nothing forwarded. Present only when the join handshake carries the input sections. */
397
+ declare const ClockSync: {
398
+ /** The heartbeat rate a client SHOULD send at, from a wall-clock timer (never the render loop). */
399
+ readonly HEARTBEAT_HZ: 10;
400
+ /** A client that sends heartbeats MUST stay within [MIN_HEARTBEAT_HZ, MAX_HEARTBEAT_HZ] while its
401
+ * page is foregrounded. Below MIN the offset and RTT refresh too slowly; above MAX buys nothing,
402
+ * and the relay's small buffer (RELAY_BUFFER) folds the excess away. */
403
+ readonly MIN_HEARTBEAT_HZ: 5;
404
+ readonly MAX_HEARTBEAT_HZ: 20;
405
+ /** Each interval is the nominal one × (1 ± up to this), clamped to the band above. A fixed interval
406
+ * that divides the patch interval phase-locks to the patch tick (every RTT sample then carries the
407
+ * same hold); the dither walks the phase so near-zero holds keep turning up. */
408
+ readonly HEARTBEAT_DITHER: 0.15;
409
+ /** Relay `defineInput({ bufferMaxSize })`. Overflow counts as consumed, so a burst still acks. */
410
+ readonly RELAY_BUFFER: 4;
411
+ /** Acked heartbeats (RTT-valid samples) before a client treats `serverNow` as synced and uses it
412
+ * for deadlines (≈3 s at 10 Hz). The room clock seeds its offset from the first TIMED frame, which
413
+ * is biased by the one-way latency, and then moves by an EMA (α = 0.1) per RTT sample, so after k
414
+ * samples 0.9^k of that bias remains: ≈35% at 10, ≈4% at 30 (≈6 ms at 150 ms one way). 30 is also
415
+ * where the room clock's RTT gate stops being bypassed (its warmup). */
416
+ readonly WARMUP_ACKS: 30;
417
+ };
418
+
419
+ export { type ChatMessage, ClientMessage, type ClientMessageType, ClientReconnection, ClockSync, CloseCode, GLOBAL_RATE, type IceConfig, type IceServer, type InputEnvelope, Interpolation, JoinError, JoinOption, Limits, MAX_MESSAGES_PER_SECOND, MESSAGE_LANE, MIN_PROTOCOL_VERSION, type MatchEnded, type ObjectControlOperation, type ObjectControlReason, type ObjectControlRequest, type ObjectControlResult, type ObjectPublish, POSE_KEYS, PROTOCOL_VERSION, type PoseKey, type PosePublish, RATE_LANES, RESERVED_EVENT_PREFIXES, RESERVED_EVENT_TYPES, RESERVED_SHARED_PREFIX, type RateLane, RelayTiming, RoomType, SEND_TIME_KEY, SERVER_OWNED_JOIN_OPTIONS, STAGING_ROOM_PREFIX, ServerMessage, type ServerMessageType, type SharedWrite, type VoiceSignal, type VoiceSignalEnvelope, isReservedEventType, roomKeyFor, slugOfRoomKey };
@@ -0,0 +1,58 @@
1
+ import {
2
+ ClientMessage,
3
+ ClientReconnection,
4
+ ClockSync,
5
+ CloseCode,
6
+ GLOBAL_RATE,
7
+ Interpolation,
8
+ JoinError,
9
+ JoinOption,
10
+ Limits,
11
+ MAX_MESSAGES_PER_SECOND,
12
+ MESSAGE_LANE,
13
+ MIN_PROTOCOL_VERSION,
14
+ POSE_KEYS,
15
+ PROTOCOL_VERSION,
16
+ RATE_LANES,
17
+ RESERVED_EVENT_PREFIXES,
18
+ RESERVED_EVENT_TYPES,
19
+ RESERVED_SHARED_PREFIX,
20
+ RelayTiming,
21
+ RoomType,
22
+ SEND_TIME_KEY,
23
+ SERVER_OWNED_JOIN_OPTIONS,
24
+ STAGING_ROOM_PREFIX,
25
+ ServerMessage,
26
+ isReservedEventType,
27
+ roomKeyFor,
28
+ slugOfRoomKey
29
+ } from "./chunk-C52XFIB6.js";
30
+ export {
31
+ ClientMessage,
32
+ ClientReconnection,
33
+ ClockSync,
34
+ CloseCode,
35
+ GLOBAL_RATE,
36
+ Interpolation,
37
+ JoinError,
38
+ JoinOption,
39
+ Limits,
40
+ MAX_MESSAGES_PER_SECOND,
41
+ MESSAGE_LANE,
42
+ MIN_PROTOCOL_VERSION,
43
+ POSE_KEYS,
44
+ PROTOCOL_VERSION,
45
+ RATE_LANES,
46
+ RESERVED_EVENT_PREFIXES,
47
+ RESERVED_EVENT_TYPES,
48
+ RESERVED_SHARED_PREFIX,
49
+ RelayTiming,
50
+ RoomType,
51
+ SEND_TIME_KEY,
52
+ SERVER_OWNED_JOIN_OPTIONS,
53
+ STAGING_ROOM_PREFIX,
54
+ ServerMessage,
55
+ isReservedEventType,
56
+ roomKeyFor,
57
+ slugOfRoomKey
58
+ };