@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,38 +1,17 @@
1
- import { RealmInfo } from '@dcl/ecs';
1
+ import { RealmInfo, PlayerIdentityData } from '@dcl/ecs';
2
2
  import { syncFilter } from './filter';
3
3
  import { engineToCrdt } from './state';
4
- import { BinaryMessageBus, CommsMessage } from './binary-message-bus';
4
+ import { BinaryMessageBus, CommsMessage, decodeString, encodeString } from './binary-message-bus';
5
5
  import { fetchProfile } from './utils';
6
6
  import { entityUtils } from './entities';
7
- import { createServerValidator } from './server';
8
7
  import { definePlayerHelper } from '../players';
9
8
  import { serializeCrdtMessages } from '../internal/transports/logger';
10
- import { Atom } from '../atom';
11
- import { setGlobalRoom, Room } from './events/implementation';
12
9
  // user that we asked for the inital crdt state
13
- export const AUTH_SERVER_PEER_ID = 'authoritative-server';
14
- export const DEBUG_NETWORK_MESSAGES = () => globalThis.DEBUG_NETWORK_MESSAGES ?? false;
15
- // Test environment detection without 'as any'
16
- const isTestEnvironment = () => {
17
- try {
18
- if (typeof globalThis === 'undefined')
19
- return false;
20
- const globalWithProcess = globalThis;
21
- return globalWithProcess.process?.env?.NODE_ENV === 'test';
22
- }
23
- catch {
24
- return false;
25
- }
26
- };
27
- export function addSyncTransport(engine, sendBinary, getUserData, isServerFn, name) {
10
+ export function addSyncTransport(engine, sendBinary, getUserData) {
11
+ const DEBUG_NETWORK_MESSAGES = () => globalThis.DEBUG_NETWORK_MESSAGES ?? false;
28
12
  // Profile Info
29
13
  const myProfile = {};
30
14
  fetchProfile(myProfile, getUserData);
31
- const isServerAtom = Atom();
32
- const isRoomReadyAtom = Atom(false);
33
- void isServerFn({}).then(($) => {
34
- return isServerAtom.swap(!!$.isServer);
35
- });
36
15
  // Entity utils
37
16
  const entityDefinitions = entityUtils(engine, myProfile);
38
17
  // List of MessageBuss messsages to be sent on every frame to comms
@@ -47,171 +26,95 @@ export function addSyncTransport(engine, sendBinary, getUserData, isServerFn, na
47
26
  }
48
27
  const players = definePlayerHelper(engine);
49
28
  let stateIsSyncronized = false;
50
- /**
51
- * We need to wait till 2 ticks that is when the engine is ready to send new messages.
52
- * The first tick is for the client engine processing the CRDT messages,
53
- * and the second one are the messages created by the main() function.
54
- * So to avoid sending those messages, that all the clients have, through the network we put this validation here.
55
- */
56
- let tick = 0;
57
- const TRANSPORT_INITIALIZED_NUMBER = isTestEnvironment() ? 0 : 2;
29
+ let transportInitialzed = false;
58
30
  // Add Sync Transport
59
31
  const transport = {
60
32
  filter: syncFilter(engine),
61
33
  send: async (messages) => {
62
- if (tick <= TRANSPORT_INITIALIZED_NUMBER)
63
- tick++;
64
- for (const message of tick > TRANSPORT_INITIALIZED_NUMBER ? [messages].flat() : []) {
65
- if (message.byteLength) {
34
+ for (const message of [messages].flat()) {
35
+ if (message.byteLength && transportInitialzed) {
66
36
  DEBUG_NETWORK_MESSAGES() &&
67
37
  console.log(...Array.from(serializeCrdtMessages('[NetworkMessage sent]:', message, engine)));
68
- // Convert regular messages to network messages for broadcasting with chunking
69
- for (const chunk of serverValidator.convertRegularToNetworkMessage(message)) {
70
- binaryMessageBus.emit(CommsMessage.CRDT, chunk);
71
- }
38
+ binaryMessageBus.emit(CommsMessage.CRDT, message);
72
39
  }
73
40
  }
74
41
  const peerMessages = getMessagesToSend();
42
+ let totalSize = 0;
43
+ for (const message of peerMessages) {
44
+ for (const data of message.data) {
45
+ totalSize += data.byteLength;
46
+ }
47
+ }
48
+ if (totalSize) {
49
+ DEBUG_NETWORK_MESSAGES() && console.log('Sending network messages: ', totalSize / 1024, 'KB');
50
+ }
75
51
  const response = await sendBinary({ data: [], peerData: peerMessages });
76
52
  binaryMessageBus.__processMessages(response.data);
53
+ transportInitialzed = true;
77
54
  },
78
- type: name
55
+ type: 'network'
79
56
  };
80
- // Server validation setup
81
- const serverValidator = createServerValidator({
82
- engine,
83
- binaryMessageBus
84
- });
85
- // Initialize Event Bus with registered schemas
86
- const eventBus = new Room(engine, binaryMessageBus, isServerAtom, isRoomReadyAtom);
87
- // Set global eventBus instance
88
- setGlobalRoom(eventBus);
89
57
  engine.addTransport(transport);
90
58
  // End add sync transport
91
59
  // Receive & Process CRDT_STATE
92
- binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (data, sender) => {
93
- DEBUG_NETWORK_MESSAGES() && console.log('[REQ_CRDT_STATE]', sender, Date.now());
94
- const chunks = engineToCrdt(engine);
95
- if (chunks.length === 0) {
96
- DEBUG_NETWORK_MESSAGES() && console.log('[Emiting empty state:]', sender, Date.now());
97
- binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, new Uint8Array(), [sender]);
98
- }
99
- else {
100
- for (const chunk of chunks) {
101
- DEBUG_NETWORK_MESSAGES() && console.log('[Emiting:]', sender, Date.now());
102
- binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, chunk, [sender]);
103
- }
104
- }
105
- });
106
- binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, async (data, sender) => {
107
- requestingState = false;
108
- elapsedTimeSinceRequest = 0;
109
- if (isServerAtom.getOrNull() || sender !== AUTH_SERVER_PEER_ID)
60
+ binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => {
61
+ const { sender, data } = decodeCRDTState(value);
62
+ if (sender !== myProfile.userId)
110
63
  return;
111
64
  DEBUG_NETWORK_MESSAGES() && console.log('[Processing CRDT State]', data.byteLength / 1024, 'KB');
112
- if (data.byteLength > 0) {
113
- transport.onmessage(serverValidator.processClientMessages(data, sender));
114
- }
65
+ transport.onmessage(data);
115
66
  stateIsSyncronized = true;
116
- // IMPORTANT: Only mark room as ready AFTER state is synchronized
117
- // This ensures comms is truly connected and working
118
- const realmInfo = RealmInfo.getOrNull(engine.RootEntity);
119
- if (realmInfo) {
120
- DEBUG_NETWORK_MESSAGES() && console.log('[isRoomReady] Marking room as ready after state sync');
121
- isRoomReadyAtom.swap(true);
67
+ });
68
+ // Answer to REQ_CRDT_STATE
69
+ binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (_, userId) => {
70
+ DEBUG_NETWORK_MESSAGES() && console.log(`Sending CRDT State to: ${userId}`);
71
+ for (const chunk of engineToCrdt(engine)) {
72
+ binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, encodeCRDTState(userId, chunk), [userId]);
122
73
  }
123
74
  });
