@dcl/sdk 7.22.5-24836126953.commit-ddc8da1 → 7.22.5

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.
Files changed (65) hide show
  1. package/network/binary-message-bus.d.ts +3 -6
  2. package/network/binary-message-bus.js +5 -9
  3. package/network/entities.js +11 -3
  4. package/network/index.d.ts +2 -8
  5. package/network/index.js +3 -16
  6. package/network/message-bus-sync.d.ts +1 -14
  7. package/network/message-bus-sync.js +103 -161
  8. package/network/state.js +10 -5
  9. package/package.json +6 -6
  10. package/src/network/binary-message-bus.ts +4 -9
  11. package/src/network/entities.ts +10 -2
  12. package/src/network/index.ts +3 -40
  13. package/src/network/message-bus-sync.ts +110 -174
  14. package/src/network/state.ts +10 -4
  15. package/atom.d.ts +0 -19
  16. package/atom.js +0 -83
  17. package/future.d.ts +0 -8
  18. package/future.js +0 -26
  19. package/network/chunking.d.ts +0 -5
  20. package/network/chunking.js +0 -38
  21. package/network/events/implementation.d.ts +0 -93
  22. package/network/events/implementation.js +0 -221
  23. package/network/events/index.d.ts +0 -42
  24. package/network/events/index.js +0 -43
  25. package/network/events/protocol.d.ts +0 -27
  26. package/network/events/protocol.js +0 -66
  27. package/network/events/registry.d.ts +0 -8
  28. package/network/events/registry.js +0 -3
  29. package/network/server/index.d.ts +0 -14
  30. package/network/server/index.js +0 -219
  31. package/network/server/utils.d.ts +0 -18
  32. package/network/server/utils.js +0 -135
  33. package/server/env-var.d.ts +0 -15
  34. package/server/env-var.js +0 -31
  35. package/server/index.d.ts +0 -2
  36. package/server/index.js +0 -3
  37. package/server/storage/constants.d.ts +0 -23
  38. package/server/storage/constants.js +0 -2
  39. package/server/storage/index.d.ts +0 -22
  40. package/server/storage/index.js +0 -29
  41. package/server/storage/player.d.ts +0 -43
  42. package/server/storage/player.js +0 -92
  43. package/server/storage/scene.d.ts +0 -38
  44. package/server/storage/scene.js +0 -90
  45. package/server/storage-url.d.ts +0 -10
  46. package/server/storage-url.js +0 -29
  47. package/server/utils.d.ts +0 -35
  48. package/server/utils.js +0 -56
  49. package/src/atom.ts +0 -98
  50. package/src/future.ts +0 -38
  51. package/src/network/chunking.ts +0 -45
  52. package/src/network/events/implementation.ts +0 -271
  53. package/src/network/events/index.ts +0 -48
  54. package/src/network/events/protocol.ts +0 -94
  55. package/src/network/events/registry.ts +0 -18
  56. package/src/network/server/index.ts +0 -301
  57. package/src/network/server/utils.ts +0 -189
  58. package/src/server/env-var.ts +0 -36
  59. package/src/server/index.ts +0 -2
  60. package/src/server/storage/constants.ts +0 -22
  61. package/src/server/storage/index.ts +0 -44
  62. package/src/server/storage/player.ts +0 -156
  63. package/src/server/storage/scene.ts +0 -149
  64. package/src/server/storage-url.ts +0 -34
  65. package/src/server/utils.ts +0 -73
