@dcl/sdk 7.21.1-22917715332.commit-e5d969d → 7.21.1-22918726402.commit-ee210ee
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/atom.d.ts +19 -0
- package/atom.js +83 -0
- package/future.d.ts +8 -0
- package/future.js +26 -0
- package/index.js +1 -5
- package/internal/transports/rendererTransport.d.ts +0 -4
- package/internal/transports/rendererTransport.js +1 -8
- package/network/binary-message-bus.d.ts +6 -3
- package/network/binary-message-bus.js +9 -5
- package/network/chunking.d.ts +5 -0
- package/network/chunking.js +38 -0
- package/network/events/implementation.d.ts +93 -0
- package/network/events/implementation.js +221 -0
- package/network/events/index.d.ts +42 -0
- package/network/events/index.js +43 -0
- package/network/events/protocol.d.ts +27 -0
- package/network/events/protocol.js +66 -0
- package/network/events/registry.d.ts +8 -0
- package/network/events/registry.js +3 -0
- package/network/index.d.ts +8 -2
- package/network/index.js +16 -3
- package/network/message-bus-sync.d.ts +14 -1
- package/network/message-bus-sync.js +161 -103
- package/network/server/index.d.ts +14 -0
- package/network/server/index.js +219 -0
- package/network/server/utils.d.ts +18 -0
- package/network/server/utils.js +135 -0
- package/network/state.js +3 -5
- package/package.json +6 -6
- package/platform/index.d.ts +5 -0
- package/platform/index.js +29 -0
- package/players/index.d.ts +0 -1
- package/players/index.js +1 -2
- package/server/env-var.d.ts +15 -0
- package/server/env-var.js +31 -0
- package/server/index.d.ts +2 -0
- package/server/index.js +3 -0
- package/server/storage/constants.d.ts +23 -0
- package/server/storage/constants.js +2 -0
- package/server/storage/index.d.ts +22 -0
- package/server/storage/index.js +29 -0
- package/server/storage/player.d.ts +43 -0
- package/server/storage/player.js +92 -0
- package/server/storage/scene.d.ts +38 -0
- package/server/storage/scene.js +90 -0
- package/server/storage-url.d.ts +10 -0
- package/server/storage-url.js +29 -0
- package/server/utils.d.ts +35 -0
- package/server/utils.js +56 -0
- package/src/atom.ts +98 -0
- package/src/future.ts +38 -0
- package/src/index.ts +1 -5
- package/src/internal/transports/rendererTransport.ts +0 -13
- package/src/network/binary-message-bus.ts +9 -4
- package/src/network/chunking.ts +45 -0
- package/src/network/events/implementation.ts +271 -0
- package/src/network/events/index.ts +48 -0
- package/src/network/events/protocol.ts +94 -0
- package/src/network/events/registry.ts +18 -0
- package/src/network/index.ts +40 -3
- package/src/network/message-bus-sync.ts +174 -110
- package/src/network/server/index.ts +301 -0
- package/src/network/server/utils.ts +189 -0
- package/src/network/state.ts +3 -4
- package/src/platform/index.ts +35 -0
- package/src/players/index.ts +0 -2
- package/src/server/env-var.ts +36 -0
- package/src/server/index.ts +2 -0
- package/src/server/storage/constants.ts +22 -0
- package/src/server/storage/index.ts +44 -0
- package/src/server/storage/player.ts +156 -0
- package/src/server/storage/scene.ts +149 -0
- package/src/server/storage-url.ts +34 -0
- package/src/server/utils.ts +73 -0
- package/src/testing/runtime.ts +3 -3
- package/testing/runtime.js +4 -4
|
@@ -0,0 +1,221 @@
|
|
|
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=
|
|
@@ -0,0 +1,42 @@
|
|
|
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 };
|
|
@@ -0,0 +1,43 @@
|
|
|
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==
|
|
@@ -0,0 +1,27 @@
|
|
|
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>;
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
|
@@ -0,0 +1,8 @@
|
|
|
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;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// Default empty registry
|
|
2
|
+
export const EventSchemas = {};
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9ldmVudHMvcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUEseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFzQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVNjaGVtYSB9IGZyb20gJ0BkY2wvZWNzJ1xuXG4vLyBCYXNlIHR5cGUgZm9yIGV2ZW50IHNjaGVtYSByZWdpc3RyeVxuZXhwb3J0IHR5cGUgRXZlbnRTY2hlbWFSZWdpc3RyeSA9IFJlY29yZDxzdHJpbmcsIElTY2hlbWE+XG5cbi8vIFR5cGUgZXh0cmFjdGlvbiBmcm9tIHNjaGVtYXNcbmV4cG9ydCB0eXBlIEV2ZW50VHlwZXM8VCBleHRlbmRzIEV2ZW50U2NoZW1hUmVnaXN0cnkgPSBFdmVudFNjaGVtYVJlZ2lzdHJ5PiA9IHtcbiAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBJU2NoZW1hPGluZmVyIFU+ID8gVSA6IG5ldmVyXG59XG5cbi8vIEdsb2JhbCBpbnRlcmZhY2UgdGhhdCB1c2VycyBjYW4gYXVnbWVudCB3aXRoIHRoZWlyIG93biBldmVudHNcbmV4cG9ydCB0eXBlIFJlZ2lzdGVyZWRFdmVudHMgPSBFdmVudFNjaGVtYVJlZ2lzdHJ5XG5cbi8vIERlZmF1bHQgZW1wdHkgcmVnaXN0cnlcbmV4cG9ydCBjb25zdCBFdmVudFNjaGVtYXMgPSB7fSBhcyBSZWdpc3RlcmVkRXZlbnRzXG5cbi8vIEhlbHBlciB0byBlbnN1cmUgdXNlciBldmVudHMgY29uZm9ybSB0byB0aGUgcmVnaXN0cnkgdHlwZVxuZXhwb3J0IHR5cGUgVmFsaWRhdGVFdmVudFJlZ2lzdHJ5PFQgZXh0ZW5kcyBFdmVudFNjaGVtYVJlZ2lzdHJ5PiA9IFRcbiJdfQ==
|
package/network/index.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
|
-
declare
|
|
2
|
-
|
|
1
|
+
export declare function isServer(): boolean;
|
|
2
|
+
declare const getChildren: (parent: import("@dcl/ecs").Entity) => Iterable<import("@dcl/ecs").Entity>, syncEntity: (entityId: import("@dcl/ecs").Entity, componentIds: number[], entityEnumId?: number | undefined) => void, parentEntity: (entity: import("@dcl/ecs").Entity, parent: import("@dcl/ecs").Entity) => void, getParent: (child: import("@dcl/ecs").Entity) => import("@dcl/ecs").Entity | undefined, myProfile: import("./message-bus-sync").IProfile, removeParent: (entity: import("@dcl/ecs").Entity) => void, getFirstChild: (entity: import("@dcl/ecs").Entity) => import("@dcl/ecs").Entity, isStateSyncronized: () => boolean, binaryMessageBus: {
|
|
3
|
+
on: <K extends import("./binary-message-bus").CommsMessage>(message: K, callback: (value: Uint8Array, sender: string) => void) => void;
|
|
4
|
+
emit: <K_1 extends import("./binary-message-bus").CommsMessage>(message: K_1, value: Uint8Array, toPeerAddress?: string[] | undefined) => void;
|
|
5
|
+
__processMessages: (messages: Uint8Array[]) => void;
|
|
6
|
+
}, eventBus: import("./events/implementation").Room<import("./events").EventSchemaRegistry>;
|
|
7
|
+
export { registerMessages, getRoom } from './events';
|
|
8
|
+
export { getFirstChild, getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, isStateSyncronized, binaryMessageBus, eventBus };
|
package/network/index.js
CHANGED
|
@@ -2,7 +2,20 @@ import { sendBinary } from '~system/CommunicationsController';
|
|
|
2
2
|
import { engine } from '@dcl/ecs';
|
|
3
3
|
import { addSyncTransport } from './message-bus-sync';
|
|
4
4
|
import { getUserData } from '~system/UserIdentity';
|
|
5
|
+
import { isServer as isServerApi } from '~system/EngineApi';
|
|
6
|
+
import { Atom } from '../atom';
|
|
7
|
+
// Create isServer atom for consistent state
|
|
8
|
+
const isServerAtom = Atom(false);
|
|
9
|
+
void isServerApi({}).then((response) => {
|
|
10
|
+
isServerAtom.swap(!!response.isServer);
|
|
11
|
+
});
|
|
12
|
+
// Helper function to check if running on server
|
|
13
|
+
export function isServer() {
|
|
14
|
+
return isServerAtom.getOrNull() ?? false;
|
|
15
|
+
}
|
|
5
16
|
// initialize sync transport for sdk engine
|
|
6
|
-
const { getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, getFirstChild, isStateSyncronized } = addSyncTransport(engine, sendBinary, getUserData);
|
|
7
|
-
export
|
|
8
|
-
|
|
17
|
+
const { getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, getFirstChild, isStateSyncronized, binaryMessageBus, eventBus } = addSyncTransport(engine, sendBinary, getUserData, isServerApi, 'network');
|
|
18
|
+
// Re-export the room messaging system
|
|
19
|
+
export { registerMessages, getRoom } from './events';
|
|
20
|
+
export { getFirstChild, getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, isStateSyncronized, binaryMessageBus, eventBus };
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFDN0QsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQTtBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDbEQsT0FBTyxFQUFFLFFBQVEsSUFBSSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBRTlCLDRDQUE0QztBQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQVUsS0FBSyxDQUFDLENBQUE7QUFDekMsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7SUFDckMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0FBQ3hDLENBQUMsQ0FBQyxDQUFBO0FBRUYsZ0RBQWdEO0FBQ2hELE1BQU0sVUFBVSxRQUFRO0lBQ3RCLE9BQU8sWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLEtBQUssQ0FBQTtBQUMxQyxDQUFDO0FBRUQsMkNBQTJDO0FBQzNDLE1BQU0sRUFDSixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1QsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUE7QUFFN0Usc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFcEQsT0FBTyxFQUNMLGFBQWEsRUFDYixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFFBQVEsRUFDVCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc2VuZEJpbmFyeSB9IGZyb20gJ35zeXN0ZW0vQ29tbXVuaWNhdGlvbnNDb250cm9sbGVyJ1xuaW1wb3J0IHsgZW5naW5lIH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBhZGRTeW5jVHJhbnNwb3J0IH0gZnJvbSAnLi9tZXNzYWdlLWJ1cy1zeW5jJ1xuaW1wb3J0IHsgZ2V0VXNlckRhdGEgfSBmcm9tICd+c3lzdGVtL1VzZXJJZGVudGl0eSdcbmltcG9ydCB7IGlzU2VydmVyIGFzIGlzU2VydmVyQXBpIH0gZnJvbSAnfnN5c3RlbS9FbmdpbmVBcGknXG5pbXBvcnQgeyBBdG9tIH0gZnJvbSAnLi4vYXRvbSdcblxuLy8gQ3JlYXRlIGlzU2VydmVyIGF0b20gZm9yIGNvbnNpc3RlbnQgc3RhdGVcbmNvbnN0IGlzU2VydmVyQXRvbSA9IEF0b208Ym9vbGVhbj4oZmFsc2UpXG52b2lkIGlzU2VydmVyQXBpKHt9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICBpc1NlcnZlckF0b20uc3dhcCghIXJlc3BvbnNlLmlzU2VydmVyKVxufSlcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHJ1bm5pbmcgb24gc2VydmVyXG5leHBvcnQgZnVuY3Rpb24gaXNTZXJ2ZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1NlcnZlckF0b20uZ2V0T3JOdWxsKCkgPz8gZmFsc2Vcbn1cblxuLy8gaW5pdGlhbGl6ZSBzeW5jIHRyYW5zcG9ydCBmb3Igc2RrIGVuZ2luZVxuY29uc3Qge1xuICBnZXRDaGlsZHJlbixcbiAgc3luY0VudGl0eSxcbiAgcGFyZW50RW50aXR5LFxuICBnZXRQYXJlbnQsXG4gIG15UHJvZmlsZSxcbiAgcmVtb3ZlUGFyZW50LFxuICBnZXRGaXJzdENoaWxkLFxuICBpc1N0YXRlU3luY3Jvbml6ZWQsXG4gIGJpbmFyeU1lc3NhZ2VCdXMsXG4gIGV2ZW50QnVzXG59ID0gYWRkU3luY1RyYW5zcG9ydChlbmdpbmUsIHNlbmRCaW5hcnksIGdldFVzZXJEYXRhLCBpc1NlcnZlckFwaSwgJ25ldHdvcmsnKVxuXG4vLyBSZS1leHBvcnQgdGhlIHJvb20gbWVzc2FnaW5nIHN5c3RlbVxuZXhwb3J0IHsgcmVnaXN0ZXJNZXNzYWdlcywgZ2V0Um9vbSB9IGZyb20gJy4vZXZlbnRzJ1xuXG5leHBvcnQge1xuICBnZXRGaXJzdENoaWxkLFxuICBnZXRDaGlsZHJlbixcbiAgc3luY0VudGl0eSxcbiAgcGFyZW50RW50aXR5LFxuICBnZXRQYXJlbnQsXG4gIG15UHJvZmlsZSxcbiAgcmVtb3ZlUGFyZW50LFxuICBpc1N0YXRlU3luY3Jvbml6ZWQsXG4gIGJpbmFyeU1lc3NhZ2VCdXMsXG4gIGV2ZW50QnVzXG59XG4iXX0=
|
|
@@ -1,14 +1,27 @@
|
|
|
1
1
|
/// <reference types="@dcl/js-runtime" />
|
|
2
2
|
import { IEngine } from '@dcl/ecs';
|
|
3
3
|
import { type SendBinaryRequest, type SendBinaryResponse } from '~system/CommunicationsController';
|
|
4
|
+
import { CommsMessage } from './binary-message-bus';
|
|
4
5
|
import { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity';
|
|
6
|
+
import { IsServerRequest, IsServerResponse } from '~system/EngineApi';
|
|
7
|
+
import { Atom } from '../atom';
|
|
8
|
+
import { Room } from './events/implementation';
|
|
5
9
|
export type IProfile = {
|
|
6
10
|
networkId: number;
|
|
7
11
|
userId: string;
|
|
8
12
|
};
|
|
9
|
-
export declare
|
|
13
|
+
export declare const AUTH_SERVER_PEER_ID = "authoritative-server";
|
|
14
|
+
export declare const DEBUG_NETWORK_MESSAGES: () => any;
|
|
15
|
+
export declare function addSyncTransport(engine: IEngine, sendBinary: (msg: SendBinaryRequest) => Promise<SendBinaryResponse>, getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>, isServerFn: (request: IsServerRequest) => Promise<IsServerResponse>, name: string): {
|
|
10
16
|
myProfile: IProfile;
|
|
11
17
|
isStateSyncronized: () => boolean;
|
|
18
|
+
binaryMessageBus: {
|
|
19
|
+
on: <K extends CommsMessage>(message: K, callback: (value: Uint8Array, sender: string) => void) => void;
|
|
20
|
+
emit: <K_1 extends CommsMessage>(message: K_1, value: Uint8Array, toPeerAddress?: string[] | undefined) => void;
|
|
21
|
+
__processMessages: (messages: Uint8Array[]) => void;
|
|
22
|
+
};
|
|
23
|
+
eventBus: Room<import("./events").EventSchemaRegistry>;
|
|
24
|
+
isRoomReadyAtom: Atom<boolean>;
|
|
12
25
|
syncEntity: (entityId: import("@dcl/ecs").Entity, componentIds: number[], entityEnumId?: number | undefined) => void;
|
|
13
26
|
getChildren: (parent: import("@dcl/ecs").Entity) => Iterable<import("@dcl/ecs").Entity>;
|
|
14
27
|
getParent: (child: import("@dcl/ecs").Entity) => import("@dcl/ecs").Entity | undefined;
|