124
- // received message from the network
125
- binaryMessageBus.on(CommsMessage.CRDT, (value, sender) => {
126
- const isServer = isServerAtom.getOrNull();
75
+ // Process CRDT messages here
76
+ binaryMessageBus.on(CommsMessage.CRDT, (value) => {
127
77
  DEBUG_NETWORK_MESSAGES() &&
128
- console.log(transport.type, ...Array.from(serializeCrdtMessages('[NetworkMessage received]:', value, engine)), isServer);
129
- if (isServer) {
130
- transport.onmessage(serverValidator.processServerMessages(value, sender));
131
- }
132
- else if (sender === AUTH_SERVER_PEER_ID) {
133
- // Process network messages from server and convert to regular messages
134
- transport.onmessage(serverValidator.processClientMessages(value, sender));
135
- }
78
+ console.log(Array.from(serializeCrdtMessages('[NetworkMessage received]:', value, engine)));
79
+ transport.onmessage(value);
136
80
  });
137
- // received authoritative message from server - force apply to fix invalid local state
138
- binaryMessageBus.on(CommsMessage.CRDT_AUTHORITATIVE, (value, sender) => {
139
- // Only accept authoritative messages from authoritative server
140
- if (sender !== AUTH_SERVER_PEER_ID)
81
+ async function requestState(retryCount = 1) {
82
+ let players = Array.from(engine.getEntitiesWith(PlayerIdentityData));
83
+ DEBUG_NETWORK_MESSAGES() && console.log(`Requesting state. Players connected: ${players.length - 1}`);
84
+ if (!RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom) {
85
+ DEBUG_NETWORK_MESSAGES() && console.log(`Aborting Requesting state?. Disconnected`);
141
86
  return;
142
- // DEBUG_NETWORK_MESSAGES() &&
143
- console.log('[AUTHORITATIVE] Received authoritative message from server:', value.byteLength, 'bytes');
144
- // Process authoritative messages by forcing them through normal CRDT processing
145
- // but with a timestamp that's guaranteed to be accepted
146
- const authoritativeBuffer = serverValidator.processClientMessages(value, sender, true);
147
- if (authoritativeBuffer.byteLength > 0) {
148
- // Apply authoritative message through normal transport, but the server's messages
149
- // should be processed as authoritative with special timestamp handling
150
- transport.onmessage(authoritativeBuffer);
151
- DEBUG_NETWORK_MESSAGES() && console.log('[AUTHORITATIVE] Applied server authoritative message to local state');
152
87
  }
153
- });
88
+ binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array());
89
+ // Wait ~5s for the response.
90
+ await sleep(5000);
91
+ players = Array.from(engine.getEntitiesWith(PlayerIdentityData));
92
+ if (!stateIsSyncronized) {
93
+ if (players.length > 1 && retryCount <= 2) {
94
+ DEBUG_NETWORK_MESSAGES() &&
95
+ console.log(`Requesting state again ${retryCount} (no response). Players connected: ${players.length - 1}`);
96
+ void requestState(retryCount + 1);
97
+ }
98
+ else {
99
+ DEBUG_NETWORK_MESSAGES() && console.log('No active players. State syncronized');
100
+ stateIsSyncronized = true;
101
+ }
102
+ }
103
+ }
154
104
  players.onEnterScene((player) => {
155
105
  DEBUG_NETWORK_MESSAGES() && console.log('[onEnterScene]', player.userId);
156
- if (!isServerAtom.getOrNull() && myProfile.userId === player.userId) {
157
- requestState();
158
- }
159
106
  });
160
107
  // Asks for the REQ_CRDT_STATE when its connected to comms
161
108
  RealmInfo.onChange(engine.RootEntity, (value) => {
162
- const isServer = isServerAtom.getOrNull();
163
109
  if (!value?.isConnectedSceneRoom) {
164
- // Only react when actually transitioning from ready to not ready
165
- if (isRoomReadyAtom.getOrNull() === true) {
166
- DEBUG_NETWORK_MESSAGES() && console.log('Disconnected from comms');
167
- isRoomReadyAtom.swap(false);
168
- if (!isServer) {
169
- stateIsSyncronized = false;
170
- }
171
- }
110
+ DEBUG_NETWORK_MESSAGES() && console.log('Disconnected from comms');
111
+ stateIsSyncronized = false;
172
112
  }
173
113
  if (value?.isConnectedSceneRoom) {
174
- requestState();
175
- // For servers, mark as ready immediately when connected
176
- // (servers don't need to sync state from anyone)
177
- if (isServer && isRoomReadyAtom.getOrNull() === false) {
178
- DEBUG_NETWORK_MESSAGES() && console.log('[isRoomReady] Server marking room as ready');
179
- isRoomReadyAtom.swap(true);
180
- }
181
- // For clients, room will be marked ready after receiving CRDT state (above)
114
+ DEBUG_NETWORK_MESSAGES() && console.log('Connected to comms');
182
115
  }
183
- });
184
- let requestingState = false;
185
- let elapsedTimeSinceRequest = 0;
186
- const STATE_REQUEST_RETRY_INTERVAL = 2.0; // seconds
187
- /**
188
- * Why we have to request the state if we have a server that can send us the state when we joined?
189
- * The thing is that when the server detects a new JOIN_PARTICIPANT on livekit room, it sends automatically the state to that peer.
190
- * But in unity, it takes more time, so that message is not being delivered to the client.
191
- * So instead, when we are finally connected to the room, we request the state, and then the server answers with the state :)
192
- *
193
- * If no response is received within 2 seconds, the request is automatically retried.
194
- */
195
- function requestState() {
196
- if (isServerAtom.getOrNull())
197
- return;
198
- if (RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom && !requestingState) {
199
- requestingState = true;
200
- elapsedTimeSinceRequest = 0;
201
- DEBUG_NETWORK_MESSAGES() && console.log('Requesting state...');
202
- binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array());
203
- }
204
- }
205
- // System to retry state request if no response is received within the retry interval
206
- engine.addSystem((dt) => {
207
- if (requestingState && !stateIsSyncronized) {
208
- elapsedTimeSinceRequest += dt;
209
- if (elapsedTimeSinceRequest >= STATE_REQUEST_RETRY_INTERVAL) {
210
- DEBUG_NETWORK_MESSAGES() && console.log('State request timed out, retrying...');
211
- elapsedTimeSinceRequest = 0;
212
- requestingState = false;
213
- requestState();
214
- }
116
+ if (value?.isConnectedSceneRoom && !stateIsSyncronized) {
117
+ void requestState();
215
118
  }
216
119
  });
217
120
  players.onLeaveScene((userId) => {
@@ -220,13 +123,52 @@ export function addSyncTransport(engine, sendBinary, getUserData, isServerFn, na
220
123
  function isStateSyncronized() {
221
124
  return stateIsSyncronized;
222
125
  }
126
+ function sleep(ms) {
127
+ return new Promise((resolve) => {
128
+ let timer = 0;
129
+ function sleepSystem(dt) {
130
+ timer += dt;
131
+ if (timer * 1000 >= ms) {
132
+ engine.removeSystem(sleepSystem);
133
+ resolve();
134
+ }
135
+ }
136
+ engine.addSystem(sleepSystem);
137
+ });
138
+ }
223
139
  return {
224
140
  ...entityDefinitions,
225
141
  myProfile,
226
- isStateSyncronized,
227
- binaryMessageBus,
228
- eventBus,
229
- isRoomReadyAtom
142
+ isStateSyncronized
230
143
  };
231
144
  }
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMtc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXR3b3JrL21lc3NhZ2UtYnVzLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRWhELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUVyRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFHN0QsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLHNCQUFzQixDQUFBO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsRUFBRSxDQUFFLFVBQWtCLENBQUMsc0JBQXNCLElBQUksS0FBSyxDQUFBO0FBRS9GLDhDQUE4QztBQUM5QyxNQUFNLGlCQUFpQixHQUFHLEdBQVksRUFBRTtJQUN0QyxJQUFJO1FBQ0YsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFDbkQsTUFBTSxpQkFBaUIsR0FBRyxVQUFzRSxDQUFBO1FBQ2hH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QkFBc0IsRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQTtnQkFDL0UsdUJBQXVCLEdBQUcsQ0FBQyxDQUFBO2dCQUMzQixlQUFlLEdBQUcsS0FBSyxDQUFBO2dCQUN2QixZQUFZLEVBQUUsQ0FBQTthQUNmO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQTtJQUVGLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtRQUM5QixzQkFBc0IsRUFBRSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDbkUsQ0FBQyxDQUFDLENBQUE7SUFFRixTQUFTLGtCQUFrQjtRQUN6QixPQUFPLGtCQUFrQixDQUFBO0lBQzNCLENBQUM7SUFFRCxPQUFPO1FBQ0wsR0FBRyxpQkFBaUI7UUFDcEIsU0FBUztRQUNULGtCQUFrQjtRQUNsQixnQkFBZ0I7UUFDaEIsUUFBUTtRQUNSLGVBQWU7S0FDaEIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRW5naW5lLCBUcmFuc3BvcnQsIFJlYWxtSW5mbyB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgdHlwZSBTZW5kQmluYXJ5UmVxdWVzdCwgdHlwZSBTZW5kQmluYXJ5UmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0NvbW11bmljYXRpb25zQ29udHJvbGxlcidcblxuaW1wb3J0IHsgc3luY0ZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuaW1wb3J0IHsgZW5naW5lVG9DcmR0IH0gZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCB7IEJpbmFyeU1lc3NhZ2VCdXMsIENvbW1zTWVzc2FnZSB9IGZyb20gJy4vYmluYXJ5LW1lc3NhZ2UtYnVzJ1xuaW1wb3J0IHsgZmV0Y2hQcm9maWxlIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IGVudGl0eVV0aWxzIH0gZnJvbSAnLi9lbnRpdGllcydcbmltcG9ydCB7IGNyZWF0ZVNlcnZlclZhbGlkYXRvciB9IGZyb20gJy4vc2VydmVyJ1xuaW1wb3J0IHsgR2V0VXNlckRhdGFSZXF1ZXN0LCBHZXRVc2VyRGF0YVJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9Vc2VySWRlbnRpdHknXG5pbXBvcnQgeyBkZWZpbmVQbGF5ZXJIZWxwZXIgfSBmcm9tICcuLi9wbGF5ZXJzJ1xuaW1wb3J0IHsgc2VyaWFsaXplQ3JkdE1lc3NhZ2VzIH0gZnJvbSAnLi4vaW50ZXJuYWwvdHJhbnNwb3J0cy9sb2dnZXInXG5pbXBvcnQgeyBJc1NlcnZlclJlcXVlc3QsIElzU2VydmVyUmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcbmltcG9ydCB7IEF0b20gfSBmcm9tICcuLi9hdG9tJ1xuaW1wb3J0IHsgc2V0R2xvYmFsUm9vbSwgUm9vbSB9IGZyb20gJy4vZXZlbnRzL2ltcGxlbWVudGF0aW9uJ1xuXG5leHBvcnQgdHlwZSBJUHJvZmlsZSA9IHsgbmV0d29ya0lkOiBudW1iZXI7IHVzZXJJZDogc3RyaW5nIH1cbi8vIHVzZXIgdGhhdCB3ZSBhc2tlZCBmb3IgdGhlIGluaXRhbCBjcmR0IHN0YXRlXG5leHBvcnQgY29uc3QgQVVUSF9TRVJWRVJfUEVFUl9JRCA9ICdhdXRob3JpdGF0aXZlLXNlcnZlcidcbmV4cG9ydCBjb25zdCBERUJVR19ORVRXT1JLX01FU1NBR0VTID0gKCkgPT4gKGdsb2JhbFRoaXMgYXMgYW55KS5ERUJVR19ORVRXT1JLX01FU1NBR0VTID8/IGZhbHNlXG5cbi8vIFRlc3QgZW52aXJvbm1lbnQgZGV0ZWN0aW9uIHdpdGhvdXQgJ2FzIGFueSdcbmNvbnN0IGlzVGVzdEVudmlyb25tZW50ID0gKCk6IGJvb2xlYW4gPT4ge1xuICB0cnkge1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiBmYWxzZVxuICAgIGNvbnN0IGdsb2JhbFdpdGhQcm9jZXNzID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIHsgcHJvY2Vzcz86IHsgZW52PzogeyBOT0RFX0VOVj86IHN0cmluZyB9IH0gfVxuICAgIHJldHVybiBnbG9iYWxXaXRoUHJvY2Vzcy5wcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAndGVzdCdcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN5bmNUcmFuc3BvcnQoXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc2VuZEJpbmFyeTogKG1zZzogU2VuZEJpbmFyeVJlcXVlc3QpID0+IFByb21pc2U8U2VuZEJpbmFyeVJlc3BvbnNlPixcbiAgZ2V0VXNlckRhdGE6ICh2YWx1ZTogR2V0VXNlckRhdGFSZXF1ZXN0KSA9PiBQcm9taXNlPEdldFVzZXJEYXRhUmVzcG9uc2U+LFxuICBpc1NlcnZlckZuOiAocmVxdWVzdDogSXNTZXJ2ZXJSZXF1ZXN0KSA9PiBQcm9taXNlPElzU2VydmVyUmVzcG9uc2U+LFxuICBuYW1lOiBzdHJpbmdcbikge1xuICAvLyBQcm9maWxlIEluZm9cbiAgY29uc3QgbXlQcm9maWxlOiBJUHJvZmlsZSA9IHt9IGFzIElQcm9maWxlXG4gIGZldGNoUHJvZmlsZShteVByb2ZpbGUhLCBnZXRVc2VyRGF0YSlcblxuICBjb25zdCBpc1NlcnZlckF0b20gPSBBdG9tPGJvb2xlYW4+KClcbiAgY29uc3QgaXNSb29tUmVhZHlBdG9tID0gQXRvbTxib29sZWFuPihmYWxzZSlcblxuICB2b2lkIGlzU2VydmVyRm4oe30pLnRoZW4oKCQ6IElzU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICByZXR1cm4gaXNTZXJ2ZXJBdG9tLnN3YXAoISEkLmlzU2VydmVyKVxuICB9KVxuXG4gIC8vIEVudGl0eSB1dGlsc1xuICBjb25zdCBlbnRpdHlEZWZpbml0aW9ucyA9IGVudGl0eVV0aWxzKGVuZ2luZSwgbXlQcm9maWxlKVxuXG4gIC8vIExpc3Qgb2YgTWVzc2FnZUJ1c3MgbWVzc3NhZ2VzIHRvIGJlIHNlbnQgb24gZXZlcnkgZnJhbWUgdG8gY29tbXNcbiAgY29uc3QgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZDogeyBkYXRhOiBVaW50OEFycmF5W107IGFkZHJlc3M6IHN0cmluZ1tdIH1bXSA9IFtdXG5cbiAgY29uc3QgYmluYXJ5TWVzc2FnZUJ1cyA9IEJpbmFyeU1lc3NhZ2VCdXMoKGRhdGEsIGFkZHJlc3MpID0+IHtcbiAgICBwZW5kaW5nTWVzc2FnZUJ1c01lc3NhZ2VzVG9TZW5kLnB1c2goeyBkYXRhOiBbZGF0YV0sIGFkZHJlc3M6IGFkZHJlc3MgPz8gW10gfSlcbiAgfSlcblxuICBmdW5jdGlvbiBnZXRNZXNzYWdlc1RvU2VuZCgpOiB0eXBlb2YgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZCB7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBbLi4ucGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZF1cbiAgICBwZW5kaW5nTWVzc2FnZUJ1c01lc3NhZ2VzVG9TZW5kLmxlbmd0aCA9IDBcbiAgICByZXR1cm4gbWVzc2FnZXNcbiAgfVxuICBjb25zdCBwbGF5ZXJzID0gZGVmaW5lUGxheWVySGVscGVyKGVuZ2luZSlcblxuICBsZXQgc3RhdGVJc1N5bmNyb25pemVkID0gZmFsc2VcblxuICAvKipcbiAgICogV2UgbmVlZCB0byB3YWl0IHRpbGwgMiB0aWNrcyB0aGF0IGlzIHdoZW4gdGhlIGVuZ2luZSBpcyByZWFkeSB0byBzZW5kIG5ldyBtZXNzYWdlcy5cbiAgICogVGhlIGZpcnN0IHRpY2sgaXMgZm9yIHRoZSBjbGllbnQgZW5naW5lIHByb2Nlc3NpbmcgdGhlIENSRFQgbWVzc2FnZXMsXG4gICAqIGFuZCB0aGUgc2Vjb25kIG9uZSBhcmUgdGhlIG1lc3NhZ2VzIGNyZWF0ZWQgYnkgdGhlIG1haW4oKSBmdW5jdGlvbi5cbiAgICogU28gdG8gYXZvaWQgc2VuZGluZyB0aG9zZSBtZXNzYWdlcywgdGhhdCBhbGwgdGhlIGNsaWVudHMgaGF2ZSwgdGhyb3VnaCB0aGUgbmV0d29yayB3ZSBwdXQgdGhpcyB2YWxpZGF0aW9uIGhlcmUuXG4gICAqL1xuICBsZXQgdGljayA9IDBcbiAgY29uc3QgVFJBTlNQT1JUX0lOSVRJQUxJWkVEX05VTUJFUiA9IGlzVGVzdEVudmlyb25tZW50KCkgPyAwIDogMlxuICAvLyBBZGQgU3luYyBUcmFuc3BvcnRcbiAgY29uc3QgdHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgZmlsdGVyOiBzeW5jRmlsdGVyKGVuZ2luZSksXG4gICAgc2VuZDogYXN5bmMgKG1lc3NhZ2VzKSA9PiB7XG4gICAgICBpZiAodGljayA8PSBUUkFOU1BPUlRfSU5JVElBTElaRURfTlVNQkVSKSB0aWNrKytcbiAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB0aWNrID4gVFJBTlNQT1JUX0lOSVRJQUxJWkVEX05VTUJFUiA/IFttZXNzYWdlc10uZmxhdCgpIDogW10pIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coLi4uQXJyYXkuZnJvbShzZXJpYWxpemVDcmR0TWVzc2FnZXMoJ1tOZXR3b3JrTWVzc2FnZSBzZW50XTonLCBtZXNzYWdlLCBlbmdpbmUpKSlcblxuICAgICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBtZXNzYWdlcyB0byBuZXR3b3JrIG1lc3NhZ2VzIGZvciBicm9hZGNhc3Rpbmcgd2l0aCBjaHVua2luZ1xuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2Ygc2VydmVyVmFsaWRhdG9yLmNvbnZlcnRSZWd1bGFyVG9OZXR3b3JrTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5DUkRULCBjaHVuaylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHBlZXJNZXNzYWdlcyA9IGdldE1lc3NhZ2VzVG9TZW5kKClcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VuZEJpbmFyeSh7IGRhdGE6IFtdLCBwZWVyRGF0YTogcGVlck1lc3NhZ2VzIH0pXG4gICAgICBiaW5hcnlNZXNzYWdlQnVzLl9fcHJvY2Vzc01lc3NhZ2VzKHJlc3BvbnNlLmRhdGEpXG4gICAgfSxcbiAgICB0eXBlOiBuYW1lXG4gIH1cblxuICAvLyBTZXJ2ZXIgdmFsaWRhdGlvbiBzZXR1cFxuICBjb25zdCBzZXJ2ZXJWYWxpZGF0b3IgPSBjcmVhdGVTZXJ2ZXJWYWxpZGF0b3Ioe1xuICAgIGVuZ2luZSxcbiAgICBiaW5hcnlNZXNzYWdlQnVzXG4gIH0pXG5cbiAgLy8gSW5pdGlhbGl6ZSBFdmVudCBCdXMgd2l0aCByZWdpc3RlcmVkIHNjaGVtYXNcbiAgY29uc3QgZXZlbnRCdXMgPSBuZXcgUm9vbShlbmdpbmUsIGJpbmFyeU1lc3NhZ2VCdXMsIGlzU2VydmVyQXRvbSwgaXNSb29tUmVhZHlBdG9tKVxuXG4gIC8vIFNldCBnbG9iYWwgZXZlbnRCdXMgaW5zdGFuY2VcbiAgc2V0R2xvYmFsUm9vbShldmVudEJ1cylcblxuICBlbmdpbmUuYWRkVHJhbnNwb3J0KHRyYW5zcG9ydClcbiAgLy8gRW5kIGFkZCBzeW5jIHRyYW5zcG9ydFxuXG4gIC8vIFJlY2VpdmUgJiBQcm9jZXNzIENSRFRfU1RBVEVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuUkVRX0NSRFRfU1RBVEUsIGFzeW5jIChkYXRhLCBzZW5kZXIpID0+IHtcbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tSRVFfQ1JEVF9TVEFURV0nLCBzZW5kZXIsIERhdGUubm93KCkpXG4gICAgY29uc3QgY2h1bmtzID0gZW5naW5lVG9DcmR0KGVuZ2luZSlcbiAgICBpZiAoY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbRW1pdGluZyBlbXB0eSBzdGF0ZTpdJywgc2VuZGVyLCBEYXRlLm5vdygpKVxuICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgbmV3IFVpbnQ4QXJyYXkoKSwgW3NlbmRlcl0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0VtaXRpbmc6XScsIHNlbmRlciwgRGF0ZS5ub3coKSlcbiAgICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgY2h1bmssIFtzZW5kZXJdKVxuICAgICAgfVxuICAgIH1cbiAgfSlcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuUkVTX0NSRFRfU1RBVEUsIGFzeW5jIChkYXRhLCBzZW5kZXIpID0+IHtcbiAgICByZXF1ZXN0aW5nU3RhdGUgPSBmYWxzZVxuICAgIGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICAgIGlmIChpc1NlcnZlckF0b20uZ2V0T3JOdWxsKCkgfHwgc2VuZGVyICE9PSBBVVRIX1NFUlZFUl9QRUVSX0lEKSByZXR1cm5cbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tQcm9jZXNzaW5nIENSRFQgU3RhdGVdJywgZGF0YS5ieXRlTGVuZ3RoIC8gMTAyNCwgJ0tCJylcbiAgICBpZiAoZGF0YS5ieXRlTGVuZ3RoID4gMCkge1xuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyhkYXRhLCBzZW5kZXIpKVxuICAgIH1cbiAgICBzdGF0ZUlzU3luY3Jvbml6ZWQgPSB0cnVlXG5cbiAgICAvLyBJTVBPUlRBTlQ6IE9ubHkgbWFyayByb29tIGFzIHJlYWR5IEFGVEVSIHN0YXRlIGlzIHN5bmNocm9uaXplZFxuICAgIC8vIFRoaXMgZW5zdXJlcyBjb21tcyBpcyB0cnVseSBjb25uZWN0ZWQgYW5kIHdvcmtpbmdcbiAgICBjb25zdCByZWFsbUluZm8gPSBSZWFsbUluZm8uZ2V0T3JOdWxsKGVuZ2luZS5Sb290RW50aXR5KVxuICAgIGlmIChyZWFsbUluZm8pIHtcbiAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW2lzUm9vbVJlYWR5XSBNYXJraW5nIHJvb20gYXMgcmVhZHkgYWZ0ZXIgc3RhdGUgc3luYycpXG4gICAgICBpc1Jvb21SZWFkeUF0b20uc3dhcCh0cnVlKVxuICAgIH1cbiAgfSlcblxuICAvLyByZWNlaXZlZCBtZXNzYWdlIGZyb20gdGhlIG5ldHdvcmtcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVCwgKHZhbHVlLCBzZW5kZXIpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzU2VydmVyQXRvbS5nZXRPck51bGwoKVxuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIHRyYW5zcG9ydC50eXBlLFxuICAgICAgICAuLi5BcnJheS5mcm9tKHNlcmlhbGl6ZUNyZHRNZXNzYWdlcygnW05ldHdvcmtNZXNzYWdlIHJlY2VpdmVkXTonLCB2YWx1ZSwgZW5naW5lKSksXG4gICAgICAgIGlzU2VydmVyXG4gICAgICApXG4gICAgaWYgKGlzU2VydmVyKSB7XG4gICAgICB0cmFuc3BvcnQub25tZXNzYWdlIShzZXJ2ZXJWYWxpZGF0b3IucHJvY2Vzc1NlcnZlck1lc3NhZ2VzKHZhbHVlLCBzZW5kZXIpKVxuICAgIH0gZWxzZSBpZiAoc2VuZGVyID09PSBBVVRIX1NFUlZFUl9QRUVSX0lEKSB7XG4gICAgICAvLyBQcm9jZXNzIG5ldHdvcmsgbWVzc2FnZXMgZnJvbSBzZXJ2ZXIgYW5kIGNvbnZlcnQgdG8gcmVndWxhciBtZXNzYWdlc1xuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyh2YWx1ZSwgc2VuZGVyKSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gcmVjZWl2ZWQgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIGZyb20gc2VydmVyIC0gZm9yY2UgYXBwbHkgdG8gZml4IGludmFsaWQgbG9jYWwgc3RhdGVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVF9BVVRIT1JJVEFUSVZFLCAodmFsdWUsIHNlbmRlcikgPT4ge1xuICAgIC8vIE9ubHkgYWNjZXB0IGF1dGhvcml0YXRpdmUgbWVzc2FnZXMgZnJvbSBhdXRob3JpdGF0aXZlIHNlcnZlclxuICAgIGlmIChzZW5kZXIgIT09IEFVVEhfU0VSVkVSX1BFRVJfSUQpIHJldHVyblxuXG4gICAgLy8gREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgY29uc29sZS5sb2coJ1tBVVRIT1JJVEFUSVZFXSBSZWNlaXZlZCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZnJvbSBzZXJ2ZXI6JywgdmFsdWUuYnl0ZUxlbmd0aCwgJ2J5dGVzJylcblxuICAgIC8vIFByb2Nlc3MgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlcyBieSBmb3JjaW5nIHRoZW0gdGhyb3VnaCBub3JtYWwgQ1JEVCBwcm9jZXNzaW5nXG4gICAgLy8gYnV0IHdpdGggYSB0aW1lc3RhbXAgdGhhdCdzIGd1YXJhbnRlZWQgdG8gYmUgYWNjZXB0ZWRcbiAgICBjb25zdCBhdXRob3JpdGF0aXZlQnVmZmVyID0gc2VydmVyVmFsaWRhdG9yLnByb2Nlc3NDbGllbnRNZXNzYWdlcyh2YWx1ZSwgc2VuZGVyLCB0cnVlKVxuICAgIGlmIChhdXRob3JpdGF0aXZlQnVmZmVyLmJ5dGVMZW5ndGggPiAwKSB7XG4gICAgICAvLyBBcHBseSBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdGhyb3VnaCBub3JtYWwgdHJhbnNwb3J0LCBidXQgdGhlIHNlcnZlcidzIG1lc3NhZ2VzXG4gICAgICAvLyBzaG91bGQgYmUgcHJvY2Vzc2VkIGFzIGF1dGhvcml0YXRpdmUgd2l0aCBzcGVjaWFsIHRpbWVzdGFtcCBoYW5kbGluZ1xuICAgICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoYXV0aG9yaXRhdGl2ZUJ1ZmZlcilcblxuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbQVVUSE9SSVRBVElWRV0gQXBwbGllZCBzZXJ2ZXIgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIHRvIGxvY2FsIHN0YXRlJylcbiAgICB9XG4gIH0pXG5cbiAgcGxheWVycy5vbkVudGVyU2NlbmUoKHBsYXllcikgPT4ge1xuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW29uRW50ZXJTY2VuZV0nLCBwbGF5ZXIudXNlcklkKVxuICAgIGlmICghaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpICYmIG15UHJvZmlsZS51c2VySWQgPT09IHBsYXllci51c2VySWQpIHtcbiAgICAgIHJlcXVlc3RTdGF0ZSgpXG4gICAgfVxuICB9KVxuXG4gIC8vIEFza3MgZm9yIHRoZSBSRVFfQ1JEVF9TVEFURSB3aGVuIGl0cyBjb25uZWN0ZWQgdG8gY29tbXNcbiAgUmVhbG1JbmZvLm9uQ2hhbmdlKGVuZ2luZS5Sb290RW50aXR5LCAodmFsdWUpID0+IHtcbiAgICBjb25zdCBpc1NlcnZlciA9IGlzU2VydmVyQXRvbS5nZXRPck51bGwoKVxuXG4gICAgaWYgKCF2YWx1ZT8uaXNDb25uZWN0ZWRTY2VuZVJvb20pIHtcbiAgICAgIC8vIE9ubHkgcmVhY3Qgd2hlbiBhY3R1YWxseSB0cmFuc2l0aW9uaW5nIGZyb20gcmVhZHkgdG8gbm90IHJlYWR5XG4gICAgICBpZiAoaXNSb29tUmVhZHlBdG9tLmdldE9yTnVsbCgpID09PSB0cnVlKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnRGlzY29ubmVjdGVkIGZyb20gY29tbXMnKVxuICAgICAgICBpc1Jvb21SZWFkeUF0b20uc3dhcChmYWxzZSlcbiAgICAgICAgaWYgKCFpc1NlcnZlcikge1xuICAgICAgICAgIHN0YXRlSXNTeW5jcm9uaXplZCA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsdWU/LmlzQ29ubmVjdGVkU2NlbmVSb29tKSB7XG4gICAgICByZXF1ZXN0U3RhdGUoKVxuXG4gICAgICAvLyBGb3Igc2VydmVycywgbWFyayBhcyByZWFkeSBpbW1lZGlhdGVseSB3aGVuIGNvbm5lY3RlZFxuICAgICAgLy8gKHNlcnZlcnMgZG9uJ3QgbmVlZCB0byBzeW5jIHN0YXRlIGZyb20gYW55b25lKVxuICAgICAgaWYgKGlzU2VydmVyICYmIGlzUm9vbVJlYWR5QXRvbS5nZXRPck51bGwoKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbaXNSb29tUmVhZHldIFNlcnZlciBtYXJraW5nIHJvb20gYXMgcmVhZHknKVxuICAgICAgICBpc1Jvb21SZWFkeUF0b20uc3dhcCh0cnVlKVxuICAgICAgfVxuICAgICAgLy8gRm9yIGNsaWVudHMsIHJvb20gd2lsbCBiZSBtYXJrZWQgcmVhZHkgYWZ0ZXIgcmVjZWl2aW5nIENSRFQgc3RhdGUgKGFib3ZlKVxuICAgIH1cbiAgfSlcblxuICBsZXQgcmVxdWVzdGluZ1N0YXRlID0gZmFsc2VcbiAgbGV0IGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICBjb25zdCBTVEFURV9SRVFVRVNUX1JFVFJZX0lOVEVSVkFMID0gMi4wIC8vIHNlY29uZHNcblxuICAvKipcbiAgICogV2h5IHdlIGhhdmUgdG8gcmVxdWVzdCB0aGUgc3RhdGUgaWYgd2UgaGF2ZSBhIHNlcnZlciB0aGF0IGNhbiBzZW5kIHVzIHRoZSBzdGF0ZSB3aGVuIHdlIGpvaW5lZD9cbiAgICogVGhlIHRoaW5nIGlzIHRoYXQgd2hlbiB0aGUgc2VydmVyIGRldGVjdHMgYSBuZXcgSk9JTl9QQVJUSUNJUEFOVCBvbiBsaXZla2l0IHJvb20sIGl0IHNlbmRzIGF1dG9tYXRpY2FsbHkgdGhlIHN0YXRlIHRvIHRoYXQgcGVlci5cbiAgICogQnV0IGluIHVuaXR5LCBpdCB0YWtlcyBtb3JlIHRpbWUsIHNvIHRoYXQgbWVzc2FnZSBpcyBub3QgYmVpbmcgZGVsaXZlcmVkIHRvIHRoZSBjbGllbnQuXG4gICAqIFNvIGluc3RlYWQsIHdoZW4gd2UgYXJlIGZpbmFsbHkgY29ubmVjdGVkIHRvIHRoZSByb29tLCB3ZSByZXF1ZXN0IHRoZSBzdGF0ZSwgYW5kIHRoZW4gdGhlIHNlcnZlciBhbnN3ZXJzIHdpdGggdGhlIHN0YXRlIDopXG4gICAqXG4gICAqIElmIG5vIHJlc3BvbnNlIGlzIHJlY2VpdmVkIHdpdGhpbiAyIHNlY29uZHMsIHRoZSByZXF1ZXN0IGlzIGF1dG9tYXRpY2FsbHkgcmV0cmllZC5cbiAgICovXG4gIGZ1bmN0aW9uIHJlcXVlc3RTdGF0ZSgpIHtcbiAgICBpZiAoaXNTZXJ2ZXJBdG9tLmdldE9yTnVsbCgpKSByZXR1cm5cbiAgICBpZiAoUmVhbG1JbmZvLmdldE9yTnVsbChlbmdpbmUuUm9vdEVudGl0eSk/LmlzQ29ubmVjdGVkU2NlbmVSb29tICYmICFyZXF1ZXN0aW5nU3RhdGUpIHtcbiAgICAgIHJlcXVlc3RpbmdTdGF0ZSA9IHRydWVcbiAgICAgIGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID0gMFxuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdSZXF1ZXN0aW5nIHN0YXRlLi4uJylcbiAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuUkVRX0NSRFRfU1RBVEUsIG5ldyBVaW50OEFycmF5KCkpXG4gICAgfVxuICB9XG5cbiAgLy8gU3lzdGVtIHRvIHJldHJ5IHN0YXRlIHJlcXVlc3QgaWYgbm8gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgd2l0aGluIHRoZSByZXRyeSBpbnRlcnZhbFxuICBlbmdpbmUuYWRkU3lzdGVtKChkdDogbnVtYmVyKSA9PiB7XG4gICAgaWYgKHJlcXVlc3RpbmdTdGF0ZSAmJiAhc3RhdGVJc1N5bmNyb25pemVkKSB7XG4gICAgICBlbGFwc2VkVGltZVNpbmNlUmVxdWVzdCArPSBkdFxuICAgICAgaWYgKGVsYXBzZWRUaW1lU2luY2VSZXF1ZXN0ID49IFNUQVRFX1JFUVVFU1RfUkVUUllfSU5URVJWQUwpIHtcbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdTdGF0ZSByZXF1ZXN0IHRpbWVkIG91dCwgcmV0cnlpbmcuLi4nKVxuICAgICAgICBlbGFwc2VkVGltZVNpbmNlUmVxdWVzdCA9IDBcbiAgICAgICAgcmVxdWVzdGluZ1N0YXRlID0gZmFsc2VcbiAgICAgICAgcmVxdWVzdFN0YXRlKClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcGxheWVycy5vbkxlYXZlU2NlbmUoKHVzZXJJZCkgPT4ge1xuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW29uTGVhdmVTY2VuZV0nLCB1c2VySWQpXG4gIH0pXG5cbiAgZnVuY3Rpb24gaXNTdGF0ZVN5bmNyb25pemVkKCkge1xuICAgIHJldHVybiBzdGF0ZUlzU3luY3Jvbml6ZWRcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZW50aXR5RGVmaW5pdGlvbnMsXG4gICAgbXlQcm9maWxlLFxuICAgIGlzU3RhdGVTeW5jcm9uaXplZCxcbiAgICBiaW5hcnlNZXNzYWdlQnVzLFxuICAgIGV2ZW50QnVzLFxuICAgIGlzUm9vbVJlYWR5QXRvbVxuICB9XG59XG4iXX0=
145
+ /**
146
+ * Messages Protocol Encoding
147
+ *
148
+ * CRDT: Plain Uint8Array
149
+ *
150
+ * CRDT_STATE_RES { sender: string, data: Uint8Array}
151
+ */
152
+ function decodeCRDTState(data) {
153
+ let offset = 0;
154
+ const r = new Uint8Array(data);
155
+ const view = new DataView(r.buffer);
156
+ const senderLength = view.getUint8(offset);
157
+ offset += 1;
158
+ const sender = decodeString(data.subarray(1, senderLength + 1));
159
+ offset += senderLength;
160
+ const state = r.subarray(offset);
161
+ return { sender, data: state };
162
+ }
163
+ function encodeCRDTState(address, data) {
164
+ // address to uint8array
165
+ const addressBuffer = encodeString(address);
166
+ const addressOffset = 1;
167
+ const messageLength = addressOffset + addressBuffer.byteLength + data.byteLength;
168
+ const serializedMessage = new Uint8Array(messageLength);
169
+ serializedMessage.set(new Uint8Array([addressBuffer.byteLength]), 0);
170
+ serializedMessage.set(addressBuffer, 1);
171
+ serializedMessage.set(data, addressBuffer.byteLength + 1);
172
+ return serializedMessage;
173
+ }
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMtc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXR3b3JrL21lc3NhZ2UtYnVzLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFHckUsK0NBQStDO0FBQy9DLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsTUFBZSxFQUNmLFVBQW1FLEVBQ25FLFdBQXdFO0lBRXhFLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxFQUFFLENBQUUsVUFBa0IsQ0FBQyxzQkFBc0IsSUFBSSxLQUFLLENBQUE7SUFDeEYsZUFBZTtJQUNmLE1BQU0sU0FBUyxHQUFhLEVBQWMsQ0FBQTtJQUMxQyxZQUFZLENBQUMsU0FBVSxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBRXJDLGVBQWU7SUFDZixNQUFNLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUE7SUFFeEQsbUVBQW1FO0lBQ25FLE1BQU0sK0JBQStCLEdBQWdELEVBQUUsQ0FBQTtJQUV2RixNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLENBQUMsSUFBSSxFQUFFLE9B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LGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDekQsT0FBTyxpQkFBaUIsQ0FBQTtBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUVuZ2luZSwgVHJhbnNwb3J0LCBSZWFsbUluZm8sIFBsYXllcklkZW50aXR5RGF0YSB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgdHlwZSBTZW5kQmluYXJ5UmVxdWVzdCwgdHlwZSBTZW5kQmluYXJ5UmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL0NvbW11bmljYXRpb25zQ29udHJvbGxlcidcblxuaW1wb3J0IHsgc3luY0ZpbHRlciB9IGZyb20gJy4vZmlsdGVyJ1xuaW1wb3J0IHsgZW5naW5lVG9DcmR0IH0gZnJvbSAnLi9zdGF0ZSdcbmltcG9ydCB7IEJpbmFyeU1lc3NhZ2VCdXMsIENvbW1zTWVzc2FnZSwgZGVjb2RlU3RyaW5nLCBlbmNvZGVTdHJpbmcgfSBmcm9tICcuL2JpbmFyeS1tZXNzYWdlLWJ1cydcbmltcG9ydCB7IGZldGNoUHJvZmlsZSB9IGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBlbnRpdHlVdGlscyB9IGZyb20gJy4vZW50aXRpZXMnXG5pbXBvcnQgeyBHZXRVc2VyRGF0YVJlcXVlc3QsIEdldFVzZXJEYXRhUmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL1VzZXJJZGVudGl0eSdcbmltcG9ydCB7IGRlZmluZVBsYXllckhlbHBlciB9IGZyb20gJy4uL3BsYXllcnMnXG5pbXBvcnQgeyBzZXJpYWxpemVDcmR0TWVzc2FnZXMgfSBmcm9tICcuLi9pbnRlcm5hbC90cmFuc3BvcnRzL2xvZ2dlcidcblxuZXhwb3J0IHR5cGUgSVByb2ZpbGUgPSB7IG5ldHdvcmtJZDogbnVtYmVyOyB1c2VySWQ6IHN0cmluZyB9XG4vLyB1c2VyIHRoYXQgd2UgYXNrZWQgZm9yIHRoZSBpbml0YWwgY3JkdCBzdGF0ZVxuZXhwb3J0IGZ1bmN0aW9uIGFkZFN5bmNUcmFuc3BvcnQoXG4gIGVuZ2luZTogSUVuZ2luZSxcbiAgc2VuZEJpbmFyeTogKG1zZzogU2VuZEJpbmFyeVJlcXVlc3QpID0+IFByb21pc2U8U2VuZEJpbmFyeVJlc3BvbnNlPixcbiAgZ2V0VXNlckRhdGE6ICh2YWx1ZTogR2V0VXNlckRhdGFSZXF1ZXN0KSA9PiBQcm9taXNlPEdldFVzZXJEYXRhUmVzcG9uc2U+XG4pIHtcbiAgY29uc3QgREVCVUdfTkVUV09SS19NRVNTQUdFUyA9ICgpID0+IChnbG9iYWxUaGlzIGFzIGFueSkuREVCVUdfTkVUV09SS19NRVNTQUdFUyA/PyBmYWxzZVxuICAvLyBQcm9maWxlIEluZm9cbiAgY29uc3QgbXlQcm9maWxlOiBJUHJvZmlsZSA9IHt9IGFzIElQcm9maWxlXG4gIGZldGNoUHJvZmlsZShteVByb2ZpbGUhLCBnZXRVc2VyRGF0YSlcblxuICAvLyBFbnRpdHkgdXRpbHNcbiAgY29uc3QgZW50aXR5RGVmaW5pdGlvbnMgPSBlbnRpdHlVdGlscyhlbmdpbmUsIG15UHJvZmlsZSlcblxuICAvLyBMaXN0IG9mIE1lc3NhZ2VCdXNzIG1lc3NzYWdlcyB0byBiZSBzZW50IG9uIGV2ZXJ5IGZyYW1lIHRvIGNvbW1zXG4gIGNvbnN0IHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQ6IHsgZGF0YTogVWludDhBcnJheVtdOyBhZGRyZXNzOiBzdHJpbmdbXSB9W10gPSBbXVxuXG4gIGNvbnN0IGJpbmFyeU1lc3NhZ2VCdXMgPSBCaW5hcnlNZXNzYWdlQnVzKChkYXRhLCBhZGRyZXNzKSA9PiB7XG4gICAgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZC5wdXNoKHsgZGF0YTogW2RhdGFdLCBhZGRyZXNzOiBhZGRyZXNzID8/IFtdIH0pXG4gIH0pXG5cbiAgZnVuY3Rpb24gZ2V0TWVzc2FnZXNUb1NlbmQoKTogdHlwZW9mIHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0gWy4uLnBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmRdXG4gICAgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZC5sZW5ndGggPSAwXG4gICAgcmV0dXJuIG1lc3NhZ2VzXG4gIH1cbiAgY29uc3QgcGxheWVycyA9IGRlZmluZVBsYXllckhlbHBlcihlbmdpbmUpXG5cbiAgbGV0IHN0YXRlSXNTeW5jcm9uaXplZCA9IGZhbHNlXG4gIGxldCB0cmFuc3BvcnRJbml0aWFsemVkID0gZmFsc2VcblxuICAvLyBBZGQgU3luYyBUcmFuc3BvcnRcbiAgY29uc3QgdHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgZmlsdGVyOiBzeW5jRmlsdGVyKGVuZ2luZSksXG4gICAgc2VuZDogYXN5bmMgKG1lc3NhZ2VzKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgW21lc3NhZ2VzXS5mbGF0KCkpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuYnl0ZUxlbmd0aCAmJiB0cmFuc3BvcnRJbml0aWFsemVkKSB7XG4gICAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyguLi5BcnJheS5mcm9tKHNlcmlhbGl6ZUNyZHRNZXNzYWdlcygnW05ldHdvcmtNZXNzYWdlIHNlbnRdOicsIG1lc3NhZ2UsIGVuZ2luZSkpKVxuICAgICAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1JEVCwgbWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgcGVlck1lc3NhZ2VzID0gZ2V0TWVzc2FnZXNUb1NlbmQoKVxuICAgICAgbGV0IHRvdGFsU2l6ZSA9IDBcbiAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBwZWVyTWVzc2FnZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYXRhIG9mIG1lc3NhZ2UuZGF0YSkge1xuICAgICAgICAgIHRvdGFsU2l6ZSArPSBkYXRhLmJ5dGVMZW5ndGhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvdGFsU2l6ZSkge1xuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1NlbmRpbmcgbmV0d29yayBtZXNzYWdlczogJywgdG90YWxTaXplIC8gMTAyNCwgJ0tCJylcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VuZEJpbmFyeSh7IGRhdGE6IFtdLCBwZWVyRGF0YTogcGVlck1lc3NhZ2VzIH0pXG4gICAgICBiaW5hcnlNZXNzYWdlQnVzLl9fcHJvY2Vzc01lc3NhZ2VzKHJlc3BvbnNlLmRhdGEpXG4gICAgICB0cmFuc3BvcnRJbml0aWFsemVkID0gdHJ1ZVxuICAgIH0sXG4gICAgdHlwZTogJ25ldHdvcmsnXG4gIH1cbiAgZW5naW5lLmFkZFRyYW5zcG9ydCh0cmFuc3BvcnQpXG4gIC8vIEVuZCBhZGQgc3luYyB0cmFuc3BvcnRcblxuICAvLyBSZWNlaXZlICYgUHJvY2VzcyBDUkRUX1NUQVRFXG4gIGJpbmFyeU1lc3NhZ2VCdXMub24oQ29tbXNNZXNzYWdlLlJFU19DUkRUX1NUQVRFLCAodmFsdWUpID0+IHtcbiAgICBjb25zdCB7IHNlbmRlciwgZGF0YSB9ID0gZGVjb2RlQ1JEVFN0YXRlKHZhbHVlKVxuICAgIGlmIChzZW5kZXIgIT09IG15UHJvZmlsZS51c2VySWQpIHJldHVyblxuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW1Byb2Nlc3NpbmcgQ1JEVCBTdGF0ZV0nLCBkYXRhLmJ5dGVMZW5ndGggLyAxMDI0LCAnS0InKVxuICAgIHRyYW5zcG9ydC5vbm1lc3NhZ2UhKGRhdGEpXG4gICAgc3RhdGVJc1N5bmNyb25pemVkID0gdHJ1ZVxuICB9KVxuXG4gIC8vIEFuc3dlciB0byBSRVFfQ1JEVF9TVEFURVxuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5SRVFfQ1JEVF9TVEFURSwgYXN5bmMgKF8sIHVzZXJJZCkgPT4ge1xuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZyhgU2VuZGluZyBDUkRUIFN0YXRlIHRvOiAke3VzZXJJZH1gKVxuXG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBlbmdpbmVUb0NyZHQoZW5naW5lKSkge1xuICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgZW5jb2RlQ1JEVFN0YXRlKHVzZXJJZCwgY2h1bmspLCBbdXNlcklkXSlcbiAgICB9XG4gIH0pXG5cbiAgLy8gUHJvY2VzcyBDUkRUIG1lc3NhZ2VzIGhlcmVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVCwgKHZhbHVlKSA9PiB7XG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgICBjb25zb2xlLmxvZyhBcnJheS5mcm9tKHNlcmlhbGl6ZUNyZHRNZXNzYWdlcygnW05ldHdvcmtNZXNzYWdlIHJlY2VpdmVkXTonLCB2YWx1ZSwgZW5naW5lKSkpXG4gICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEodmFsdWUpXG4gIH0pXG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdFN0YXRlKHJldHJ5Q291bnQ6IG51bWJlciA9IDEpIHtcbiAgICBsZXQgcGxheWVycyA9IEFycmF5LmZyb20oZW5naW5lLmdldEVudGl0aWVzV2l0aChQbGF5ZXJJZGVudGl0eURhdGEpKVxuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZyhgUmVxdWVzdGluZyBzdGF0ZS4gUGxheWVycyBjb25uZWN0ZWQ6ICR7cGxheWVycy5sZW5ndGggLSAxfWApXG5cbiAgICBpZiAoIVJlYWxtSW5mby5nZXRPck51bGwoZW5naW5lLlJvb3RFbnRpdHkpPy5pc0Nvbm5lY3RlZFNjZW5lUm9vbSkge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKGBBYm9ydGluZyBSZXF1ZXN0aW5nIHN0YXRlPy4gRGlzY29ubmVjdGVkYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuUkVRX0NSRFRfU1RBVEUsIG5ldyBVaW50OEFycmF5KCkpXG5cbiAgICAvLyBXYWl0IH41cyBmb3IgdGhlIHJlc3BvbnNlLlxuICAgIGF3YWl0IHNsZWVwKDUwMDApXG5cbiAgICBwbGF5ZXJzID0gQXJyYXkuZnJvbShlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSkpXG5cbiAgICBpZiAoIXN0YXRlSXNTeW5jcm9uaXplZCkge1xuICAgICAgaWYgKHBsYXllcnMubGVuZ3RoID4gMSAmJiByZXRyeUNvdW50IDw9IDIpIHtcbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coYFJlcXVlc3Rpbmcgc3RhdGUgYWdhaW4gJHtyZXRyeUNvdW50fSAobm8gcmVzcG9uc2UpLiBQbGF5ZXJzIGNvbm5lY3RlZDogJHtwbGF5ZXJzLmxlbmd0aCAtIDF9YClcbiAgICAgICAgdm9pZCByZXF1ZXN0U3RhdGUocmV0cnlDb3VudCArIDEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ05vIGFjdGl2ZSBwbGF5ZXJzLiBTdGF0ZSBzeW5jcm9uaXplZCcpXG4gICAgICAgIHN0YXRlSXNTeW5jcm9uaXplZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwbGF5ZXJzLm9uRW50ZXJTY2VuZSgocGxheWVyKSA9PiB7XG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbb25FbnRlclNjZW5lXScsIHBsYXllci51c2VySWQpXG4gIH0pXG5cbiAgLy8gQXNrcyBmb3IgdGhlIFJFUV9DUkRUX1NUQVRFIHdoZW4gaXRzIGNvbm5lY3RlZCB0byBjb21tc1xuICBSZWFsbUluZm8ub25DaGFuZ2UoZW5naW5lLlJvb3RFbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgIGlmICghdmFsdWU/LmlzQ29ubmVjdGVkU2NlbmVSb29tKSB7XG4gICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ0Rpc2Nvbm5lY3RlZCBmcm9tIGNvbW1zJylcbiAgICAgIHN0YXRlSXNTeW5jcm9uaXplZCA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHZhbHVlPy5pc0Nvbm5lY3RlZFNjZW5lUm9vbSkge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdDb25uZWN0ZWQgdG8gY29tbXMnKVxuICAgIH1cblxuICAgIGlmICh2YWx1ZT8uaXNDb25uZWN0ZWRTY2VuZVJvb20gJiYgIXN0YXRlSXNTeW5jcm9uaXplZCkge1xuICAgICAgdm9pZCByZXF1ZXN0U3RhdGUoKVxuICAgIH1cbiAgfSlcblxuICBwbGF5ZXJzLm9uTGVhdmVTY2VuZSgodXNlcklkKSA9PiB7XG4gICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUubG9nKCdbb25MZWF2ZVNjZW5lXScsIHVzZXJJZClcbiAgfSlcblxuICBmdW5jdGlvbiBpc1N0YXRlU3luY3Jvbml6ZWQoKSB7XG4gICAgcmV0dXJuIHN0YXRlSXNTeW5jcm9uaXplZFxuICB9XG5cbiAgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbGV0IHRpbWVyID0gMFxuICAgICAgZnVuY3Rpb24gc2xlZXBTeXN0ZW0oZHQ6IG51bWJlcikge1xuICAgICAgICB0aW1lciArPSBkdFxuICAgICAgICBpZiAodGltZXIgKiAxMDAwID49IG1zKSB7XG4gICAgICAgICAgZW5naW5lLnJlbW92ZVN5c3RlbShzbGVlcFN5c3RlbSlcbiAgICAgICAgICByZXNvbHZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZW5naW5lLmFkZFN5c3RlbShzbGVlcFN5c3RlbSlcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5lbnRpdHlEZWZpbml0aW9ucyxcbiAgICBteVByb2ZpbGUsXG4gICAgaXNTdGF0ZVN5bmNyb25pemVkXG4gIH1cbn1cblxuLyoqXG4gKiBNZXNzYWdlcyBQcm90b2NvbCBFbmNvZGluZ1xuICpcbiAqIENSRFQ6IFBsYWluIFVpbnQ4QXJyYXlcbiAqXG4gKiBDUkRUX1NUQVRFX1JFUyB7IHNlbmRlcjogc3RyaW5nLCBkYXRhOiBVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiBkZWNvZGVDUkRUU3RhdGUoZGF0YTogVWludDhBcnJheSkge1xuICBsZXQgb2Zmc2V0ID0gMFxuICBjb25zdCByID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSlcbiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhyLmJ1ZmZlcilcbiAgY29uc3Qgc2VuZGVyTGVuZ3RoID0gdmlldy5nZXRVaW50OChvZmZzZXQpXG4gIG9mZnNldCArPSAxXG4gIGNvbnN0IHNlbmRlciA9IGRlY29kZVN0cmluZyhkYXRhLnN1YmFycmF5KDEsIHNlbmRlckxlbmd0aCArIDEpKVxuICBvZmZzZXQgKz0gc2VuZGVyTGVuZ3RoXG4gIGNvbnN0IHN0YXRlID0gci5zdWJhcnJheShvZmZzZXQpXG5cbiAgcmV0dXJuIHsgc2VuZGVyLCBkYXRhOiBzdGF0ZSB9XG59XG5cbmZ1bmN0aW9uIGVuY29kZUNSRFRTdGF0ZShhZGRyZXNzOiBzdHJpbmcsIGRhdGE6IFVpbnQ4QXJyYXkpIHtcbiAgLy8gYWRkcmVzcyB0byB1aW50OGFycmF5XG4gIGNvbnN0IGFkZHJlc3NCdWZmZXIgPSBlbmNvZGVTdHJpbmcoYWRkcmVzcylcbiAgY29uc3QgYWRkcmVzc09mZnNldCA9IDFcbiAgY29uc3QgbWVzc2FnZUxlbmd0aCA9IGFkZHJlc3NPZmZzZXQgKyBhZGRyZXNzQnVmZmVyLmJ5dGVMZW5ndGggKyBkYXRhLmJ5dGVMZW5ndGhcblxuICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KG1lc3NhZ2VMZW5ndGgpXG4gIHNlcmlhbGl6ZWRNZXNzYWdlLnNldChuZXcgVWludDhBcnJheShbYWRkcmVzc0J1ZmZlci5ieXRlTGVuZ3RoXSksIDApXG4gIHNlcmlhbGl6ZWRNZXNzYWdlLnNldChhZGRyZXNzQnVmZmVyLCAxKVxuICBzZXJpYWxpemVkTWVzc2FnZS5zZXQoZGF0YSwgYWRkcmVzc0J1ZmZlci5ieXRlTGVuZ3RoICsgMSlcbiAgcmV0dXJuIHNlcmlhbGl6ZWRNZXNzYWdlXG59XG4iXX0=
package/network/state.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
2
- import { CrdtMessageProtocol, CrdtMessageType, PutComponentOperation, PutNetworkComponentOperation, NetworkEntity as _NetworkEntity, VideoEvent, AudioEvent, EngineInfo, GltfContainerLoadingState, PointerEventsResult, RaycastResult, RealmInfo, TweenState, UiDropdown, UiDropdownResult, UiInput, UiInputResult, UiText, UiTransform } from '@dcl/ecs';
3
- import { LIVEKIT_MAX_SIZE } from './server';
2
+ import { CrdtMessageProtocol, CrdtMessageType, PutComponentOperation, PutNetworkComponentOperation, NetworkEntity as _NetworkEntity, VideoEvent, AudioEvent, EngineInfo, GltfContainerLoadingState, PhysicsCombinedForce, PhysicsCombinedImpulse, PointerEventsResult, RaycastResult, RealmInfo, TweenState, UiDropdown, UiDropdownResult, UiInput, UiInputResult, UiText, UiTransform } from '@dcl/ecs';
3
+ import { LIVEKIT_MAX_SIZE } from '@dcl/ecs/dist/systems/crdt';
4
4
  export const NOT_SYNC_COMPONENTS = [
5
5
  VideoEvent,
6
6
  TweenState,
7
7
  AudioEvent,
8
8
  EngineInfo,
9
9
  GltfContainerLoadingState,
10
+ PhysicsCombinedForce,
11
+ PhysicsCombinedImpulse,
10
12
  PointerEventsResult,
11
13
  RaycastResult,
12
14
  RealmInfo,
@@ -19,7 +21,8 @@ export const NOT_SYNC_COMPONENTS = [
19
21
  ];
20
22
  export const NOT_SYNC_COMPONENTS_IDS = NOT_SYNC_COMPONENTS.map(($) => $.componentId);
21
23
  export const NOT_SYNC_COMPONENTS_NAMES = [
22
- 'asset-packs::Script' // ComponentName from: https://github.com/decentraland/asset-packs/blob/main/src/enums.ts
24
+ 'asset-packs::Script',
25
+ 'asset-packs::ActionTypes'
23
26
  ];
24
27
  export function shouldSyncComponent(component) {
25
28
  return !(NOT_SYNC_COMPONENTS_IDS.includes(component.componentId) ||
@@ -38,7 +41,8 @@ export function engineToCrdt(engine) {
38
41
  continue;
39
42
  }
40
43
  itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
41
- return NetworkEntity.has(entity);
44
+ const isNetworkEntity = NetworkEntity.has(entity);
45
+ return isNetworkEntity;
42
46
  });
43
47
  }
44
48
  let header;
@@ -56,6 +60,7 @@ export function engineToCrdt(engine) {
56
60
  networkBuffer.resetBuffer();
57
61
  }
58
62
  // If the message itself is larger than the limit, we need to handle it specially
63
+ // For now, we'll skip it to prevent infinite loops
59
64
  if (messageSize / 1024 > LIVEKIT_MAX_SIZE) {
60
65
  console.error(`Message too large (${messageSize} bytes), skipping component ${message.componentId} for entity ${message.entityId}`);
61
66
  continue;
@@ -75,4 +80,4 @@ export function engineToCrdt(engine) {
75
80
  }
76
81
  return chunks;
77
82
  }
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsNEJBQTRCLEVBRTVCLGFBQWEsSUFBSSxjQUFjLEVBRS9CLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixtQkFBbUIsRUFDbkIsYUFBYSxFQUNiLFNBQVMsRUFDVCxVQUFVLEVBQ1YsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsYUFBYSxFQUNiLE1BQU0sRUFDTixXQUFXLEVBRVosTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFtQztJQUNqRSxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YseUJBQXlCO0lBQ3pCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsU0FBUztJQUNULFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLGFBQWE7SUFDYixXQUFXO0lBQ1gsTUFBTTtDQUNQLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNwRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBYTtJQUNqRCxxQkFBcUIsQ0FBQyx5RkFBeUY7Q0FDaEgsQ0FBQTtBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxTQUF1QztJQUN6RSxPQUFPLENBQUMsQ0FDTix1QkFBdUIsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdB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RSxHQUFHLENBQUMsRUFBRTtRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0tBQ3RDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuaW1wb3J0IHtcbiAgQ3JkdE1lc3NhZ2VIZWFkZXIsXG4gIENyZHRNZXNzYWdlUHJvdG9jb2wsXG4gIENyZHRNZXNzYWdlVHlwZSxcbiAgSUVuZ2luZSxcbiAgUHV0Q29tcG9uZW50T3BlcmF0aW9uLFxuICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLFxuICBTeW5jQ29tcG9uZW50cyBhcyBfU3luY0NvbXBvbmVudHMsXG4gIE5ldHdvcmtFbnRpdHkgYXMgX05ldHdvcmtFbnRpdHksXG4gIElOZXRvd3JrRW50aXR5LFxuICBWaWRlb0V2ZW50LFxuICBBdWRpb0V2ZW50LFxuICBFbmdpbmVJbmZvLFxuICBHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLFxuICBQb2ludGVyRXZlbnRzUmVzdWx0LFxuICBSYXljYXN0UmVzdWx0LFxuICBSZWFsbUluZm8sXG4gIFR3ZWVuU3RhdGUsXG4gIFVpRHJvcGRvd24sXG4gIFVpRHJvcGRvd25SZXN1bHQsXG4gIFVpSW5wdXQsXG4gIFVpSW5wdXRSZXN1bHQsXG4gIFVpVGV4dCxcbiAgVWlUcmFuc2Zvcm0sXG4gIENvbXBvbmVudERlZmluaXRpb25cbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBMSVZFS0lUX01BWF9TSVpFIH0gZnJvbSAnLi9zZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTOiBDb21wb25lbnREZWZpbml0aW9uPHVua25vd24+W10gPSBbXG4gIFZpZGVvRXZlbnQsXG4gIFR3ZWVuU3RhdGUsXG4gIEF1ZGlvRXZlbnQsXG4gIEVuZ2luZUluZm8sXG4gIEdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVWlEcm9wZG93bixcbiAgVWlEcm9wZG93blJlc3VsdCxcbiAgVWlJbnB1dCxcbiAgVWlJbnB1dFJlc3VsdCxcbiAgVWlUcmFuc2Zvcm0sXG4gIFVpVGV4dFxuXVxuXG5leHBvcnQgY29uc3QgTk9UX1NZTkNfQ09NUE9ORU5UU19JRFMgPSBOT1RfU1lOQ19DT01QT05FTlRTLm1hcCgoJCkgPT4gJC5jb21wb25lbnRJZClcbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTX05BTUVTOiBzdHJpbmdbXSA9IFtcbiAgJ2Fzc2V0LXBhY2tzOjpTY3JpcHQnIC8vIENvbXBvbmVudE5hbWUgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2RlY2VudHJhbGFuZC9hc3NldC1wYWNrcy9ibG9iL21haW4vc3JjL2VudW1zLnRzXG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTeW5jQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50RGVmaW5pdGlvbjx1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIShcbiAgICBOT1RfU1lOQ19DT01QT05FTlRTX0lEUy5pbmNsdWRlcyhjb21wb25lbnQuY29tcG9uZW50SWQpIHx8XG4gICAgTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUy5pbmNsdWRlcyhjb21wb25lbnQuY29tcG9uZW50TmFtZSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzeW5jZWRDb21wb25lbnRzKGVuZ2luZTogSUVuZ2luZSk6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXSB7XG4gIHJldHVybiBbLi4uTk9UX1NZTkNfQ09NUE9ORU5UUywgLi4uTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUy5tYXAoKCQpID0+IGVuZ2luZS5nZXRDb21wb25lbnRPck51bGwoJCkpXS5maWx0ZXIoXG4gICAgQm9vbGVhblxuICApIGFzIENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5naW5lVG9DcmR0KGVuZ2luZTogSUVuZ2luZSk6IFVpbnQ4QXJyYXlbXSB7XG4gIGNvbnN0IGNyZHRCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrRW50aXR5LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya0VudGl0eVxuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBpdENvbXBvbmVudERlZmluaXRpb24gb2YgZW5naW5lLmNvbXBvbmVudHNJdGVyKCkpIHtcbiAgICBpZiAoIXNob3VsZFN5bmNDb21wb25lbnQoaXRDb21wb25lbnREZWZpbml0aW9uKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpdENvbXBvbmVudERlZmluaXRpb24uZHVtcENyZHRTdGF0ZVRvQnVmZmVyKGNyZHRCdWZmZXIsIChlbnRpdHkpID0+IHtcbiAgICAgIHJldHVybiBOZXR3b3JrRW50aXR5LmhhcyhlbnRpdHkpXG4gICAgfSlcbiAgfVxuXG4gIGxldCBoZWFkZXI6IENyZHRNZXNzYWdlSGVhZGVyIHwgbnVsbFxuICB3aGlsZSAoKGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wuZ2V0SGVhZGVyKGNyZHRCdWZmZXIpKSkge1xuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlQpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBQdXRDb21wb25lbnRPcGVyYXRpb24ucmVhZChjcmR0QnVmZmVyKSFcbiAgICAgIGNvbnN0IG5ldHdvcmtFbnRpdHkgPSBOZXR3b3JrRW50aXR5LmdldE9yTnVsbChtZXNzYWdlLmVudGl0eUlkKVxuXG4gICAgICAvLyBDaGVjayBpZiBhZGRpbmcgdGhpcyBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgc2l6ZSBsaW1pdFxuICAgICAgY29uc3QgY3VycmVudEJ1ZmZlclNpemUgPSBuZXR3b3JrQnVmZmVyLnRvQmluYXJ5KCkuYnl0ZUxlbmd0aFxuICAgICAgY29uc3QgbWVzc2FnZVNpemUgPSBtZXNzYWdlLmRhdGEuYnl0ZUxlbmd0aFxuXG4gICAgICBpZiAoKGN1cnJlbnRCdWZmZXJTaXplICsgbWVzc2FnZVNpemUpIC8gMTAyNCA+IExJVkVLSVRfTUFYX1NJWkUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGhhcyBjb250ZW50LCBzYXZlIGl0IGFzIGEgY2h1bmtcbiAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXJTaXplID4gMCkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKG5ldHdvcmtCdWZmZXIudG9Db3BpZWRCaW5hcnkoKSlcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyLnJlc2V0QnVmZmVyKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQsIHdlIG5lZWQgdG8gaGFuZGxlIGl0IHNwZWNpYWxseVxuICAgICAgICBpZiAobWVzc2FnZVNpemUgLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgTWVzc2FnZSB0b28gbGFyZ2UgKCR7bWVzc2FnZVNpemV9IGJ5dGVzKSwgc2tpcHBpbmcgY29tcG9uZW50ICR7bWVzc2FnZS5jb21wb25lbnRJZH0gZm9yIGVudGl0eSAke21lc3NhZ2UuZW50aXR5SWR9YFxuICAgICAgICAgIClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgICBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtFbnRpdHkubmV0d29ya0lkLFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3JkdEJ1ZmZlci5pbmNyZW1lbnRSZWFkT2Zmc2V0KGhlYWRlci5sZW5ndGgpXG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgZGF0YSBhcyB0aGUgZmluYWwgY2h1bmtcbiAgaWYgKG5ldHdvcmtCdWZmZXIuY3VycmVudFdyaXRlT2Zmc2V0KCkgPiAwKSB7XG4gICAgY2h1bmtzLnB1c2gobmV0d29ya0J1ZmZlci50b0JpbmFyeSgpKVxuICB9XG5cbiAgcmV0dXJuIGNodW5rc1xufVxuIl19
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsNEJBQTRCLEVBRTVCLGFBQWEsSUFBSSxjQUFjLEVBRS9CLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxhQUFhLEVBQ2IsTUFBTSxFQUNOLFdBQVcsRUFFWixNQUFNLFVBQVUsQ0FBQTtBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUU3RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBbUM7SUFDakUsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLHlCQUF5QjtJQUN6QixvQkFBb0I7SUFDcEIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixhQUFhO0lBQ2IsU0FBUztJQUNULFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLGFBQWE7SUFDYixXQUFXO0lBQ1gsTUFBTTtDQUNQLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNwRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBYTtJQUNqRCxxQkFBcUI7SUFDckIsMEJBQTBCO0NBQzNCLENBQUE7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsU0FBdUM7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QUFVLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQzlDO0tBQ0Y7SUFFRCw0Q0FBNEM7SUFDNUMsSUFBSSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUN0QztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlcidcbmltcG9ydCB7XG4gIENyZHRNZXNzYWdlSGVhZGVyLFxuICBDcmR0TWVzc2FnZVByb3RvY29sLFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIElFbmdpbmUsXG4gIFB1dENvbXBvbmVudE9wZXJhdGlvbixcbiAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbixcbiAgU3luY0NvbXBvbmVudHMgYXMgX1N5bmNDb21wb25lbnRzLFxuICBOZXR3b3JrRW50aXR5IGFzIF9OZXR3b3JrRW50aXR5LFxuICBJTmV0b3dya0VudGl0eSxcbiAgVmlkZW9FdmVudCxcbiAgQXVkaW9FdmVudCxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUGh5c2ljc0NvbWJpbmVkRm9yY2UsXG4gIFBoeXNpY3NDb21iaW5lZEltcHVsc2UsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVHdlZW5TdGF0ZSxcbiAgVWlEcm9wZG93bixcbiAgVWlEcm9wZG93blJlc3VsdCxcbiAgVWlJbnB1dCxcbiAgVWlJbnB1dFJlc3VsdCxcbiAgVWlUZXh0LFxuICBVaVRyYW5zZm9ybSxcbiAgQ29tcG9uZW50RGVmaW5pdGlvblxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IExJVkVLSVRfTUFYX1NJWkUgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3N5c3RlbXMvY3JkdCdcblxuZXhwb3J0IGNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFM6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXSA9IFtcbiAgVmlkZW9FdmVudCxcbiAgVHdlZW5TdGF0ZSxcbiAgQXVkaW9FdmVudCxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUGh5c2ljc0NvbWJpbmVkRm9yY2UsXG4gIFBoeXNpY3NDb21iaW5lZEltcHVsc2UsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVWlEcm9wZG93bixcbiAgVWlEcm9wZG93blJlc3VsdCxcbiAgVWlJbnB1dCxcbiAgVWlJbnB1dFJlc3VsdCxcbiAgVWlUcmFuc2Zvcm0sXG4gIFVpVGV4dFxuXVxuXG5leHBvcnQgY29uc3QgTk9UX1NZTkNfQ09NUE9ORU5UU19JRFMgPSBOT1RfU1lOQ19DT01QT05FTlRTLm1hcCgoJCkgPT4gJC5jb21wb25lbnRJZClcbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTX05BTUVTOiBzdHJpbmdbXSA9IFtcbiAgJ2Fzc2V0LXBhY2tzOjpTY3JpcHQnLCAvLyBDb21wb25lbnROYW1lIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9kZWNlbnRyYWxhbmQvYXNzZXQtcGFja3MvYmxvYi9tYWluL3NyYy9lbnVtcy50c1xuICAnYXNzZXQtcGFja3M6OkFjdGlvblR5cGVzJ1xuXVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkU3luY0NvbXBvbmVudChjb21wb25lbnQ6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj4pOiBib29sZWFuIHtcbiAgcmV0dXJuICEoXG4gICAgTk9UX1NZTkNfQ09NUE9ORU5UU19JRFMuaW5jbHVkZXMoY29tcG9uZW50LmNvbXBvbmVudElkKSB8fFxuICAgIE5PVF9TWU5DX0NPTVBPTkVOVFNfTkFNRVMuaW5jbHVkZXMoY29tcG9uZW50LmNvbXBvbmVudE5hbWUpXG4gIClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlc3luY2VkQ29tcG9uZW50cyhlbmdpbmU6IElFbmdpbmUpOiBDb21wb25lbnREZWZpbml0aW9uPHVua25vd24+W10ge1xuICByZXR1cm4gWy4uLk5PVF9TWU5DX0NPTVBPTkVOVFMsIC4uLk5PVF9TWU5DX0NPTVBPTkVOVFNfTkFNRVMubWFwKCgkKSA9PiBlbmdpbmUuZ2V0Q29tcG9uZW50T3JOdWxsKCQpKV0uZmlsdGVyKFxuICAgIEJvb2xlYW5cbiAgKSBhcyBDb21wb25lbnREZWZpbml0aW9uPHVua25vd24+W11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuZ2luZVRvQ3JkdChlbmdpbmU6IElFbmdpbmUpOiBVaW50OEFycmF5W10ge1xuICBjb25zdCBjcmR0QnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICBjb25zdCBuZXR3b3JrQnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICBjb25zdCBOZXR3b3JrRW50aXR5ID0gZW5naW5lLmdldENvbXBvbmVudChfTmV0d29ya0VudGl0eS5jb21wb25lbnRJZCkgYXMgSU5ldG93cmtFbnRpdHlcbiAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXVxuXG4gIGZvciAoY29uc3QgaXRDb21wb25lbnREZWZpbml0aW9uIG9mIGVuZ2luZS5jb21wb25lbnRzSXRlcigpKSB7XG4gICAgaWYgKCFzaG91bGRTeW5jQ29tcG9uZW50KGl0Q29tcG9uZW50RGVmaW5pdGlvbikpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGl0Q29tcG9uZW50RGVmaW5pdGlvbi5kdW1wQ3JkdFN0YXRlVG9CdWZmZXIoY3JkdEJ1ZmZlciwgKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgaXNOZXR3b3JrRW50aXR5ID0gTmV0d29ya0VudGl0eS5oYXMoZW50aXR5KVxuICAgICAgcmV0dXJuIGlzTmV0d29ya0VudGl0eVxuICAgIH0pXG4gIH1cblxuICBsZXQgaGVhZGVyOiBDcmR0TWVzc2FnZUhlYWRlciB8IG51bGxcbiAgd2hpbGUgKChoZWFkZXIgPSBDcmR0TWVzc2FnZVByb3RvY29sLmdldEhlYWRlcihjcmR0QnVmZmVyKSkpIHtcbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gUHV0Q29tcG9uZW50T3BlcmF0aW9uLnJlYWQoY3JkdEJ1ZmZlcikhXG4gICAgICBjb25zdCBuZXR3b3JrRW50aXR5ID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcblxuICAgICAgLy8gQ2hlY2sgaWYgYWRkaW5nIHRoaXMgbWVzc2FnZSB3b3VsZCBleGNlZWQgdGhlIHNpemUgbGltaXRcbiAgICAgIGNvbnN0IGN1cnJlbnRCdWZmZXJTaXplID0gbmV0d29ya0J1ZmZlci50b0JpbmFyeSgpLmJ5dGVMZW5ndGhcbiAgICAgIGNvbnN0IG1lc3NhZ2VTaXplID0gbWVzc2FnZS5kYXRhLmJ5dGVMZW5ndGhcblxuICAgICAgaWYgKChjdXJyZW50QnVmZmVyU2l6ZSArIG1lc3NhZ2VTaXplKSAvIDEwMjQgPiBMSVZFS0lUX01BWF9TSVpFKSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJyZW50IGJ1ZmZlciBoYXMgY29udGVudCwgc2F2ZSBpdCBhcyBhIGNodW5rXG4gICAgICAgIGlmIChjdXJyZW50QnVmZmVyU2l6ZSA+IDApIHtcbiAgICAgICAgICBjaHVua3MucHVzaChuZXR3b3JrQnVmZmVyLnRvQ29waWVkQmluYXJ5KCkpXG4gICAgICAgICAgbmV0d29ya0J1ZmZlci5yZXNldEJ1ZmZlcigpXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgaXMgbGFyZ2VyIHRoYW4gdGhlIGxpbWl0LCB3ZSBuZWVkIHRvIGhhbmRsZSBpdCBzcGVjaWFsbHlcbiAgICAgICAgLy8gRm9yIG5vdywgd2UnbGwgc2tpcCBpdCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzXG4gICAgICAgIGlmIChtZXNzYWdlU2l6ZSAvIDEwMjQgPiBMSVZFS0lUX01BWF9TSVpFKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBNZXNzYWdlIHRvbyBsYXJnZSAoJHttZXNzYWdlU2l6ZX0gYnl0ZXMpLCBza2lwcGluZyBjb21wb25lbnQgJHttZXNzYWdlLmNvbXBvbmVudElkfSBmb3IgZW50aXR5ICR7bWVzc2FnZS5lbnRpdHlJZH1gXG4gICAgICAgICAgKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKG5ldHdvcmtFbnRpdHkpIHtcbiAgICAgICAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbi53cml0ZShcbiAgICAgICAgICBuZXR3b3JrRW50aXR5LmVudGl0eUlkLFxuICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wLFxuICAgICAgICAgIG1lc3NhZ2UuY29tcG9uZW50SWQsXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5uZXR3b3JrSWQsXG4gICAgICAgICAgbWVzc2FnZS5kYXRhLFxuICAgICAgICAgIG5ldHdvcmtCdWZmZXJcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmR0QnVmZmVyLmluY3JlbWVudFJlYWRPZmZzZXQoaGVhZGVyLmxlbmd0aClcbiAgICB9XG4gIH1cblxuICAvLyBBZGQgYW55IHJlbWFpbmluZyBkYXRhIGFzIHRoZSBmaW5hbCBjaHVua1xuICBpZiAobmV0d29ya0J1ZmZlci5jdXJyZW50V3JpdGVPZmZzZXQoKSA+IDApIHtcbiAgICBjaHVua3MucHVzaChuZXR3b3JrQnVmZmVyLnRvQmluYXJ5KCkpXG4gIH1cblxuICByZXR1cm4gY2h1bmtzXG59XG4iXX0=
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
3
  "description": "",
4
- "version": "7.22.5-24836126953.commit-ddc8da1",
4
+ "version": "7.22.5",
5
5
  "author": "Decentraland",
6
6
  "dependencies": {
7
- "@dcl/ecs": "7.22.5-24836126953.commit-ddc8da1",
7
+ "@dcl/ecs": "7.22.5",
8
8
  "@dcl/ecs-math": "2.1.0",
9
9
  "@dcl/explorer": "1.0.164509-20240802172549.commit-fb95b9b",
10
- "@dcl/js-runtime": "7.22.5-24836126953.commit-ddc8da1",
11
- "@dcl/react-ecs": "7.22.5-24836126953.commit-ddc8da1",
12
- "@dcl/sdk-commands": "7.22.5-24836126953.commit-ddc8da1",
10
+ "@dcl/js-runtime": "7.22.5",
11
+ "@dcl/react-ecs": "7.22.5",
12
+ "@dcl/sdk-commands": "7.22.5",
13
13
  "text-encoding": "0.7.0"
14
14
  },
15
15
  "keywords": [],
@@ -35,5 +35,5 @@
35
35
  },
36
36
  "types": "./index.d.ts",
37
37
  "typings": "./index.d.ts",
38
- "commit": "ddc8da1f80f3b488609d8a2a694f0c9fd5fe2c54"
38
+ "commit": "b6da827dbab8b88795119b50ab578d457e552d0c"
39
39
  }
@@ -1,12 +1,9 @@
1
1
  import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer'
2
2
 
3
3
  export enum CommsMessage {
4
- CRDT = 7,
5
- REQ_CRDT_STATE = 8,
6
- RES_CRDT_STATE = 9,
7
- CRDT_SERVER = 4,
8
- CRDT_AUTHORITATIVE = 5,
9
- CUSTOM_EVENT = 6
4
+ CRDT = 1,
5
+ REQ_CRDT_STATE = 2,
6
+ RES_CRDT_STATE = 3
10
7
  }
11
8
 
12
9
  export function BinaryMessageBus<T extends CommsMessage>(
@@ -23,9 +20,7 @@ export function BinaryMessageBus<T extends CommsMessage>(
23
20
  __processMessages: (messages: Uint8Array[]) => {
24
21
  for (const message of messages) {
25
22
  const commsMsg = decodeCommsMessage<T>(message)
26
- if (!commsMsg) {
27
- continue
28
- }
23
+ if (!commsMsg) continue
29
24
  const { sender, messageType, data } = commsMsg
30
25
  const fn = mapping.get(messageType)
31
26
  if (fn) fn(data, sender)
@@ -112,8 +112,16 @@ export function entityUtils(engine: IEngine, profile: IProfile) {
112
112
  if (!Transform.getOrNull(entity)) {
113
113
  Transform.create(entity)
114
114
  } else {
115
- // We force to send a tick update of the transform so we can send the NEW parent to the renderer
116
- Transform.getMutable(entity)
115
+ // Force a tick update of the transform so the renderer receives the NEW parent.
116
+ // createOrReplace bypasses the CRDT unchanged-data suppression optimization,
117
+ // ensuring the renderer transport can inject the network parent into the message.
118
+ const t = Transform.get(entity)
119
+ Transform.createOrReplace(entity, {
120
+ position: { x: t.position.x, y: t.position.y, z: t.position.z },
121
+ rotation: { x: t.rotation.x, y: t.rotation.y, z: t.rotation.z, w: t.rotation.w },
122
+ scale: { x: t.scale.x, y: t.scale.y, z: t.scale.z },
123
+ parent: t.parent
124
+ })
117
125
  }
118
126
  }
119
127
 
@@ -2,46 +2,9 @@ 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
-
8
- // Create isServer atom for consistent state
9
- const isServerAtom = Atom<boolean>(false)
10
- void isServerApi({}).then((response) => {
11
- isServerAtom.swap(!!response.isServer)
12
- })
13
-
14
- // Helper function to check if running on server
15
- export function isServer(): boolean {
16
- return isServerAtom.getOrNull() ?? false
17
- }
18
5
 
19
6
  // initialize sync transport for sdk engine
20
- const {
21
- getChildren,
22
- syncEntity,
23
- parentEntity,
24
- getParent,
25
- myProfile,
26
- removeParent,
27
- getFirstChild,
28
- isStateSyncronized,
29
- binaryMessageBus,
30
- eventBus
31
- } = addSyncTransport(engine, sendBinary, getUserData, isServerApi, 'network')
32
-
33
- // Re-export the room messaging system
34
- export { registerMessages, getRoom } from './events'
7
+ const { getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, getFirstChild, isStateSyncronized } =
8
+ addSyncTransport(engine, sendBinary, getUserData)
35
9
 
36
- export {
37
- getFirstChild,
38
- getChildren,
39
- syncEntity,
40
- parentEntity,
41
- getParent,
42
- myProfile,
43
- removeParent,
44
- isStateSyncronized,
45
- binaryMessageBus,
46
- eventBus
47
- }
10
+ export { getFirstChild, getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, isStateSyncronized }