@@ -1,93 +0,0 @@
1
- import { IEngine } from '@dcl/ecs';
2
- import { EventTypes, EventSchemaRegistry } from './registry';
3
- import { Atom } from '../../atom';
4
- export type EventContext = {
5
- from: string;
6
- };
7
- export type EventCallback<T> = (data: T, context?: EventContext) => void;
8
- export type SendOptions = {
9
- to?: string[];
10
- };
11
- export declare class Room<T extends EventSchemaRegistry = EventSchemaRegistry> {
12
- private listeners;
13
- private binaryMessageBus;
14
- private isServerFuture;
15
- private isRoomReadyAtom;
16
- private messageQueue;
17
- private isProcessingQueue;
18
- constructor(_engine: IEngine, binaryMessageBus: any, isServerFn: Atom<boolean>, isRoomReadyAtom: Atom<boolean>);
19
- /**
20
- * Flush queued messages when room becomes ready
21
- */
22
- private flushMessageQueue;
23
- /**
24
- * Send an event
25
- * @param eventType - The type of event from the registry
26
- * @param data - The event data matching the schema
27
- * @param options - Optional send options (server only)
28
- *
29
- * Messages are automatically queued if the room is not ready and sent once connected.
30
- */
31
- send<K extends keyof T>(eventType: K, data: EventTypes<T>[K], options?: SendOptions): Promise<void>;
32
- /**
33
- * Listen for an event
34
- * @param eventType - The type of event to listen for
35
- * @param callback - Callback to handle the event
36
- * @returns Unsubscribe function
37
- */
38
- onMessage<K extends keyof T>(eventType: K, callback: EventCallback<EventTypes<T>[K]>): () => void;
39
- /**
40
- * Remove all listeners for a specific event type
41
- * @param eventType - The type of event to clear listeners for
42
- */
43
- clear<K extends keyof T>(eventType?: K): void;
44
- /**
45
- * Get the number of listeners for an event type
46
- * @param eventType - The type of event to check
47
- * @returns Number of registered listeners
48
- */
49
- listenerCount<K extends keyof T>(eventType: K): number;
50
- /**
51
- * Check if the room is ready to send messages
52
- * @returns true if messages will be sent immediately, false if they will be queued
53
- */
54
- isReady(): boolean;
55
- /**
56
- * Subscribe to room readiness changes
57
- * @param callback - Called when room becomes ready or disconnected
58
- * @returns Unsubscribe function
59
- *
60
- * @example
61
- * ```ts
62
- * const unsubscribe = room.onReady((isReady) => {
63
- * if (isReady) {
64
- * console.log('Room connected!')
65
- * } else {
66
- * console.log('Room disconnected')
67
- * }
68
- * })
69
- *
70
- * // Later: unsubscribe()
71
- * ```
72
- */
73
- onReady(callback: (isReady: boolean) => void): () => void;
74
- }
75
- /**
76
- * Register message schemas for use with the room
77
- * Call this before main() to define your custom messages
78
- * @param messages - Object containing your message schemas
79
- * @returns Typed room instance for your registered messages
80
- */
81
- export declare function registerMessages<T extends EventSchemaRegistry>(messages: T): Room<T>;
82
- /**
83
- * Get a typed version of the global room
84
- * Use this when you want the room with your specific message types
85
- *
86
- * @example
87
- * ```typescript
88
- * const MyMessages = { ... }
89
- * registerMessages(MyMessages) // Register first
90
- * const room = getRoom<typeof MyMessages>() // Then get typed version
91
- * ```
92
- */
93
- export declare function getRoom<T extends EventSchemaRegistry>(): Room<T>;
@@ -1,221 +0,0 @@
1
- import { CommsMessage } from '../binary-message-bus';
2
- import { AUTH_SERVER_PEER_ID } from '../message-bus-sync';
3
- import { encodeEvent, decodeEvent } from './protocol';
4
- import { future } from '../../future';
5
- export class Room {
6
- constructor(_engine, binaryMessageBus, isServerFn, isRoomReadyAtom) {
7
- this.listeners = new Map();
8
- this.isServerFuture = future();
9
- this.messageQueue = [];
10
- this.isProcessingQueue = false;
11
- void isServerFn.deref().then(($) => this.isServerFuture.resolve($));
12
- this.binaryMessageBus = binaryMessageBus;
13
- this.isRoomReadyAtom = isRoomReadyAtom;
14
- // Subscribe to room readiness changes to flush queue
15
- this.isRoomReadyAtom.observable.add((isReady) => {
16
- if (isReady && this.messageQueue.length > 0) {
17
- void this.flushMessageQueue();
18
- }
19
- });
20
- // Listen for CUSTOM_EVENT messages
21
- binaryMessageBus.on(CommsMessage.CUSTOM_EVENT, (data, sender) => {
22
- try {
23
- const { eventType, payload } = decodeEvent(data, globalEventRegistry);
24
- const callbacks = this.listeners.get(eventType);
25
- if (callbacks) {
26
- callbacks.forEach(async (cb) => {
27
- if (await this.isServerFuture) {
28
- // Server handlers receive sender context
29
- cb(payload, { from: sender });
30
- }
31
- else if (sender === AUTH_SERVER_PEER_ID) {
32
- // Client only processes events from authoritative server
33
- cb(payload);
34
- }
35
- });
36
- }
37
- }
38
- catch (error) {
39
- console.error('[EventBus] Failed to decode event:', error);
40
- }
41
- });
42
- }
43
- /**
44
- * Flush queued messages when room becomes ready
45
- */
46
- async flushMessageQueue() {
47
- if (this.isProcessingQueue || this.messageQueue.length === 0)
48
- return;
49
- this.isProcessingQueue = true;
50
- // Copy and clear the queue to avoid mutation during iteration
51
- const messages = [...this.messageQueue];
52
- this.messageQueue.length = 0;
53
- // Re-send all queued messages
54
- for (const message of messages) {
55
- await this.send(message.eventType, message.data, message.options);
56
- }
57
- this.isProcessingQueue = false;
58
- }
59
- /**
60
- * Send an event
61
- * @param eventType - The type of event from the registry
62
- * @param data - The event data matching the schema
63
- * @param options - Optional send options (server only)
64
- *
65
- * Messages are automatically queued if the room is not ready and sent once connected.
66
- */
67
- async send(eventType, data, options) {
68
- try {
69
- const isRoomReady = this.isRoomReadyAtom.getOrNull() ?? false;
70
- // If room is not ready, queue the message with original params
71
- if (!isRoomReady) {
72
- this.messageQueue.push({
73
- eventType,
74
- data,
75
- options
76
- });
77
- return;
78
- }
79
- // Room is ready, send immediately
80
- const buffer = encodeEvent(eventType, data, globalEventRegistry);
81
- if (await this.isServerFuture) {
82
- // Server can send to specific clients or broadcast
83
- this.binaryMessageBus.emit(CommsMessage.CUSTOM_EVENT, buffer, options?.to);
84
- }
85
- else {
86
- // Client always sends to authoritative server
87
- this.binaryMessageBus.emit(CommsMessage.CUSTOM_EVENT, buffer);
88
- }
89
- }
90
- catch (error) {
91
- console.error(`[EventBus] Failed to send event '${String(eventType)}':`, error);
92
- }
93
- }
94
- /**
95
- * Listen for an event
96
- * @param eventType - The type of event to listen for
97
- * @param callback - Callback to handle the event
98
- * @returns Unsubscribe function
99
- */
100
- onMessage(eventType, callback) {
101
- if (!this.listeners.has(eventType)) {
102
- this.listeners.set(eventType, new Set());
103
- }
104
- const callbacks = this.listeners.get(eventType);
105
- callbacks.add(callback);
106
- // Return unsubscribe function
107
- return () => {
108
- callbacks.delete(callback);
109
- if (callbacks.size === 0) {
110
- this.listeners.delete(eventType);
111
- }
112
- };
113
- }
114
- /**
115
- * Remove all listeners for a specific event type
116
- * @param eventType - The type of event to clear listeners for
117
- */
118
- clear(eventType) {
119
- if (eventType) {
120
- this.listeners.delete(eventType);
121
- }
122
- else {
123
- this.listeners.clear();
124
- }
125
- }
126
- /**
127
- * Get the number of listeners for an event type
128
- * @param eventType - The type of event to check
129
- * @returns Number of registered listeners
130
- */
131
- listenerCount(eventType) {
132
- return this.listeners.get(eventType)?.size ?? 0;
133
- }
134
- /**
135
- * Check if the room is ready to send messages
136
- * @returns true if messages will be sent immediately, false if they will be queued
137
- */
138
- isReady() {
139
- return this.isRoomReadyAtom.getOrNull() ?? false;
140
- }
141
- /**
142
- * Subscribe to room readiness changes
143
- * @param callback - Called when room becomes ready or disconnected
144
- * @returns Unsubscribe function
145
- *
146
- * @example
147
- * ```ts
148
- * const unsubscribe = room.onReady((isReady) => {
149
- * if (isReady) {
150
- * console.log('Room connected!')
151
- * } else {
152
- * console.log('Room disconnected')
153
- * }
154
- * })
155
- *
156
- * // Later: unsubscribe()
157
- * ```
158
- */
159
- onReady(callback) {
160
- const observer = this.isRoomReadyAtom.observable.add((isReady) => {
161
- callback(isReady);
162
- });
163
- return () => {
164
- if (observer) {
165
- this.isRoomReadyAtom.observable.remove(observer);
166
- }
167
- };
168
- }
169
- }
170
- // Global registry for user-defined events
171
- const globalEventRegistry = {};
172
- /**
173
- * Get the global event registry (internal use)
174
- * @internal
175
- */
176
- export function getEventRegistry() {
177
- return globalEventRegistry;
178
- }
179
- // Global room instance (created by addSyncTransport)
180
- let globalRoom = null;
181
- /**
182
- * Set the global room instance (internal use)
183
- * @internal
184
- */
185
- export function setGlobalRoom(roomInstance) {
186
- globalRoom = roomInstance;
187
- }
188
- /**
189
- * Register message schemas for use with the room
190
- * Call this before main() to define your custom messages
191
- * @param messages - Object containing your message schemas
192
- * @returns Typed room instance for your registered messages
193
- */
194
- export function registerMessages(messages) {
195
- Object.assign(globalEventRegistry, messages);
196
- if (!globalRoom) {
197
- throw new Error('Room not initialized. Make sure the SDK network transport is initialized.');
198
- }
199
- // Update the room registry
200
- ;
201
- globalRoom.registry = globalEventRegistry;
202
- return globalRoom;
203
- }
204
- /**
205
- * Get a typed version of the global room
206
- * Use this when you want the room with your specific message types
207
- *
208
- * @example
209
- * ```typescript
210
- * const MyMessages = { ... }
211
- * registerMessages(MyMessages) // Register first
212
- * const room = getRoom<typeof MyMessages>() // Then get typed version
213
- * ```
214
- */
215
- export function getRoom() {
216
- if (!globalRoom) {
217
- throw new Error('Room not initialized. Make sure the SDK network transport is initialized.');
218
- }
219
- return globalRoom;
220
- }
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wbGVtZW50YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9ldmVudHMvaW1wbGVtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRXpELE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXJELE9BQU8sRUFBRSxNQUFNLEVBQVcsTUFBTSxjQUFjLENBQUE7QUEyQjlDLE1BQU0sT0FBTyxJQUFJO0lBUWYsWUFBWSxPQUFnQixFQUFFLGdCQUFxQixFQUFFLFVBQXlCLEVBQUUsZUFBOEI7UUFQdEcsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQyxDQUFBO1FBRXZELG1CQUFjLEdBQXFCLE1BQU0sRUFBRSxDQUFBO1FBRTNDLGlCQUFZLEdBQXVCLEVBQUUsQ0FBQTtRQUNyQyxzQkFBaUIsR0FBRyxLQUFLLENBQUE7UUFHL0IsS0FBSyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRW5FLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQTtRQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQTtRQUV0QyxxREFBcUQ7UUFDckQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUMsSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO2FBQzlCO1FBQ0gs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TSxVQUFVLE9BQU87SUFDckIsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQTtLQUM3RjtJQUNELE9BQU8sVUFBZ0MsQ0FBQTtBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUVuZ2luZSB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgQ29tbXNNZXNzYWdlIH0gZnJvbSAnLi4vYmluYXJ5LW1lc3NhZ2UtYnVzJ1xuaW1wb3J0IHsgQVVUSF9TRVJWRVJfUEVFUl9JRCB9IGZyb20gJy4uL21lc3NhZ2UtYnVzLXN5bmMnXG5pbXBvcnQgeyBFdmVudFR5cGVzLCBFdmVudFNjaGVtYVJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeSdcbmltcG9ydCB7IGVuY29kZUV2ZW50LCBkZWNvZGVFdmVudCB9IGZyb20gJy4vcHJvdG9jb2wnXG5pbXBvcnQgeyBBdG9tIH0gZnJvbSAnLi4vLi4vYXRvbSdcbmltcG9ydCB7IGZ1dHVyZSwgSUZ1dHVyZSB9IGZyb20gJy4uLy4uL2Z1dHVyZSdcblxuLy8gQ29udGV4dCBwcm92aWRlZCB0byBzZXJ2ZXItc2lkZSBldmVudCBoYW5kbGVyc1xuZXhwb3J0IHR5cGUgRXZlbnRDb250ZXh0ID0ge1xuICBmcm9tOiBzdHJpbmdcbn1cblxuLy8gRXZlbnQgY2FsbGJhY2sgdHlwZSAtIHNlcnZlciBnZXRzIGNvbnRleHQsIGNsaWVudCBkb2Vzbid0XG5leHBvcnQgdHlwZSBFdmVudENhbGxiYWNrPFQ+ID0gKGRhdGE6IFQsIGNvbnRleHQ/OiBFdmVudENvbnRleHQpID0+IHZvaWRcblxuLy8gT3B0aW9ucyBmb3Igc2VuZGluZyBldmVudHNcbmV4cG9ydCB0eXBlIFNlbmRPcHRpb25zID0ge1xuICB0bz86IHN0cmluZ1tdIC8vIFRhcmdldCBzcGVjaWZpYyBwZWVycyAoc2VydmVyIG9ubHkpXG59XG5cbi8qKlxuICogUm9vbSBwcm92aWRlcyB0eXBlLXNhZmUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGNsaWVudHMgYW5kIHNlcnZlclxuICogVXNlcyBiaW5hcnkgc2VyaWFsaXphdGlvbiB3aXRoIFNjaGVtYSBkZWZpbml0aW9ucyBmb3IgZWZmaWNpZW5jeVxuICovXG50eXBlIFF1ZXVlZE1lc3NhZ2U8VCBleHRlbmRzIEV2ZW50U2NoZW1hUmVnaXN0cnkgPSBFdmVudFNjaGVtYVJlZ2lzdHJ5PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IHtcbiAgICBldmVudFR5cGU6IEtcbiAgICBkYXRhOiBFdmVudFR5cGVzPFQ+W0tdXG4gICAgb3B0aW9ucz86IFNlbmRPcHRpb25zXG4gIH1cbn1ba2V5b2YgVF1cblxuZXhwb3J0IGNsYXNzIFJvb208VCBleHRlbmRzIEV2ZW50U2NoZW1hUmVnaXN0cnkgPSBFdmVudFNjaGVtYVJlZ2lzdHJ5PiB7XG4gIHByaXZhdGUgbGlzdGVuZXJzID0gbmV3IE1hcDxrZXlvZiBULCBTZXQ8RXZlbnRDYWxsYmFjazxhbnk+Pj4oKVxuICBwcml2YXRlIGJpbmFyeU1lc3NhZ2VCdXM6IGFueVxuICBwcml2YXRlIGlzU2VydmVyRnV0dXJlOiBJRnV0dXJlPGJvb2xlYW4+ID0gZnV0dXJlKClcbiAgcHJpdmF0ZSBpc1Jvb21SZWFkeUF0b206IEF0b208Ym9vbGVhbj5cbiAgcHJpdmF0ZSBtZXNzYWdlUXVldWU6IFF1ZXVlZE1lc3NhZ2U8VD5bXSA9IFtdXG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nUXVldWUgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKF9lbmdpbmU6IElFbmdpbmUsIGJpbmFyeU1lc3NhZ2VCdXM6IGFueSwgaXNTZXJ2ZXJGbjogQXRvbTxib29sZWFuPiwgaXNSb29tUmVhZHlBdG9tOiBBdG9tPGJvb2xlYW4+KSB7XG4gICAgdm9pZCBpc1NlcnZlckZuLmRlcmVmKCkudGhlbigoJCkgPT4gdGhpcy5pc1NlcnZlckZ1dHVyZS5yZXNvbHZlKCQpKVxuXG4gICAgdGhpcy5iaW5hcnlNZXNzYWdlQnVzID0gYmluYXJ5TWVzc2FnZUJ1c1xuICAgIHRoaXMuaXNSb29tUmVhZHlBdG9tID0gaXNSb29tUmVhZHlBdG9tXG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gcm9vbSByZWFkaW5lc3MgY2hhbmdlcyB0byBmbHVzaCBxdWV1ZVxuICAgIHRoaXMuaXNSb29tUmVhZHlBdG9tLm9ic2VydmFibGUuYWRkKChpc1JlYWR5KSA9PiB7XG4gICAgICBpZiAoaXNSZWFkeSAmJiB0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZvaWQgdGhpcy5mbHVzaE1lc3NhZ2VRdWV1ZSgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBMaXN0ZW4gZm9yIENVU1RPTV9FVkVOVCBtZXNzYWdlc1xuICAgIGJpbmFyeU1lc3NhZ2VCdXMub24oQ29tbXNNZXNzYWdlLkNVU1RPTV9FVkVOVCwgKGRhdGE6IFVpbnQ4QXJyYXksIHNlbmRlcjogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGV2ZW50VHlwZSwgcGF5bG9hZCB9ID0gZGVjb2RlRXZlbnQoZGF0YSwgZ2xvYmFsRXZlbnRSZWdpc3RyeSlcbiAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSlcblxuICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goYXN5bmMgKGNiKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5pc1NlcnZlckZ1dHVyZSkge1xuICAgICAgICAgICAgICAvLyBTZXJ2ZXIgaGFuZGxlcnMgcmVjZWl2ZSBzZW5kZXIgY29udGV4dFxuICAgICAgICAgICAgICBjYihwYXlsb2FkLCB7IGZyb206IHNlbmRlciB9KVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZW5kZXIgPT09IEFVVEhfU0VSVkVSX1BFRVJfSUQpIHtcbiAgICAgICAgICAgICAgLy8gQ2xpZW50IG9ubHkgcHJvY2Vzc2VzIGV2ZW50cyBmcm9tIGF1dGhvcml0YXRpdmUgc2VydmVyXG4gICAgICAgICAgICAgIGNiKHBheWxvYWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW0V2ZW50QnVzXSBGYWlsZWQgdG8gZGVjb2RlIGV2ZW50OicsIGVycm9yKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggcXVldWVkIG1lc3NhZ2VzIHdoZW4gcm9vbSBiZWNvbWVzIHJlYWR5XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZsdXNoTWVzc2FnZVF1ZXVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlIHx8IHRoaXMubWVzc2FnZVF1ZXVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICB0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlID0gdHJ1ZVxuXG4gICAgLy8gQ29weSBhbmQgY2xlYXIgdGhlIHF1ZXVlIHRvIGF2b2lkIG11dGF0aW9uIGR1cmluZyBpdGVyYXRpb25cbiAgICBjb25zdCBtZXNzYWdlcyA9IFsuLi50aGlzLm1lc3NhZ2VRdWV1ZV1cbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5sZW5ndGggPSAwXG5cbiAgICAvLyBSZS1zZW5kIGFsbCBxdWV1ZWQgbWVzc2FnZXNcbiAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgbWVzc2FnZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZChtZXNzYWdlLmV2ZW50VHlwZSwgbWVzc2FnZS5kYXRhLCBtZXNzYWdlLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb2Nlc3NpbmdRdWV1ZSA9IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhbiBldmVudFxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQgZnJvbSB0aGUgcmVnaXN0cnlcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZXZlbnQgZGF0YSBtYXRjaGluZyB0aGUgc2NoZW1hXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2VuZCBvcHRpb25zIChzZXJ2ZXIgb25seSlcbiAgICpcbiAgICogTWVzc2FnZXMgYXJlIGF1dG9tYXRpY2FsbHkgcXVldWVkIGlmIHRoZSByb29tIGlzIG5vdCByZWFkeSBhbmQgc2VudCBvbmNlIGNvbm5lY3RlZC5cbiAgICovXG4gIGFzeW5jIHNlbmQ8SyBleHRlbmRzIGtleW9mIFQ+KGV2ZW50VHlwZTogSywgZGF0YTogRXZlbnRUeXBlczxUPltLXSwgb3B0aW9ucz86IFNlbmRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGlzUm9vbVJlYWR5ID0gdGhpcy5pc1Jvb21SZWFkeUF0b20uZ2V0T3JOdWxsKCkgPz8gZmFsc2VcblxuICAgICAgLy8gSWYgcm9vbSBpcyBub3QgcmVhZHksIHF1ZXVlIHRoZSBtZXNzYWdlIHdpdGggb3JpZ2luYWwgcGFyYW1zXG4gICAgICBpZiAoIWlzUm9vbVJlYWR5KSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVF1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50VHlwZSxcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFJvb20gaXMgcmVhZHksIHNlbmQgaW1tZWRpYXRlbHlcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGVuY29kZUV2ZW50KGV2ZW50VHlwZSBhcyBzdHJpbmcsIGRhdGEsIGdsb2JhbEV2ZW50UmVnaXN0cnkpXG5cbiAgICAgIGlmIChhd2FpdCB0aGlzLmlzU2VydmVyRnV0dXJlKSB7XG4gICAgICAgIC8vIFNlcnZlciBjYW4gc2VuZCB0byBzcGVjaWZpYyBjbGllbnRzIG9yIGJyb2FkY2FzdFxuICAgICAgICB0aGlzLmJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1VTVE9NX0VWRU5ULCBidWZmZXIsIG9wdGlvbnM/LnRvKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ2xpZW50IGFsd2F5cyBzZW5kcyB0byBhdXRob3JpdGF0aXZlIHNlcnZlclxuICAgICAgICB0aGlzLmJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1VTVE9NX0VWRU5ULCBidWZmZXIpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtFdmVudEJ1c10gRmFpbGVkIHRvIHNlbmQgZXZlbnQgJyR7U3RyaW5nKGV2ZW50VHlwZSl9JzpgLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBhbiBldmVudFxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVGhlIHR5cGUgb2YgZXZlbnQgdG8gbGlzdGVuIGZvclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBoYW5kbGUgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIFVuc3Vic2NyaWJlIGZ1bmN0aW9uXG4gICAqL1xuICBvbk1lc3NhZ2U8SyBleHRlbmRzIGtleW9mIFQ+KGV2ZW50VHlwZTogSywgY2FsbGJhY2s6IEV2ZW50Q2FsbGJhY2s8RXZlbnRUeXBlczxUPltLXT4pOiAoKSA9PiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5zZXQoZXZlbnRUeXBlLCBuZXcgU2V0KCkpXG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSkhXG4gICAgY2FsbGJhY2tzLmFkZChjYWxsYmFjaylcblxuICAgIC8vIFJldHVybiB1bnN1YnNjcmliZSBmdW5jdGlvblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKVxuICAgICAgaWYgKGNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZShldmVudFR5cGUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZvciBhIHNwZWNpZmljIGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGNsZWFyIGxpc3RlbmVycyBmb3JcbiAgICovXG4gIGNsZWFyPEsgZXh0ZW5kcyBrZXlvZiBUPihldmVudFR5cGU/OiBLKTogdm9pZCB7XG4gICAgaWYgKGV2ZW50VHlwZSkge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuZGVsZXRlKGV2ZW50VHlwZSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5saXN0ZW5lcnMuY2xlYXIoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50IHR5cGVcbiAgICogQHBhcmFtIGV2ZW50VHlwZSAtIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGNoZWNrXG4gICAqIEByZXR1cm5zIE51bWJlciBvZiByZWdpc3RlcmVkIGxpc3RlbmVyc1xuICAgKi9cbiAgbGlzdGVuZXJDb3VudDxLIGV4dGVuZHMga2V5b2YgVD4oZXZlbnRUeXBlOiBLKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuZ2V0KGV2ZW50VHlwZSk/LnNpemUgPz8gMFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSByb29tIGlzIHJlYWR5IHRvIHNlbmQgbWVzc2FnZXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBtZXNzYWdlcyB3aWxsIGJlIHNlbnQgaW1tZWRpYXRlbHksIGZhbHNlIGlmIHRoZXkgd2lsbCBiZSBxdWV1ZWRcbiAgICovXG4gIGlzUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNSb29tUmVhZHlBdG9tLmdldE9yTnVsbCgpID8/IGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIHJvb20gcmVhZGluZXNzIGNoYW5nZXNcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHdoZW4gcm9vbSBiZWNvbWVzIHJlYWR5IG9yIGRpc2Nvbm5lY3RlZFxuICAgKiBAcmV0dXJucyBVbnN1YnNjcmliZSBmdW5jdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBjb25zdCB1bnN1YnNjcmliZSA9IHJvb20ub25SZWFkeSgoaXNSZWFkeSkgPT4ge1xuICAgKiAgIGlmIChpc1JlYWR5KSB7XG4gICAqICAgICBjb25zb2xlLmxvZygnUm9vbSBjb25uZWN0ZWQhJylcbiAgICogICB9IGVsc2Uge1xuICAgKiAgICAgY29uc29sZS5sb2coJ1Jvb20gZGlzY29ubmVjdGVkJylcbiAgICogICB9XG4gICAqIH0pXG4gICAqXG4gICAqIC8vIExhdGVyOiB1bnN1YnNjcmliZSgpXG4gICAqIGBgYFxuICAgKi9cbiAgb25SZWFkeShjYWxsYmFjazogKGlzUmVhZHk6IGJvb2xlYW4pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBvYnNlcnZlciA9IHRoaXMuaXNSb29tUmVhZHlBdG9tLm9ic2VydmFibGUuYWRkKChpc1JlYWR5KSA9PiB7XG4gICAgICBjYWxsYmFjayhpc1JlYWR5KVxuICAgIH0pXG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICAgIHRoaXMuaXNSb29tUmVhZHlBdG9tLm9ic2VydmFibGUucmVtb3ZlKG9ic2VydmVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBHbG9iYWwgcmVnaXN0cnkgZm9yIHVzZXItZGVmaW5lZCBldmVudHNcbmNvbnN0IGdsb2JhbEV2ZW50UmVnaXN0cnk6IEV2ZW50U2NoZW1hUmVnaXN0cnkgPSB7fVxuXG4vKipcbiAqIEdldCB0aGUgZ2xvYmFsIGV2ZW50IHJlZ2lzdHJ5IChpbnRlcm5hbCB1c2UpXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50UmVnaXN0cnkoKTogRXZlbnRTY2hlbWFSZWdpc3RyeSB7XG4gIHJldHVybiBnbG9iYWxFdmVudFJlZ2lzdHJ5XG59XG5cbi8vIEdsb2JhbCByb29tIGluc3RhbmNlIChjcmVhdGVkIGJ5IGFkZFN5bmNUcmFuc3BvcnQpXG5sZXQgZ2xvYmFsUm9vbTogUm9vbSB8IG51bGwgPSBudWxsXG5cbi8qKlxuICogU2V0IHRoZSBnbG9iYWwgcm9vbSBpbnN0YW5jZSAoaW50ZXJuYWwgdXNlKVxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRHbG9iYWxSb29tKHJvb21JbnN0YW5jZTogUm9vbSk6IHZvaWQge1xuICBnbG9iYWxSb29tID0gcm9vbUluc3RhbmNlXG59XG5cbi8qKlxuICogUmVnaXN0ZXIgbWVzc2FnZSBzY2hlbWFzIGZvciB1c2Ugd2l0aCB0aGUgcm9vbVxuICogQ2FsbCB0aGlzIGJlZm9yZSBtYWluKCkgdG8gZGVmaW5lIHlvdXIgY3VzdG9tIG1lc3NhZ2VzXG4gKiBAcGFyYW0gbWVzc2FnZXMgLSBPYmplY3QgY29udGFpbmluZyB5b3VyIG1lc3NhZ2Ugc2NoZW1hc1xuICogQHJldHVybnMgVHlwZWQgcm9vbSBpbnN0YW5jZSBmb3IgeW91ciByZWdpc3RlcmVkIG1lc3NhZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1lc3NhZ2VzPFQgZXh0ZW5kcyBFdmVudFNjaGVtYVJlZ2lzdHJ5PihtZXNzYWdlczogVCk6IFJvb208VD4ge1xuICBPYmplY3QuYXNzaWduKGdsb2JhbEV2ZW50UmVnaXN0cnksIG1lc3NhZ2VzKVxuICBpZiAoIWdsb2JhbFJvb20pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Jvb20gbm90IGluaXRpYWxpemVkLiBNYWtlIHN1cmUgdGhlIFNESyBuZXR3b3JrIHRyYW5zcG9ydCBpcyBpbml0aWFsaXplZC4nKVxuICB9XG4gIC8vIFVwZGF0ZSB0aGUgcm9vbSByZWdpc3RyeVxuICA7KGdsb2JhbFJvb20gYXMgYW55KS5yZWdpc3RyeSA9IGdsb2JhbEV2ZW50UmVnaXN0cnlcbiAgcmV0dXJuIGdsb2JhbFJvb20gYXMgdW5rbm93biBhcyBSb29tPFQ+XG59XG5cbi8qKlxuICogR2V0IGEgdHlwZWQgdmVyc2lvbiBvZiB0aGUgZ2xvYmFsIHJvb21cbiAqIFVzZSB0aGlzIHdoZW4geW91IHdhbnQgdGhlIHJvb20gd2l0aCB5b3VyIHNwZWNpZmljIG1lc3NhZ2UgdHlwZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgTXlNZXNzYWdlcyA9IHsgLi4uIH1cbiAqIHJlZ2lzdGVyTWVzc2FnZXMoTXlNZXNzYWdlcykgLy8gUmVnaXN0ZXIgZmlyc3RcbiAqIGNvbnN0IHJvb20gPSBnZXRSb29tPHR5cGVvZiBNeU1lc3NhZ2VzPigpIC8vIFRoZW4gZ2V0IHR5cGVkIHZlcnNpb25cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9vbTxUIGV4dGVuZHMgRXZlbnRTY2hlbWFSZWdpc3RyeT4oKTogUm9vbTxUPiB7XG4gIGlmICghZ2xvYmFsUm9vbSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUm9vbSBub3QgaW5pdGlhbGl6ZWQuIE1ha2Ugc3VyZSB0aGUgU0RLIG5ldHdvcmsgdHJhbnNwb3J0IGlzIGluaXRpYWxpemVkLicpXG4gIH1cbiAgcmV0dXJuIGdsb2JhbFJvb20gYXMgdW5rbm93biBhcyBSb29tPFQ+XG59XG4iXX0=
@@ -1,42 +0,0 @@
1
- /**
2
- * Room - Multiplayer messaging for SDK7
3
- *
4
- * Simple room-based communication system for multiplayer scenes.
5
- *
6
- * @example Basic usage:
7
- * ```typescript
8
- * import { registerMessages, getRoom, isServer } from '@dcl/sdk/network/events'
9
- *
10
- * const MyMessages = {
11
- * playerJump: Schemas.Map({ playerId: Schemas.String, position: Schemas.Vector3 }),
12
- * gameUpdate: Schemas.Map({ message: Schemas.String })
13
- * }
14
- *
15
- * // Option 1: Register and get typed room
16
- * const room = registerMessages(MyMessages)
17
- *
18
- * // Option 2: Register first, then get typed room
19
- * // registerMessages(MyMessages)
20
- * // const room = getRoom<typeof MyMessages>()
21
- *
22
- * export function main() {
23
- * if (isServer()) {
24
- * room.onMessage('playerJump', (data, context) => {
25
- * console.log(`Player ${context?.from} jumped`)
26
- * room.send('gameUpdate', { message: 'Player jumped!' })
27
- * })
28
- * } else {
29
- * room.send('playerJump', { playerId: 'me', position: { x: 1, y: 2, z: 3 } })
30
- * room.onMessage('gameUpdate', (data) => {
31
- * console.log('Server says:', data.message)
32
- * })
33
- * }
34
- * }
35
- * ```
36
- *
37
- * @packageDocumentation
38
- */
39
- import { registerMessages, getRoom, EventContext } from './implementation';
40
- import { EventSchemaRegistry } from './registry';
41
- export { registerMessages, getRoom };
42
- export type { EventContext, EventSchemaRegistry };
@@ -1,43 +0,0 @@
1
- /**
2
- * Room - Multiplayer messaging for SDK7
3
- *
4
- * Simple room-based communication system for multiplayer scenes.
5
- *
6
- * @example Basic usage:
7
- * ```typescript
8
- * import { registerMessages, getRoom, isServer } from '@dcl/sdk/network/events'
9
- *
10
- * const MyMessages = {
11
- * playerJump: Schemas.Map({ playerId: Schemas.String, position: Schemas.Vector3 }),
12
- * gameUpdate: Schemas.Map({ message: Schemas.String })
13
- * }
14
- *
15
- * // Option 1: Register and get typed room
16
- * const room = registerMessages(MyMessages)
17
- *
18
- * // Option 2: Register first, then get typed room
19
- * // registerMessages(MyMessages)
20
- * // const room = getRoom<typeof MyMessages>()
21
- *
22
- * export function main() {
23
- * if (isServer()) {
24
- * room.onMessage('playerJump', (data, context) => {
25
- * console.log(`Player ${context?.from} jumped`)
26
- * room.send('gameUpdate', { message: 'Player jumped!' })
27
- * })
28
- * } else {
29
- * room.send('playerJump', { playerId: 'me', position: { x: 1, y: 2, z: 3 } })
30
- * room.onMessage('gameUpdate', (data) => {
31
- * console.log('Server says:', data.message)
32
- * })
33
- * }
34
- * }
35
- * ```
36
- *
37
- * @packageDocumentation
38
- */
39
- // Import public API and types
40
- import { registerMessages, getRoom } from './implementation';
41
- // Re-export public API - only what users need
42
- export { registerMessages, getRoom };
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9ldmVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFFSCw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBZ0IsTUFBTSxrQkFBa0IsQ0FBQTtBQUcxRSw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSb29tIC0gTXVsdGlwbGF5ZXIgbWVzc2FnaW5nIGZvciBTREs3XG4gKlxuICogU2ltcGxlIHJvb20tYmFzZWQgY29tbXVuaWNhdGlvbiBzeXN0ZW0gZm9yIG11bHRpcGxheWVyIHNjZW5lcy5cbiAqXG4gKiBAZXhhbXBsZSBCYXNpYyB1c2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IHJlZ2lzdGVyTWVzc2FnZXMsIGdldFJvb20sIGlzU2VydmVyIH0gZnJvbSAnQGRjbC9zZGsvbmV0d29yay9ldmVudHMnXG4gKlxuICogY29uc3QgTXlNZXNzYWdlcyA9IHtcbiAqICAgcGxheWVySnVtcDogU2NoZW1hcy5NYXAoeyBwbGF5ZXJJZDogU2NoZW1hcy5TdHJpbmcsIHBvc2l0aW9uOiBTY2hlbWFzLlZlY3RvcjMgfSksXG4gKiAgIGdhbWVVcGRhdGU6IFNjaGVtYXMuTWFwKHsgbWVzc2FnZTogU2NoZW1hcy5TdHJpbmcgfSlcbiAqIH1cbiAqXG4gKiAvLyBPcHRpb24gMTogUmVnaXN0ZXIgYW5kIGdldCB0eXBlZCByb29tXG4gKiBjb25zdCByb29tID0gcmVnaXN0ZXJNZXNzYWdlcyhNeU1lc3NhZ2VzKVxuICpcbiAqIC8vIE9wdGlvbiAyOiBSZWdpc3RlciBmaXJzdCwgdGhlbiBnZXQgdHlwZWQgcm9vbVxuICogLy8gcmVnaXN0ZXJNZXNzYWdlcyhNeU1lc3NhZ2VzKVxuICogLy8gY29uc3Qgcm9vbSA9IGdldFJvb208dHlwZW9mIE15TWVzc2FnZXM+KClcbiAqXG4gKiBleHBvcnQgZnVuY3Rpb24gbWFpbigpIHtcbiAqICAgaWYgKGlzU2VydmVyKCkpIHtcbiAqICAgICByb29tLm9uTWVzc2FnZSgncGxheWVySnVtcCcsIChkYXRhLCBjb250ZXh0KSA9PiB7XG4gKiAgICAgICBjb25zb2xlLmxvZyhgUGxheWVyICR7Y29udGV4dD8uZnJvbX0ganVtcGVkYClcbiAqICAgICAgIHJvb20uc2VuZCgnZ2FtZVVwZGF0ZScsIHsgbWVzc2FnZTogJ1BsYXllciBqdW1wZWQhJyB9KVxuICogICAgIH0pXG4gKiAgIH0gZWxzZSB7XG4gKiAgICAgcm9vbS5zZW5kKCdwbGF5ZXJKdW1wJywgeyBwbGF5ZXJJZDogJ21lJywgcG9zaXRpb246IHsgeDogMSwgeTogMiwgejogMyB9IH0pXG4gKiAgICAgcm9vbS5vbk1lc3NhZ2UoJ2dhbWVVcGRhdGUnLCAoZGF0YSkgPT4ge1xuICogICAgICAgY29uc29sZS5sb2coJ1NlcnZlciBzYXlzOicsIGRhdGEubWVzc2FnZSlcbiAqICAgICB9KVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vLyBJbXBvcnQgcHVibGljIEFQSSBhbmQgdHlwZXNcbmltcG9ydCB7IHJlZ2lzdGVyTWVzc2FnZXMsIGdldFJvb20sIEV2ZW50Q29udGV4dCB9IGZyb20gJy4vaW1wbGVtZW50YXRpb24nXG5pbXBvcnQgeyBFdmVudFNjaGVtYVJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeSdcblxuLy8gUmUtZXhwb3J0IHB1YmxpYyBBUEkgLSBvbmx5IHdoYXQgdXNlcnMgbmVlZFxuZXhwb3J0IHsgcmVnaXN0ZXJNZXNzYWdlcywgZ2V0Um9vbSB9XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyB0aGF0IHVzZXJzIG5lZWRcbmV4cG9ydCB0eXBlIHsgRXZlbnRDb250ZXh0LCBFdmVudFNjaGVtYVJlZ2lzdHJ5IH1cbiJdfQ==
@@ -1,27 +0,0 @@
1
- import { EventSchemas, EventTypes, EventSchemaRegistry } from './registry';
2
- /**
3
- * Encode an event into a binary buffer
4
- * @param eventType - The type of event from the registry
5
- * @param data - The event data matching the schema
6
- * @param registry - Optional custom registry (defaults to EventSchemas)
7
- * @returns Binary buffer containing the encoded event
8
- */
9
- export declare function encodeEvent<T extends EventSchemaRegistry = typeof EventSchemas, K extends keyof T = keyof T>(eventType: K, data: EventTypes<T>[K], registry?: T): Uint8Array;
10
- /**
11
- * Decode a binary buffer into an event
12
- * @param data - Binary buffer containing the encoded event
13
- * @param registry - Optional custom registry (defaults to EventSchemas)
14
- * @returns Decoded event with type, payload, and timestamp
15
- */
16
- export declare function decodeEvent<T extends EventSchemaRegistry = typeof EventSchemas>(data: Uint8Array, registry?: T): {
17
- eventType: keyof T;
18
- payload: EventTypes<T>[keyof T];
19
- timestamp: number;
20
- };
21
- /**
22
- * Validate if an event type exists in the registry
23
- * @param eventType - The event type to check
24
- * @param registry - Optional custom registry (defaults to EventSchemas)
25
- * @returns True if the event type exists
26
- */
27
- export declare function isValidEventType<T extends EventSchemaRegistry = typeof EventSchemas>(eventType: string, registry?: T): eventType is Extract<keyof T, string>;
@@ -1,66 +0,0 @@
1
- import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
2
- import { Schemas } from '@dcl/ecs';
3
- import { EventSchemas } from './registry';
4
- // Event envelope that wraps all events with metadata
5
- const EventEnvelope = Schemas.Map({
6
- eventType: Schemas.String,
7
- timestamp: Schemas.Int64
8
- });
9
- /**
10
- * Encode an event into a binary buffer
11
- * @param eventType - The type of event from the registry
12
- * @param data - The event data matching the schema
13
- * @param registry - Optional custom registry (defaults to EventSchemas)
14
- * @returns Binary buffer containing the encoded event
15
- */
16
- export function encodeEvent(eventType, data, registry = EventSchemas) {
17
- const buffer = new ReadWriteByteBuffer();
18
- // Write envelope with event type and timestamp
19
- EventEnvelope.serialize({
20
- eventType: eventType,
21
- timestamp: Date.now()
22
- }, buffer);
23
- // Get the schema for this event type
24
- const schema = registry[eventType];
25
- if (!schema) {
26
- throw new Error(`Unknown event type: ${String(eventType)}`);
27
- }
28
- // Write the typed payload
29
- schema.serialize(data, buffer);
30
- return buffer.toBinary();
31
- }
32
- /**
33
- * Decode a binary buffer into an event
34
- * @param data - Binary buffer containing the encoded event
35
- * @param registry - Optional custom registry (defaults to EventSchemas)
36
- * @returns Decoded event with type, payload, and timestamp
37
- */
38
- export function decodeEvent(data, registry = EventSchemas) {
39
- const buffer = new ReadWriteByteBuffer();
40
- buffer.writeBuffer(data, false);
41
- // Read envelope
42
- const envelope = EventEnvelope.deserialize(buffer);
43
- const eventType = envelope.eventType;
44
- // Get the schema for this event type
45
- const schema = registry[eventType];
46
- if (!schema) {
47
- throw new Error(`Unknown event type: ${String(eventType)}`);
48
- }
49
- // Read the typed payload
50
- const payload = schema.deserialize(buffer);
51
- return {
52
- eventType,
53
- payload,
54
- timestamp: envelope.timestamp
55
- };
56
- }
57
- /**
58
- * Validate if an event type exists in the registry
59
- * @param eventType - The event type to check
60
- * @param registry - Optional custom registry (defaults to EventSchemas)
61
- * @returns True if the event type exists
62
- */
63
- export function isValidEventType(eventType, registry = EventSchemas) {
64
- return eventType in registry;
65
- }
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdG9jb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9ldmVudHMvcHJvdG9jb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDNUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFtQyxNQUFNLFlBQVksQ0FBQTtBQUUxRSxxREFBcUQ7QUFDckQsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUNoQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDekIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxLQUFLO0NBQ3pCLENBQUMsQ0FBQTtBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLFNBQVksRUFDWixJQUFzQixFQUN0QixXQUFjLFlBQWlCO0lBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQTtJQUV4QywrQ0FBK0M7SUFDL0MsYUFBYSxDQUFDLFNBQVMsQ0FDckI7UUFDRSxTQUFTLEVBQUUsU0FBbUI7UUFDOUIsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7S0FDdEIsRUFDRCxNQUFNLENBQ1AsQ0FBQTtJQUVELHFDQUFxQztJQUNyQyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDbEMsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUE7S0FDNUQ7SUFFRCwwQkFBMEI7SUFDMUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFFOUIsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDMUIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBZ0IsRUFDaEIsV0FBYyxZQUFpQjtJQU0vQixNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUE7SUFDeEMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFFL0IsZ0JBQWdCO0lBQ2hCLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQW9CLENBQUE7SUFFL0MscUNBQXFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNsQyxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtLQUM1RDtJQUVELHlCQUF5QjtJQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTFDLE9BQU87UUFDTCxTQUFTO1FBQ1QsT0FBTztRQUNQLFNBQVMsRUFBRSxRQUFRLENBQUMsU0FBUztLQUM5QixDQUFBO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixTQUFpQixFQUNqQixXQUFjLFlBQWlCO0lBRS9CLE9BQU8sU0FBUyxJQUFJLFFBQVEsQ0FBQTtBQUM5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuaW1wb3J0IHsgU2NoZW1hcyB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgRXZlbnRTY2hlbWFzLCBFdmVudFR5cGVzLCBFdmVudFNjaGVtYVJlZ2lzdHJ5IH0gZnJvbSAnLi9yZWdpc3RyeSdcblxuLy8gRXZlbnQgZW52ZWxvcGUgdGhhdCB3cmFwcyBhbGwgZXZlbnRzIHdpdGggbWV0YWRhdGFcbmNvbnN0IEV2ZW50RW52ZWxvcGUgPSBTY2hlbWFzLk1hcCh7XG4gIGV2ZW50VHlwZTogU2NoZW1hcy5TdHJpbmcsXG4gIHRpbWVzdGFtcDogU2NoZW1hcy5JbnQ2NFxufSlcblxuLyoqXG4gKiBFbmNvZGUgYW4gZXZlbnQgaW50byBhIGJpbmFyeSBidWZmZXJcbiAqIEBwYXJhbSBldmVudFR5cGUgLSBUaGUgdHlwZSBvZiBldmVudCBmcm9tIHRoZSByZWdpc3RyeVxuICogQHBhcmFtIGRhdGEgLSBUaGUgZXZlbnQgZGF0YSBtYXRjaGluZyB0aGUgc2NoZW1hXG4gKiBAcGFyYW0gcmVnaXN0cnkgLSBPcHRpb25hbCBjdXN0b20gcmVnaXN0cnkgKGRlZmF1bHRzIHRvIEV2ZW50U2NoZW1hcylcbiAqIEByZXR1cm5zIEJpbmFyeSBidWZmZXIgY29udGFpbmluZyB0aGUgZW5jb2RlZCBldmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlRXZlbnQ8VCBleHRlbmRzIEV2ZW50U2NoZW1hUmVnaXN0cnkgPSB0eXBlb2YgRXZlbnRTY2hlbWFzLCBLIGV4dGVuZHMga2V5b2YgVCA9IGtleW9mIFQ+KFxuICBldmVudFR5cGU6IEssXG4gIGRhdGE6IEV2ZW50VHlwZXM8VD5bS10sXG4gIHJlZ2lzdHJ5OiBUID0gRXZlbnRTY2hlbWFzIGFzIFRcbik6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG5cbiAgLy8gV3JpdGUgZW52ZWxvcGUgd2l0aCBldmVudCB0eXBlIGFuZCB0aW1lc3RhbXBcbiAgRXZlbnRFbnZlbG9wZS5zZXJpYWxpemUoXG4gICAge1xuICAgICAgZXZlbnRUeXBlOiBldmVudFR5cGUgYXMgc3RyaW5nLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgfSxcbiAgICBidWZmZXJcbiAgKVxuXG4gIC8vIEdldCB0aGUgc2NoZW1hIGZvciB0aGlzIGV2ZW50IHR5cGVcbiAgY29uc3Qgc2NoZW1hID0gcmVnaXN0cnlbZXZlbnRUeXBlXVxuICBpZiAoIXNjaGVtYSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBldmVudCB0eXBlOiAke1N0cmluZyhldmVudFR5cGUpfWApXG4gIH1cblxuICAvLyBXcml0ZSB0aGUgdHlwZWQgcGF5bG9hZFxuICBzY2hlbWEuc2VyaWFsaXplKGRhdGEsIGJ1ZmZlcilcblxuICByZXR1cm4gYnVmZmVyLnRvQmluYXJ5KClcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBiaW5hcnkgYnVmZmVyIGludG8gYW4gZXZlbnRcbiAqIEBwYXJhbSBkYXRhIC0gQmluYXJ5IGJ1ZmZlciBjb250YWluaW5nIHRoZSBlbmNvZGVkIGV2ZW50XG4gKiBAcGFyYW0gcmVnaXN0cnkgLSBPcHRpb25hbCBjdXN0b20gcmVnaXN0cnkgKGRlZmF1bHRzIHRvIEV2ZW50U2NoZW1hcylcbiAqIEByZXR1cm5zIERlY29kZWQgZXZlbnQgd2l0aCB0eXBlLCBwYXlsb2FkLCBhbmQgdGltZXN0YW1wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVFdmVudDxUIGV4dGVuZHMgRXZlbnRTY2hlbWFSZWdpc3RyeSA9IHR5cGVvZiBFdmVudFNjaGVtYXM+KFxuICBkYXRhOiBVaW50OEFycmF5LFxuICByZWdpc3RyeTogVCA9IEV2ZW50U2NoZW1hcyBhcyBUXG4pOiB7XG4gIGV2ZW50VHlwZToga2V5b2YgVFxuICBwYXlsb2FkOiBFdmVudFR5cGVzPFQ+W2tleW9mIFRdXG4gIHRpbWVzdGFtcDogbnVtYmVyXG59IHtcbiAgY29uc3QgYnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICBidWZmZXIud3JpdGVCdWZmZXIoZGF0YSwgZmFsc2UpXG5cbiAgLy8gUmVhZCBlbnZlbG9wZVxuICBjb25zdCBlbnZlbG9wZSA9IEV2ZW50RW52ZWxvcGUuZGVzZXJpYWxpemUoYnVmZmVyKVxuICBjb25zdCBldmVudFR5cGUgPSBlbnZlbG9wZS5ldmVudFR5cGUgYXMga2V5b2YgVFxuXG4gIC8vIEdldCB0aGUgc2NoZW1hIGZvciB0aGlzIGV2ZW50IHR5cGVcbiAgY29uc3Qgc2NoZW1hID0gcmVnaXN0cnlbZXZlbnRUeXBlXVxuICBpZiAoIXNjaGVtYSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBldmVudCB0eXBlOiAke1N0cmluZyhldmVudFR5cGUpfWApXG4gIH1cblxuICAvLyBSZWFkIHRoZSB0eXBlZCBwYXlsb2FkXG4gIGNvbnN0IHBheWxvYWQgPSBzY2hlbWEuZGVzZXJpYWxpemUoYnVmZmVyKVxuXG4gIHJldHVybiB7XG4gICAgZXZlbnRUeXBlLFxuICAgIHBheWxvYWQsXG4gICAgdGltZXN0YW1wOiBlbnZlbG9wZS50aW1lc3RhbXBcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGlmIGFuIGV2ZW50IHR5cGUgZXhpc3RzIGluIHRoZSByZWdpc3RyeVxuICogQHBhcmFtIGV2ZW50VHlwZSAtIFRoZSBldmVudCB0eXBlIHRvIGNoZWNrXG4gKiBAcGFyYW0gcmVnaXN0cnkgLSBPcHRpb25hbCBjdXN0b20gcmVnaXN0cnkgKGRlZmF1bHRzIHRvIEV2ZW50U2NoZW1hcylcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IHR5cGUgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRXZlbnRUeXBlPFQgZXh0ZW5kcyBFdmVudFNjaGVtYVJlZ2lzdHJ5ID0gdHlwZW9mIEV2ZW50U2NoZW1hcz4oXG4gIGV2ZW50VHlwZTogc3RyaW5nLFxuICByZWdpc3RyeTogVCA9IEV2ZW50U2NoZW1hcyBhcyBUXG4pOiBldmVudFR5cGUgaXMgRXh0cmFjdDxrZXlvZiBULCBzdHJpbmc+IHtcbiAgcmV0dXJuIGV2ZW50VHlwZSBpbiByZWdpc3RyeVxufVxuIl19
@@ -1,8 +0,0 @@
1
- import { ISchema } from '@dcl/ecs';
2
- export type EventSchemaRegistry = Record<string, ISchema>;
3
- export type EventTypes<T extends EventSchemaRegistry = EventSchemaRegistry> = {
4
- [K in keyof T]: T[K] extends ISchema<infer U> ? U : never;
5
- };
6
- export type RegisteredEvents = EventSchemaRegistry;
7
- export declare const EventSchemas: EventSchemaRegistry;
8
- export type ValidateEventRegistry<T extends EventSchemaRegistry> = T;
@@ -1,3 +0,0 @@
1
- // Default empty registry
2
- export const EventSchemas = {};
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9ldmVudHMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFzQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVNjaGVtYSB9IGZyb20gJ0BkY2wvZWNzJ1xuXG4vLyBCYXNlIHR5cGUgZm9yIGV2ZW50IHNjaGVtYSByZWdpc3RyeVxuZXhwb3J0IHR5cGUgRXZlbnRTY2hlbWFSZWdpc3RyeSA9IFJlY29yZDxzdHJpbmcsIElTY2hlbWE+XG5cbi8vIFR5cGUgZXh0cmFjdGlvbiBmcm9tIHNjaGVtYXNcbmV4cG9ydCB0eXBlIEV2ZW50VHlwZXM8VCBleHRlbmRzIEV2ZW50U2NoZW1hUmVnaXN0cnkgPSBFdmVudFNjaGVtYVJlZ2lzdHJ5PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBJU2NoZW1hPGluZmVyIFU+ID8gVSA6IG5ldmVyXG59XG5cbi8vIEdsb2JhbCBpbnRlcmZhY2UgdGhhdCB1c2VycyBjYW4gYXVnbWVudCB3aXRoIHRoZWlyIG93biBldmVudHNcbmV4cG9ydCB0eXBlIFJlZ2lzdGVyZWRFdmVudHMgPSBFdmVudFNjaGVtYVJlZ2lzdHJ5XG5cbi8vIERlZmF1bHQgZW1wdHkgcmVnaXN0cnlcbmV4cG9ydCBjb25zdCBFdmVudFNjaGVtYXMgPSB7fSBhcyBSZWdpc3RlcmVkRXZlbnRzXG5cbi8vIEhlbHBlciB0byBlbnN1cmUgdXNlciBldmVudHMgY29uZm9ybSB0byB0aGUgcmVnaXN0cnkgdHlwZVxuZXhwb3J0IHR5cGUgVmFsaWRhdGVFdmVudFJlZ2lzdHJ5PFQgZXh0ZW5kcyBFdmVudFNjaGVtYVJlZ2lzdHJ5PiA9IFRcbiJdfQ==
@@ -1,14 +0,0 @@
1
- import { IEngine, Entity } from '@dcl/ecs';
2
- import * as utils from './utils';
3
- import { type BinaryMessageBus } from '../binary-message-bus';
4
- export declare const LIVEKIT_MAX_SIZE = 12;
5
- export interface ServerValidationConfig {
6
- engine: IEngine;
7
- binaryMessageBus: ReturnType<typeof BinaryMessageBus>;
8
- }
9
- export declare function createServerValidator(config: ServerValidationConfig): {
10
- findExistingNetworkEntity: (message: utils.NetworkMessage) => Entity | null;
11
- processClientMessages: (value: Uint8Array, sender: string, forceCorrections?: boolean) => Uint8Array;
12
- processServerMessages: (value: Uint8Array, sender: string) => Uint8Array;
13
- convertRegularToNetworkMessage: (regularMessage: Uint8Array) => Uint8Array[];
14
- };