@dcl/sdk 7.29.1-36625469671.commit-2d5ffac → 7.29.1-36863326504.commit-aa54c50
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/network/server/index.js +43 -6
- package/package.json +6 -6
- package/src/network/server/index.ts +45 -5
package/network/server/index.js
CHANGED
|
@@ -28,6 +28,27 @@ export function createServerValidator(config) {
|
|
|
28
28
|
// Return null if not found
|
|
29
29
|
return null;
|
|
30
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
|
+
}
|
|
31
52
|
function findOrCreateNetworkEntity(message, sender, isServer) {
|
|
32
53
|
// Look for existing network entity mapping first
|
|
33
54
|
const existingEntity = findExistingNetworkEntity(message);
|
|
@@ -68,9 +89,18 @@ export function createServerValidator(config) {
|
|
|
68
89
|
// TODO: how to handle this case ?
|
|
69
90
|
}
|
|
70
91
|
if (message.type === CrdtMessageType.PUT_COMPONENT || message.type === CrdtMessageType.DELETE_COMPONENT) {
|
|
71
|
-
const component = engine.
|
|
72
|
-
|
|
73
|
-
|
|
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
|
+
}
|
|
74
104
|
const dryRunCRDT = component.__dry_run_updateFromCrdt(message);
|
|
75
105
|
const validCRDT = [
|
|
76
106
|
ProcessMessageResultType.StateUpdatedData,
|
|
@@ -174,12 +204,19 @@ export function createServerValidator(config) {
|
|
|
174
204
|
// Only process network messages in server message handler
|
|
175
205
|
if (utils.isNetworkMessage(message)) {
|
|
176
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
|
+
}
|
|
177
214
|
// 1. Find or create network entity mapping
|
|
178
215
|
const localEntityId = findOrCreateNetworkEntity(networkMessage, sender, true);
|
|
179
216
|
// 2. Convert network message to regular message and collect for local application
|
|
180
217
|
const regularMessage = convertNetworkToRegularMessage(networkMessage, localEntityId);
|
|
181
|
-
// 3. Basic permission validation
|
|
182
|
-
if (!validateMessagePermissions(regularMessage, sender, localEntityId)) {
|
|
218
|
+
// 3. Basic permission validation.
|
|
219
|
+
if (!regularMessage || !validateMessagePermissions(regularMessage, sender, localEntityId)) {
|
|
183
220
|
// Send correction back to sender with server's authoritative state
|
|
184
221
|
sendCorrectionToSender(networkMessage, sender, localEntityId);
|
|
185
222
|
continue;
|
|
@@ -216,4 +253,4 @@ export function createServerValidator(config) {
|
|
|
216
253
|
}
|
|
217
254
|
};
|
|
218
255
|
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9zZXJ2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGVBQWUsRUFFZix3QkFBd0IsRUFFeEIsNEJBQTRCLEVBQzdCLE1BQU0sVUFBVSxDQUFBO0FBQ2pCLE9BQU8sS0FBSyxVQUFVLE1BQU0sMEJBQTBCLENBQUE7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMvQyxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQVNqRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7QUFPbEMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQThCO0lBQ2xFLE1BQU0sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUE7SUFFM0Msb0VBQW9FO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXRELG1GQUFtRjtJQUNuRixTQUFTLG1CQUFtQixDQUMxQixTQUFpQztRQUVqQyxPQUFPLENBQ0wsQ0FBQyxTQUFTLENBQUMsYUFBYSxpREFBeUM7WUFDL0QsU0FBUyxDQUFDLGFBQWEsMkNBQW1DLENBQUM7WUFDN0QsY0FBYyxJQUFJLFNBQVMsQ0FD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QkFBcUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFBO2lCQUNqRTthQUNGO1lBRUQsOEVBQThFO1lBQzlFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtZQUMxQyxPQUFPLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3ZELENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIElFbmdpbmUsXG4gIEVudGl0eSxcbiAgQ3JkdE1lc3NhZ2VUeXBlLFxuICBDcmR0TWVzc2FnZUJvZHksXG4gIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZSxcbiAgQ29tcG9uZW50VHlwZSxcbiAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvblxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCAqIGFzIGNvbXBvbmVudHMgZnJvbSAnQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzJ1xuaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuaW1wb3J0IHsgQ29tbXNNZXNzYWdlIH0gZnJvbSAnLi4vYmluYXJ5LW1lc3NhZ2UtYnVzJ1xuaW1wb3J0IHsgY2h1bmtDcmR0TWVzc2FnZXMgfSBmcm9tICcuLi9jaHVua2luZydcbmltcG9ydCAqIGFzIHV0aWxzIGZyb20gJy4vdXRpbHMnXG5pbXBvcnQgeyBBVVRIX1NFUlZFUl9QRUVSX0lELCBERUJVR19ORVRXT1JLX01FU1NBR0VTIH0gZnJvbSAnLi4vbWVzc2FnZS1idXMtc3luYydcbmltcG9ydCB7IHR5cGUgQmluYXJ5TWVzc2FnZUJ1cyB9IGZyb20gJy4uL2JpbmFyeS1tZXNzYWdlLWJ1cydcbmltcG9ydCB7XG4gIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uLFxuICBHcm93T25seVZhbHVlU2V0Q29tcG9uZW50RGVmaW5pdGlvbixcbiAgQ29tcG9uZW50RGVmaW5pdGlvbixcbiAgSW50ZXJuYWxCYXNlQ29tcG9uZW50XG59IGZyb20gJ0BkY2wvZWNzL2Rpc3QvZW5naW5lL2NvbXBvbmVudCdcblxuZXhwb3J0IGNvbnN0IExJVkVLSVRfTUFYX1NJWkUgPSAxMlxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZlclZhbGlkYXRpb25Db25maWcge1xuICBlbmdpbmU6IElFbmdpbmVcbiAgYmluYXJ5TWVzc2FnZUJ1czogUmV0dXJuVHlwZTx0eXBlb2YgQmluYXJ5TWVzc2FnZUJ1cz5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNlcnZlclZhbGlkYXRvcihjb25maWc6IFNlcnZlclZhbGlkYXRpb25Db25maWcpIHtcbiAgY29uc3QgeyBlbmdpbmUsIGJpbmFyeU1lc3NhZ2VCdXMgfSA9IGNvbmZpZ1xuXG4gIC8vIEluaXRpYWxpemUgY29tcG9uZW50cyBmb3IgbmV0d29yayBvcGVyYXRpb25zIGFuZCB0cmFuc2Zvcm0gZml4aW5nXG4gIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBjb21wb25lbnRzLk5ldHdvcmtFbnRpdHkoZW5naW5lKVxuICBjb25zdCBDcmVhdGVkQnkgPSBjb21wb25lbnRzLkNyZWF0ZWRCeShlbmdpbmUpXG4gIGNvbnN0IE5ldHdvcmtQYXJlbnQgPSBjb21wb25lbnRzLk5ldHdvcmtQYXJlbnQoZW5naW5lKVxuXG4gIC8vIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgY29tcG9uZW50IHN1cHBvcnRzIGNvcnJlY3Rpb25zIChib3RoIExXVyBhbmQgR3Jvd09ubHlTZXQpXG4gIGZ1bmN0aW9uIHN1cHBvcnRzQ29ycmVjdGlvbnM8VD4oXG4gICAgY29tcG9uZW50OiBDb21wb25lbnREZWZpbml0aW9uPFQ+XG4gICk6IGNvbXBvbmVudCBpcyBMYXN0V3JpdGVXaW5FbGVtZW50U2V0Q29tcG9uZW50RGVmaW5pdGlvbjxUPiB8IEdyb3dPbmx5VmFsdWVTZXRDb21wb25lbnREZWZpbml0aW9uPFQ+IHtcbiAgICByZXR1cm4gKFxuICAgICAgKGNvbXBvbmVudC5jb21wb25lbnRUeXBlID09PSBDb21wb25lbnRUeXBlLkxhc3RXcml0ZVdpbkVsZW1lbnRTZXQgfHxcbiAgICAgICAgY29tcG9uZW50LmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuR3Jvd09ubHlWYWx1ZVNldCkgJiZcbiAgICAgICdnZXRDcmR0U3RhdGUnIGluIGNvbXBvbmVudFxuICAgIClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRFeGlzdGluZ05ldHdvcmtFbnRpdHkobWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UpOiBFbnRpdHkgfCBudWxsIHtcbiAgICAvLyBMb29rIGZvciBleGlzdGluZyBuZXR3b3JrIGVudGl0eSBtYXBwaW5nIChkb24ndCBjcmVhdGUgbmV3IG9uZXMpXG4gICAgZm9yIChjb25zdCBbZW50aXR5SWQsIG5ldHdvcmtEYXRhXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKE5ldHdvcmtFbnRpdHkpKSB7XG4gICAgICBpZiAobmV0d29ya0RhdGEubmV0d29ya0lkID09PSBtZXNzYWdlLm5ldHdvcmtJZCAmJiBuZXR3b3JrRGF0YS5lbnRpdHlJZCA9PT0gbWVzc2FnZS5lbnRpdHlJZCkge1xuICAgICAgICByZXR1cm4gZW50aXR5SWRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmV0dXJuIG51bGwgaWYgbm90IGZvdW5kXG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRPckNyZWF0ZU5ldHdvcmtFbnRpdHkobWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UsIHNlbmRlcjogc3RyaW5nLCBpc1NlcnZlcjogYm9vbGVhbik6IEVudGl0eSB7XG4gICAgLy8gTG9vayBmb3IgZXhpc3RpbmcgbmV0d29yayBlbnRpdHkgbWFwcGluZyBmaXJzdFxuICAgIGNvbnN0IGV4aXN0aW5nRW50aXR5ID0gZmluZEV4aXN0aW5nTmV0d29ya0VudGl0eShtZXNzYWdlKVxuXG4gICAgaWYgKGV4aXN0aW5nRW50aXR5KSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdFbnRpdHlcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IGVudGl0eSBhbmQgbmV0d29yayBtYXBwaW5nXG4gICAgY29uc3QgbmV3RW50aXR5SWQgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgICBOZXR3b3JrRW50aXR5LmNyZWF0ZU9yUmVwbGFjZShuZXdFbnRpdHlJZCwge1xuICAgICAgbmV0d29ya0lkOiBtZXNzYWdlLm5ldHdvcmtJZCxcbiAgICAgIGVudGl0eUlkOiBtZXNzYWdlLmVudGl0eUlkXG4gICAgfSlcblxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgQ3JlYXRlZEJ5LmNyZWF0ZU9yUmVwbGFjZShuZXdFbnRpdHlJZCwgeyBhZGRyZXNzOiBzZW5kZXIgfSlcbiAgICB9XG5cbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddIENyZWF0ZWQgbmV3IGVudGl0eSAke25ld0VudGl0eUlkfSBmb3IgbmV0d29yayAke21lc3NhZ2UubmV0d29ya0lkfToke21lc3NhZ2UuZW50aXR5SWR9YClcbiAgICByZXR1cm4gbmV3RW50aXR5SWRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnROZXR3b3JrVG9SZWd1bGFyTWVzc2FnZShcbiAgICBuZXR3b3JrTWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UsXG4gICAgbG9jYWxFbnRpdHlJZDogRW50aXR5LFxuICAgIGZvcmNlQ29ycmVjdGlvbnMgPSBmYWxzZVxuICApOiAoQ3JkdE1lc3NhZ2VCb2R5ICYgeyBtZXNzYWdlQnVmZmVyOiBVaW50OEFycmF5IH0pIHwgbnVsbCB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSB0aGUgd2VsbC10ZXN0ZWQgbmV0d29ya01lc3NhZ2VUb0xvY2FsIHV0aWxpdHkgd2l0aCB0cmFuc2Zvcm0gZml4aW5nIGZvciBVbml0eVxuICAgICAgY29uc3QgbWVzc2FnZSA9IHV0aWxzLm5ldHdvcmtNZXNzYWdlVG9Mb2NhbChcbiAgICAgICAgbmV0d29ya01lc3NhZ2UsXG4gICAgICAgIGxvY2FsRW50aXR5SWQsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgTmV0d29ya1BhcmVudCxcbiAgICAgICAgZm9yY2VDb3JyZWN0aW9uc1xuICAgICAgKVxuICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgbWVzc2FnZUJ1ZmZlcjogYnVmZmVyLnRvQmluYXJ5KCkgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5lcnJvcignRXJyb3IgY29udmVydGluZyBuZXR3b3JrIG1lc3NhZ2U6JywgZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZVBlcm1pc3Npb25zKG1lc3NhZ2U6IHV0aWxzLlJlZ3VsYXJNZXNzYWdlLCBzZW5kZXI6IHN0cmluZywgX2xvY2FsRW50aXR5SWQ6IEVudGl0eSk6IGJvb2xlYW4ge1xuICAgIC8vIEJhc2ljIGNoZWNrc1xuICAgIGlmICghc2VuZGVyIHx8IHNlbmRlciA9PT0gQVVUSF9TRVJWRVJfUEVFUl9JRCkge1xuICAgICAgcmV0dXJuIGZhbHNlIC8vIFNlcnZlciBzaG91bGRuJ3Qgc2VuZCBtZXNzYWdlcyB0byBpdHNlbGZcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSkge1xuICAgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgP1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UIHx8IG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGVuZ2luZS5nZXRDb21wb25lbnQobWVzc2FnZS5jb21wb25lbnRJZCkgYXMgSW50ZXJuYWxCYXNlQ29tcG9uZW50PHVua25vd24+XG4gICAgICBjb25zdCBidWYgPSAnZGF0YScgaW4gbWVzc2FnZSA/IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKG1lc3NhZ2UuZGF0YSkgOiBudWxsXG4gICAgICBjb25zdCB2YWx1ZSA9IGJ1ZiA/IGNvbXBvbmVudC5zY2hlbWEuZGVzZXJpYWxpemUoYnVmKSA6IG51bGxcbiAgICAgIGNvbnN0IGRyeVJ1bkNSRFQgPSBjb21wb25lbnQuX19kcnlfcnVuX3VwZGF0ZUZyb21DcmR0KG1lc3NhZ2UpXG4gICAgICBjb25zdCB2YWxpZENSRFQgPSBbXG4gICAgICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5TdGF0ZVVwZGF0ZWREYXRhLFxuICAgICAgICBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuU3RhdGVVcGRhdGVkVGltZXN0YW1wLFxuICAgICAgICBQcm9jZXNzTWVzc2FnZVJlc3VsdFR5cGUuRW50aXR5RGVsZXRlZFxuICAgICAgXS5pbmNsdWRlcyhkcnlSdW5DUkRUKVxuICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gQ3JlYXRlZEJ5LmdldE9yTnVsbChtZXNzYWdlLmVudGl0eUlkKVxuICAgICAgY29uc3QgdmFsaWRNZXNzYWdlID1cbiAgICAgICAgdmFsaWRDUkRUICYmXG4gICAgICAgIGNvbXBvbmVudC5fX3J1bl92YWxpZGF0ZUJlZm9yZUNoYW5nZShtZXNzYWdlLmVudGl0eUlkLCB2YWx1ZSwgc2VuZGVyLCBjcmVhdGVkQnk/LmFkZHJlc3MgPz8gQVVUSF9TRVJWRVJfUEVFUl9JRClcblxuICAgICAgcmV0dXJuICEhdmFsaWRNZXNzYWdlXG4gICAgfVxuXG4gICAgLy8gRm9yIG5vdywgYmFzaWMgdmFsaWRhdGlvbiAtIGluIHRoZSBmdXR1cmUgdGhpcyB3aWxsIGNoZWNrIGNvbXBvbmVudCBzeW5jIHBlcm1pc3Npb25zXG4gICAgLy8gVE9ETzogQ2hlY2sgaWYgc2VuZGVyIG93bnMgdGhlIGVudGl0eVxuICAgIC8vIFRPRE86IENoZWNrIGNvbXBvbmVudCBzeW5jIG1vZGUgKCdhbGwnIHwgJ293bmVyJyB8ICdzZXJ2ZXInKVxuICAgIC8vIFRPRE86IFJ1biBjb21wb25lbnQgY3VzdG9tIHZhbGlkYXRpb25cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZnVuY3Rpb24gYnJvYWRjYXN0QmF0Y2hlZE1lc3NhZ2VzKG1lc3NhZ2VzOiB1dGlscy5OZXR3b3JrTWVzc2FnZVtdLCBleGNsdWRlU2VuZGVyOiBzdHJpbmcpIHtcbiAgICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICAgIC8vIEJ1aWxkIHRoZSBjb21wbGV0ZSBidWZmZXIgd2l0aCBhbGwgbWVzc2FnZXNcbiAgICBjb25zdCBuZXR3b3JrQnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgLy8gU2tpcCBvdmVyc2l6ZWQgbWVzc2FnZXMgdXBmcm9udFxuICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZUJ1ZmZlci5ieXRlTGVuZ3RoIC8gMTAyNCA+IExJVkVLSVRfTUFYX1NJWkUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgTWVzc2FnZSB0b28gbGFyZ2UgKCR7bWVzc2FnZS5tZXNzYWdlQnVmZmVyLmJ5dGVMZW5ndGh9IGJ5dGVzKSwgc2tpcHBpbmcgbWVzc2FnZSBmcm9tICR7ZXhjbHVkZVNlbmRlcn1gXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIG5ldHdvcmtCdWZmZXIud3JpdGVCdWZmZXIobWVzc2FnZS5tZXNzYWdlQnVmZmVyLCBmYWxzZSlcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIGNodW5raW5nIGZ1bmN0aW9uIHRvIHNwbGl0IGludG8gcHJvcGVyIGNodW5rc1xuICAgIGNvbnN0IGNodW5rcyA9IGNodW5rQ3JkdE1lc3NhZ2VzKG5ldHdvcmtCdWZmZXIudG9CaW5hcnkoKSwgTElWRUtJVF9NQVhfU0laRSlcblxuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBiaW5hcnlNZXNzYWdlQnVzLmVtaXQoQ29tbXNNZXNzYWdlLkNSRFQsIGNodW5rKVxuICAgIH1cbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGBUb3RhbDogJHttZXNzYWdlcy5sZW5ndGh9IG1lc3NhZ2VzIGluICR7Y2h1bmtzLmxlbmd0aH0gY2h1bmtzIGZyb20gJHtleGNsdWRlU2VuZGVyfWApXG4gIH1cblxuICBmdW5jdGlvbiBzZW5kQ29ycmVjdGlvblRvU2VuZGVyKG5ldHdvcmtNZXNzYWdlOiB1dGlscy5OZXR3b3JrTWVzc2FnZSwgc2VuZGVyOiBzdHJpbmcsIGxvY2FsRW50aXR5SWQ6IEVudGl0eSkge1xuICAgIHRyeSB7XG4gICAgICAvLyBPbmx5IGhhbmRsZSBjb21wb25lbnQgbWVzc2FnZXMgKFBVVC9ERUxFVEUpLCBub3QgZW50aXR5IGRlbGV0aW9uXG4gICAgICBpZiAobmV0d29ya01lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9FTlRJVFlfTkVUV09SSykge1xuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tBVVRIT1JJVEFUSVZFXSBDYW5ub3Qgc2VuZCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZm9yIGVudGl0eSBkZWxldGlvbicpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBTYWZlIHRvIGFjY2VzcyBjb21wb25lbnRJZCBhbmQgdGltZXN0YW1wIG5vd1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gZW5naW5lLmdldENvbXBvbmVudChuZXR3b3JrTWVzc2FnZS5jb21wb25lbnRJZClcblxuICAgICAgLy8gT25seSBwcm9jZWVkIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBhdXRob3JpdGF0aXZlIG1lc3NhZ2VzIChMV1cgb3IgR3Jvd09ubHlTZXQpXG4gICAgICBpZiAoIXN1cHBvcnRzQ29ycmVjdGlvbnMoY29tcG9uZW50KSkge1xuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5sb2coJ1tBVVRIT1JJVEFUSVZFXSBDb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBhdXRob3JpdGF0aXZlIG1lc3NhZ2VzJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcnZlckNSRFRTdGF0ZSA9IGNvbXBvbmVudC5nZXRDcmR0U3RhdGUobG9jYWxFbnRpdHlJZClcblxuICAgICAgaWYgKHNlcnZlckNSRFRTdGF0ZSkge1xuICAgICAgICAvLyBDcmVhdGUgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIHVzaW5nIFBVVF9DT01QT05FTlRfTkVUV09SS1xuICAgICAgICAvLyBFYWNoIGNsaWVudCB3aWxsIGNvbnZlcnQgdGhpcyB0byBBVVRIT1JJVEFUSVZFX1BVVF9DT01QT05FTlQgd2l0aCBwcm9wZXIgZW50aXR5IG1hcHBpbmdcbiAgICAgICAgY29uc3QgY29ycmVjdGlvbkJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcbiAgICAgICAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbi53cml0ZShcbiAgICAgICAgICBuZXR3b3JrTWVzc2FnZS5lbnRpdHlJZCwgLy8gVXNlIG9yaWdpbmFsIG5ldHdvcmsgZW50aXR5IElEXG4gICAgICAgICAgc2VydmVyQ1JEVFN0YXRlLnRpbWVzdGFtcCxcbiAgICAgICAgICBuZXR3b3JrTWVzc2FnZS5jb21wb25lbnRJZCxcbiAgICAgICAgICBuZXR3b3JrTWVzc2FnZS5uZXR3b3JrSWQsXG4gICAgICAgICAgc2VydmVyQ1JEVFN0YXRlLmRhdGEsXG4gICAgICAgICAgY29ycmVjdGlvbkJ1ZmZlclxuICAgICAgICApXG4gICAgICAgIC8vIFNlbmQgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIGRpcmVjdGx5IHRvIHRoZSBzZW5kZXJcbiAgICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5DUkRUX0FVVEhPUklUQVRJVkUsIGNvcnJlY3Rpb25CdWZmZXIudG9CaW5hcnkoKSwgW3NlbmRlcl0pXG5cbiAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW0FVVEhPUklUQVRJVkVdIFNlbnQgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIHRvICR7c2VuZGVyfSBmb3IgZW50aXR5ICR7bG9jYWxFbnRpdHlJZH0gY29tcG9uZW50ICR7bmV0d29ya01lc3NhZ2UuY29tcG9uZW50SWR9IHdpdGggdGltZXN0YW1wICR7bmV0d29ya01lc3NhZ2UudGltZXN0YW1wfWBcbiAgICAgICAgICApXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmVycm9yKCdFcnJvciBzZW5kaW5nIGNvcnJlY3Rpb246JywgZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBmaW5kRXhpc3RpbmdOZXR3b3JrRW50aXR5LFxuICAgIC8vIHRyYW5zZm9ybSBOZXR3b3JrIG1lc3NhZ2VzIHRvIENSRFQgQ29tbW9uIE1lc3NhZ2VzLlxuICAgIHByb2Nlc3NDbGllbnRNZXNzYWdlczogZnVuY3Rpb24gcHJvY2Vzc0NsaWVudE1lc3NhZ2VzKHZhbHVlOiBVaW50OEFycmF5LCBzZW5kZXI6IHN0cmluZywgZm9yY2VDb3JyZWN0aW9ucyA9IGZhbHNlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NMSUVOVF0gUHJvY2Vzc2luZyBtZXNzYWdlIGZyb20gJHtzZW5kZXJ9LCAke3ZhbHVlLmxlbmd0aH0gYnl0ZXNgKVxuXG4gICAgICAvLyBDb2xsZWN0IGFsbCByZWd1bGFyIG1lc3NhZ2VzIGluIGEgc2luZ2xlIGJ1ZmZlciBmb3IgYmF0Y2hlZCBhcHBsaWNhdGlvblxuICAgICAgY29uc3QgY29tYmluZWRCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG5cbiAgICAgIC8vIENsaWVudHMgcHJvY2VzcyBuZXR3b3JrIG1lc3NhZ2VzIGZyb20gc2VydmVyIGFuZCBjb252ZXJ0IHRoZW0gdG8gcmVndWxhciBtZXNzYWdlc1xuICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHV0aWxzLnJlYWRNZXNzYWdlcyh2YWx1ZSkpIHtcbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG5ldHdvcmsgbWVzc2FnZXMgaW4gY2xpZW50IG1lc3NhZ2UgaGFuZGxlclxuICAgICAgICBpZiAodXRpbHMuaXNOZXR3b3JrTWVzc2FnZShtZXNzYWdlKSkge1xuICAgICAgICAgIGNvbnN0IG5ldHdvcmtNZXNzYWdlID0gbWVzc2FnZSBhcyB1dGlscy5OZXR3b3JrTWVzc2FnZVxuXG4gICAgICAgICAgLy8gRmluZCBvciBjcmVhdGUgbmV0d29yayBlbnRpdHkgbWFwcGluZ1xuICAgICAgICAgIGNvbnN0IGxvY2FsRW50aXR5SWQgPSBmaW5kT3JDcmVhdGVOZXR3b3JrRW50aXR5KG5ldHdvcmtNZXNzYWdlLCBzZW5kZXIsIGZhbHNlKVxuXG4gICAgICAgICAgLy8gQ29udmVydCBuZXR3b3JrIG1lc3NhZ2UgdG8gcmVndWxhciBtZXNzYWdlIG9yIGNvcnJlY3Rpb24gbWVzc2FnZVxuICAgICAgICAgIGNvbnN0IHJlZ3VsYXJNZXNzYWdlID0gY29udmVydE5ldHdvcmtUb1JlZ3VsYXJNZXNzYWdlKG5ldHdvcmtNZXNzYWdlLCBsb2NhbEVudGl0eUlkLCBmb3JjZUNvcnJlY3Rpb25zKVxuXG4gICAgICAgICAgaWYgKHJlZ3VsYXJNZXNzYWdlPy5tZXNzYWdlQnVmZmVyLmJ5dGVMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkQnVmZmVyLndyaXRlQnVmZmVyKHJlZ3VsYXJNZXNzYWdlLm1lc3NhZ2VCdWZmZXIsIGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbWJpbmVkQnVmZmVyLnRvQmluYXJ5KClcbiAgICB9LFxuICAgIC8vIFNldmVyIENvZGU6IHByb2Nlc3MgbWVzc2FnZSwgaGFuZGxlIHBlcm1pc3Npb25zLCBhbmQgYnJvYWRjYXN0IGlmIG5lZWRlZC5cbiAgICBwcm9jZXNzU2VydmVyTWVzc2FnZXM6IGZ1bmN0aW9uIHByb2Nlc3NTZXJ2ZXJNZXNzYWdlcyh2YWx1ZTogVWludDhBcnJheSwgc2VuZGVyOiBzdHJpbmcpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBbU0VSVkVSXSBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke3NlbmRlcn0sICR7dmFsdWUubGVuZ3RofSBieXRlc2ApXG5cbiAgICAgIC8vIENvbGxlY3QgYWxsIHZhbGlkIG1lc3NhZ2VzIGZvciBiYXRjaGVkIGJyb2FkY2FzdGluZ1xuICAgICAgY29uc3QgbWVzc2FnZXNUb0Jyb2FkY2FzdDogdXRpbHMuTmV0d29ya01lc3NhZ2VbXSA9IFtdXG4gICAgICBjb25zdCByZWd1bGFyTWVzc2FnZXNCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG5cbiAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiB1dGlscy5yZWFkTWVzc2FnZXModmFsdWUpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gT25seSBwcm9jZXNzIG5ldHdvcmsgbWVzc2FnZXMgaW4gc2VydmVyIG1lc3NhZ2UgaGFuZGxlclxuICAgICAgICAgIGlmICh1dGlscy5pc05ldHdvcmtNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrTWVzc2FnZSA9IG1lc3NhZ2UgYXMgdXRpbHMuTmV0d29ya01lc3NhZ2VcbiAgICAgICAgICAgIC8vIDEuIEZpbmQgb3IgY3JlYXRlIG5ldHdvcmsgZW50aXR5IG1hcHBpbmdcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsRW50aXR5SWQgPSBmaW5kT3JDcmVhdGVOZXR3b3JrRW50aXR5KG5ldHdvcmtNZXNzYWdlLCBzZW5kZXIsIHRydWUpXG5cbiAgICAgICAgICAgIC8vIDIuIENvbnZlcnQgbmV0d29yayBtZXNzYWdlIHRvIHJlZ3VsYXIgbWVzc2FnZSBhbmQgY29sbGVjdCBmb3IgbG9jYWwgYXBwbGljYXRpb25cbiAgICAgICAgICAgIGNvbnN0IHJlZ3VsYXJNZXNzYWdlID0gY29udmVydE5ldHdvcmtUb1JlZ3VsYXJNZXNzYWdlKG5ldHdvcmtNZXNzYWdlLCBsb2NhbEVudGl0eUlkKVxuXG4gICAgICAgICAgICAvLyAzLiBCYXNpYyBwZXJtaXNzaW9uIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVNZXNzYWdlUGVybWlzc2lvbnMocmVndWxhck1lc3NhZ2UgYXMgYW55LCBzZW5kZXIsIGxvY2FsRW50aXR5SWQpKSB7XG4gICAgICAgICAgICAgIC8vIFNlbmQgY29ycmVjdGlvbiBiYWNrIHRvIHNlbmRlciB3aXRoIHNlcnZlcidzIGF1dGhvcml0YXRpdmUgc3RhdGVcbiAgICAgICAgICAgICAgc2VuZENvcnJlY3Rpb25Ub1NlbmRlcihuZXR3b3JrTWVzc2FnZSwgc2VuZGVyLCBsb2NhbEVudGl0eUlkKVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA0LiBDb2xsZWN0IHZhbGlkIG1lc3NhZ2UgZm9yIGJhdGNoZWQgYnJvYWRjYXN0aW5nXG4gICAgICAgICAgICBtZXNzYWdlc1RvQnJvYWRjYXN0LnB1c2gobmV0d29ya01lc3NhZ2UpXG5cbiAgICAgICAgICAgIGlmIChyZWd1bGFyTWVzc2FnZT8ubWVzc2FnZUJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlZ3VsYXJNZXNzYWdlc0J1ZmZlci53cml0ZUJ1ZmZlcihyZWd1bGFyTWVzc2FnZS5tZXNzYWdlQnVmZmVyLCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3Npbmcgc2VydmVyIG1lc3NhZ2U6JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEJhdGNoIGJyb2FkY2FzdCBhbGwgdmFsaWQgbWVzc2FnZXMgdG9nZXRoZXJcbiAgICAgIGJyb2FkY2FzdEJhdGNoZWRNZXNzYWdlcyhtZXNzYWdlc1RvQnJvYWRjYXN0LCBzZW5kZXIpXG4gICAgICByZXR1cm4gcmVndWxhck1lc3NhZ2VzQnVmZmVyLnRvQmluYXJ5KClcbiAgICB9LFxuICAgIC8vIGVuZ2luZSBjaGFuZ2VzIHRoYXQgbmVlZHMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gICAgY29udmVydFJlZ3VsYXJUb05ldHdvcmtNZXNzYWdlOiBmdW5jdGlvbiBjb252ZXJ0UmVndWxhclRvTmV0d29ya01lc3NhZ2UocmVndWxhck1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICAgICAgY29uc3QgZ3JvdXBlZEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgLy8gRmlyc3QgcGFzczogQ29udmVydCBhbGwgcmVndWxhciBtZXNzYWdlcyB0byBuZXR3b3JrIGZvcm1hdCBhbmQgZ3JvdXAgdGhlbSBpbnRvIG9uZSBiaWcgYnVmZmVyXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdXRpbHMucmVhZE1lc3NhZ2VzKHJlZ3VsYXJNZXNzYWdlKSkge1xuICAgICAgICAvLyBPbmx5IGNvbnZlcnQgcmVndWxhciBtZXNzYWdlcyB0aGF0IGhhdmUgbmV0d29yayBkYXRhXG4gICAgICAgIGNvbnN0IG5ldHdvcmtEYXRhID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcblxuICAgICAgICBpZiAobmV0d29ya0RhdGEgJiYgIXV0aWxzLmlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICB1dGlscy5sb2NhbE1lc3NhZ2VUb05ldHdvcmsobWVzc2FnZSwgbmV0d29ya0RhdGEsIGdyb3VwZWRCdWZmZXIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2Vjb25kIHBhc3M6IFVzZSB0aGUgbmV3IGNodW5raW5nIGZ1bmN0aW9uIHRoYXQgcmVzcGVjdHMgbWVzc2FnZSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB0b3RhbERhdGEgPSBncm91cGVkQnVmZmVyLnRvQmluYXJ5KClcbiAgICAgIHJldHVybiBjaHVua0NyZHRNZXNzYWdlcyh0b3RhbERhdGEsIExJVkVLSVRfTUFYX1NJWkUpXG4gICAgfVxuICB9XG59XG4iXX0=
|
|
256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV0d29yay9zZXJ2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGVBQWUsRUFFZix3QkFBd0IsRUFFeEIsNEJBQTRCLEVBQzdCLE1BQU0sVUFBVSxDQUFBO0FBQ2pCLE9BQU8sS0FBSyxVQUFVLE1BQU0sMEJBQTBCLENBQUE7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3BELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUMvQyxPQUFPLEtBQUssS0FBSyxNQUFNLFNBQVMsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQVNqRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUE7QUFPbEMsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQThCO0lBQ2xFLE1BQU0sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLENBQUE7SUFFM0Msb0VBQW9FO0lBQ3BFLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUM5QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRXRELG1GQUFtRjtJQUNuRixTQUFTLG1CQUFtQixDQUMxQixTQUFpQztRQUVqQyxPQUFPLENBQ0wsQ0FBQyxTQUFTLENBQUMsYUFBYSxpREFBeUM7WUFDL0QsU0FBUyxDQUFDLGFBQWEsMkNBQW1DLENBQUM7WUFDN0QsY0FBYyxJQUFJLFNBQVMsQ0FD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QUM1QyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQTt5QkFDdkU7cUJBQ0Y7aUJBQ0Y7Z0JBQUMsT0FBTyxLQUFLLEVBQUU7b0JBQ2Qsc0JBQXNCLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxDQUFBO2lCQUNyRjthQUNGO1lBQ0QsOENBQThDO1lBQzlDLHdCQUF3QixDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3JELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDekMsQ0FBQztRQUNELCtDQUErQztRQUMvQyw4QkFBOEIsRUFBRSxTQUFTLDhCQUE4QixDQUFDLGNBQTBCO1lBQ2hHLE1BQU0sYUFBYSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQTtZQUUvQyxnR0FBZ0c7WUFDaEcsS0FBSyxNQUFNLE9BQU8sSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUN4RCx1REFBdUQ7Z0JBQ3ZELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUU3RCxJQUFJLFdBQVcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDbkQsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUE7aUJBQ2pFO2FBQ0Y7WUFFRCw4RUFBOEU7WUFDOUUsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFBO1lBQzFDLE9BQU8saUJBQWlCLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUE7UUFDdkQsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgSUVuZ2luZSxcbiAgRW50aXR5LFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIENyZHRNZXNzYWdlQm9keSxcbiAgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLFxuICBDb21wb25lbnRUeXBlLFxuICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uXG59IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0ICogYXMgY29tcG9uZW50cyBmcm9tICdAZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMnXG5pbXBvcnQgeyBSZWFkV3JpdGVCeXRlQnVmZmVyIH0gZnJvbSAnQGRjbC9lY3MvZGlzdC9zZXJpYWxpemF0aW9uL0J5dGVCdWZmZXInXG5pbXBvcnQgeyBDb21tc01lc3NhZ2UgfSBmcm9tICcuLi9iaW5hcnktbWVzc2FnZS1idXMnXG5pbXBvcnQgeyBjaHVua0NyZHRNZXNzYWdlcyB9IGZyb20gJy4uL2NodW5raW5nJ1xuaW1wb3J0ICogYXMgdXRpbHMgZnJvbSAnLi91dGlscydcbmltcG9ydCB7IEFVVEhfU0VSVkVSX1BFRVJfSUQsIERFQlVHX05FVFdPUktfTUVTU0FHRVMgfSBmcm9tICcuLi9tZXNzYWdlLWJ1cy1zeW5jJ1xuaW1wb3J0IHsgdHlwZSBCaW5hcnlNZXNzYWdlQnVzIH0gZnJvbSAnLi4vYmluYXJ5LW1lc3NhZ2UtYnVzJ1xuaW1wb3J0IHtcbiAgTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb24sXG4gIEdyb3dPbmx5VmFsdWVTZXRDb21wb25lbnREZWZpbml0aW9uLFxuICBDb21wb25lbnREZWZpbml0aW9uLFxuICBJbnRlcm5hbEJhc2VDb21wb25lbnRcbn0gZnJvbSAnQGRjbC9lY3MvZGlzdC9lbmdpbmUvY29tcG9uZW50J1xuXG5leHBvcnQgY29uc3QgTElWRUtJVF9NQVhfU0laRSA9IDEyXG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyVmFsaWRhdGlvbkNvbmZpZyB7XG4gIGVuZ2luZTogSUVuZ2luZVxuICBiaW5hcnlNZXNzYWdlQnVzOiBSZXR1cm5UeXBlPHR5cGVvZiBCaW5hcnlNZXNzYWdlQnVzPlxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2VydmVyVmFsaWRhdG9yKGNvbmZpZzogU2VydmVyVmFsaWRhdGlvbkNvbmZpZykge1xuICBjb25zdCB7IGVuZ2luZSwgYmluYXJ5TWVzc2FnZUJ1cyB9ID0gY29uZmlnXG5cbiAgLy8gSW5pdGlhbGl6ZSBjb21wb25lbnRzIGZvciBuZXR3b3JrIG9wZXJhdGlvbnMgYW5kIHRyYW5zZm9ybSBmaXhpbmdcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGNvbXBvbmVudHMuTmV0d29ya0VudGl0eShlbmdpbmUpXG4gIGNvbnN0IENyZWF0ZWRCeSA9IGNvbXBvbmVudHMuQ3JlYXRlZEJ5KGVuZ2luZSlcbiAgY29uc3QgTmV0d29ya1BhcmVudCA9IGNvbXBvbmVudHMuTmV0d29ya1BhcmVudChlbmdpbmUpXG5cbiAgLy8gVHlwZSBndWFyZCB0byBjaGVjayBpZiBjb21wb25lbnQgc3VwcG9ydHMgY29ycmVjdGlvbnMgKGJvdGggTFdXIGFuZCBHcm93T25seVNldClcbiAgZnVuY3Rpb24gc3VwcG9ydHNDb3JyZWN0aW9uczxUPihcbiAgICBjb21wb25lbnQ6IENvbXBvbmVudERlZmluaXRpb248VD5cbiAgKTogY29tcG9uZW50IGlzIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFQ+IHwgR3Jvd09ubHlWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb248VD4ge1xuICAgIHJldHVybiAoXG4gICAgICAoY29tcG9uZW50LmNvbXBvbmVudFR5cGUgPT09IENvbXBvbmVudFR5cGUuTGFzdFdyaXRlV2luRWxlbWVudFNldCB8fFxuICAgICAgICBjb21wb25lbnQuY29tcG9uZW50VHlwZSA9PT0gQ29tcG9uZW50VHlwZS5Hcm93T25seVZhbHVlU2V0KSAmJlxuICAgICAgJ2dldENyZHRTdGF0ZScgaW4gY29tcG9uZW50XG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEV4aXN0aW5nTmV0d29ya0VudGl0eShtZXNzYWdlOiB1dGlscy5OZXR3b3JrTWVzc2FnZSk6IEVudGl0eSB8IG51bGwge1xuICAgIC8vIExvb2sgZm9yIGV4aXN0aW5nIG5ldHdvcmsgZW50aXR5IG1hcHBpbmcgKGRvbid0IGNyZWF0ZSBuZXcgb25lcylcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHlJZCwgbmV0d29ya0RhdGFdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoTmV0d29ya0VudGl0eSkpIHtcbiAgICAgIGlmIChuZXR3b3JrRGF0YS5uZXR3b3JrSWQgPT09IG1lc3NhZ2UubmV0d29ya0lkICYmIG5ldHdvcmtEYXRhLmVudGl0eUlkID09PSBtZXNzYWdlLmVudGl0eUlkKSB7XG4gICAgICAgIHJldHVybiBlbnRpdHlJZFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBSZXR1cm4gbnVsbCBpZiBub3QgZm91bmRcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYSBtZXNzYWdlIGNhbiBiZSBqdWRnZWQgb24gYmVmb3JlIGFuIGVudGl0eSBpcyBzcGVudCBtYXBwaW5nIGl0LiBBbnl0aGluZ1xuICAgKiBuZWVkaW5nIHRoZSBsb2NhbCBlbnRpdHkg4oCUIHRoZSBDUkRUIGRyeSBydW4sIHRoZSBzY2VuZSdzIG93biB2YWxpZGF0b3Ig4oCUIHN0aWxsXG4gICAqIGhhcHBlbnMgaW4gdmFsaWRhdGVNZXNzYWdlUGVybWlzc2lvbnMgYWZ0ZXJ3YXJkcy5cbiAgICovXG4gIGZ1bmN0aW9uIHBlZXJNZXNzYWdlSXNFbGlnaWJsZShtZXNzYWdlOiB1dGlscy5OZXR3b3JrTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgIGlmICghKCdjb21wb25lbnRJZCcgaW4gbWVzc2FnZSkpIHJldHVybiB0cnVlXG5cbiAgICBjb25zdCBkZWZpbml0aW9uID0gZW5naW5lLmdldENvbXBvbmVudE9yTnVsbChtZXNzYWdlLmNvbXBvbmVudElkKVxuICAgIGlmICghZGVmaW5pdGlvbikgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAoJ2RhdGEnIGluIG1lc3NhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRlZmluaXRpb24uc2NoZW1hLmRlc2VyaWFsaXplKG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKG1lc3NhZ2UuZGF0YSkpXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRPckNyZWF0ZU5ldHdvcmtFbnRpdHkobWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UsIHNlbmRlcjogc3RyaW5nLCBpc1NlcnZlcjogYm9vbGVhbik6IEVudGl0eSB7XG4gICAgLy8gTG9vayBmb3IgZXhpc3RpbmcgbmV0d29yayBlbnRpdHkgbWFwcGluZyBmaXJzdFxuICAgIGNvbnN0IGV4aXN0aW5nRW50aXR5ID0gZmluZEV4aXN0aW5nTmV0d29ya0VudGl0eShtZXNzYWdlKVxuXG4gICAgaWYgKGV4aXN0aW5nRW50aXR5KSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdFbnRpdHlcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbmV3IGVudGl0eSBhbmQgbmV0d29yayBtYXBwaW5nXG4gICAgY29uc3QgbmV3RW50aXR5SWQgPSBlbmdpbmUuYWRkRW50aXR5KClcbiAgICBOZXR3b3JrRW50aXR5LmNyZWF0ZU9yUmVwbGFjZShuZXdFbnRpdHlJZCwge1xuICAgICAgbmV0d29ya0lkOiBtZXNzYWdlLm5ldHdvcmtJZCxcbiAgICAgIGVudGl0eUlkOiBtZXNzYWdlLmVudGl0eUlkXG4gICAgfSlcblxuICAgIGlmIChpc1NlcnZlcikge1xuICAgICAgQ3JlYXRlZEJ5LmNyZWF0ZU9yUmVwbGFjZShuZXdFbnRpdHlJZCwgeyBhZGRyZXNzOiBzZW5kZXIgfSlcbiAgICB9XG5cbiAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKGBbREVCVUddIENyZWF0ZWQgbmV3IGVudGl0eSAke25ld0VudGl0eUlkfSBmb3IgbmV0d29yayAke21lc3NhZ2UubmV0d29ya0lkfToke21lc3NhZ2UuZW50aXR5SWR9YClcbiAgICByZXR1cm4gbmV3RW50aXR5SWRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnZlcnROZXR3b3JrVG9SZWd1bGFyTWVzc2FnZShcbiAgICBuZXR3b3JrTWVzc2FnZTogdXRpbHMuTmV0d29ya01lc3NhZ2UsXG4gICAgbG9jYWxFbnRpdHlJZDogRW50aXR5LFxuICAgIGZvcmNlQ29ycmVjdGlvbnMgPSBmYWxzZVxuICApOiAoQ3JkdE1lc3NhZ2VCb2R5ICYgeyBtZXNzYWdlQnVmZmVyOiBVaW50OEFycmF5IH0pIHwgbnVsbCB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFVzZSB0aGUgd2VsbC10ZXN0ZWQgbmV0d29ya01lc3NhZ2VUb0xvY2FsIHV0aWxpdHkgd2l0aCB0cmFuc2Zvcm0gZml4aW5nIGZvciBVbml0eVxuICAgICAgY29uc3QgbWVzc2FnZSA9IHV0aWxzLm5ldHdvcmtNZXNzYWdlVG9Mb2NhbChcbiAgICAgICAgbmV0d29ya01lc3NhZ2UsXG4gICAgICAgIGxvY2FsRW50aXR5SWQsXG4gICAgICAgIGJ1ZmZlcixcbiAgICAgICAgTmV0d29ya1BhcmVudCxcbiAgICAgICAgZm9yY2VDb3JyZWN0aW9uc1xuICAgICAgKVxuICAgICAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgbWVzc2FnZUJ1ZmZlcjogYnVmZmVyLnRvQmluYXJ5KCkgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiYgY29uc29sZS5lcnJvcignRXJyb3IgY29udmVydGluZyBuZXR3b3JrIG1lc3NhZ2U6JywgZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlTWVzc2FnZVBlcm1pc3Npb25zKG1lc3NhZ2U6IHV0aWxzLlJlZ3VsYXJNZXNzYWdlLCBzZW5kZXI6IHN0cmluZywgX2xvY2FsRW50aXR5SWQ6IEVudGl0eSk6IGJvb2xlYW4ge1xuICAgIC8vIEJhc2ljIGNoZWNrc1xuICAgIGlmICghc2VuZGVyIHx8IHNlbmRlciA9PT0gQVVUSF9TRVJWRVJfUEVFUl9JRCkge1xuICAgICAgcmV0dXJuIGZhbHNlIC8vIFNlcnZlciBzaG91bGRuJ3Qgc2VuZCBtZXNzYWdlcyB0byBpdHNlbGZcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWSkge1xuICAgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSB0aGlzIGNhc2UgP1xuICAgIH1cblxuICAgIGlmIChtZXNzYWdlLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UIHx8IG1lc3NhZ2UudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLkRFTEVURV9DT01QT05FTlQpIHtcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGVuZ2luZS5nZXRDb21wb25lbnRPck51bGwobWVzc2FnZS5jb21wb25lbnRJZCkgYXMgSW50ZXJuYWxCYXNlQ29tcG9uZW50PHVua25vd24+IHwgbnVsbFxuICAgICAgaWYgKCFjb21wb25lbnQpIHJldHVybiBmYWxzZVxuXG4gICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsXG4gICAgICBpZiAoJ2RhdGEnIGluIG1lc3NhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YWx1ZSA9IGNvbXBvbmVudC5zY2hlbWEuZGVzZXJpYWxpemUobmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIobWVzc2FnZS5kYXRhKSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJ5UnVuQ1JEVCA9IGNvbXBvbmVudC5fX2RyeV9ydW5fdXBkYXRlRnJvbUNyZHQobWVzc2FnZSlcbiAgICAgIGNvbnN0IHZhbGlkQ1JEVCA9IFtcbiAgICAgICAgUHJvY2Vzc01lc3NhZ2VSZXN1bHRUeXBlLlN0YXRlVXBkYXRlZERhdGEsXG4gICAgICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5TdGF0ZVVwZGF0ZWRUaW1lc3RhbXAsXG4gICAgICAgIFByb2Nlc3NNZXNzYWdlUmVzdWx0VHlwZS5FbnRpdHlEZWxldGVkXG4gICAgICBdLmluY2x1ZGVzKGRyeVJ1bkNSRFQpXG4gICAgICBjb25zdCBjcmVhdGVkQnkgPSBDcmVhdGVkQnkuZ2V0T3JOdWxsKG1lc3NhZ2UuZW50aXR5SWQpXG4gICAgICBjb25zdCB2YWxpZE1lc3NhZ2UgPVxuICAgICAgICB2YWxpZENSRFQgJiZcbiAgICAgICAgY29tcG9uZW50Ll9fcnVuX3ZhbGlkYXRlQmVmb3JlQ2hhbmdlKG1lc3NhZ2UuZW50aXR5SWQsIHZhbHVlLCBzZW5kZXIsIGNyZWF0ZWRCeT8uYWRkcmVzcyA/PyBBVVRIX1NFUlZFUl9QRUVSX0lEKVxuXG4gICAgICByZXR1cm4gISF2YWxpZE1lc3NhZ2VcbiAgICB9XG5cbiAgICAvLyBGb3Igbm93LCBiYXNpYyB2YWxpZGF0aW9uIC0gaW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgY2hlY2sgY29tcG9uZW50IHN5bmMgcGVybWlzc2lvbnNcbiAgICAvLyBUT0RPOiBDaGVjayBpZiBzZW5kZXIgb3ducyB0aGUgZW50aXR5XG4gICAgLy8gVE9ETzogQ2hlY2sgY29tcG9uZW50IHN5bmMgbW9kZSAoJ2FsbCcgfCAnb3duZXInIHwgJ3NlcnZlcicpXG4gICAgLy8gVE9ETzogUnVuIGNvbXBvbmVudCBjdXN0b20gdmFsaWRhdGlvblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBmdW5jdGlvbiBicm9hZGNhc3RCYXRjaGVkTWVzc2FnZXMobWVzc2FnZXM6IHV0aWxzLk5ldHdvcmtNZXNzYWdlW10sIGV4Y2x1ZGVTZW5kZXI6IHN0cmluZykge1xuICAgIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgLy8gQnVpbGQgdGhlIGNvbXBsZXRlIGJ1ZmZlciB3aXRoIGFsbCBtZXNzYWdlc1xuICAgIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIG1lc3NhZ2VzKSB7XG4gICAgICAvLyBTa2lwIG92ZXJzaXplZCBtZXNzYWdlcyB1cGZyb250XG4gICAgICBpZiAobWVzc2FnZS5tZXNzYWdlQnVmZmVyLmJ5dGVMZW5ndGggLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBNZXNzYWdlIHRvbyBsYXJnZSAoJHttZXNzYWdlLm1lc3NhZ2VCdWZmZXIuYnl0ZUxlbmd0aH0gYnl0ZXMpLCBza2lwcGluZyBtZXNzYWdlIGZyb20gJHtleGNsdWRlU2VuZGVyfWBcbiAgICAgICAgKVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgbmV0d29ya0J1ZmZlci53cml0ZUJ1ZmZlcihtZXNzYWdlLm1lc3NhZ2VCdWZmZXIsIGZhbHNlKVxuICAgIH1cblxuICAgIC8vIFVzZSB0aGUgY2h1bmtpbmcgZnVuY3Rpb24gdG8gc3BsaXQgaW50byBwcm9wZXIgY2h1bmtzXG4gICAgY29uc3QgY2h1bmtzID0gY2h1bmtDcmR0TWVzc2FnZXMobmV0d29ya0J1ZmZlci50b0JpbmFyeSgpLCBMSVZFS0lUX01BWF9TSVpFKVxuXG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1JEVCwgY2h1bmspXG4gICAgfVxuICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJlxuICAgICAgY29uc29sZS5sb2coYFRvdGFsOiAke21lc3NhZ2VzLmxlbmd0aH0gbWVzc2FnZXMgaW4gJHtjaHVua3MubGVuZ3RofSBjaHVua3MgZnJvbSAke2V4Y2x1ZGVTZW5kZXJ9YClcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlbmRDb3JyZWN0aW9uVG9TZW5kZXIobmV0d29ya01lc3NhZ2U6IHV0aWxzLk5ldHdvcmtNZXNzYWdlLCBzZW5kZXI6IHN0cmluZywgbG9jYWxFbnRpdHlJZDogRW50aXR5KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIE9ubHkgaGFuZGxlIGNvbXBvbmVudCBtZXNzYWdlcyAoUFVUL0RFTEVURSksIG5vdCBlbnRpdHkgZGVsZXRpb25cbiAgICAgIGlmIChuZXR3b3JrTWVzc2FnZS50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuREVMRVRFX0VOVElUWV9ORVRXT1JLKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0FVVEhPUklUQVRJVkVdIENhbm5vdCBzZW5kIGF1dGhvcml0YXRpdmUgbWVzc2FnZSBmb3IgZW50aXR5IGRlbGV0aW9uJylcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFNhZmUgdG8gYWNjZXNzIGNvbXBvbmVudElkIGFuZCB0aW1lc3RhbXAgbm93XG4gICAgICBjb25zdCBjb21wb25lbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KG5ldHdvcmtNZXNzYWdlLmNvbXBvbmVudElkKVxuXG4gICAgICAvLyBPbmx5IHByb2NlZWQgaWYgY29tcG9uZW50IHN1cHBvcnRzIGF1dGhvcml0YXRpdmUgbWVzc2FnZXMgKExXVyBvciBHcm93T25seVNldClcbiAgICAgIGlmICghc3VwcG9ydHNDb3JyZWN0aW9ucyhjb21wb25lbnQpKSB7XG4gICAgICAgIERFQlVHX05FVFdPUktfTUVTU0FHRVMoKSAmJiBjb25zb2xlLmxvZygnW0FVVEhPUklUQVRJVkVdIENvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IGF1dGhvcml0YXRpdmUgbWVzc2FnZXMnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VydmVyQ1JEVFN0YXRlID0gY29tcG9uZW50LmdldENyZHRTdGF0ZShsb2NhbEVudGl0eUlkKVxuXG4gICAgICBpZiAoc2VydmVyQ1JEVFN0YXRlKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdXNpbmcgUFVUX0NPTVBPTkVOVF9ORVRXT1JLXG4gICAgICAgIC8vIEVhY2ggY2xpZW50IHdpbGwgY29udmVydCB0aGlzIHRvIEFVVEhPUklUQVRJVkVfUFVUX0NPTVBPTkVOVCB3aXRoIHByb3BlciBlbnRpdHkgbWFwcGluZ1xuICAgICAgICBjb25zdCBjb3JyZWN0aW9uQnVmZmVyID0gbmV3IFJlYWRXcml0ZUJ5dGVCdWZmZXIoKVxuICAgICAgICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLndyaXRlKFxuICAgICAgICAgIG5ldHdvcmtNZXNzYWdlLmVudGl0eUlkLCAvLyBVc2Ugb3JpZ2luYWwgbmV0d29yayBlbnRpdHkgSURcbiAgICAgICAgICBzZXJ2ZXJDUkRUU3RhdGUudGltZXN0YW1wLFxuICAgICAgICAgIG5ldHdvcmtNZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtNZXNzYWdlLm5ldHdvcmtJZCxcbiAgICAgICAgICBzZXJ2ZXJDUkRUU3RhdGUuZGF0YSxcbiAgICAgICAgICBjb3JyZWN0aW9uQnVmZmVyXG4gICAgICAgIClcbiAgICAgICAgLy8gU2VuZCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIHNlbmRlclxuICAgICAgICBiaW5hcnlNZXNzYWdlQnVzLmVtaXQoQ29tbXNNZXNzYWdlLkNSRFRfQVVUSE9SSVRBVElWRSwgY29ycmVjdGlvbkJ1ZmZlci50b0JpbmFyeSgpLCBbc2VuZGVyXSlcblxuICAgICAgICBERUJVR19ORVRXT1JLX01FU1NBR0VTKCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbQVVUSE9SSVRBVElWRV0gU2VudCBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgdG8gJHtzZW5kZXJ9IGZvciBlbnRpdHkgJHtsb2NhbEVudGl0eUlkfSBjb21wb25lbnQgJHtuZXR3b3JrTWVzc2FnZS5jb21wb25lbnRJZH0gd2l0aCB0aW1lc3RhbXAgJHtuZXR3b3JrTWVzc2FnZS50aW1lc3RhbXB9YFxuICAgICAgICAgIClcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHNlbmRpbmcgY29ycmVjdGlvbjonLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZpbmRFeGlzdGluZ05ldHdvcmtFbnRpdHksXG4gICAgLy8gdHJhbnNmb3JtIE5ldHdvcmsgbWVzc2FnZXMgdG8gQ1JEVCBDb21tb24gTWVzc2FnZXMuXG4gICAgcHJvY2Vzc0NsaWVudE1lc3NhZ2VzOiBmdW5jdGlvbiBwcm9jZXNzQ2xpZW50TWVzc2FnZXModmFsdWU6IFVpbnQ4QXJyYXksIHNlbmRlcjogc3RyaW5nLCBmb3JjZUNvcnJlY3Rpb25zID0gZmFsc2UpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ0xJRU5UXSBQcm9jZXNzaW5nIG1lc3NhZ2UgZnJvbSAke3NlbmRlcn0sICR7dmFsdWUubGVuZ3RofSBieXRlc2ApXG5cbiAgICAgIC8vIENvbGxlY3QgYWxsIHJlZ3VsYXIgbWVzc2FnZXMgaW4gYSBzaW5nbGUgYnVmZmVyIGZvciBiYXRjaGVkIGFwcGxpY2F0aW9uXG4gICAgICBjb25zdCBjb21iaW5lZEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgLy8gQ2xpZW50cyBwcm9jZXNzIG5ldHdvcmsgbWVzc2FnZXMgZnJvbSBzZXJ2ZXIgYW5kIGNvbnZlcnQgdGhlbSB0byByZWd1bGFyIG1lc3NhZ2VzXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdXRpbHMucmVhZE1lc3NhZ2VzKHZhbHVlKSkge1xuICAgICAgICAvLyBPbmx5IHByb2Nlc3MgbmV0d29yayBtZXNzYWdlcyBpbiBjbGllbnQgbWVzc2FnZSBoYW5kbGVyXG4gICAgICAgIGlmICh1dGlscy5pc05ldHdvcmtNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgY29uc3QgbmV0d29ya01lc3NhZ2UgPSBtZXNzYWdlIGFzIHV0aWxzLk5ldHdvcmtNZXNzYWdlXG5cbiAgICAgICAgICAvLyBGaW5kIG9yIGNyZWF0ZSBuZXR3b3JrIGVudGl0eSBtYXBwaW5nXG4gICAgICAgICAgY29uc3QgbG9jYWxFbnRpdHlJZCA9IGZpbmRPckNyZWF0ZU5ldHdvcmtFbnRpdHkobmV0d29ya01lc3NhZ2UsIHNlbmRlciwgZmFsc2UpXG5cbiAgICAgICAgICAvLyBDb252ZXJ0IG5ldHdvcmsgbWVzc2FnZSB0byByZWd1bGFyIG1lc3NhZ2Ugb3IgY29ycmVjdGlvbiBtZXNzYWdlXG4gICAgICAgICAgY29uc3QgcmVndWxhck1lc3NhZ2UgPSBjb252ZXJ0TmV0d29ya1RvUmVndWxhck1lc3NhZ2UobmV0d29ya01lc3NhZ2UsIGxvY2FsRW50aXR5SWQsIGZvcmNlQ29ycmVjdGlvbnMpXG5cbiAgICAgICAgICBpZiAocmVndWxhck1lc3NhZ2U/Lm1lc3NhZ2VCdWZmZXIuYnl0ZUxlbmd0aCkge1xuICAgICAgICAgICAgY29tYmluZWRCdWZmZXIud3JpdGVCdWZmZXIocmVndWxhck1lc3NhZ2UubWVzc2FnZUJ1ZmZlciwgZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY29tYmluZWRCdWZmZXIudG9CaW5hcnkoKVxuICAgIH0sXG4gICAgLy8gU2V2ZXIgQ29kZTogcHJvY2VzcyBtZXNzYWdlLCBoYW5kbGUgcGVybWlzc2lvbnMsIGFuZCBicm9hZGNhc3QgaWYgbmVlZGVkLlxuICAgIHByb2Nlc3NTZXJ2ZXJNZXNzYWdlczogZnVuY3Rpb24gcHJvY2Vzc1NlcnZlck1lc3NhZ2VzKHZhbHVlOiBVaW50OEFycmF5LCBzZW5kZXI6IHN0cmluZykge1xuICAgICAgLy8gY29uc29sZS5sb2coYFtTRVJWRVJdIFByb2Nlc3NpbmcgbWVzc2FnZSBmcm9tICR7c2VuZGVyfSwgJHt2YWx1ZS5sZW5ndGh9IGJ5dGVzYClcblxuICAgICAgLy8gQ29sbGVjdCBhbGwgdmFsaWQgbWVzc2FnZXMgZm9yIGJhdGNoZWQgYnJvYWRjYXN0aW5nXG4gICAgICBjb25zdCBtZXNzYWdlc1RvQnJvYWRjYXN0OiB1dGlscy5OZXR3b3JrTWVzc2FnZVtdID0gW11cbiAgICAgIGNvbnN0IHJlZ3VsYXJNZXNzYWdlc0J1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHV0aWxzLnJlYWRNZXNzYWdlcyh2YWx1ZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgbmV0d29yayBtZXNzYWdlcyBpbiBzZXJ2ZXIgbWVzc2FnZSBoYW5kbGVyXG4gICAgICAgICAgaWYgKHV0aWxzLmlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtNZXNzYWdlID0gbWVzc2FnZSBhcyB1dGlscy5OZXR3b3JrTWVzc2FnZVxuXG4gICAgICAgICAgICAvLyAwLiBSZWZ1c2Ugd2hhdCBpcyBhbHJlYWR5IHVudXNhYmxlIGJlZm9yZSBhbiBlbnRpdHkgaXMgc3BlbnQgb24gaXQuIEEgcGVlclxuICAgICAgICAgICAgLy8gc2VuZGluZyB1bmlxdWUgKG5ldHdvcmtJZCwgZW50aXR5SWQpIHBhaXJzIGl0IGtub3dzIHdpbGwgYmUgcmVmdXNlZCB3b3VsZFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGRyYWluIHRoZSByYW5nZSBvbmUgcmVmdXNhbCBhdCBhIHRpbWUuIEEgcGFpciBhbHJlYWR5IG1hcHBlZCB0YWtlc1xuICAgICAgICAgICAgLy8gdGhlIG5vcm1hbCBwYXRoLCBzbyBpdHMgc2VuZGVyIHN0aWxsIGdldHMgdGhlIGNvcnJlY3Rpb24gaXQgaXMgb3dlZC5cbiAgICAgICAgICAgIGlmIChmaW5kRXhpc3RpbmdOZXR3b3JrRW50aXR5KG5ldHdvcmtNZXNzYWdlKSA9PT0gbnVsbCAmJiAhcGVlck1lc3NhZ2VJc0VsaWdpYmxlKG5ldHdvcmtNZXNzYWdlKSkge1xuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAxLiBGaW5kIG9yIGNyZWF0ZSBuZXR3b3JrIGVudGl0eSBtYXBwaW5nXG4gICAgICAgICAgICBjb25zdCBsb2NhbEVudGl0eUlkID0gZmluZE9yQ3JlYXRlTmV0d29ya0VudGl0eShuZXR3b3JrTWVzc2FnZSwgc2VuZGVyLCB0cnVlKVxuXG4gICAgICAgICAgICAvLyAyLiBDb252ZXJ0IG5ldHdvcmsgbWVzc2FnZSB0byByZWd1bGFyIG1lc3NhZ2UgYW5kIGNvbGxlY3QgZm9yIGxvY2FsIGFwcGxpY2F0aW9uXG4gICAgICAgICAgICBjb25zdCByZWd1bGFyTWVzc2FnZSA9IGNvbnZlcnROZXR3b3JrVG9SZWd1bGFyTWVzc2FnZShuZXR3b3JrTWVzc2FnZSwgbG9jYWxFbnRpdHlJZClcblxuICAgICAgICAgICAgLy8gMy4gQmFzaWMgcGVybWlzc2lvbiB2YWxpZGF0aW9uLlxuICAgICAgICAgICAgaWYgKCFyZWd1bGFyTWVzc2FnZSB8fCAhdmFsaWRhdGVNZXNzYWdlUGVybWlzc2lvbnMocmVndWxhck1lc3NhZ2UgYXMgYW55LCBzZW5kZXIsIGxvY2FsRW50aXR5SWQpKSB7XG4gICAgICAgICAgICAgIC8vIFNlbmQgY29ycmVjdGlvbiBiYWNrIHRvIHNlbmRlciB3aXRoIHNlcnZlcidzIGF1dGhvcml0YXRpdmUgc3RhdGVcbiAgICAgICAgICAgICAgc2VuZENvcnJlY3Rpb25Ub1NlbmRlcihuZXR3b3JrTWVzc2FnZSwgc2VuZGVyLCBsb2NhbEVudGl0eUlkKVxuICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA0LiBDb2xsZWN0IHZhbGlkIG1lc3NhZ2UgZm9yIGJhdGNoZWQgYnJvYWRjYXN0aW5nXG4gICAgICAgICAgICBtZXNzYWdlc1RvQnJvYWRjYXN0LnB1c2gobmV0d29ya01lc3NhZ2UpXG5cbiAgICAgICAgICAgIGlmIChyZWd1bGFyTWVzc2FnZT8ubWVzc2FnZUJ1ZmZlci5ieXRlTGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlZ3VsYXJNZXNzYWdlc0J1ZmZlci53cml0ZUJ1ZmZlcihyZWd1bGFyTWVzc2FnZS5tZXNzYWdlQnVmZmVyLCBmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgREVCVUdfTkVUV09SS19NRVNTQUdFUygpICYmIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHByb2Nlc3Npbmcgc2VydmVyIG1lc3NhZ2U6JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEJhdGNoIGJyb2FkY2FzdCBhbGwgdmFsaWQgbWVzc2FnZXMgdG9nZXRoZXJcbiAgICAgIGJyb2FkY2FzdEJhdGNoZWRNZXNzYWdlcyhtZXNzYWdlc1RvQnJvYWRjYXN0LCBzZW5kZXIpXG4gICAgICByZXR1cm4gcmVndWxhck1lc3NhZ2VzQnVmZmVyLnRvQmluYXJ5KClcbiAgICB9LFxuICAgIC8vIGVuZ2luZSBjaGFuZ2VzIHRoYXQgbmVlZHMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gICAgY29udmVydFJlZ3VsYXJUb05ldHdvcmtNZXNzYWdlOiBmdW5jdGlvbiBjb252ZXJ0UmVndWxhclRvTmV0d29ya01lc3NhZ2UocmVndWxhck1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5W10ge1xuICAgICAgY29uc3QgZ3JvdXBlZEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcblxuICAgICAgLy8gRmlyc3QgcGFzczogQ29udmVydCBhbGwgcmVndWxhciBtZXNzYWdlcyB0byBuZXR3b3JrIGZvcm1hdCBhbmQgZ3JvdXAgdGhlbSBpbnRvIG9uZSBiaWcgYnVmZmVyXG4gICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgdXRpbHMucmVhZE1lc3NhZ2VzKHJlZ3VsYXJNZXNzYWdlKSkge1xuICAgICAgICAvLyBPbmx5IGNvbnZlcnQgcmVndWxhciBtZXNzYWdlcyB0aGF0IGhhdmUgbmV0d29yayBkYXRhXG4gICAgICAgIGNvbnN0IG5ldHdvcmtEYXRhID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcblxuICAgICAgICBpZiAobmV0d29ya0RhdGEgJiYgIXV0aWxzLmlzTmV0d29ya01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgICAgICB1dGlscy5sb2NhbE1lc3NhZ2VUb05ldHdvcmsobWVzc2FnZSwgbmV0d29ya0RhdGEsIGdyb3VwZWRCdWZmZXIpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2Vjb25kIHBhc3M6IFVzZSB0aGUgbmV3IGNodW5raW5nIGZ1bmN0aW9uIHRoYXQgcmVzcGVjdHMgbWVzc2FnZSBib3VuZGFyaWVzXG4gICAgICBjb25zdCB0b3RhbERhdGEgPSBncm91cGVkQnVmZmVyLnRvQmluYXJ5KClcbiAgICAgIHJldHVybiBjaHVua0NyZHRNZXNzYWdlcyh0b3RhbERhdGEsIExJVkVLSVRfTUFYX1NJWkUpXG4gICAgfVxuICB9XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/sdk",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "7.29.1-
|
|
4
|
+
"version": "7.29.1-36863326504.commit-aa54c50",
|
|
5
5
|
"author": "Decentraland",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dcl/ecs": "7.29.1-
|
|
7
|
+
"@dcl/ecs": "7.29.1-36863326504.commit-aa54c50",
|
|
8
8
|
"@dcl/ecs-math": "2.1.0",
|
|
9
|
-
"@dcl/js-runtime": "7.29.1-
|
|
10
|
-
"@dcl/react-ecs": "7.29.1-
|
|
11
|
-
"@dcl/sdk-commands": "7.29.1-
|
|
9
|
+
"@dcl/js-runtime": "7.29.1-36863326504.commit-aa54c50",
|
|
10
|
+
"@dcl/react-ecs": "7.29.1-36863326504.commit-aa54c50",
|
|
11
|
+
"@dcl/sdk-commands": "7.29.1-36863326504.commit-aa54c50"
|
|
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": "aa54c508d64b518bf772287608b3de1c409be04f"
|
|
37
37
|
}
|
|
@@ -58,6 +58,28 @@ export function createServerValidator(config: ServerValidationConfig) {
|
|
|
58
58
|
return null
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* What a message can be judged on before an entity is spent mapping it. Anything
|
|
63
|
+
* needing the local entity — the CRDT dry run, the scene's own validator — still
|
|
64
|
+
* happens in validateMessagePermissions afterwards.
|
|
65
|
+
*/
|
|
66
|
+
function peerMessageIsEligible(message: utils.NetworkMessage): boolean {
|
|
67
|
+
if (!('componentId' in message)) return true
|
|
68
|
+
|
|
69
|
+
const definition = engine.getComponentOrNull(message.componentId)
|
|
70
|
+
if (!definition) return false
|
|
71
|
+
|
|
72
|
+
if ('data' in message) {
|
|
73
|
+
try {
|
|
74
|
+
definition.schema.deserialize(new ReadWriteByteBuffer(message.data))
|
|
75
|
+
} catch {
|
|
76
|
+
return false
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return true
|
|
81
|
+
}
|
|
82
|
+
|
|
61
83
|
function findOrCreateNetworkEntity(message: utils.NetworkMessage, sender: string, isServer: boolean): Entity {
|
|
62
84
|
// Look for existing network entity mapping first
|
|
63
85
|
const existingEntity = findExistingNetworkEntity(message)
|
|
@@ -116,9 +138,18 @@ export function createServerValidator(config: ServerValidationConfig) {
|
|
|
116
138
|
}
|
|
117
139
|
|
|
118
140
|
if (message.type === CrdtMessageType.PUT_COMPONENT || message.type === CrdtMessageType.DELETE_COMPONENT) {
|
|
119
|
-
const component = engine.
|
|
120
|
-
|
|
121
|
-
|
|
141
|
+
const component = engine.getComponentOrNull(message.componentId) as InternalBaseComponent<unknown> | null
|
|
142
|
+
if (!component) return false
|
|
143
|
+
|
|
144
|
+
let value: unknown = null
|
|
145
|
+
if ('data' in message) {
|
|
146
|
+
try {
|
|
147
|
+
value = component.schema.deserialize(new ReadWriteByteBuffer(message.data))
|
|
148
|
+
} catch {
|
|
149
|
+
return false
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
122
153
|
const dryRunCRDT = component.__dry_run_updateFromCrdt(message)
|
|
123
154
|
const validCRDT = [
|
|
124
155
|
ProcessMessageResultType.StateUpdatedData,
|
|
@@ -251,14 +282,23 @@ export function createServerValidator(config: ServerValidationConfig) {
|
|
|
251
282
|
// Only process network messages in server message handler
|
|
252
283
|
if (utils.isNetworkMessage(message)) {
|
|
253
284
|
const networkMessage = message as utils.NetworkMessage
|
|
285
|
+
|
|
286
|
+
// 0. Refuse what is already unusable before an entity is spent on it. A peer
|
|
287
|
+
// sending unique (networkId, entityId) pairs it knows will be refused would
|
|
288
|
+
// otherwise drain the range one refusal at a time. A pair already mapped takes
|
|
289
|
+
// the normal path, so its sender still gets the correction it is owed.
|
|
290
|
+
if (findExistingNetworkEntity(networkMessage) === null && !peerMessageIsEligible(networkMessage)) {
|
|
291
|
+
continue
|
|
292
|
+
}
|
|
293
|
+
|
|
254
294
|
// 1. Find or create network entity mapping
|
|
255
295
|
const localEntityId = findOrCreateNetworkEntity(networkMessage, sender, true)
|
|
256
296
|
|
|
257
297
|
// 2. Convert network message to regular message and collect for local application
|
|
258
298
|
const regularMessage = convertNetworkToRegularMessage(networkMessage, localEntityId)
|
|
259
299
|
|
|
260
|
-
// 3. Basic permission validation
|
|
261
|
-
if (!validateMessagePermissions(regularMessage as any, sender, localEntityId)) {
|
|
300
|
+
// 3. Basic permission validation.
|
|
301
|
+
if (!regularMessage || !validateMessagePermissions(regularMessage as any, sender, localEntityId)) {
|
|
262
302
|
// Send correction back to sender with server's authoritative state
|
|
263
303
|
sendCorrectionToSender(networkMessage, sender, localEntityId)
|
|
264
304
|
continue
|