@dcl/sdk 7.30.2-37804519171.commit-60e3717 → 7.30.2-37807847179.commit-24c42ea
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/internal/transports/rendererTransport.js +5 -2
- 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 +16 -3
- package/network/message-bus-sync.js +164 -103
- package/network/server/index.d.ts +14 -0
- package/network/server/index.js +256 -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/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 +80 -0
- package/server/storage/constants.js +19 -0
- package/server/storage/error-message.d.ts +1 -0
- package/server/storage/error-message.js +9 -0
- package/server/storage/index.d.ts +54 -0
- package/server/storage/index.js +60 -0
- package/server/storage/player.d.ts +60 -0
- package/server/storage/player.js +244 -0
- package/server/storage/scene.d.ts +55 -0
- package/server/storage/scene.js +232 -0
- package/server/storage/serialize.d.ts +1 -0
- package/server/storage/serialize.js +135 -0
- package/server/storage/value-cache.d.ts +1 -0
- package/server/storage/value-cache.js +67 -0
- package/server/storage/write-queue.d.ts +1 -0
- package/server/storage/write-queue.js +113 -0
- package/server/storage-url.d.ts +13 -0
- package/server/storage-url.js +42 -0
- package/server/utils.d.ts +35 -0
- package/server/utils.js +69 -0
- package/src/atom.ts +98 -0
- package/src/future.ts +38 -0
- package/src/internal/transports/rendererTransport.ts +4 -1
- 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 +180 -112
- package/src/network/server/index.ts +341 -0
- package/src/network/server/utils.ts +189 -0
- package/src/network/state.ts +3 -4
- package/src/server/env-var.ts +36 -0
- package/src/server/index.ts +12 -0
- package/src/server/storage/constants.ts +112 -0
- package/src/server/storage/error-message.ts +8 -0
- package/src/server/storage/index.ts +83 -0
- package/src/server/storage/player.ts +345 -0
- package/src/server/storage/scene.ts +324 -0
- package/src/server/storage/serialize.ts +132 -0
- package/src/server/storage/value-cache.ts +119 -0
- package/src/server/storage/write-queue.ts +174 -0
- package/src/server/storage-url.ts +49 -0
- package/src/server/utils.ts +83 -0
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { CrdtMessageType, ProcessMessageResultType, PutNetworkComponentOperation } from '@dcl/ecs';
|
|
2
|
+
import * as components from '@dcl/ecs/dist/components';
|
|
3
|
+
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
|
4
|
+
import { CommsMessage } from '../binary-message-bus';
|
|
5
|
+
import { chunkCrdtMessages } from '../chunking';
|
|
6
|
+
import * as utils from './utils';
|
|
7
|
+
import { AUTH_SERVER_PEER_ID, DEBUG_NETWORK_MESSAGES } from '../message-bus-sync';
|
|
8
|
+
export const LIVEKIT_MAX_SIZE = 12;
|
|
9
|
+
export function createServerValidator(config) {
|
|
10
|
+
const { engine, binaryMessageBus } = config;
|
|
11
|
+
// Initialize components for network operations and transform fixing
|
|
12
|
+
const NetworkEntity = components.NetworkEntity(engine);
|
|
13
|
+
const CreatedBy = components.CreatedBy(engine);
|
|
14
|
+
const NetworkParent = components.NetworkParent(engine);
|
|
15
|
+
// Type guard to check if component supports corrections (both LWW and GrowOnlySet)
|
|
16
|
+
function supportsCorrections(component) {
|
|
17
|
+
return ((component.componentType === 0 /* ComponentType.LastWriteWinElementSet */ ||
|
|
18
|
+
component.componentType === 1 /* ComponentType.GrowOnlyValueSet */) &&
|
|
19
|
+
'getCrdtState' in component);
|
|
20
|
+
}
|
|
21
|
+
function findExistingNetworkEntity(message) {
|
|
22
|
+
// Look for existing network entity mapping (don't create new ones)
|
|
23
|
+
for (const [entityId, networkData] of engine.getEntitiesWith(NetworkEntity)) {
|
|
24
|
+
if (networkData.networkId === message.networkId && networkData.entityId === message.entityId) {
|
|
25
|
+
return entityId;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Return null if not found
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* What a message can be judged on before an entity is spent mapping it. Anything
|
|
33
|
+
* needing the local entity — the CRDT dry run, the scene's own validator — still
|
|
34
|
+
* happens in validateMessagePermissions afterwards.
|
|
35
|
+
*/
|
|
36
|
+
function peerMessageIsEligible(message) {
|
|
37
|
+
if (!('componentId' in message))
|
|
38
|
+
return true;
|
|
39
|
+
const definition = engine.getComponentOrNull(message.componentId);
|
|
40
|
+
if (!definition)
|
|
41
|
+
return false;
|
|
42
|
+
if ('data' in message) {
|
|
43
|
+
try {
|
|
44
|
+
definition.schema.deserialize(new ReadWriteByteBuffer(message.data));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
function findOrCreateNetworkEntity(message, sender, isServer) {
|
|
53
|
+
// Look for existing network entity mapping first
|
|
54
|
+
const existingEntity = findExistingNetworkEntity(message);
|
|
55
|
+
if (existingEntity) {
|
|
56
|
+
return existingEntity;
|
|
57
|
+
}
|
|
58
|
+
// Create new entity and network mapping
|
|
59
|
+
const newEntityId = engine.addEntity();
|
|
60
|
+
NetworkEntity.createOrReplace(newEntityId, {
|
|
61
|
+
networkId: message.networkId,
|
|
62
|
+
entityId: message.entityId
|
|
63
|
+
});
|
|
64
|
+
if (isServer) {
|
|
65
|
+
CreatedBy.createOrReplace(newEntityId, { address: sender });
|
|
66
|
+
}
|
|
67
|
+
DEBUG_NETWORK_MESSAGES() &&
|
|
68
|
+
console.log(`[DEBUG] Created new entity ${newEntityId} for network ${message.networkId}:${message.entityId}`);
|
|
69
|
+
return newEntityId;
|
|
70
|
+
}
|
|
71
|
+
function convertNetworkToRegularMessage(networkMessage, localEntityId, forceCorrections = false) {
|
|
72
|
+
const buffer = new ReadWriteByteBuffer();
|
|
73
|
+
try {
|
|
74
|
+
// Use the well-tested networkMessageToLocal utility with transform fixing for Unity
|
|
75
|
+
const message = utils.networkMessageToLocal(networkMessage, localEntityId, buffer, NetworkParent, forceCorrections);
|
|
76
|
+
return { ...message, messageBuffer: buffer.toBinary() };
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
DEBUG_NETWORK_MESSAGES() && console.error('Error converting network message:', error);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function validateMessagePermissions(message, sender, _localEntityId) {
|
|
84
|
+
// Basic checks
|
|
85
|
+
if (!sender || sender === AUTH_SERVER_PEER_ID) {
|
|
86
|
+
return false; // Server shouldn't send messages to itself
|
|
87
|
+
}
|
|
88
|
+
if (message.type === CrdtMessageType.DELETE_ENTITY) {
|
|
89
|
+
// TODO: how to handle this case ?
|
|
90
|
+
}
|
|
91
|
+
if (message.type === CrdtMessageType.PUT_COMPONENT || message.type === CrdtMessageType.DELETE_COMPONENT) {
|
|
92
|
+
const component = engine.getComponentOrNull(message.componentId);
|
|
93
|
+
if (!component)
|
|
94
|
+
return false;
|
|
95
|
+
let value = null;
|
|
96
|
+
if ('data' in message) {
|
|
97
|
+
try {
|
|
98
|
+
value = component.schema.deserialize(new ReadWriteByteBuffer(message.data));
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const dryRunCRDT = component.__dry_run_updateFromCrdt(message);
|
|
105
|
+
const validCRDT = [
|
|
106
|
+
ProcessMessageResultType.StateUpdatedData,
|
|
107
|
+
ProcessMessageResultType.StateUpdatedTimestamp,
|
|
108
|
+
ProcessMessageResultType.EntityDeleted
|
|
109
|
+
].includes(dryRunCRDT);
|
|
110
|
+
const createdBy = CreatedBy.getOrNull(message.entityId);
|
|
111
|
+
const validMessage = validCRDT &&
|
|
112
|
+
component.__run_validateBeforeChange(message.entityId, value, sender, createdBy?.address ?? AUTH_SERVER_PEER_ID);
|
|
113
|
+
return !!validMessage;
|
|
114
|
+
}
|
|
115
|
+
// For now, basic validation - in the future this will check component sync permissions
|
|
116
|
+
// TODO: Check if sender owns the entity
|
|
117
|
+
// TODO: Check component sync mode ('all' | 'owner' | 'server')
|
|
118
|
+
// TODO: Run component custom validation
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
function broadcastBatchedMessages(messages, excludeSender) {
|
|
122
|
+
if (messages.length === 0)
|
|
123
|
+
return;
|
|
124
|
+
// Build the complete buffer with all messages
|
|
125
|
+
const networkBuffer = new ReadWriteByteBuffer();
|
|
126
|
+
for (const message of messages) {
|
|
127
|
+
// Skip oversized messages upfront
|
|
128
|
+
if (message.messageBuffer.byteLength / 1024 > LIVEKIT_MAX_SIZE) {
|
|
129
|
+
console.error(`Message too large (${message.messageBuffer.byteLength} bytes), skipping message from ${excludeSender}`);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
networkBuffer.writeBuffer(message.messageBuffer, false);
|
|
133
|
+
}
|
|
134
|
+
// Use the chunking function to split into proper chunks
|
|
135
|
+
const chunks = chunkCrdtMessages(networkBuffer.toBinary(), LIVEKIT_MAX_SIZE);
|
|
136
|
+
for (const chunk of chunks) {
|
|
137
|
+
binaryMessageBus.emit(CommsMessage.CRDT, chunk);
|
|
138
|
+
}
|
|
139
|
+
DEBUG_NETWORK_MESSAGES() &&
|
|
140
|
+
console.log(`Total: ${messages.length} messages in ${chunks.length} chunks from ${excludeSender}`);
|
|
141
|
+
}
|
|
142
|
+
function sendCorrectionToSender(networkMessage, sender, localEntityId) {
|
|
143
|
+
try {
|
|
144
|
+
// Only handle component messages (PUT/DELETE), not entity deletion
|
|
145
|
+
if (networkMessage.type === CrdtMessageType.DELETE_ENTITY_NETWORK) {
|
|
146
|
+
DEBUG_NETWORK_MESSAGES() && console.log('[AUTHORITATIVE] Cannot send authoritative message for entity deletion');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// Safe to access componentId and timestamp now
|
|
150
|
+
const component = engine.getComponent(networkMessage.componentId);
|
|
151
|
+
// Only proceed if component supports authoritative messages (LWW or GrowOnlySet)
|
|
152
|
+
if (!supportsCorrections(component)) {
|
|
153
|
+
DEBUG_NETWORK_MESSAGES() && console.log('[AUTHORITATIVE] Component does not support authoritative messages');
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const serverCRDTState = component.getCrdtState(localEntityId);
|
|
157
|
+
if (serverCRDTState) {
|
|
158
|
+
// Create authoritative message using PUT_COMPONENT_NETWORK
|
|
159
|
+
// Each client will convert this to AUTHORITATIVE_PUT_COMPONENT with proper entity mapping
|
|
160
|
+
const correctionBuffer = new ReadWriteByteBuffer();
|
|
161
|
+
PutNetworkComponentOperation.write(networkMessage.entityId, // Use original network entity ID
|
|
162
|
+
serverCRDTState.timestamp, networkMessage.componentId, networkMessage.networkId, serverCRDTState.data, correctionBuffer);
|
|
163
|
+
// Send authoritative message directly to the sender
|
|
164
|
+
binaryMessageBus.emit(CommsMessage.CRDT_AUTHORITATIVE, correctionBuffer.toBinary(), [sender]);
|
|
165
|
+
DEBUG_NETWORK_MESSAGES() &&
|
|
166
|
+
console.log(`[AUTHORITATIVE] Sent authoritative message to ${sender} for entity ${localEntityId} component ${networkMessage.componentId} with timestamp ${networkMessage.timestamp}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
DEBUG_NETWORK_MESSAGES() && console.error('Error sending correction:', error);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
findExistingNetworkEntity,
|
|
175
|
+
// transform Network messages to CRDT Common Messages.
|
|
176
|
+
processClientMessages: function processClientMessages(value, sender, forceCorrections = false) {
|
|
177
|
+
// console.log(`[CLIENT] Processing message from ${sender}, ${value.length} bytes`)
|
|
178
|
+
// Collect all regular messages in a single buffer for batched application
|
|
179
|
+
const combinedBuffer = new ReadWriteByteBuffer();
|
|
180
|
+
// Clients process network messages from server and convert them to regular messages
|
|
181
|
+
for (const message of utils.readMessages(value)) {
|
|
182
|
+
// Only process network messages in client message handler
|
|
183
|
+
if (utils.isNetworkMessage(message)) {
|
|
184
|
+
const networkMessage = message;
|
|
185
|
+
// Find or create network entity mapping
|
|
186
|
+
const localEntityId = findOrCreateNetworkEntity(networkMessage, sender, false);
|
|
187
|
+
// Convert network message to regular message or correction message
|
|
188
|
+
const regularMessage = convertNetworkToRegularMessage(networkMessage, localEntityId, forceCorrections);
|
|
189
|
+
if (regularMessage?.messageBuffer.byteLength) {
|
|
190
|
+
combinedBuffer.writeBuffer(regularMessage.messageBuffer, false);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return combinedBuffer.toBinary();
|
|
195
|
+
},
|
|
196
|
+
// Sever Code: process message, handle permissions, and broadcast if needed.
|
|
197
|
+
processServerMessages: function processServerMessages(value, sender) {
|
|
198
|
+
// console.log(`[SERVER] Processing message from ${sender}, ${value.length} bytes`)
|
|
199
|
+
// Collect all valid messages for batched broadcasting
|
|
200
|
+
const messagesToBroadcast = [];
|
|
201
|
+
const regularMessagesBuffer = new ReadWriteByteBuffer();
|
|
202
|
+
for (const message of utils.readMessages(value)) {
|
|
203
|
+
try {
|
|
204
|
+
// Only process network messages in server message handler
|
|
205
|
+
if (utils.isNetworkMessage(message)) {
|
|
206
|
+
const networkMessage = message;
|
|
207
|
+
// 0. Refuse what is already unusable before an entity is spent on it. A peer
|
|
208
|
+
// sending unique (networkId, entityId) pairs it knows will be refused would
|
|
209
|
+
// otherwise drain the range one refusal at a time. A pair already mapped takes
|
|
210
|
+
// the normal path, so its sender still gets the correction it is owed.
|
|
211
|
+
if (findExistingNetworkEntity(networkMessage) === null && !peerMessageIsEligible(networkMessage)) {
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
// 1. Find or create network entity mapping
|
|
215
|
+
const localEntityId = findOrCreateNetworkEntity(networkMessage, sender, true);
|
|
216
|
+
// 2. Convert network message to regular message and collect for local application
|
|
217
|
+
const regularMessage = convertNetworkToRegularMessage(networkMessage, localEntityId);
|
|
218
|
+
// 3. Basic permission validation.
|
|
219
|
+
if (!regularMessage || !validateMessagePermissions(regularMessage, sender, localEntityId)) {
|
|
220
|
+
// Send correction back to sender with server's authoritative state
|
|
221
|
+
sendCorrectionToSender(networkMessage, sender, localEntityId);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// 4. Collect valid message for batched broadcasting
|
|
225
|
+
messagesToBroadcast.push(networkMessage);
|
|
226
|
+
if (regularMessage?.messageBuffer.byteLength) {
|
|
227
|
+
regularMessagesBuffer.writeBuffer(regularMessage.messageBuffer, false);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
DEBUG_NETWORK_MESSAGES() && console.error('Error processing server message:', error);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Batch broadcast all valid messages together
|
|
236
|
+
broadcastBatchedMessages(messagesToBroadcast, sender);
|
|
237
|
+
return regularMessagesBuffer.toBinary();
|
|
238
|
+
},
|
|
239
|
+
// engine changes that needs to be broadcasted.
|
|
240
|
+
convertRegularToNetworkMessage: function convertRegularToNetworkMessage(regularMessage) {
|
|
241
|
+
const groupedBuffer = new ReadWriteByteBuffer();
|
|
242
|
+
// First pass: Convert all regular messages to network format and group them into one big buffer
|
|
243
|
+
for (const message of utils.readMessages(regularMessage)) {
|
|
244
|
+
// Only convert regular messages that have network data
|
|
245
|
+
const networkData = NetworkEntity.getOrNull(message.entityId);
|
|
246
|
+
if (networkData && !utils.isNetworkMessage(message)) {
|
|
247
|
+
utils.localMessageToNetwork(message, networkData, groupedBuffer);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Second pass: Use the new chunking function that respects message boundaries
|
|
251
|
+
const totalData = groupedBuffer.toBinary();
|
|
252
|
+
return chunkCrdtMessages(totalData, LIVEKIT_MAX_SIZE);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9zZXJ2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGVBQWUsRUFFZix3QkFBd0IsRUFFeEIsNEJBQTRCLEVBQzdCLE1BQU0sVUFBVSxDQUFBO0FBQ2pCLE9BQU8sS0FBSyxVQUFVLE1BQU0sMEJBQTBCLENBQUE7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMvQyxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQVNqRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7QUFPbEMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQThCO0lBQ2xFLE1BQU0sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUE7SUFFM0Msb0VBQW9FO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXRELG1GQUFtRjtJQUNuRixTQUFTLG1CQUFtQixDQUMxQixTQUFpQztRQUVqQyxPQUFPLENBQ0wsQ0FBQyxTQUFTLENBQUMsYUFBYSxpREFBeUM7WUFDL0QsU0FBUyxDQUFDLGFBQWEsMkNBQW1DLENBQUM7WUFDN0QsY0FBYyxJQUFJLFNBQVMsQ0FD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QUM1QyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTt5QkFDdkU7cUJBQ0Y7aUJBQ0Y7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2Qsc0JBQXNCLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFBO2lCQUNyRjthQUNGO1lBQ0QsOENBQThDO1lBQzlDLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3JELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDekMsQ0FBQztRQUNELCtDQUErQztRQUMvQyw4QkFBOEIsRUFBRSxTQUFTLDhCQUE4QixDQUFDLGNBQTBCO1lBQ2hHLE1BQU0sYUFBYSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQTtZQUUvQyxnR0FBZ0c7WUFDaEcsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUN4RCx1REFBdUQ7Z0JBQ3ZELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUU3RCxJQUFJLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDbkQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUE7aUJBQ2pFO2FBQ0Y7WUFFRCw4RUFBOEU7WUFDOUUsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFBO1lBQzFDLE9BQU8saUJBQWlCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDdkQsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSUVuZ2luZSxcbiAgRW50aXR5LFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIENyZHRNZXNzYWdlQm9keSxcbiAgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLFxuICBDb21wb25lbnRUeXBlLFxuICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uXG59IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICdAZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMnXG5pbXBvcnQgeyBSZWFkV3JpdGVCeXRlQnVmZmVyIH0gZnJvbSAnQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInXG5pbXBvcnQgeyBDb21tc01lc3NhZ2UgfSBmcm9tICcuLi9iaW5hcnktbWVzc2FnZS1idXMnXG5pbXBvcnQgeyBjaHVua0NyZHRNZXNzYWdlcyB9IGZyb20gJy4uL2NodW5raW5nJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscydcbmltcG9ydCB7IEFVVEhfU0VSVkVSX1BFRVJfSUQsIERFQlVHX05FVFdPUktfTUVTU0FHRVMgfSBmcm9tICcuLi9tZXNzYWdlLWJ1cy1zeW5jJ1xuaW1wb3J0IHsgdHlwZSBCaW5hcnlNZXNzYWdlQnVzIH0gZnJvbSAnLi4vYmluYXJ5LW1lc3NhZ2UtYnVzJ1xuaW1wb3J0IHtcbiAgTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb24sXG4gIEdyb3dPbmx5VmFsdWVTZXRDb21wb25lbnREZWZpbml0aW9uLFxuICBDb21wb25lbnREZWZpbml0aW9uLFxuICBJbnRlcm5hbEJhc2VDb21wb25lbnRcbn0gZnJvbSAnQGRjbC9lY3MvZGlzdC9lbmdpbmUvY29tcG9uZW50J1xuXG5leHBvcnQgY29uc3QgTElWRUtJVF9NQVhfU0laRSA9IDEyXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyVmFsaWRhdGlvbkNvbmZpZyB7XG4gIGVuZ2luZTogSUVuZ2luZVxuICBiaW5hcnlNZXNzYWdlQnVzOiBSZXR1cm5UeXBlPHR5cGVvZiBCaW5hcnlNZXNzYWdlQnVzPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVyVmFsaWRhdG9yKGNvbmZpZzogU2VydmVyVmFsaWRhdGlvbkNvbmZpZykge1xuICBjb25zdCB7IGVuZ2luZSwgYmluYXJ5TWVzc2FnZUJ1cyB9ID0gY29uZmlnXG5cbiAgLy8gSW5pdGlhbGl6ZSBjb21wb25lbnRzIGZvciBuZXR3b3JrIG9wZXJhdGlvbnMgYW5kIHRyYW5zZm9ybSBmaXhpbmdcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGNvbXBvbmVudHMuTmV0d29ya0VudGl0eShlbmdpbmUpXG4gIGNvbnN0IENyZWF0ZWRCeSA9IGNvbXBvbmVudHMuQ3JlYXRlZEJ5KGVuZ2luZSlcbiAgY29uc3QgTmV0d29ya1BhcmVudCA9IGNvbXBvbmVudHMuTmV0d29ya1BhcmVudChlbmdpbmUpXG5cbiAgLy8gVHlwZSBndWFyZCB0byBjaGVjayBpZiBjb21wb25lbnQgc3VwcG9ydHMgY29ycmVjdGlvbnMgKGJvdGggTFdXIGFuZCBHcm93T25seVNldClcbiAgZnVuY3Rpb24gc3VwcG9ydHNDb3JyZWN0aW9uczxUPihcbiAgICBjb21wb25lbnQ6IENvbXBvbmVudERlZmluaXRpb248VD5cbiAgKTogY29tcG9uZW50IGlzIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFQ+IHwgR3Jvd09ubHlWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb248VD4ge1xuICAgIHJldHVybiAoXG4gICAgICAoY29tcG9uZW50LmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuTGFzdFdyaXRlV2luRWxlbWVudFNldCB8fFxuICAgICAgICBjb21wb25lbnQuY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5Hcm93T25seVZhbHVlU2V0KSAmJlxuICAgICAgJ2dldENyZHRTdGF0ZScgaW4gY29tcG9uZW50XG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEV4aXN0aW5nTmV0d29ya0VudGl0eShtZXNzYWdlOiB1dGlscy5OZXR3b3JrTWVzc2FnZSk6IEVudGl0eSB8IG51bGwge1xuICAgIC8vIExvb2sgZm9yIGV4aXN0aW5nIG5ldHdvcmsgZW50aXR5IG1hcHBpbmcgKGRvbid0IGNyZWF0ZSBuZXcgb25lcylcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHlJZCwgbmV0d29ya0RhdGFdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoTmV0d29ya0VudGl0eSkpIHtcbiAgICAgIGlmIChuZXR3b3JrRGF0YS5uZXR3b3JrSWQgPT09IG1lc3NhZ2UubmV0d29ya0lkICYmIG5ldHdvcmtEYXRhLmVudGl0eUlkID09PSBtZXNzYWdlLmVudGl0eUlkKSB7XG4gICAgICAgIHJldHVybiBlbnRpdHlJZFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiBub3QgZm91bmRcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYSBtZXNzYWdlIGNhbiBiZSBqdWRnZWQgb24gYmVmb3JlIGFuIGVudGl0eSBpcyBzcGVudCBtYXBwaW5nIGl0LiBBbnl0aGluZ1xuICAgKiBuZWVkaW5nIHRoZSBsb2NhbCBlbnRpdHkg4oCUIHRoZSBDUkRUIGRyeSBydW4sIHRoZSBzY2VuZSdzIG93biB2YWxpZGF0b3Ig4oCUIHN0aWxsXG4gICAqIGhhcHBlbnMgaW4gdmFsaWRhdGVNZXNzYWdlUGVybWlzc2lvbnMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIGZ1bmN0aW9uIHBlZXJNZXNzYWdlSXNFbGlnaWJsZShtZXNzYWdlOiB1dGlscy5OZXR3b3JrTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgIGlmICghKCdjb21wb25lbnRJZCcgaW4gbWVzc2FnZSkpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBkZWZpbml0aW9uID0gZW5naW5lLmdldENvbXBvbmVudE9yTnVsbChtZXNzYWdlLmNvbXBvbmVudElkKVxuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoJ2RhdGEnIGluIG1lc3NhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlZmluaXRpb24uc2NoZW1hLmRlc2VyaWFsaXplKG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKG1lc3NhZ2UuZGF0YSkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRPckNyZWF0ZU5ldHdvcmtFbnRpdHkobWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UsIHNlbmRlcjogc3RyaW5nLCBpc1NlcnZlcjogYm9vbGVhbik6IEVudGl0eSB7XG4gICAgLy8gTG9vayBmb3IgZXhpc3RpbmcgbmV0d29yayBlbnRpdHkgbWFwcGluZyBmaXJzdFxuICAgIGNvbnN0IGV4aXN0aW5nRW50aXR5ID0gZmluZEV4aXN0aW5nTmV0d29ya0VudGl0eShtZXNzYWdlKVxuXG4gICAgaWYgKGV4aXN0aW5nRW50aXR5KSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdFbnRpdHlcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IGVudGl0eSBhbmQgbmV0d29yayBtYXBwaW5nXG4gICAgY29uc3QgbmV3RW50aXR5SWQgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgICBOZXR3b3JrRW50aXR5LmNyZWF0ZU9yUmVwbGFjZShuZXdFbnRpdHlJZCwge1xuICAgICAgbmV0d29ya0lkOiBtZXNzYWdlLm5ldHdvcmtJZCxcbiAgICAgIGVudGl0eUlkOiBtZXNzYWdlLmVudGl0eUlkXG4gICAgfSlcblxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgQ3JlYXRlZEJ5LmNyZWF0ZU9yUmVwbGFjZShuZXdFbnRpdHlJZCwgeyBhZGRyZXNzOiBzZW5kZXIgfSlcbiAgICB9XG5cbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddIENyZWF0ZWQgbmV3IGVudGl0eSAke25ld0VudGl0eUlkfSBmb3IgbmV0d29yayAke21lc3NhZ2UubmV0d29ya0lkfToke21lc3NhZ2UuZW50aXR5SWR9YClcbiAgICByZXR1cm4gbmV3RW50aXR5SWRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnROZXR3b3JrVG9SZWd1bGFyTWVzc2FnZShcbiAgICBuZXR3b3JrTWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UsXG4gICAgbG9jYWxFbnRpdHlJZDogRW50aXR5LFxuICAgIGZvcmNlQ29ycmVjdGlvbnMgPSBmYWxzZVxuICApOiAoQ3JkdE1lc3NhZ2VCb2R5ICYgeyBtZXNzYWdlQnVmZmVyOiBVaW50OEFycmF5IH0pIHwgbnVsbCB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSB0aGUgd2VsbC10ZXN0ZWQgbmV0d29ya01lc3NhZ2VUb0xvY2FsIHV0aWxpdHkgd2l0aCB0cmFuc2Zvcm0gZml4aW5nIGZvciBVbml0eVxuICAgICAgY29uc3QgbWVzc2FnZSA9IHV0aWxzLm5ldHdvcmtNZXNzYWdlVG9Mb2NhbChcbiAgICAgICAgbmV0d29ya01lc3NhZ2UsXG4gICAgICAgIGxvY2FsRW50aXR5SWQsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgTmV0d29ya1BhcmVudCxcbiAgICAgICAgZm9yY2VDb3JyZWN0aW9uc1xuICAgICAgKVxuICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgbWVzc2FnZUJ1ZmZlcjogYnVmZmVyLnRvQmluYXJ5KCkgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5lcnJvcignRXJyb3IgY29udmVydGluZyBuZXR3b3JrIG1lc3NhZ2U6JywgZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZVBlcm1pc3Npb25zKG1lc3NhZ2U6IHV0aWxzLlJlZ3VsYXJNZXNzYWdlLCBzZW5kZXI6IHN0cmluZywgX2xvY2FsRW50aXR5SWQ6IEVudGl0eSk6IGJvb2xlYW4ge1xuICAgIC8vIEJhc2ljIGNoZWNrc1xuICAgIGlmICghc2VuZGVyIHx8IHNlbmRlciA9PT0gQVVUSF9TRVJWRVJfUEVFUl9JRCkge1xuICAgICAgcmV0dXJuIGZhbHNlIC8vIFNlcnZlciBzaG91bGRuJ3Qgc2VuZCBtZXNzYWdlcyB0byBpdHNlbGZcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSkge1xuICAgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgP1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UIHx8IG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGVuZ2luZS5nZXRDb21wb25lbnRPck51bGwobWVzc2FnZS5jb21wb25lbnRJZCkgYXMgSW50ZXJuYWxCYXNlQ29tcG9uZW50PHVua25vd24+IHwgbnVsbFxuICAgICAgaWYgKCFjb21wb25lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsXG4gICAgICBpZiAoJ2RhdGEnIGluIG1lc3NhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IGNvbXBvbmVudC5zY2hlbWEuZGVzZXJpYWxpemUobmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIobWVzc2FnZS5kYXRhKSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJ5UnVuQ1JEVCA9IGNvbXBvbmVudC5fX2RyeV9ydW5fdXBkYXRlRnJvbUNyZHQobWVzc2FnZSlcbiAgICAgIGNvbnN0IHZhbGlkQ1JEVCA9IFtcbiAgICAgICAgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLlN0YXRlVXBkYXRlZERhdGEsXG4gICAgICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5TdGF0ZVVwZGF0ZWRUaW1lc3RhbXAsXG4gICAgICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5FbnRpdHlEZWxldGVkXG4gICAgICBdLmluY2x1ZGVzKGRyeVJ1bkNSRFQpXG4gICAgICBjb25zdCBjcmVhdGVkQnkgPSBDcmVhdGVkQnkuZ2V0T3JOdWxsKG1lc3NhZ2UuZW50aXR5SWQpXG4gICAgICBjb25zdCB2YWxpZE1lc3NhZ2UgPVxuICAgICAgICB2YWxpZENSRFQgJiZcbiAgICAgICAgY29tcG9uZW50Ll9fcnVuX3ZhbGlkYXRlQmVmb3JlQ2hhbmdlKG1lc3NhZ2UuZW50aXR5SWQsIHZhbHVlLCBzZW5kZXIsIGNyZWF0ZWRCeT8uYWRkcmVzcyA/PyBBVVRIX1NFUlZFUl9QRUVSX0lEKVxuXG4gICAgICByZXR1cm4gISF2YWxpZE1lc3NhZ2VcbiAgICB9XG5cbiAgICAvLyBGb3Igbm93LCBiYXNpYyB2YWxpZGF0aW9uIC0gaW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgY2hlY2sgY29tcG9uZW50IHN5bmMgcGVybWlzc2lvbnNcbiAgICAvLyBUT0RPOiBDaGVjayBpZiBzZW5kZXIgb3ducyB0aGUgZW50aXR5XG4gICAgLy8gVE9ETzogQ2hlY2sgY29tcG9uZW50IHN5bmMgbW9kZSAoJ2FsbCcgfCAnb3duZXInIHwgJ3NlcnZlcicpXG4gICAgLy8gVE9ETzogUnVuIGNvbXBvbmVudCBjdXN0b20gdmFsaWRhdGlvblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBicm9hZGNhc3RCYXRjaGVkTWVzc2FnZXMobWVzc2FnZXM6IHV0aWxzLk5ldHdvcmtNZXNzYWdlW10sIGV4Y2x1ZGVTZW5kZXI6IHN0cmluZykge1xuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgLy8gQnVpbGQgdGhlIGNvbXBsZXRlIGJ1ZmZlciB3aXRoIGFsbCBtZXNzYWdlc1xuICAgIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgICAvLyBTa2lwIG92ZXJzaXplZCBtZXNzYWdlcyB1cGZyb250XG4gICAgICBpZiAobWVzc2FnZS5tZXNzYWdlQnVmZmVyLmJ5dGVMZW5ndGggLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBNZXNzYWdlIHRvbyBsYXJnZSAoJHttZXNzYWdlLm1lc3NhZ2VCdWZmZXIuYnl0ZUxlbmd0aH0gYnl0ZXMpLCBza2lwcGluZyBtZXNzYWdlIGZyb20gJHtleGNsdWRlU2VuZGVyfWBcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgbmV0d29ya0J1ZmZlci53cml0ZUJ1ZmZlcihtZXNzYWdlLm1lc3NhZ2VCdWZmZXIsIGZhbHNlKVxuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgY2h1bmtpbmcgZnVuY3Rpb24gdG8gc3BsaXQgaW50byBwcm9wZXIgY2h1bmtzXG4gICAgY29uc3QgY2h1bmtzID0gY2h1bmtDcmR0TWVzc2FnZXMobmV0d29ya0J1ZmZlci50b0JpbmFyeSgpLCBMSVZFS0lUX01BWF9TSVpFKVxuXG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1JEVCwgY2h1bmspXG4gICAgfVxuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJlxuICAgICAgY29uc29sZS5sb2coYFRvdGFsOiAke21lc3NhZ2VzLmxlbmd0aH0gbWVzc2FnZXMgaW4gJHtjaHVua3MubGVuZ3RofSBjaHVua3MgZnJvbSAke2V4Y2x1ZGVTZW5kZXJ9YClcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbmRDb3JyZWN0aW9uVG9TZW5kZXIobmV0d29ya01lc3NhZ2U6IHV0aWxzLk5ldHdvcmtNZXNzYWdlLCBzZW5kZXI6IHN0cmluZywgbG9jYWxFbnRpdHlJZDogRW50aXR5KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9ubHkgaGFuZGxlIGNvbXBvbmVudCBtZXNzYWdlcyAoUFVUL0RFTEVURSksIG5vdCBlbnRpdHkgZGVsZXRpb25cbiAgICAgIGlmIChuZXR3b3JrTWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWV9ORVRXT1JLKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0FVVEhPUklUQVRJVkVdIENhbm5vdCBzZW5kIGF1dGhvcml0YXRpdmUgbWVzc2FnZSBmb3IgZW50aXR5IGRlbGV0aW9uJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFNhZmUgdG8gYWNjZXNzIGNvbXBvbmVudElkIGFuZCB0aW1lc3RhbXAgbm93XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KG5ldHdvcmtNZXNzYWdlLmNvbXBvbmVudElkKVxuXG4gICAgICAvLyBPbmx5IHByb2NlZWQgaWYgY29tcG9uZW50IHN1cHBvcnRzIGF1dGhvcml0YXRpdmUgbWVzc2FnZXMgKExXVyBvciBHcm93T25seVNldClcbiAgICAgIGlmICghc3VwcG9ydHNDb3JyZWN0aW9ucyhjb21wb25lbnQpKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0FVVEhPUklUQVRJVkVdIENvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IGF1dGhvcml0YXRpdmUgbWVzc2FnZXMnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyQ1JEVFN0YXRlID0gY29tcG9uZW50LmdldENyZHRTdGF0ZShsb2NhbEVudGl0eUlkKVxuXG4gICAgICBpZiAoc2VydmVyQ1JEVFN0YXRlKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdXNpbmcgUFVUX0NPTVBPTkVOVF9ORVRXT1JLXG4gICAgICAgIC8vIEVhY2ggY2xpZW50IHdpbGwgY29udmVydCB0aGlzIHRvIEFVVEhPUklUQVRJVkVfUFVUX0NPTVBPTkVOVCB3aXRoIHByb3BlciBlbnRpdHkgbWFwcGluZ1xuICAgICAgICBjb25zdCBjb3JyZWN0aW9uQnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICAgICAgICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLndyaXRlKFxuICAgICAgICAgIG5ldHdvcmtNZXNzYWdlLmVudGl0eUlkLCAvLyBVc2Ugb3JpZ2luYWwgbmV0d29yayBlbnRpdHkgSURcbiAgICAgICAgICBzZXJ2ZXJDUkRUU3RhdGUudGltZXN0YW1wLFxuICAgICAgICAgIG5ldHdvcmtNZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtNZXNzYWdlLm5ldHdvcmtJZCxcbiAgICAgICAgICBzZXJ2ZXJDUkRUU3RhdGUuZGF0YSxcbiAgICAgICAgICBjb3JyZWN0aW9uQnVmZmVyXG4gICAgICAgIClcbiAgICAgICAgLy8gU2VuZCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIHNlbmRlclxuICAgICAgICBiaW5hcnlNZXNzYWdlQnVzLmVtaXQoQ29tbXNNZXNzYWdlLkNSRFRfQVVUSE9SSVRBVElWRSwgY29ycmVjdGlvbkJ1ZmZlci50b0JpbmFyeSgpLCBbc2VuZGVyXSlcblxuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbQVVUSE9SSVRBVElWRV0gU2VudCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdG8gJHtzZW5kZXJ9IGZvciBlbnRpdHkgJHtsb2NhbEVudGl0eUlkfSBjb21wb25lbnQgJHtuZXR3b3JrTWVzc2FnZS5jb21wb25lbnRJZH0gd2l0aCB0aW1lc3RhbXAgJHtuZXR3b3JrTWVzc2FnZS50aW1lc3RhbXB9YFxuICAgICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlbmRpbmcgY29ycmVjdGlvbjonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpbmRFeGlzdGluZ05ldHdvcmtFbnRpdHksXG4gICAgLy8gdHJhbnNmb3JtIE5ldHdvcmsgbWVzc2FnZXMgdG8gQ1JEVCBDb21tb24gTWVzc2FnZXMuXG4gICAgcHJvY2Vzc0NsaWVudE1lc3NhZ2VzOiBmdW5jdGlvbiBwcm9jZXNzQ2xpZW50TWVzc2FnZXModmFsdWU6IFVpbnQ4QXJyYXksIHNlbmRlcjogc3RyaW5nLCBmb3JjZUNvcnJlY3Rpb25zID0gZmFsc2UpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ0xJRU5UXSBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke3NlbmRlcn0sICR7dmFsdWUubGVuZ3RofSBieXRlc2ApXG5cbiAgICAgIC8vIENvbGxlY3QgYWxsIHJlZ3VsYXIgbWVzc2FnZXMgaW4gYSBzaW5nbGUgYnVmZmVyIGZvciBiYXRjaGVkIGFwcGxpY2F0aW9uXG4gICAgICBjb25zdCBjb21iaW5lZEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgLy8gQ2xpZW50cyBwcm9jZXNzIG5ldHdvcmsgbWVzc2FnZXMgZnJvbSBzZXJ2ZXIgYW5kIGNvbnZlcnQgdGhlbSB0byByZWd1bGFyIG1lc3NhZ2VzXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdXRpbHMucmVhZE1lc3NhZ2VzKHZhbHVlKSkge1xuICAgICAgICAvLyBPbmx5IHByb2Nlc3MgbmV0d29yayBtZXNzYWdlcyBpbiBjbGllbnQgbWVzc2FnZSBoYW5kbGVyXG4gICAgICAgIGlmICh1dGlscy5pc05ldHdvcmtNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgY29uc3QgbmV0d29ya01lc3NhZ2UgPSBtZXNzYWdlIGFzIHV0aWxzLk5ldHdvcmtNZXNzYWdlXG5cbiAgICAgICAgICAvLyBGaW5kIG9yIGNyZWF0ZSBuZXR3b3JrIGVudGl0eSBtYXBwaW5nXG4gICAgICAgICAgY29uc3QgbG9jYWxFbnRpdHlJZCA9IGZpbmRPckNyZWF0ZU5ldHdvcmtFbnRpdHkobmV0d29ya01lc3NhZ2UsIHNlbmRlciwgZmFsc2UpXG5cbiAgICAgICAgICAvLyBDb252ZXJ0IG5ldHdvcmsgbWVzc2FnZSB0byByZWd1bGFyIG1lc3NhZ2Ugb3IgY29ycmVjdGlvbiBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgcmVndWxhck1lc3NhZ2UgPSBjb252ZXJ0TmV0d29ya1RvUmVndWxhck1lc3NhZ2UobmV0d29ya01lc3NhZ2UsIGxvY2FsRW50aXR5SWQsIGZvcmNlQ29ycmVjdGlvbnMpXG5cbiAgICAgICAgICBpZiAocmVndWxhck1lc3NhZ2U/Lm1lc3NhZ2VCdWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgY29tYmluZWRCdWZmZXIud3JpdGVCdWZmZXIocmVndWxhck1lc3NhZ2UubWVzc2FnZUJ1ZmZlciwgZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tYmluZWRCdWZmZXIudG9CaW5hcnkoKVxuICAgIH0sXG4gICAgLy8gU2V2ZXIgQ29kZTogcHJvY2VzcyBtZXNzYWdlLCBoYW5kbGUgcGVybWlzc2lvbnMsIGFuZCBicm9hZGNhc3QgaWYgbmVlZGVkLlxuICAgIHByb2Nlc3NTZXJ2ZXJNZXNzYWdlczogZnVuY3Rpb24gcHJvY2Vzc1NlcnZlck1lc3NhZ2VzKHZhbHVlOiBVaW50OEFycmF5LCBzZW5kZXI6IHN0cmluZykge1xuICAgICAgLy8gY29uc29sZS5sb2coYFtTRVJWRVJdIFByb2Nlc3NpbmcgbWVzc2FnZSBmcm9tICR7c2VuZGVyfSwgJHt2YWx1ZS5sZW5ndGh9IGJ5dGVzYClcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgdmFsaWQgbWVzc2FnZXMgZm9yIGJhdGNoZWQgYnJvYWRjYXN0aW5nXG4gICAgICBjb25zdCBtZXNzYWdlc1RvQnJvYWRjYXN0OiB1dGlscy5OZXR3b3JrTWVzc2FnZVtdID0gW11cbiAgICAgIGNvbnN0IHJlZ3VsYXJNZXNzYWdlc0J1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHV0aWxzLnJlYWRNZXNzYWdlcyh2YWx1ZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgbmV0d29yayBtZXNzYWdlcyBpbiBzZXJ2ZXIgbWVzc2FnZSBoYW5kbGVyXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtNZXNzYWdlID0gbWVzc2FnZSBhcyB1dGlscy5OZXR3b3JrTWVzc2FnZVxuXG4gICAgICAgICAgICAvLyAwLiBSZWZ1c2Ugd2hhdCBpcyBhbHJlYWR5IHVudXNhYmxlIGJlZm9yZSBhbiBlbnRpdHkgaXMgc3BlbnQgb24gaXQuIEEgcGVlclxuICAgICAgICAgICAgLy8gc2VuZGluZyB1bmlxdWUgKG5ldHdvcmtJZCwgZW50aXR5SWQpIHBhaXJzIGl0IGtub3dzIHdpbGwgYmUgcmVmdXNlZCB3b3VsZFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGRyYWluIHRoZSByYW5nZSBvbmUgcmVmdXNhbCBhdCBhIHRpbWUuIEEgcGFpciBhbHJlYWR5IG1hcHBlZCB0YWtlc1xuICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCBwYXRoLCBzbyBpdHMgc2VuZGVyIHN0aWxsIGdldHMgdGhlIGNvcnJlY3Rpb24gaXQgaXMgb3dlZC5cbiAgICAgICAgICAgIGlmIChmaW5kRXhpc3RpbmdOZXR3b3JrRW50aXR5KG5ldHdvcmtNZXNzYWdlKSA9PT0gbnVsbCAmJiAhcGVlck1lc3NhZ2VJc0VsaWdpYmxlKG5ldHdvcmtNZXNzYWdlKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAxLiBGaW5kIG9yIGNyZWF0ZSBuZXR3b3JrIGVudGl0eSBtYXBwaW5nXG4gICAgICAgICAgICBjb25zdCBsb2NhbEVudGl0eUlkID0gZmluZE9yQ3JlYXRlTmV0d29ya0VudGl0eShuZXR3b3JrTWVzc2FnZSwgc2VuZGVyLCB0cnVlKVxuXG4gICAgICAgICAgICAvLyAyLiBDb252ZXJ0IG5ldHdvcmsgbWVzc2FnZSB0byByZWd1bGFyIG1lc3NhZ2UgYW5kIGNvbGxlY3QgZm9yIGxvY2FsIGFwcGxpY2F0aW9uXG4gICAgICAgICAgICBjb25zdCByZWd1bGFyTWVzc2FnZSA9IGNvbnZlcnROZXR3b3JrVG9SZWd1bGFyTWVzc2FnZShuZXR3b3JrTWVzc2FnZSwgbG9jYWxFbnRpdHlJZClcblxuICAgICAgICAgICAgLy8gMy4gQmFzaWMgcGVybWlzc2lvbiB2YWxpZGF0aW9uLlxuICAgICAgICAgICAgaWYgKCFyZWd1bGFyTWVzc2FnZSB8fCAhdmFsaWRhdGVNZXNzYWdlUGVybWlzc2lvbnMocmVndWxhck1lc3NhZ2UgYXMgYW55LCBzZW5kZXIsIGxvY2FsRW50aXR5SWQpKSB7XG4gICAgICAgICAgICAgIC8vIFNlbmQgY29ycmVjdGlvbiBiYWNrIHRvIHNlbmRlciB3aXRoIHNlcnZlcidzIGF1dGhvcml0YXRpdmUgc3RhdGVcbiAgICAgICAgICAgICAgc2VuZENvcnJlY3Rpb25Ub1NlbmRlcihuZXR3b3JrTWVzc2FnZSwgc2VuZGVyLCBsb2NhbEVudGl0eUlkKVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA0LiBDb2xsZWN0IHZhbGlkIG1lc3NhZ2UgZm9yIGJhdGNoZWQgYnJvYWRjYXN0aW5nXG4gICAgICAgICAgICBtZXNzYWdlc1RvQnJvYWRjYXN0LnB1c2gobmV0d29ya01lc3NhZ2UpXG5cbiAgICAgICAgICAgIGlmIChyZWd1bGFyTWVzc2FnZT8ubWVzc2FnZUJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlZ3VsYXJNZXNzYWdlc0J1ZmZlci53cml0ZUJ1ZmZlcihyZWd1bGFyTWVzc2FnZS5tZXNzYWdlQnVmZmVyLCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3Npbmcgc2VydmVyIG1lc3NhZ2U6JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEJhdGNoIGJyb2FkY2FzdCBhbGwgdmFsaWQgbWVzc2FnZXMgdG9nZXRoZXJcbiAgICAgIGJyb2FkY2FzdEJhdGNoZWRNZXNzYWdlcyhtZXNzYWdlc1RvQnJvYWRjYXN0LCBzZW5kZXIpXG4gICAgICByZXR1cm4gcmVndWxhck1lc3NhZ2VzQnVmZmVyLnRvQmluYXJ5KClcbiAgICB9LFxuICAgIC8vIGVuZ2luZSBjaGFuZ2VzIHRoYXQgbmVlZHMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gICAgY29udmVydFJlZ3VsYXJUb05ldHdvcmtNZXNzYWdlOiBmdW5jdGlvbiBjb252ZXJ0UmVndWxhclRvTmV0d29ya01lc3NhZ2UocmVndWxhck1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICAgICAgY29uc3QgZ3JvdXBlZEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgLy8gRmlyc3QgcGFzczogQ29udmVydCBhbGwgcmVndWxhciBtZXNzYWdlcyB0byBuZXR3b3JrIGZvcm1hdCBhbmQgZ3JvdXAgdGhlbSBpbnRvIG9uZSBiaWcgYnVmZmVyXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdXRpbHMucmVhZE1lc3NhZ2VzKHJlZ3VsYXJNZXNzYWdlKSkge1xuICAgICAgICAvLyBPbmx5IGNvbnZlcnQgcmVndWxhciBtZXNzYWdlcyB0aGF0IGhhdmUgbmV0d29yayBkYXRhXG4gICAgICAgIGNvbnN0IG5ldHdvcmtEYXRhID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcblxuICAgICAgICBpZiAobmV0d29ya0RhdGEgJiYgIXV0aWxzLmlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICB1dGlscy5sb2NhbE1lc3NhZ2VUb05ldHdvcmsobWVzc2FnZSwgbmV0d29ya0RhdGEsIGdyb3VwZWRCdWZmZXIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2Vjb25kIHBhc3M6IFVzZSB0aGUgbmV3IGNodW5raW5nIGZ1bmN0aW9uIHRoYXQgcmVzcGVjdHMgbWVzc2FnZSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB0b3RhbERhdGEgPSBncm91cGVkQnVmZmVyLnRvQmluYXJ5KClcbiAgICAgIHJldHVybiBjaHVua0NyZHRNZXNzYWdlcyh0b3RhbERhdGEsIExJVkVLSVRfTUFYX1NJWkUpXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Entity } from '@dcl/ecs/dist/engine';
|
|
2
|
+
import { NetworkParent } from '@dcl/ecs';
|
|
3
|
+
import { ReceiveMessage } from '@dcl/ecs/dist/runtime/types';
|
|
4
|
+
import { ReceiveNetworkMessage } from '@dcl/ecs/dist/systems/crdt/types';
|
|
5
|
+
import { ByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
|
6
|
+
import { CrdtMessageBody, DeleteComponentMessage, DeleteComponentNetworkMessage, DeleteEntityMessage, DeleteEntityNetworkMessage, PutComponentMessage, AuthoritativePutComponentMessage, PutNetworkComponentMessage } from '@dcl/ecs/dist/serialization/crdt/types';
|
|
7
|
+
import { INetowrkEntityType } from '@dcl/ecs/dist/components/types';
|
|
8
|
+
export type NetworkMessage = (PutNetworkComponentMessage | DeleteComponentNetworkMessage | DeleteEntityNetworkMessage) & {
|
|
9
|
+
messageBuffer: Uint8Array;
|
|
10
|
+
};
|
|
11
|
+
export type RegularMessage = (PutComponentMessage | AuthoritativePutComponentMessage | DeleteComponentMessage | DeleteEntityMessage) & {
|
|
12
|
+
messageBuffer: Uint8Array;
|
|
13
|
+
};
|
|
14
|
+
export declare function readMessages(data: Uint8Array): (NetworkMessage | RegularMessage)[];
|
|
15
|
+
export declare function isNetworkMessage(message: ReceiveMessage): message is ReceiveNetworkMessage;
|
|
16
|
+
export declare function networkMessageToLocal(message: ReceiveNetworkMessage, localEntityId: Entity, destinationBuffer: ByteBuffer, networkParentComponent?: typeof NetworkParent, forceCorrections?: boolean): CrdtMessageBody;
|
|
17
|
+
export declare function localMessageToNetwork(message: ReceiveMessage, network: INetowrkEntityType, destinationBuffer: ByteBuffer): void;
|
|
18
|
+
export declare function fixTransformParent(message: ReceiveMessage, parent?: Entity): Uint8Array;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { CrdtMessageProtocol } from '@dcl/ecs';
|
|
2
|
+
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
|
3
|
+
import { AuthoritativePutComponentOperation, PutComponentOperation } from '@dcl/ecs/dist/serialization/crdt';
|
|
4
|
+
import { CrdtMessageType } from '@dcl/ecs/dist/serialization/crdt/types';
|
|
5
|
+
import { DeleteComponent } from '@dcl/ecs/dist/serialization/crdt/deleteComponent';
|
|
6
|
+
import { DeleteEntity } from '@dcl/ecs/dist/serialization/crdt/deleteEntity';
|
|
7
|
+
import { PutNetworkComponentOperation } from '@dcl/ecs/dist/serialization/crdt/network/putComponentNetwork';
|
|
8
|
+
import { DeleteComponentNetwork } from '@dcl/ecs/dist/serialization/crdt/network/deleteComponentNetwork';
|
|
9
|
+
import { DeleteEntityNetwork } from '@dcl/ecs/dist/serialization/crdt/network/deleteEntityNetwork';
|
|
10
|
+
import { TransformSchema, COMPONENT_ID as TransformComponentId } from '@dcl/ecs/dist/components/manual/Transform';
|
|
11
|
+
export function readMessages(data) {
|
|
12
|
+
const buffer = new ReadWriteByteBuffer(data);
|
|
13
|
+
const messages = [];
|
|
14
|
+
let header;
|
|
15
|
+
while ((header = CrdtMessageProtocol.getHeader(buffer))) {
|
|
16
|
+
const offset = buffer.currentReadOffset();
|
|
17
|
+
let message = undefined;
|
|
18
|
+
// Network messages
|
|
19
|
+
if (header.type === CrdtMessageType.DELETE_COMPONENT_NETWORK) {
|
|
20
|
+
message = DeleteComponentNetwork.read(buffer);
|
|
21
|
+
}
|
|
22
|
+
else if (header.type === CrdtMessageType.PUT_COMPONENT_NETWORK) {
|
|
23
|
+
message = PutNetworkComponentOperation.read(buffer);
|
|
24
|
+
}
|
|
25
|
+
else if (header.type === CrdtMessageType.DELETE_ENTITY_NETWORK) {
|
|
26
|
+
message = DeleteEntityNetwork.read(buffer);
|
|
27
|
+
}
|
|
28
|
+
// Regular messages
|
|
29
|
+
else if (header.type === CrdtMessageType.PUT_COMPONENT) {
|
|
30
|
+
message = PutComponentOperation.read(buffer);
|
|
31
|
+
}
|
|
32
|
+
else if (header.type === CrdtMessageType.AUTHORITATIVE_PUT_COMPONENT) {
|
|
33
|
+
message = AuthoritativePutComponentOperation.read(buffer);
|
|
34
|
+
}
|
|
35
|
+
else if (header.type === CrdtMessageType.DELETE_COMPONENT) {
|
|
36
|
+
message = DeleteComponent.read(buffer);
|
|
37
|
+
}
|
|
38
|
+
else if (header.type === CrdtMessageType.DELETE_ENTITY) {
|
|
39
|
+
message = DeleteEntity.read(buffer);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
// consume unknown messages
|
|
43
|
+
buffer.incrementReadOffset(header.length);
|
|
44
|
+
}
|
|
45
|
+
if (message) {
|
|
46
|
+
messages.push({
|
|
47
|
+
...message,
|
|
48
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentReadOffset())
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return messages;
|
|
53
|
+
}
|
|
54
|
+
export function isNetworkMessage(message) {
|
|
55
|
+
return [
|
|
56
|
+
CrdtMessageType.DELETE_COMPONENT_NETWORK,
|
|
57
|
+
CrdtMessageType.DELETE_ENTITY_NETWORK,
|
|
58
|
+
CrdtMessageType.PUT_COMPONENT_NETWORK
|
|
59
|
+
].includes(message.type);
|
|
60
|
+
}
|
|
61
|
+
export function networkMessageToLocal(message, localEntityId, destinationBuffer,
|
|
62
|
+
// Optional network parent component for transform fixing
|
|
63
|
+
networkParentComponent,
|
|
64
|
+
// Force corrections - converts PUT_COMPONENT_NETWORK to authoritative_PUT_COMPONENT
|
|
65
|
+
forceCorrections = false) {
|
|
66
|
+
if (message.type === CrdtMessageType.PUT_COMPONENT_NETWORK) {
|
|
67
|
+
let messageData = message.data;
|
|
68
|
+
// Fix transform parent if needed for Unity/engine processing
|
|
69
|
+
if (message.componentId === TransformComponentId && networkParentComponent) {
|
|
70
|
+
const parentNetwork = networkParentComponent.getOrNull(localEntityId);
|
|
71
|
+
messageData = fixTransformParent(message, parentNetwork?.entityId);
|
|
72
|
+
}
|
|
73
|
+
if (forceCorrections) {
|
|
74
|
+
// Use AUTHORITATIVE_PUT_COMPONENT for forced state updates
|
|
75
|
+
AuthoritativePutComponentOperation.write(localEntityId, message.timestamp, message.componentId, messageData, destinationBuffer);
|
|
76
|
+
return {
|
|
77
|
+
type: CrdtMessageType.AUTHORITATIVE_PUT_COMPONENT,
|
|
78
|
+
componentId: message.componentId,
|
|
79
|
+
timestamp: message.timestamp,
|
|
80
|
+
data: messageData,
|
|
81
|
+
entityId: localEntityId
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
// Normal PUT_COMPONENT conversion
|
|
86
|
+
PutComponentOperation.write(localEntityId, message.timestamp, message.componentId, messageData, destinationBuffer);
|
|
87
|
+
return {
|
|
88
|
+
type: CrdtMessageType.PUT_COMPONENT,
|
|
89
|
+
componentId: message.componentId,
|
|
90
|
+
timestamp: message.timestamp,
|
|
91
|
+
data: messageData,
|
|
92
|
+
entityId: localEntityId
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (message.type === CrdtMessageType.DELETE_COMPONENT_NETWORK) {
|
|
97
|
+
DeleteComponent.write(localEntityId, message.componentId, message.timestamp, destinationBuffer);
|
|
98
|
+
return {
|
|
99
|
+
type: CrdtMessageType.DELETE_COMPONENT,
|
|
100
|
+
componentId: message.componentId,
|
|
101
|
+
timestamp: message.timestamp,
|
|
102
|
+
entityId: localEntityId
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
else if (message.type === CrdtMessageType.DELETE_ENTITY_NETWORK) {
|
|
106
|
+
DeleteEntity.write(localEntityId, destinationBuffer);
|
|
107
|
+
return {
|
|
108
|
+
type: CrdtMessageType.DELETE_ENTITY,
|
|
109
|
+
entityId: localEntityId
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
throw 1;
|
|
113
|
+
}
|
|
114
|
+
export function localMessageToNetwork(message, network, destinationBuffer) {
|
|
115
|
+
if (message.type === CrdtMessageType.PUT_COMPONENT) {
|
|
116
|
+
PutNetworkComponentOperation.write(network.entityId, message.timestamp, message.componentId, network.networkId, message.data, destinationBuffer);
|
|
117
|
+
}
|
|
118
|
+
else if (message.type === CrdtMessageType.DELETE_COMPONENT) {
|
|
119
|
+
DeleteComponentNetwork.write(network.entityId, message.componentId, message.timestamp, network.networkId, destinationBuffer);
|
|
120
|
+
}
|
|
121
|
+
else if (message.type === CrdtMessageType.DELETE_ENTITY) {
|
|
122
|
+
DeleteEntityNetwork.write(network.entityId, network.networkId, destinationBuffer);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function fixTransformParent(message, parent) {
|
|
126
|
+
const buffer = new ReadWriteByteBuffer();
|
|
127
|
+
const transform = 'data' in message && TransformSchema.deserialize(new ReadWriteByteBuffer(message.data));
|
|
128
|
+
if (!transform)
|
|
129
|
+
throw new Error('Invalid parent transform');
|
|
130
|
+
// Generate new transform raw data with the parent
|
|
131
|
+
const newTransform = { ...transform, parent };
|
|
132
|
+
TransformSchema.serialize(newTransform, buffer);
|
|
133
|
+
return buffer.toBinary();
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9zZXJ2ZXIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFpQixNQUFNLFVBQVUsQ0FBQTtBQUc3RCxPQUFPLEVBQWMsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUN4RixPQUFPLEVBQUUsa0NBQWtDLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUM1RyxPQUFPLEVBSUwsZUFBZSxFQVFoQixNQUFNLHdDQUF3QyxDQUFBO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrREFBa0QsQ0FBQTtBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0NBQStDLENBQUE7QUFFNUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOERBQThELENBQUE7QUFDM0csT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUVBQWlFLENBQUE7QUFDeEcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOERBQThELENBQUE7QUFDbEcsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLElBQUksb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQWdCakgsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFnQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzVDLE1BQU0sUUFBUSxHQUF3QyxFQUFFLENBQUE7SUFDeEQsSUFBSSxNQUFnQyxDQUFBO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDekMsSUFBSSxPQUFPLEdBQTRCLFNBQVMsQ0FBQTtRQUVoRCxtQkFBbUI7UUFDbkIs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QUE7SUFFM0Qsa0RBQWtEO0lBQ2xELE1BQU0sWUFBWSxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUE7SUFDN0MsZUFBZSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDL0MsT0FBTyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7QUFDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSB9IGZyb20gJ0BkY2wvZWNzL2Rpc3QvZW5naW5lJ1xuaW1wb3J0IHsgQ3JkdE1lc3NhZ2VQcm90b2NvbCwgTmV0d29ya1BhcmVudCB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgUmVjZWl2ZU1lc3NhZ2UgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3J1bnRpbWUvdHlwZXMnXG5pbXBvcnQgeyBSZWNlaXZlTmV0d29ya01lc3NhZ2UgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3N5c3RlbXMvY3JkdC90eXBlcydcbmltcG9ydCB7IEJ5dGVCdWZmZXIsIFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlcidcbmltcG9ydCB7IEF1dGhvcml0YXRpdmVQdXRDb21wb25lbnRPcGVyYXRpb24sIFB1dENvbXBvbmVudE9wZXJhdGlvbiB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9jcmR0J1xuaW1wb3J0IHtcbiAgQ3JkdE1lc3NhZ2UsXG4gIENyZHRNZXNzYWdlQm9keSxcbiAgQ3JkdE1lc3NhZ2VIZWFkZXIsXG4gIENyZHRNZXNzYWdlVHlwZSxcbiAgRGVsZXRlQ29tcG9uZW50TWVzc2FnZSxcbiAgRGVsZXRlQ29tcG9uZW50TmV0d29ya01lc3NhZ2UsXG4gIERlbGV0ZUVudGl0eU1lc3NhZ2UsXG4gIERlbGV0ZUVudGl0eU5ldHdvcmtNZXNzYWdlLFxuICBQdXRDb21wb25lbnRNZXNzYWdlLFxuICBBdXRob3JpdGF0aXZlUHV0Q29tcG9uZW50TWVzc2FnZSxcbiAgUHV0TmV0d29ya0NvbXBvbmVudE1lc3NhZ2Vcbn0gZnJvbSAnQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL2NyZHQvdHlwZXMnXG5pbXBvcnQgeyBEZWxldGVDb21wb25lbnQgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vY3JkdC9kZWxldGVDb21wb25lbnQnXG5pbXBvcnQgeyBEZWxldGVFbnRpdHkgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vY3JkdC9kZWxldGVFbnRpdHknXG5pbXBvcnQgeyBJTmV0b3dya0VudGl0eVR5cGUgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uIH0gZnJvbSAnQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL2NyZHQvbmV0d29yay9wdXRDb21wb25lbnROZXR3b3JrJ1xuaW1wb3J0IHsgRGVsZXRlQ29tcG9uZW50TmV0d29yayB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9jcmR0L25ldHdvcmsvZGVsZXRlQ29tcG9uZW50TmV0d29yaydcbmltcG9ydCB7IERlbGV0ZUVudGl0eU5ldHdvcmsgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vY3JkdC9uZXR3b3JrL2RlbGV0ZUVudGl0eU5ldHdvcmsnXG5pbXBvcnQgeyBUcmFuc2Zvcm1TY2hlbWEsIENPTVBPTkVOVF9JRCBhcyBUcmFuc2Zvcm1Db21wb25lbnRJZCB9IGZyb20gJ0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9tYW51YWwvVHJhbnNmb3JtJ1xuXG5leHBvcnQgdHlwZSBOZXR3b3JrTWVzc2FnZSA9IChcbiAgfCBQdXROZXR3b3JrQ29tcG9uZW50TWVzc2FnZVxuICB8IERlbGV0ZUNvbXBvbmVudE5ldHdvcmtNZXNzYWdlXG4gIHwgRGVsZXRlRW50aXR5TmV0d29ya01lc3NhZ2VcbikgJiB7IG1lc3NhZ2VCdWZmZXI6IFVpbnQ4QXJyYXkgfVxuXG5leHBvcnQgdHlwZSBSZWd1bGFyTWVzc2FnZSA9IChcbiAgfCBQdXRDb21wb25lbnRNZXNzYWdlXG4gIHwgQXV0aG9yaXRhdGl2ZVB1dENvbXBvbmVudE1lc3NhZ2VcbiAgfCBEZWxldGVDb21wb25lbnRNZXNzYWdlXG4gIHwgRGVsZXRlRW50aXR5TWVzc2FnZVxuKSAmIHtcbiAgbWVzc2FnZUJ1ZmZlcjogVWludDhBcnJheVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRNZXNzYWdlcyhkYXRhOiBVaW50OEFycmF5KTogKE5ldHdvcmtNZXNzYWdlIHwgUmVndWxhck1lc3NhZ2UpW10ge1xuICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcihkYXRhKVxuICBjb25zdCBtZXNzYWdlczogKE5ldHdvcmtNZXNzYWdlIHwgUmVndWxhck1lc3NhZ2UpW10gPSBbXVxuICBsZXQgaGVhZGVyOiBDcmR0TWVzc2FnZUhlYWRlciB8IG51bGxcbiAgd2hpbGUgKChoZWFkZXIgPSBDcmR0TWVzc2FnZVByb3RvY29sLmdldEhlYWRlcihidWZmZXIpKSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGJ1ZmZlci5jdXJyZW50UmVhZE9mZnNldCgpXG4gICAgbGV0IG1lc3NhZ2U6IENyZHRNZXNzYWdlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG5cbiAgICAvLyBOZXR3b3JrIG1lc3NhZ2VzXG4gICAgaWYgKGhlYWRlci50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0NPTVBPTkVOVF9ORVRXT1JLKSB7XG4gICAgICBtZXNzYWdlID0gRGVsZXRlQ29tcG9uZW50TmV0d29yay5yZWFkKGJ1ZmZlcikhXG4gICAgfSBlbHNlIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlRfTkVUV09SSykge1xuICAgICAgbWVzc2FnZSA9IFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ucmVhZChidWZmZXIpIVxuICAgIH0gZWxzZSBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZX05FVFdPUkspIHtcbiAgICAgIG1lc3NhZ2UgPSBEZWxldGVFbnRpdHlOZXR3b3JrLnJlYWQoYnVmZmVyKSFcbiAgICB9XG4gICAgLy8gUmVndWxhciBtZXNzYWdlc1xuICAgIGVsc2UgaWYgKGhlYWRlci50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVCkge1xuICAgICAgbWVzc2FnZSA9IFB1dENvbXBvbmVudE9wZXJhdGlvbi5yZWFkKGJ1ZmZlcikhXG4gICAgfSBlbHNlIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkFVVEhPUklUQVRJVkVfUFVUX0NPTVBPTkVOVCkge1xuICAgICAgbWVzc2FnZSA9IEF1dGhvcml0YXRpdmVQdXRDb21wb25lbnRPcGVyYXRpb24ucmVhZChidWZmZXIpIVxuICAgIH0gZWxzZSBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UKSB7XG4gICAgICBtZXNzYWdlID0gRGVsZXRlQ29tcG9uZW50LnJlYWQoYnVmZmVyKSFcbiAgICB9IGVsc2UgaWYgKGhlYWRlci50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSkge1xuICAgICAgbWVzc2FnZSA9IERlbGV0ZUVudGl0eS5yZWFkKGJ1ZmZlcikhXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnN1bWUgdW5rbm93biBtZXNzYWdlc1xuICAgICAgYnVmZmVyLmluY3JlbWVudFJlYWRPZmZzZXQoaGVhZGVyLmxlbmd0aClcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgbWVzc2FnZXMucHVzaCh7XG4gICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgIG1lc3NhZ2VCdWZmZXI6IGJ1ZmZlci5idWZmZXIoKS5zdWJhcnJheShvZmZzZXQsIGJ1ZmZlci5jdXJyZW50UmVhZE9mZnNldCgpKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lc3NhZ2VzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05ldHdvcmtNZXNzYWdlKG1lc3NhZ2U6IFJlY2VpdmVNZXNzYWdlKTogbWVzc2FnZSBpcyBSZWNlaXZlTmV0d29ya01lc3NhZ2Uge1xuICByZXR1cm4gW1xuICAgIENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfQ09NUE9ORU5UX05FVFdPUkssXG4gICAgQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFlfTkVUV09SSyxcbiAgICBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVF9ORVRXT1JLXG4gIF0uaW5jbHVkZXMobWVzc2FnZS50eXBlKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbmV0d29ya01lc3NhZ2VUb0xvY2FsKFxuICBtZXNzYWdlOiBSZWNlaXZlTmV0d29ya01lc3NhZ2UsXG4gIGxvY2FsRW50aXR5SWQ6IEVudGl0eSxcbiAgZGVzdGluYXRpb25CdWZmZXI6IEJ5dGVCdWZmZXIsXG4gIC8vIE9wdGlvbmFsIG5ldHdvcmsgcGFyZW50IGNvbXBvbmVudCBmb3IgdHJhbnNmb3JtIGZpeGluZ1xuICBuZXR3b3JrUGFyZW50Q29tcG9uZW50PzogdHlwZW9mIE5ldHdvcmtQYXJlbnQsXG4gIC8vIEZvcmNlIGNvcnJlY3Rpb25zIC0gY29udmVydHMgUFVUX0NPTVBPTkVOVF9ORVRXT1JLIHRvIGF1dGhvcml0YXRpdmVfUFVUX0NPTVBPTkVOVFxuICBmb3JjZUNvcnJlY3Rpb25zID0gZmFsc2Vcbik6IENyZHRNZXNzYWdlQm9keSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UX05FVFdPUkspIHtcbiAgICBsZXQgbWVzc2FnZURhdGEgPSBtZXNzYWdlLmRhdGFcblxuICAgIC8vIEZpeCB0cmFuc2Zvcm0gcGFyZW50IGlmIG5lZWRlZCBmb3IgVW5pdHkvZW5naW5lIHByb2Nlc3NpbmdcbiAgICBpZiAobWVzc2FnZS5jb21wb25lbnRJZCA9PT0gVHJhbnNmb3JtQ29tcG9uZW50SWQgJiYgbmV0d29ya1BhcmVudENvbXBvbmVudCkge1xuICAgICAgY29uc3QgcGFyZW50TmV0d29yayA9IG5ldHdvcmtQYXJlbnRDb21wb25lbnQuZ2V0T3JOdWxsKGxvY2FsRW50aXR5SWQpXG4gICAgICBtZXNzYWdlRGF0YSA9IGZpeFRyYW5zZm9ybVBhcmVudChtZXNzYWdlLCBwYXJlbnROZXR3b3JrPy5lbnRpdHlJZClcbiAgICB9XG4gICAgaWYgKGZvcmNlQ29ycmVjdGlvbnMpIHtcbiAgICAgIC8vIFVzZSBBVVRIT1JJVEFUSVZFX1BVVF9DT01QT05FTlQgZm9yIGZvcmNlZCBzdGF0ZSB1cGRhdGVzXG4gICAgICBBdXRob3JpdGF0aXZlUHV0Q29tcG9uZW50T3BlcmF0aW9uLndyaXRlKFxuICAgICAgICBsb2NhbEVudGl0eUlkLFxuICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgbWVzc2FnZS5jb21wb25lbnRJZCxcbiAgICAgICAgbWVzc2FnZURhdGEsXG4gICAgICAgIGRlc3RpbmF0aW9uQnVmZmVyXG4gICAgICApXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBDcmR0TWVzc2FnZVR5cGUuQVVUSE9SSVRBVElWRV9QVVRfQ09NUE9ORU5ULFxuICAgICAgICBjb21wb25lbnRJZDogbWVzc2FnZS5jb21wb25lbnRJZCxcbiAgICAgICAgdGltZXN0YW1wOiBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgZGF0YTogbWVzc2FnZURhdGEsXG4gICAgICAgIGVudGl0eUlkOiBsb2NhbEVudGl0eUlkXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vcm1hbCBQVVRfQ09NUE9ORU5UIGNvbnZlcnNpb25cbiAgICAgIFB1dENvbXBvbmVudE9wZXJhdGlvbi53cml0ZShsb2NhbEVudGl0eUlkLCBtZXNzYWdlLnRpbWVzdGFtcCwgbWVzc2FnZS5jb21wb25lbnRJZCwgbWVzc2FnZURhdGEsIGRlc3RpbmF0aW9uQnVmZmVyKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlQsXG4gICAgICAgIGNvbXBvbmVudElkOiBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICB0aW1lc3RhbXA6IG1lc3NhZ2UudGltZXN0YW1wLFxuICAgICAgICBkYXRhOiBtZXNzYWdlRGF0YSxcbiAgICAgICAgZW50aXR5SWQ6IGxvY2FsRW50aXR5SWRcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0NPTVBPTkVOVF9ORVRXT1JLKSB7XG4gICAgRGVsZXRlQ29tcG9uZW50LndyaXRlKGxvY2FsRW50aXR5SWQsIG1lc3NhZ2UuY29tcG9uZW50SWQsIG1lc3NhZ2UudGltZXN0YW1wLCBkZXN0aW5hdGlvbkJ1ZmZlcilcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQsXG4gICAgICBjb21wb25lbnRJZDogbWVzc2FnZS5jb21wb25lbnRJZCxcbiAgICAgIHRpbWVzdGFtcDogbWVzc2FnZS50aW1lc3RhbXAsXG4gICAgICBlbnRpdHlJZDogbG9jYWxFbnRpdHlJZFxuICAgIH1cbiAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZX05FVFdPUkspIHtcbiAgICBEZWxldGVFbnRpdHkud3JpdGUobG9jYWxFbnRpdHlJZCwgZGVzdGluYXRpb25CdWZmZXIpXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IENyZHRNZXNzYWdlVHlwZS5ERUxFVEVfRU5USVRZLFxuICAgICAgZW50aXR5SWQ6IGxvY2FsRW50aXR5SWRcbiAgICB9XG4gIH1cbiAgdGhyb3cgMVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9jYWxNZXNzYWdlVG9OZXR3b3JrKFxuICBtZXNzYWdlOiBSZWNlaXZlTWVzc2FnZSxcbiAgbmV0d29yazogSU5ldG93cmtFbnRpdHlUeXBlLFxuICBkZXN0aW5hdGlvbkJ1ZmZlcjogQnl0ZUJ1ZmZlclxuKSB7XG4gIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UKSB7XG4gICAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbi53cml0ZShcbiAgICAgIG5ldHdvcmsuZW50aXR5SWQsXG4gICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgIG1lc3NhZ2UuY29tcG9uZW50SWQsXG4gICAgICBuZXR3b3JrLm5ldHdvcmtJZCxcbiAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgIGRlc3RpbmF0aW9uQnVmZmVyXG4gICAgKVxuICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQpIHtcbiAgICBEZWxldGVDb21wb25lbnROZXR3b3JrLndyaXRlKFxuICAgICAgbmV0d29yay5lbnRpdHlJZCxcbiAgICAgIG1lc3NhZ2UuY29tcG9uZW50SWQsXG4gICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgIG5ldHdvcmsubmV0d29ya0lkLFxuICAgICAgZGVzdGluYXRpb25CdWZmZXJcbiAgICApXG4gIH0gZWxzZSBpZiAobWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSkge1xuICAgIERlbGV0ZUVudGl0eU5ldHdvcmsud3JpdGUobmV0d29yay5lbnRpdHlJZCwgbmV0d29yay5uZXR3b3JrSWQsIGRlc3RpbmF0aW9uQnVmZmVyKVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaXhUcmFuc2Zvcm1QYXJlbnQobWVzc2FnZTogUmVjZWl2ZU1lc3NhZ2UsIHBhcmVudD86IEVudGl0eSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBidWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IHRyYW5zZm9ybSA9ICdkYXRhJyBpbiBtZXNzYWdlICYmIFRyYW5zZm9ybVNjaGVtYS5kZXNlcmlhbGl6ZShuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcihtZXNzYWdlLmRhdGEpKVxuXG4gIGlmICghdHJhbnNmb3JtKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcGFyZW50IHRyYW5zZm9ybScpXG5cbiAgLy8gR2VuZXJhdGUgbmV3IHRyYW5zZm9ybSByYXcgZGF0YSB3aXRoIHRoZSBwYXJlbnRcbiAgY29uc3QgbmV3VHJhbnNmb3JtID0geyAuLi50cmFuc2Zvcm0sIHBhcmVudCB9XG4gIFRyYW5zZm9ybVNjaGVtYS5zZXJpYWxpemUobmV3VHJhbnNmb3JtLCBidWZmZXIpXG4gIHJldHVybiBidWZmZXIudG9CaW5hcnkoKVxufVxuIl19
|
package/network/state.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
|
2
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, TriggerAreaResult } from '@dcl/ecs';
|
|
3
|
-
import { LIVEKIT_MAX_SIZE } from '
|
|
3
|
+
import { LIVEKIT_MAX_SIZE } from './server';
|
|
4
4
|
export const NOT_SYNC_COMPONENTS = [
|
|
5
5
|
VideoEvent,
|
|
6
6
|
TweenState,
|
|
@@ -42,8 +42,7 @@ export function engineToCrdt(engine) {
|
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
44
|
itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
|
|
45
|
-
|
|
46
|
-
return isNetworkEntity;
|
|
45
|
+
return NetworkEntity.has(entity);
|
|
47
46
|
});
|
|
48
47
|
}
|
|
49
48
|
let header;
|
|
@@ -61,7 +60,6 @@ export function engineToCrdt(engine) {
|
|
|
61
60
|
networkBuffer.resetBuffer();
|
|
62
61
|
}
|
|
63
62
|
// If the message itself is larger than the limit, we need to handle it specially
|
|
64
|
-
// For now, we'll skip it to prevent infinite loops
|
|
65
63
|
if (messageSize / 1024 > LIVEKIT_MAX_SIZE) {
|
|
66
64
|
console.error(`Message too large (${messageSize} bytes), skipping component ${message.componentId} for entity ${message.entityId}`);
|
|
67
65
|
continue;
|
|
@@ -81,4 +79,4 @@ export function engineToCrdt(engine) {
|
|
|
81
79
|
}
|
|
82
80
|
return chunks;
|
|
83
81
|
}
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsNEJBQTRCLEVBRTVCLGFBQWEsSUFBSSxjQUFjLEVBRS9CLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxhQUFhLEVBQ2IsTUFBTSxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsRUFFbEIsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFtQztJQUNqRSxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YseUJBQXlCO0lBQ3pCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixTQUFTO0lBQ1QsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsYUFBYTtJQUNiLFdBQVc7SUFDWCxNQUFNO0lBQ04saUJBQWlCO0NBQ2xCLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNwRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBYTtJQUNqRCxxQkFBcUI7SUFDckIsMEJBQTBCO0NBQzNCLENBQUE7QUFFRCxNQUFN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TUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQzlDO0tBQ0Y7SUFFRCw0Q0FBNEM7SUFDNUMsSUFBSSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUN0QztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlcidcbmltcG9ydCB7XG4gIENyZHRNZXNzYWdlSGVhZGVyLFxuICBDcmR0TWVzc2FnZVByb3RvY29sLFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIElFbmdpbmUsXG4gIFB1dENvbXBvbmVudE9wZXJhdGlvbixcbiAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbixcbiAgU3luY0NvbXBvbmVudHMgYXMgX1N5bmNDb21wb25lbnRzLFxuICBOZXR3b3JrRW50aXR5IGFzIF9OZXR3b3JrRW50aXR5LFxuICBJTmV0b3dya0VudGl0eSxcbiAgVmlkZW9FdmVudCxcbiAgQXVkaW9FdmVudCxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUGh5c2ljc0NvbWJpbmVkRm9yY2UsXG4gIFBoeXNpY3NDb21iaW5lZEltcHVsc2UsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVHdlZW5TdGF0ZSxcbiAgVWlEcm9wZG93bixcbiAgVWlEcm9wZG93blJlc3VsdCxcbiAgVWlJbnB1dCxcbiAgVWlJbnB1dFJlc3VsdCxcbiAgVWlUZXh0LFxuICBVaVRyYW5zZm9ybSxcbiAgVHJpZ2dlckFyZWFSZXN1bHQsXG4gIENvbXBvbmVudERlZmluaXRpb25cbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBMSVZFS0lUX01BWF9TSVpFIH0gZnJvbSAnLi9zZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTOiBDb21wb25lbnREZWZpbml0aW9uPHVua25vd24+W10gPSBbXG4gIFZpZGVvRXZlbnQsXG4gIFR3ZWVuU3RhdGUsXG4gIEF1ZGlvRXZlbnQsXG4gIEVuZ2luZUluZm8sXG4gIEdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUsXG4gIFBoeXNpY3NDb21iaW5lZEZvcmNlLFxuICBQaHlzaWNzQ29tYmluZWRJbXB1bHNlLFxuICBQb2ludGVyRXZlbnRzUmVzdWx0LFxuICBSYXljYXN0UmVzdWx0LFxuICBSZWFsbUluZm8sXG4gIFVpRHJvcGRvd24sXG4gIFVpRHJvcGRvd25SZXN1bHQsXG4gIFVpSW5wdXQsXG4gIFVpSW5wdXRSZXN1bHQsXG4gIFVpVHJhbnNmb3JtLFxuICBVaVRleHQsXG4gIFRyaWdnZXJBcmVhUmVzdWx0XG5dXG5cbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTX0lEUyA9IE5PVF9TWU5DX0NPTVBPTkVOVFMubWFwKCgkKSA9PiAkLmNvbXBvbmVudElkKVxuZXhwb3J0IGNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFNfTkFNRVM6IHN0cmluZ1tdID0gW1xuICAnYXNzZXQtcGFja3M6OlNjcmlwdCcsIC8vIENvbXBvbmVudE5hbWUgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2RlY2VudHJhbGFuZC9hc3NldC1wYWNrcy9ibG9iL21haW4vc3JjL2VudW1zLnRzXG4gICdhc3NldC1wYWNrczo6QWN0aW9uVHlwZXMnXG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTeW5jQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50RGVmaW5pdGlvbjx1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIShcbiAgICBOT1RfU1lOQ19DT01QT05FTlRTX0lEUy5pbmNsdWRlcyhjb21wb25lbnQuY29tcG9uZW50SWQpIHx8XG4gICAgTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUy5pbmNsdWRlcyhjb21wb25lbnQuY29tcG9uZW50TmFtZSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzeW5jZWRDb21wb25lbnRzKGVuZ2luZTogSUVuZ2luZSk6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXSB7XG4gIHJldHVybiBbLi4uTk9UX1NZTkNfQ09NUE9ORU5UUywgLi4uTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUy5tYXAoKCQpID0+IGVuZ2luZS5nZXRDb21wb25lbnRPck51bGwoJCkpXS5maWx0ZXIoXG4gICAgQm9vbGVhblxuICApIGFzIENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5naW5lVG9DcmR0KGVuZ2luZTogSUVuZ2luZSk6IFVpbnQ4QXJyYXlbXSB7XG4gIGNvbnN0IGNyZHRCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrRW50aXR5LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya0VudGl0eVxuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBpdENvbXBvbmVudERlZmluaXRpb24gb2YgZW5naW5lLmNvbXBvbmVudHNJdGVyKCkpIHtcbiAgICBpZiAoIXNob3VsZFN5bmNDb21wb25lbnQoaXRDb21wb25lbnREZWZpbml0aW9uKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpdENvbXBvbmVudERlZmluaXRpb24uZHVtcENyZHRTdGF0ZVRvQnVmZmVyKGNyZHRCdWZmZXIsIChlbnRpdHkpID0+IHtcbiAgICAgIHJldHVybiBOZXR3b3JrRW50aXR5LmhhcyhlbnRpdHkpXG4gICAgfSlcbiAgfVxuXG4gIGxldCBoZWFkZXI6IENyZHRNZXNzYWdlSGVhZGVyIHwgbnVsbFxuICB3aGlsZSAoKGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wuZ2V0SGVhZGVyKGNyZHRCdWZmZXIpKSkge1xuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlQpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBQdXRDb21wb25lbnRPcGVyYXRpb24ucmVhZChjcmR0QnVmZmVyKSFcbiAgICAgIGNvbnN0IG5ldHdvcmtFbnRpdHkgPSBOZXR3b3JrRW50aXR5LmdldE9yTnVsbChtZXNzYWdlLmVudGl0eUlkKVxuXG4gICAgICAvLyBDaGVjayBpZiBhZGRpbmcgdGhpcyBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgc2l6ZSBsaW1pdFxuICAgICAgY29uc3QgY3VycmVudEJ1ZmZlclNpemUgPSBuZXR3b3JrQnVmZmVyLnRvQmluYXJ5KCkuYnl0ZUxlbmd0aFxuICAgICAgY29uc3QgbWVzc2FnZVNpemUgPSBtZXNzYWdlLmRhdGEuYnl0ZUxlbmd0aFxuXG4gICAgICBpZiAoKGN1cnJlbnRCdWZmZXJTaXplICsgbWVzc2FnZVNpemUpIC8gMTAyNCA+IExJVkVLSVRfTUFYX1NJWkUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGhhcyBjb250ZW50LCBzYXZlIGl0IGFzIGEgY2h1bmtcbiAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXJTaXplID4gMCkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKG5ldHdvcmtCdWZmZXIudG9Db3BpZWRCaW5hcnkoKSlcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyLnJlc2V0QnVmZmVyKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQsIHdlIG5lZWQgdG8gaGFuZGxlIGl0IHNwZWNpYWxseVxuICAgICAgICBpZiAobWVzc2FnZVNpemUgLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgTWVzc2FnZSB0b28gbGFyZ2UgKCR7bWVzc2FnZVNpemV9IGJ5dGVzKSwgc2tpcHBpbmcgY29tcG9uZW50ICR7bWVzc2FnZS5jb21wb25lbnRJZH0gZm9yIGVudGl0eSAke21lc3NhZ2UuZW50aXR5SWR9YFxuICAgICAgICAgIClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgICBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtFbnRpdHkubmV0d29ya0lkLFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3JkdEJ1ZmZlci5pbmNyZW1lbnRSZWFkT2Zmc2V0KGhlYWRlci5sZW5ndGgpXG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgZGF0YSBhcyB0aGUgZmluYWwgY2h1bmtcbiAgaWYgKG5ldHdvcmtCdWZmZXIuY3VycmVudFdyaXRlT2Zmc2V0KCkgPiAwKSB7XG4gICAgY2h1bmtzLnB1c2gobmV0d29ya0J1ZmZlci50b0JpbmFyeSgpKVxuICB9XG5cbiAgcmV0dXJuIGNodW5rc1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/sdk",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "7.30.2-
|
|
4
|
+
"version": "7.30.2-37807847179.commit-24c42ea",
|
|
5
5
|
"author": "Decentraland",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dcl/ecs": "7.30.2-
|
|
7
|
+
"@dcl/ecs": "7.30.2-37807847179.commit-24c42ea",
|
|
8
8
|
"@dcl/ecs-math": "2.1.0",
|
|
9
|
-
"@dcl/js-runtime": "7.30.2-
|
|
10
|
-
"@dcl/react-ecs": "7.30.2-
|
|
11
|
-
"@dcl/sdk-commands": "7.30.2-
|
|
9
|
+
"@dcl/js-runtime": "7.30.2-37807847179.commit-24c42ea",
|
|
10
|
+
"@dcl/react-ecs": "7.30.2-37807847179.commit-24c42ea",
|
|
11
|
+
"@dcl/sdk-commands": "7.30.2-37807847179.commit-24c42ea"
|
|
12
12
|
},
|
|
13
13
|
"keywords": [],
|
|
14
14
|
"license": "Apache-2.0",
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
},
|
|
34
34
|
"types": "./index.d.ts",
|
|
35
35
|
"typings": "./index.d.ts",
|
|
36
|
-
"commit": "
|
|
36
|
+
"commit": "24c42ea8e31e33815f98d9d436acc3507569de11"
|
|
37
37
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EnvVar provides methods to fetch environment variables from the
|
|
3
|
+
* Server Side Storage service. This module only works when running
|
|
4
|
+
* on server-side scenes.
|
|
5
|
+
*/
|
|
6
|
+
export declare const EnvVar: {
|
|
7
|
+
/**
|
|
8
|
+
* Fetches a specific environment variable by key as plain text.
|
|
9
|
+
*
|
|
10
|
+
* @param key - The name of the environment variable to fetch
|
|
11
|
+
* @returns A promise that resolves to the plain text value, or empty string if not found
|
|
12
|
+
* @throws Error if not running on a server-side scene
|
|
13
|
+
*/
|
|
14
|
+
get(key: string): Promise<string>;
|
|
15
|
+
};
|