@dcl/sdk 7.5.8-10967536696.commit-cfc4ce5 → 7.5.8-11020113946.commit-53f6ae5
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/entities.js +3 -20
- package/network/message-bus-sync.d.ts +1 -1
- package/network/message-bus-sync.js +67 -19
- package/network/state.d.ts +1 -0
- package/network/state.js +25 -12
- package/network/utils.d.ts +0 -29
- package/network/utils.js +1 -102
- package/package.json +6 -6
- package/players/index.d.ts +9 -1
- package/players/index.js +2 -2
- package/src/network/entities.ts +2 -35
- package/src/network/message-bus-sync.ts +75 -30
- package/src/network/state.ts +42 -12
- package/src/network/utils.ts +1 -124
- package/src/players/index.ts +1 -1
- package/src/testing/runtime.ts +3 -3
- package/testing/runtime.js +4 -4
package/network/entities.js
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
import { NetworkEntity as _NetworkEntity, NetworkParent as _NetworkParent, Transform as _Transform, SyncComponents as _SyncComponents
|
1
|
+
import { NetworkEntity as _NetworkEntity, NetworkParent as _NetworkParent, Transform as _Transform, SyncComponents as _SyncComponents } from '@dcl/ecs';
|
2
|
+
import { NOT_SYNC_COMPONENTS } from './state';
|
2
3
|
export function entityUtils(engine, profile) {
|
3
4
|
const NetworkEntity = engine.getComponent(_NetworkEntity.componentId);
|
4
5
|
const NetworkParent = engine.getComponent(_NetworkParent.componentId);
|
@@ -28,24 +29,6 @@ export function entityUtils(engine, profile) {
|
|
28
29
|
}
|
29
30
|
}
|
30
31
|
}
|
31
|
-
const NOT_SYNC_COMPONENTS = [
|
32
|
-
VideoEvent,
|
33
|
-
VideoPlayer,
|
34
|
-
TweenState,
|
35
|
-
AudioEvent,
|
36
|
-
AudioSource,
|
37
|
-
EngineInfo,
|
38
|
-
GltfContainerLoadingState,
|
39
|
-
PointerEventsResult,
|
40
|
-
RaycastResult,
|
41
|
-
RealmInfo,
|
42
|
-
UiDropdown,
|
43
|
-
UiDropdownResult,
|
44
|
-
UiInput,
|
45
|
-
UiInputResult,
|
46
|
-
UiTransform,
|
47
|
-
UiText
|
48
|
-
];
|
49
32
|
for (const component of NOT_SYNC_COMPONENTS) {
|
50
33
|
if (componentsIdsMutable.includes(component.componentId)) {
|
51
34
|
console.log(`⚠️ ${component.componentName} can't be sync through the network!`);
|
@@ -127,4 +110,4 @@ export function entityUtils(engine, profile) {
|
|
127
110
|
getFirstChild
|
128
111
|
};
|
129
112
|
}
|
130
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9lbnRpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsYUFBYSxJQUFJLGNBQWMsRUFFL0IsYUFBYSxJQUFJLGNBQWMsRUFDL0IsU0FBUyxJQUFJLFVBQVUsRUFDdkIsY0FBYyxJQUFJLGVBQWUsRUFJakMsVUFBVSxFQUNWLFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixTQUFTLEVBQ1QsV0FBVyxFQUNYLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGFBQWEsRUFDYixNQUFNLEVBQ04sV0FBVyxFQUNaLE1BQU0sVUFBVSxDQUFBO0FBS2pCLE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBZSxFQUFFLE9BQWlCO0lBQzVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBbUIsQ0FBQTtJQUN2RixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQW1CLENBQUE7SUFDdkYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUF1QixDQUFBO0lBQ25GLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBb0IsQ0FBQTtJQUUxRjs7T0FFRztJQUNILFNBQVMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsWUFBc0IsRUFBRSxZQUFxQjtRQUNqRixJQUFJLG9CQUFvQixHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQTtRQUM1QywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FB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eSxcbiAgSUVuZ2luZSxcbiAgTmV0d29ya0VudGl0eSBhcyBfTmV0d29ya0VudGl0eSxcbiAgSU5ldG93cmtFbnRpdHksXG4gIE5ldHdvcmtQYXJlbnQgYXMgX05ldHdvcmtQYXJlbnQsXG4gIFRyYW5zZm9ybSBhcyBfVHJhbnNmb3JtLFxuICBTeW5jQ29tcG9uZW50cyBhcyBfU3luY0NvbXBvbmVudHMsXG4gIElOZXRvd3JrUGFyZW50LFxuICBUcmFuc2Zvcm1Db21wb25lbnQsXG4gIElTeW5jQ29tcG9uZW50cyxcbiAgVmlkZW9FdmVudCxcbiAgVHdlZW5TdGF0ZSxcbiAgQXVkaW9FdmVudCxcbiAgQXVkaW9Tb3VyY2UsXG4gIEVuZ2luZUluZm8sXG4gIEdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVmlkZW9QbGF5ZXIsXG4gIFVpRHJvcGRvd24sXG4gIFVpRHJvcGRvd25SZXN1bHQsXG4gIFVpSW5wdXQsXG4gIFVpSW5wdXRSZXN1bHQsXG4gIFVpVGV4dCxcbiAgVWlUcmFuc2Zvcm1cbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBJUHJvZmlsZSB9IGZyb20gJy4vbWVzc2FnZS1idXMtc3luYydcblxuZXhwb3J0IHR5cGUgU3luY0VudGl0eSA9IChlbnRpdHlJZDogRW50aXR5LCBjb21wb25lbnRJZHM6IG51bWJlcltdLCBlbnRpdHlFbnVtSWQ/OiBudW1iZXIpID0+IHZvaWRcblxuZXhwb3J0IGZ1bmN0aW9uIGVudGl0eVV0aWxzKGVuZ2luZTogSUVuZ2luZSwgcHJvZmlsZTogSVByb2ZpbGUpIHtcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGVuZ2luZS5nZXRDb21wb25lbnQoX05ldHdvcmtFbnRpdHkuY29tcG9uZW50SWQpIGFzIElOZXRvd3JrRW50aXR5XG4gIGNvbnN0IE5ldHdvcmtQYXJlbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrUGFyZW50LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya1BhcmVudFxuICBjb25zdCBUcmFuc2Zvcm0gPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9UcmFuc2Zvcm0uY29tcG9uZW50SWQpIGFzIFRyYW5zZm9ybUNvbXBvbmVudFxuICBjb25zdCBTeW5jQ29tcG9uZW50cyA9IGVuZ2luZS5nZXRDb21wb25lbnQoX1N5bmNDb21wb25lbnRzLmNvbXBvbmVudElkKSBhcyBJU3luY0NvbXBvbmVudHNcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV0d29yayBlbnRpdHkgKHN5bmMpIHRocm91Z2ggY29tbXMsIGFuZCBzeW5jIHRoZSByZWNlaXZlZCBjb21wb25lbnRzXG4gICAqL1xuICBmdW5jdGlvbiBzeW5jRW50aXR5KGVudGl0eUlkOiBFbnRpdHksIGNvbXBvbmVudElkczogbnVtYmVyW10sIGVudGl0eUVudW1JZD86IG51bWJlcikge1xuICAgIGxldCBjb21wb25lbnRzSWRzTXV0YWJsZSA9IFsuLi5jb21wb25lbnRJZHNdXG4gICAgLy8gUHJvZmlsZSBub3QgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXByb2ZpbGU/Lm5ldHdvcmtJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9maWxlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBzeW5jRW50aXR5IGluc2lkZSB0aGUgbWFpbigpIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gV2UgdXNlIHRoZSBuZXR3b3JrSWQgZ2VuZXJhdGVkIGJ5IHRoZSB1c2VyIGFkZHJlc3MgdG8gaWRlbnRpZnkgdGhpcyBlbnRpdHkgdGhyb3VnaCB0aGUgbmV0d29ya1xuICAgIGNvbnN0IG5ldHdvcmtWYWx1ZSA9IHsgZW50aXR5SWQsIG5ldHdvcmtJZDogcHJvZmlsZS5uZXR3b3JrSWQgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gZW50aXR5RW51bUlkLCBpdCBtZWFucyBpcyB0aGUgc2FtZSBlbnRpdHkgZm9yIGFsbCB0aGUgY2xpZW50cyBjcmVhdGVkIG9uIHRoZSBtYWluIGZ1bmNpdG9uLlxuICAgIC8vIFNvIHRoZSBuZXR3b3JrSWQgc2hvdWxkIGJlIHRoZSBzYW1lIGluIGFsbCB0aGUgY2xpZW50cyB0byBhdm9pZCByZS1jcmVhdGluZyB0aGlzIGVudGl0eS5cbiAgICAvLyBGb3IgdGhpcyBjYXNlIHdlIHVzZSBuZXR3b3JrSWQgPSAwLlxuICAgIGlmIChlbnRpdHlFbnVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV0d29ya1ZhbHVlLm5ldHdvcmtJZCA9IDBcbiAgICAgIG5ldHdvcmtWYWx1ZS5lbnRpdHlJZCA9IGVudGl0eUVudW1JZCBhcyBFbnRpdHlcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnVtIGlzIGFscmVhZHkgdXNlZFxuICAgICAgZm9yIChjb25zdCBbXywgbmV0d29ya10gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChOZXR3b3JrRW50aXR5KSkge1xuICAgICAgICBpZiAobmV0d29yay5uZXR3b3JrSWQgPT09IG5ldHdvcmtWYWx1ZS5uZXR3b3JrSWQgJiYgbmV0d29yay5lbnRpdHlJZCA9PT0gbmV0d29ya1ZhbHVlLmVudGl0eUlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzeW5jRW50aXR5IGZhaWxlZCBiZWNhdXNlIHRoZSBpZCBwcm92aWRlZCBpcyBhbHJlYWR5IGluIHVzZScpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTID0gW1xuICAgICAgVmlkZW9FdmVudCxcbiAgICAgIFZpZGVvUGxheWVyLFxuICAgICAgVHdlZW5TdGF0ZSxcbiAgICAgIEF1ZGlvRXZlbnQsXG4gICAgICBBdWRpb1NvdXJjZSxcbiAgICAgIEVuZ2luZUluZm8sXG4gICAgICBHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLFxuICAgICAgUG9pbnRlckV2ZW50c1Jlc3VsdCxcbiAgICAgIFJheWNhc3RSZXN1bHQsXG4gICAgICBSZWFsbUluZm8sXG4gICAgICBVaURyb3Bkb3duLFxuICAgICAgVWlEcm9wZG93blJlc3VsdCxcbiAgICAgIFVpSW5wdXQsXG4gICAgICBVaUlucHV0UmVzdWx0LFxuICAgICAgVWlUcmFuc2Zvcm0sXG4gICAgICBVaVRleHRcbiAgICBdXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgTk9UX1NZTkNfQ09NUE9ORU5UUykge1xuICAgICAgaWYgKGNvbXBvbmVudHNJZHNNdXRhYmxlLmluY2x1ZGVzKGNvbXBvbmVudC5jb21wb25lbnRJZCkpIHtcbiAgICAgICAgY29uc29sZS5sb2coYOKaoO+4jyAke2NvbXBvbmVudC5jb21wb25lbnROYW1lfSBjYW4ndCBiZSBzeW5jIHRocm91Z2ggdGhlIG5ldHdvcmshYClcbiAgICAgICAgY29tcG9uZW50c0lkc011dGFibGUgPSBjb21wb25lbnRzSWRzTXV0YWJsZS5maWx0ZXIoKCQpID0+ICQgIT09IGNvbXBvbmVudC5jb21wb25lbnRJZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBpcyBub3QgZGVmaW5lZCwgdGhlbiBpcyBhIGVudGl0eSBjcmVhdGVkIGluIHJ1bnRpbWUgKHdoYXQgd2UgY2FsbGVkIGR5bmFtaWMvcnVudGltZSBlbnRpdGllcykuXG4gICAgTmV0d29ya0VudGl0eS5jcmVhdGVPclJlcGxhY2UoZW50aXR5SWQsIG5ldHdvcmtWYWx1ZSlcbiAgICBTeW5jQ29tcG9uZW50cy5jcmVhdGVPclJlcGxhY2UoZW50aXR5SWQsIHsgY29tcG9uZW50SWRzOiBjb21wb25lbnRzSWRzTXV0YWJsZSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gaXRlcmFibGUgb2YgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGdpdmVuIGVudGl0eS5cbiAgICogZm9yIChjb25zdCBjaGlsZHJlbiBvZiBnZXRDaGlsZHJlbihwYXJlbnQpKSB7IGNvbnNvbGUubG9nKGNoaWxkcmVuKSB9XG4gICAqIG9yIGp1c3QgPT4gY29uc3QgY2hpbGRyZW5zOiBFbnRpdHlbXSA9IEFycmF5LmZyb20oZ2V0Q2hpbGRyZW4ocGFyZW50KSlcbiAgICovXG4gIGZ1bmN0aW9uKiBnZXRDaGlsZHJlbihwYXJlbnQ6IEVudGl0eSk6IEl0ZXJhYmxlPEVudGl0eT4ge1xuICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrRW50aXR5LmdldE9yTnVsbChwYXJlbnQpXG4gICAgaWYgKG5ldHdvcmspIHtcbiAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgcGFyZW50XSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKE5ldHdvcmtQYXJlbnQpKSB7XG4gICAgICAgIGlmIChwYXJlbnQuZW50aXR5SWQgPT09IG5ldHdvcmsuZW50aXR5SWQgJiYgcGFyZW50Lm5ldHdvcmtJZCA9PT0gbmV0d29yay5uZXR3b3JrSWQpIHtcbiAgICAgICAgICB5aWVsZCBlbnRpdHlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZpcnN0Q2hpbGQoZW50aXR5OiBFbnRpdHkpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShnZXRDaGlsZHJlbihlbnRpdHkpKVswXVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBhcmVudCBlbnRpdHkgb2YgdGhlIGdpdmVuIGVudGl0eS5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhcmVudChjaGlsZDogRW50aXR5KTogRW50aXR5IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwYXJlbnQgPSBOZXR3b3JrUGFyZW50LmdldE9yTnVsbChjaGlsZClcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIGZvciAoY29uc3QgW2VudGl0eSwgbmV0d29ya10gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChOZXR3b3JrRW50aXR5KSkge1xuICAgICAgaWYgKHBhcmVudC5uZXR3b3JrSWQgPT09IG5ldHdvcmsubmV0d29ya0lkICYmIHBhcmVudC5lbnRpdHlJZCA9PT0gbmV0d29yay5lbnRpdHlJZCkge1xuICAgICAgICByZXR1cm4gZW50aXR5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBuZXR3b3JrIHBhcmVudGluZyB0byBzeW5jIGVudGl0aWVzLlxuICAgKiBFcXVpdmFsZW50IHRvIFRyYW5zZm9ybS5wYXJlbnQgZm9yIGxvY2FsIGVudGl0aWVzXG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbnRpdHkoZW50aXR5OiBFbnRpdHksIHBhcmVudDogRW50aXR5KSB7XG4gICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKHBhcmVudClcbiAgICBpZiAoIW5ldHdvcmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGlzIG5vdCBzeW5jLiBDYWxsIHN5bmNFbnRpdHkgb24gdGhlIHBhcmVudC4nKVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBuZXR3b3JrIHBhcmVudCBjb21wb25lbnRcbiAgICBOZXR3b3JrUGFyZW50LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHksIG5ldHdvcmspXG5cbiAgICAvLyBJZiB3ZSBkb250IGhhdmUgYSB0cmFuc2Zvcm0gZm9yIHRoaXMgZW50aXR5LCBjcmVhdGUgYW4gZW1wdHkgb25lIHRvIHNlbmQgaXQgdG8gdGhlIHJlbmRlcmVyXG4gICAgaWYgKCFUcmFuc2Zvcm0uZ2V0T3JOdWxsKGVudGl0eSkpIHtcbiAgICAgIFRyYW5zZm9ybS5jcmVhdGUoZW50aXR5KVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBmb3JjZSB0byBzZW5kIGEgdGljayB1cGRhdGUgb2YgdGhlIHRyYW5zZm9ybSBzbyB3ZSBjYW4gc2VuZCB0aGUgTkVXIHBhcmVudCB0byB0aGUgcmVuZGVyZXJcbiAgICAgIFRyYW5zZm9ybS5nZXRNdXRhYmxlKGVudGl0eSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbmV0d29yayBwYXJlbnRpbmcgZnJvbSBhbiBlbnRpdHlcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVBhcmVudChlbnRpdHk6IEVudGl0eSkge1xuICAgIGNvbnN0IG5ldHdvcmsgPSBOZXR3b3JrRW50aXR5LmdldE9yTnVsbChlbnRpdHkpXG5cbiAgICBpZiAoIW5ldHdvcmspIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW50aXR5IGlzIG5vdCBzeW5jJylcbiAgICB9XG5cbiAgICBOZXR3b3JrUGFyZW50LmRlbGV0ZUZyb20oZW50aXR5KVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzeW5jRW50aXR5LFxuICAgIGdldENoaWxkcmVuLFxuICAgIGdldFBhcmVudCxcbiAgICBwYXJlbnRFbnRpdHksXG4gICAgcmVtb3ZlUGFyZW50LFxuICAgIGdldEZpcnN0Q2hpbGRcbiAgfVxufVxuIl19
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9lbnRpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0wsYUFBYSxJQUFJLGNBQWMsRUFFL0IsYUFBYSxJQUFJLGNBQWMsRUFDL0IsU0FBUyxJQUFJLFVBQVUsRUFDdkIsY0FBYyxJQUFJLGVBQWUsRUFJbEMsTUFBTSxVQUFVLENBQUE7QUFFakIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sU0FBUyxDQUFBO0FBSTdDLE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBZSxFQUFFLE9BQWlCO0lBQzVELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBbUIsQ0FBQTtJQUN2RixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQW1CLENBQUE7SUFDdkYsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUF1QixDQUFBO0lBQ25GLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBb0IsQ0FBQTtJQUUxRjs7T0FFRztJQUNILFNBQVMsVUFBVSxDQUFDLFFBQWdCLEVBQUUsWUFBc0IsRUFBRSxZQUFxQjtRQUNqRixJQUFJLG9CQUFvQixHQUFHLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQTtRQUM1QywwQkFBMEI7UUFDMUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFBO1NBQ3hGO1FBRUQsaUdBQWlHO1FBQ2pHLE1BQU0sWUFBWSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUE7UUFFL0QsNkdBQTZHO1FBQzdHLDJGQUEyRjtRQUMzRixzQ0FBc0M7UUFDdEMsSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFO1lBQzlCLFlBQVksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFBO1lBQzFCLFlBQVksQ0FBQyxRQUFRLEdBQUcsWUFBc0IsQ0FBQTtZQUU5QyxxQ0FBcUM7WUFDckMsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ2hFLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssWUFBWSxDQUFDLFFBQVEsRUFBRTtvQkFDOUYsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFBO2lCQUMvRTthQUNGO1NBQ0Y7UUFFRCxLQUFLLE1BQU0sU0FBUyxJQUFJLG1CQUFtQixFQUFFO1lBQzNDLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxhQUFhLHFDQUFxQyxDQUFDLENBQUE7Z0JBQy9FLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQTthQUN2RjtTQUNGO1FBRUQsb0dBQW9HO1FBQ3BHLGFBQWEsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ3JELGNBQWMsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLENBQUMsQ0FBQTtJQUNsRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDL0MsSUFBSSxPQUFPLEVBQUU7WUFDWCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDcEUsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsU0FBUyxFQUFFO29CQUNsRixNQUFNLE1BQU0sQ0FBQTtpQkFDYjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsU0FBUyxhQUFhLENBQUMsTUFBYztRQUNuQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUyxTQUFTLENBQUMsS0FBYTtRQUM5QixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzdDLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFDN0IsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDckUsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLE9BQU8sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUNsRixPQUFPLE1BQU0sQ0FBQTthQUNkO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsU0FBUyxZQUFZLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDbEQsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUMvQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFBO1NBQ3RFO1FBRUQsa0NBQWtDO1FBQ2xDLGFBQWEsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBRTlDLDhGQUE4RjtRQUM5RixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQ3pCO2FBQU07WUFDTCxnR0FBZ0c7WUFDaEcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUM3QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsWUFBWSxDQUFDLE1BQWM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUUvQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFBO1NBQ3RDO1FBRUQsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBRUQsT0FBTztRQUNMLFVBQVU7UUFDVixXQUFXO1FBQ1gsU0FBUztRQUNULFlBQVk7UUFDWixZQUFZO1FBQ1osYUFBYTtLQUNkLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5LFxuICBJRW5naW5lLFxuICBOZXR3b3JrRW50aXR5IGFzIF9OZXR3b3JrRW50aXR5LFxuICBJTmV0b3dya0VudGl0eSxcbiAgTmV0d29ya1BhcmVudCBhcyBfTmV0d29ya1BhcmVudCxcbiAgVHJhbnNmb3JtIGFzIF9UcmFuc2Zvcm0sXG4gIFN5bmNDb21wb25lbnRzIGFzIF9TeW5jQ29tcG9uZW50cyxcbiAgSU5ldG93cmtQYXJlbnQsXG4gIFRyYW5zZm9ybUNvbXBvbmVudCxcbiAgSVN5bmNDb21wb25lbnRzXG59IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgSVByb2ZpbGUgfSBmcm9tICcuL21lc3NhZ2UtYnVzLXN5bmMnXG5pbXBvcnQgeyBOT1RfU1lOQ19DT01QT05FTlRTIH0gZnJvbSAnLi9zdGF0ZSdcblxuZXhwb3J0IHR5cGUgU3luY0VudGl0eSA9IChlbnRpdHlJZDogRW50aXR5LCBjb21wb25lbnRJZHM6IG51bWJlcltdLCBlbnRpdHlFbnVtSWQ/OiBudW1iZXIpID0+IHZvaWRcblxuZXhwb3J0IGZ1bmN0aW9uIGVudGl0eVV0aWxzKGVuZ2luZTogSUVuZ2luZSwgcHJvZmlsZTogSVByb2ZpbGUpIHtcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGVuZ2luZS5nZXRDb21wb25lbnQoX05ldHdvcmtFbnRpdHkuY29tcG9uZW50SWQpIGFzIElOZXRvd3JrRW50aXR5XG4gIGNvbnN0IE5ldHdvcmtQYXJlbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrUGFyZW50LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya1BhcmVudFxuICBjb25zdCBUcmFuc2Zvcm0gPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9UcmFuc2Zvcm0uY29tcG9uZW50SWQpIGFzIFRyYW5zZm9ybUNvbXBvbmVudFxuICBjb25zdCBTeW5jQ29tcG9uZW50cyA9IGVuZ2luZS5nZXRDb21wb25lbnQoX1N5bmNDb21wb25lbnRzLmNvbXBvbmVudElkKSBhcyBJU3luY0NvbXBvbmVudHNcblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV0d29yayBlbnRpdHkgKHN5bmMpIHRocm91Z2ggY29tbXMsIGFuZCBzeW5jIHRoZSByZWNlaXZlZCBjb21wb25lbnRzXG4gICAqL1xuICBmdW5jdGlvbiBzeW5jRW50aXR5KGVudGl0eUlkOiBFbnRpdHksIGNvbXBvbmVudElkczogbnVtYmVyW10sIGVudGl0eUVudW1JZD86IG51bWJlcikge1xuICAgIGxldCBjb21wb25lbnRzSWRzTXV0YWJsZSA9IFsuLi5jb21wb25lbnRJZHNdXG4gICAgLy8gUHJvZmlsZSBub3QgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXByb2ZpbGU/Lm5ldHdvcmtJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQcm9maWxlIG5vdCBpbml0aWFsaXplZC4gQ2FsbCBzeW5jRW50aXR5IGluc2lkZSB0aGUgbWFpbigpIGZ1bmN0aW9uLicpXG4gICAgfVxuXG4gICAgLy8gV2UgdXNlIHRoZSBuZXR3b3JrSWQgZ2VuZXJhdGVkIGJ5IHRoZSB1c2VyIGFkZHJlc3MgdG8gaWRlbnRpZnkgdGhpcyBlbnRpdHkgdGhyb3VnaCB0aGUgbmV0d29ya1xuICAgIGNvbnN0IG5ldHdvcmtWYWx1ZSA9IHsgZW50aXR5SWQsIG5ldHdvcmtJZDogcHJvZmlsZS5uZXR3b3JrSWQgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gZW50aXR5RW51bUlkLCBpdCBtZWFucyBpcyB0aGUgc2FtZSBlbnRpdHkgZm9yIGFsbCB0aGUgY2xpZW50cyBjcmVhdGVkIG9uIHRoZSBtYWluIGZ1bmNpdG9uLlxuICAgIC8vIFNvIHRoZSBuZXR3b3JrSWQgc2hvdWxkIGJlIHRoZSBzYW1lIGluIGFsbCB0aGUgY2xpZW50cyB0byBhdm9pZCByZS1jcmVhdGluZyB0aGlzIGVudGl0eS5cbiAgICAvLyBGb3IgdGhpcyBjYXNlIHdlIHVzZSBuZXR3b3JrSWQgPSAwLlxuICAgIGlmIChlbnRpdHlFbnVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV0d29ya1ZhbHVlLm5ldHdvcmtJZCA9IDBcbiAgICAgIG5ldHdvcmtWYWx1ZS5lbnRpdHlJZCA9IGVudGl0eUVudW1JZCBhcyBFbnRpdHlcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBlbnVtIGlzIGFscmVhZHkgdXNlZFxuICAgICAgZm9yIChjb25zdCBbXywgbmV0d29ya10gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChOZXR3b3JrRW50aXR5KSkge1xuICAgICAgICBpZiAobmV0d29yay5uZXR3b3JrSWQgPT09IG5ldHdvcmtWYWx1ZS5uZXR3b3JrSWQgJiYgbmV0d29yay5lbnRpdHlJZCA9PT0gbmV0d29ya1ZhbHVlLmVudGl0eUlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzeW5jRW50aXR5IGZhaWxlZCBiZWNhdXNlIHRoZSBpZCBwcm92aWRlZCBpcyBhbHJlYWR5IGluIHVzZScpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBOT1RfU1lOQ19DT01QT05FTlRTKSB7XG4gICAgICBpZiAoY29tcG9uZW50c0lkc011dGFibGUuaW5jbHVkZXMoY29tcG9uZW50LmNvbXBvbmVudElkKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhg4pqg77iPICR7Y29tcG9uZW50LmNvbXBvbmVudE5hbWV9IGNhbid0IGJlIHN5bmMgdGhyb3VnaCB0aGUgbmV0d29yayFgKVxuICAgICAgICBjb21wb25lbnRzSWRzTXV0YWJsZSA9IGNvbXBvbmVudHNJZHNNdXRhYmxlLmZpbHRlcigoJCkgPT4gJCAhPT0gY29tcG9uZW50LmNvbXBvbmVudElkKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIGlzIG5vdCBkZWZpbmVkLCB0aGVuIGlzIGEgZW50aXR5IGNyZWF0ZWQgaW4gcnVudGltZSAod2hhdCB3ZSBjYWxsZWQgZHluYW1pYy9ydW50aW1lIGVudGl0aWVzKS5cbiAgICBOZXR3b3JrRW50aXR5LmNyZWF0ZU9yUmVwbGFjZShlbnRpdHlJZCwgbmV0d29ya1ZhbHVlKVxuICAgIFN5bmNDb21wb25lbnRzLmNyZWF0ZU9yUmVwbGFjZShlbnRpdHlJZCwgeyBjb21wb25lbnRJZHM6IGNvbXBvbmVudHNJZHNNdXRhYmxlIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgKiBmb3IgKGNvbnN0IGNoaWxkcmVuIG9mIGdldENoaWxkcmVuKHBhcmVudCkpIHsgY29uc29sZS5sb2coY2hpbGRyZW4pIH1cbiAgICogb3IganVzdCA9PiBjb25zdCBjaGlsZHJlbnM6IEVudGl0eVtdID0gQXJyYXkuZnJvbShnZXRDaGlsZHJlbihwYXJlbnQpKVxuICAgKi9cbiAgZnVuY3Rpb24qIGdldENoaWxkcmVuKHBhcmVudDogRW50aXR5KTogSXRlcmFibGU8RW50aXR5PiB7XG4gICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKHBhcmVudClcbiAgICBpZiAobmV0d29yaykge1xuICAgICAgZm9yIChjb25zdCBbZW50aXR5LCBwYXJlbnRdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoTmV0d29ya1BhcmVudCkpIHtcbiAgICAgICAgaWYgKHBhcmVudC5lbnRpdHlJZCA9PT0gbmV0d29yay5lbnRpdHlJZCAmJiBwYXJlbnQubmV0d29ya0lkID09PSBuZXR3b3JrLm5ldHdvcmtJZCkge1xuICAgICAgICAgIHlpZWxkIGVudGl0eVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Rmlyc3RDaGlsZChlbnRpdHk6IEVudGl0eSkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGdldENoaWxkcmVuKGVudGl0eSkpWzBdXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcGFyZW50IGVudGl0eSBvZiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGFyZW50KGNoaWxkOiBFbnRpdHkpOiBFbnRpdHkgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhcmVudCA9IE5ldHdvcmtQYXJlbnQuZ2V0T3JOdWxsKGNoaWxkKVxuICAgIGlmICghcGFyZW50KSByZXR1cm4gdW5kZWZpbmVkXG4gICAgZm9yIChjb25zdCBbZW50aXR5LCBuZXR3b3JrXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKE5ldHdvcmtFbnRpdHkpKSB7XG4gICAgICBpZiAocGFyZW50Lm5ldHdvcmtJZCA9PT0gbmV0d29yay5uZXR3b3JrSWQgJiYgcGFyZW50LmVudGl0eUlkID09PSBuZXR3b3JrLmVudGl0eUlkKSB7XG4gICAgICAgIHJldHVybiBlbnRpdHlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIG5ldHdvcmsgcGFyZW50aW5nIHRvIHN5bmMgZW50aXRpZXMuXG4gICAqIEVxdWl2YWxlbnQgdG8gVHJhbnNmb3JtLnBhcmVudCBmb3IgbG9jYWwgZW50aXRpZXNcbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVudGl0eShlbnRpdHk6IEVudGl0eSwgcGFyZW50OiBFbnRpdHkpIHtcbiAgICBjb25zdCBuZXR3b3JrID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwocGFyZW50KVxuICAgIGlmICghbmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXMgbm90IHN5bmMuIENhbGwgc3luY0VudGl0eSBvbiB0aGUgcGFyZW50LicpXG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIG5ldHdvcmsgcGFyZW50IGNvbXBvbmVudFxuICAgIE5ldHdvcmtQYXJlbnQuY3JlYXRlT3JSZXBsYWNlKGVudGl0eSwgbmV0d29yaylcblxuICAgIC8vIElmIHdlIGRvbnQgaGF2ZSBhIHRyYW5zZm9ybSBmb3IgdGhpcyBlbnRpdHksIGNyZWF0ZSBhbiBlbXB0eSBvbmUgdG8gc2VuZCBpdCB0byB0aGUgcmVuZGVyZXJcbiAgICBpZiAoIVRyYW5zZm9ybS5nZXRPck51bGwoZW50aXR5KSkge1xuICAgICAgVHJhbnNmb3JtLmNyZWF0ZShlbnRpdHkpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGZvcmNlIHRvIHNlbmQgYSB0aWNrIHVwZGF0ZSBvZiB0aGUgdHJhbnNmb3JtIHNvIHdlIGNhbiBzZW5kIHRoZSBORVcgcGFyZW50IHRvIHRoZSByZW5kZXJlclxuICAgICAgVHJhbnNmb3JtLmdldE11dGFibGUoZW50aXR5KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBuZXR3b3JrIHBhcmVudGluZyBmcm9tIGFuIGVudGl0eVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUGFyZW50KGVudGl0eTogRW50aXR5KSB7XG4gICAgY29uc3QgbmV0d29yayA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKGVudGl0eSlcblxuICAgIGlmICghbmV0d29yaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFbnRpdHkgaXMgbm90IHN5bmMnKVxuICAgIH1cblxuICAgIE5ldHdvcmtQYXJlbnQuZGVsZXRlRnJvbShlbnRpdHkpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN5bmNFbnRpdHksXG4gICAgZ2V0Q2hpbGRyZW4sXG4gICAgZ2V0UGFyZW50LFxuICAgIHBhcmVudEVudGl0eSxcbiAgICByZW1vdmVQYXJlbnQsXG4gICAgZ2V0Rmlyc3RDaGlsZFxuICB9XG59XG4iXX0=
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/// <reference types="@dcl/js-runtime" />
|
2
2
|
import { IEngine } from '@dcl/ecs';
|
3
|
-
import type
|
3
|
+
import { type SendBinaryRequest, type SendBinaryResponse } from '~system/CommunicationsController';
|
4
4
|
import { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity';
|
5
5
|
export type IProfile = {
|
6
6
|
networkId: number;
|
@@ -1,11 +1,13 @@
|
|
1
|
+
import { RealmInfo } from '@dcl/ecs';
|
1
2
|
import { syncFilter } from './filter';
|
2
3
|
import { engineToCrdt } from './state';
|
3
|
-
import { BinaryMessageBus, CommsMessage } from './binary-message-bus';
|
4
|
-
import {
|
4
|
+
import { BinaryMessageBus, CommsMessage, decodeString, encodeString } from './binary-message-bus';
|
5
|
+
import { fetchProfile } from './utils';
|
5
6
|
import { entityUtils } from './entities';
|
7
|
+
import { definePlayerHelper } from '../players';
|
8
|
+
import { serializeCrdtMessages } from '../internal/transports/logger';
|
6
9
|
// user that we asked for the inital crdt state
|
7
10
|
export function addSyncTransport(engine, sendBinary, getUserData) {
|
8
|
-
definePlayersInScene(engine);
|
9
11
|
// Profile Info
|
10
12
|
const myProfile = {};
|
11
13
|
fetchProfile(myProfile, getUserData);
|
@@ -35,29 +37,46 @@ export function addSyncTransport(engine, sendBinary, getUserData) {
|
|
35
37
|
};
|
36
38
|
engine.addTransport(transport);
|
37
39
|
// End add sync transport
|
38
|
-
// Add state intialized checker
|
39
|
-
engine.addSystem(() => stateInitializedChecker(engine, myProfile, entityDefinitions.syncEntity));
|
40
|
-
// Request initial state
|
41
|
-
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array());
|
42
40
|
// If we dont have any state initialized, and recieve a state message.
|
43
41
|
binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => {
|
44
|
-
|
45
|
-
|
46
|
-
|
42
|
+
const { sender, data } = decodeCRDTState(value);
|
43
|
+
if (sender !== myProfile.userId)
|
44
|
+
return;
|
45
|
+
console.log('[Processing CRDT State]', data.byteLength);
|
46
|
+
transport.onmessage(data);
|
47
|
+
});
|
48
|
+
binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, (_, userId) => {
|
49
|
+
binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, encodeCRDTState(userId, engineToCrdt(engine)));
|
50
|
+
});
|
51
|
+
const players = definePlayerHelper(engine);
|
52
|
+
let requestCrdtStateWhenConnected = false;
|
53
|
+
players.onEnterScene((player) => {
|
54
|
+
if (player.userId === myProfile.userId && !requestCrdtStateWhenConnected) {
|
55
|
+
if (RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom) {
|
56
|
+
console.log('Requesting state');
|
57
|
+
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array());
|
58
|
+
}
|
59
|
+
else {
|
60
|
+
console.log('Waiting to be conneted');
|
61
|
+
requestCrdtStateWhenConnected = true;
|
62
|
+
}
|
47
63
|
}
|
48
64
|
});
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
65
|
+
RealmInfo.onChange(engine.RootEntity, (value) => {
|
66
|
+
if (value?.isConnectedSceneRoom && requestCrdtStateWhenConnected) {
|
67
|
+
console.log('Requesting state.');
|
68
|
+
requestCrdtStateWhenConnected = false;
|
69
|
+
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array());
|
70
|
+
}
|
71
|
+
});
|
72
|
+
players.onLeaveScene((userId) => {
|
73
|
+
if (userId === myProfile.userId) {
|
74
|
+
requestCrdtStateWhenConnected = false;
|
56
75
|
}
|
57
76
|
});
|
58
77
|
// Process CRDT messages here
|
59
78
|
binaryMessageBus.on(CommsMessage.CRDT, (value) => {
|
60
|
-
|
79
|
+
console.log(Array.from(serializeCrdtMessages('[NetworkMessage]', value, engine)));
|
61
80
|
transport.onmessage(value);
|
62
81
|
});
|
63
82
|
return {
|
@@ -65,4 +84,33 @@ export function addSyncTransport(engine, sendBinary, getUserData) {
|
|
65
84
|
myProfile
|
66
85
|
};
|
67
86
|
}
|
68
|
-
|
87
|
+
/**
|
88
|
+
* Messages Protocol Encoding
|
89
|
+
*
|
90
|
+
* CRDT: Plain Uint8Array
|
91
|
+
*
|
92
|
+
* CRDT_STATE_RES { sender: string, data: Uint8Array}
|
93
|
+
*/
|
94
|
+
function decodeCRDTState(data) {
|
95
|
+
let offset = 0;
|
96
|
+
const r = new Uint8Array(data);
|
97
|
+
const view = new DataView(r.buffer);
|
98
|
+
const senderLength = view.getUint8(offset);
|
99
|
+
offset += 1;
|
100
|
+
const sender = decodeString(data.subarray(1, senderLength + 1));
|
101
|
+
offset += senderLength;
|
102
|
+
const state = r.subarray(offset);
|
103
|
+
return { sender, data: state };
|
104
|
+
}
|
105
|
+
function encodeCRDTState(address, data) {
|
106
|
+
// address to uint8array
|
107
|
+
const addressBuffer = encodeString(address);
|
108
|
+
const addressOffset = 1;
|
109
|
+
const messageLength = addressOffset + addressBuffer.byteLength + data.byteLength;
|
110
|
+
const serializedMessage = new Uint8Array(messageLength);
|
111
|
+
serializedMessage.set(new Uint8Array([addressBuffer.byteLength]), 0);
|
112
|
+
serializedMessage.set(addressBuffer, 1);
|
113
|
+
serializedMessage.set(data, addressBuffer.byteLength + 1);
|
114
|
+
return serializedMessage;
|
115
|
+
}
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1idXMtc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXR3b3JrL21lc3NhZ2UtYnVzLXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixTQUFTLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHeEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFBO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ2pHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUV4QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUE7QUFHckUsK0NBQStDO0FBQy9DLE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsTUFBZSxFQUNmLFVBQW1FLEVBQ25FLFdBQXdFO0lBRXhFLGVBQWU7SUFDZixNQUFNLFNBQVMsR0FBYSxFQUFjLENBQUE7SUFDMUMsWUFBWSxDQUFDLFNBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQTtJQUVyQyxlQUFlO0lBQ2YsTUFBTSxpQkFBaUIsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBRXhELG1FQUFtRTtJQUNuRSxNQUFNLCtCQUErQixHQUFpQixFQUFFLENBQUE7SUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFFckcsU0FBUyxpQkFBaUI7UUFDeEIsTUFBTSxRQUFR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WSxDQUFBO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUE7QUFDaEMsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE9BQWUsRUFBRSxJQUFnQjtJQUN4RCx3QkFBd0I7SUFDeEIsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzNDLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQTtJQUN2QixNQUFNLGFBQWEsR0FBRyxhQUFhLEdBQUcsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFBO0lBRWhGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDdkQsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDcEUsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN2QyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDekQsT0FBTyxpQkFBaUIsQ0FBQTtBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUVuZ2luZSwgVHJhbnNwb3J0LCBSZWFsbUluZm8gfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IHR5cGUgU2VuZEJpbmFyeVJlcXVlc3QsIHR5cGUgU2VuZEJpbmFyeVJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9Db21tdW5pY2F0aW9uc0NvbnRyb2xsZXInXG5cbmltcG9ydCB7IHN5bmNGaWx0ZXIgfSBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCB7IGVuZ2luZVRvQ3JkdCB9IGZyb20gJy4vc3RhdGUnXG5pbXBvcnQgeyBCaW5hcnlNZXNzYWdlQnVzLCBDb21tc01lc3NhZ2UsIGRlY29kZVN0cmluZywgZW5jb2RlU3RyaW5nIH0gZnJvbSAnLi9iaW5hcnktbWVzc2FnZS1idXMnXG5pbXBvcnQgeyBmZXRjaFByb2ZpbGUgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHsgZW50aXR5VXRpbHMgfSBmcm9tICcuL2VudGl0aWVzJ1xuaW1wb3J0IHsgR2V0VXNlckRhdGFSZXF1ZXN0LCBHZXRVc2VyRGF0YVJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9Vc2VySWRlbnRpdHknXG5pbXBvcnQgeyBkZWZpbmVQbGF5ZXJIZWxwZXIgfSBmcm9tICcuLi9wbGF5ZXJzJ1xuaW1wb3J0IHsgc2VyaWFsaXplQ3JkdE1lc3NhZ2VzIH0gZnJvbSAnLi4vaW50ZXJuYWwvdHJhbnNwb3J0cy9sb2dnZXInXG5cbmV4cG9ydCB0eXBlIElQcm9maWxlID0geyBuZXR3b3JrSWQ6IG51bWJlcjsgdXNlcklkOiBzdHJpbmcgfVxuLy8gdXNlciB0aGF0IHdlIGFza2VkIGZvciB0aGUgaW5pdGFsIGNyZHQgc3RhdGVcbmV4cG9ydCBmdW5jdGlvbiBhZGRTeW5jVHJhbnNwb3J0KFxuICBlbmdpbmU6IElFbmdpbmUsXG4gIHNlbmRCaW5hcnk6IChtc2c6IFNlbmRCaW5hcnlSZXF1ZXN0KSA9PiBQcm9taXNlPFNlbmRCaW5hcnlSZXNwb25zZT4sXG4gIGdldFVzZXJEYXRhOiAodmFsdWU6IEdldFVzZXJEYXRhUmVxdWVzdCkgPT4gUHJvbWlzZTxHZXRVc2VyRGF0YVJlc3BvbnNlPlxuKSB7XG4gIC8vIFByb2ZpbGUgSW5mb1xuICBjb25zdCBteVByb2ZpbGU6IElQcm9maWxlID0ge30gYXMgSVByb2ZpbGVcbiAgZmV0Y2hQcm9maWxlKG15UHJvZmlsZSEsIGdldFVzZXJEYXRhKVxuXG4gIC8vIEVudGl0eSB1dGlsc1xuICBjb25zdCBlbnRpdHlEZWZpbml0aW9ucyA9IGVudGl0eVV0aWxzKGVuZ2luZSwgbXlQcm9maWxlKVxuXG4gIC8vIExpc3Qgb2YgTWVzc2FnZUJ1c3MgbWVzc3NhZ2VzIHRvIGJlIHNlbnQgb24gZXZlcnkgZnJhbWUgdG8gY29tbXNcbiAgY29uc3QgcGVuZGluZ01lc3NhZ2VCdXNNZXNzYWdlc1RvU2VuZDogVWludDhBcnJheVtdID0gW11cbiAgY29uc3QgYmluYXJ5TWVzc2FnZUJ1cyA9IEJpbmFyeU1lc3NhZ2VCdXMoKG1lc3NhZ2UpID0+IHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQucHVzaChtZXNzYWdlKSlcblxuICBmdW5jdGlvbiBnZXRNZXNzYWdlc1RvU2VuZCgpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IFsuLi5wZW5kaW5nTWVzc2FnZUJ1c01lc3NhZ2VzVG9TZW5kXVxuICAgIHBlbmRpbmdNZXNzYWdlQnVzTWVzc2FnZXNUb1NlbmQubGVuZ3RoID0gMFxuICAgIHJldHVybiBtZXNzYWdlc1xuICB9XG5cbiAgLy8gQWRkIFN5bmMgVHJhbnNwb3J0XG4gIGNvbnN0IHRyYW5zcG9ydDogVHJhbnNwb3J0ID0ge1xuICAgIGZpbHRlcjogc3luY0ZpbHRlcihlbmdpbmUpLFxuICAgIHNlbmQ6IGFzeW5jIChtZXNzYWdlOiBVaW50OEFycmF5KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKEFycmF5LmZyb20oc2VyaWFsaXplQ3JkdE1lc3NhZ2VzKCdbc2VuZCBDUkRUXTogJywgbWVzc2FnZSwgZW5naW5lKSkpXG4gICAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuQ1JEVCwgbWVzc2FnZSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1lc3NhZ2VzID0gZ2V0TWVzc2FnZXNUb1NlbmQoKVxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZW5kQmluYXJ5KHsgZGF0YTogbWVzc2FnZXMgfSlcbiAgICAgIGJpbmFyeU1lc3NhZ2VCdXMuX19wcm9jZXNzTWVzc2FnZXMocmVzcG9uc2UuZGF0YSlcbiAgICB9LFxuICAgIHR5cGU6ICduZXR3b3JrJ1xuICB9XG4gIGVuZ2luZS5hZGRUcmFuc3BvcnQodHJhbnNwb3J0KVxuICAvLyBFbmQgYWRkIHN5bmMgdHJhbnNwb3J0XG5cbiAgLy8gSWYgd2UgZG9udCBoYXZlIGFueSBzdGF0ZSBpbml0aWFsaXplZCwgYW5kIHJlY2lldmUgYSBzdGF0ZSBtZXNzYWdlLlxuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5SRVNfQ1JEVF9TVEFURSwgKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgeyBzZW5kZXIsIGRhdGEgfSA9IGRlY29kZUNSRFRTdGF0ZSh2YWx1ZSlcbiAgICBpZiAoc2VuZGVyICE9PSBteVByb2ZpbGUudXNlcklkKSByZXR1cm5cbiAgICBjb25zb2xlLmxvZygnW1Byb2Nlc3NpbmcgQ1JEVCBTdGF0ZV0nLCBkYXRhLmJ5dGVMZW5ndGgpXG4gICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEoZGF0YSlcbiAgfSlcblxuICBiaW5hcnlNZXNzYWdlQnVzLm9uKENvbW1zTWVzc2FnZS5SRVFfQ1JEVF9TVEFURSwgKF8sIHVzZXJJZCkgPT4ge1xuICAgIGJpbmFyeU1lc3NhZ2VCdXMuZW1pdChDb21tc01lc3NhZ2UuUkVTX0NSRFRfU1RBVEUsIGVuY29kZUNSRFRTdGF0ZSh1c2VySWQsIGVuZ2luZVRvQ3JkdChlbmdpbmUpKSlcbiAgfSlcblxuICBjb25zdCBwbGF5ZXJzID0gZGVmaW5lUGxheWVySGVscGVyKGVuZ2luZSlcblxuICBsZXQgcmVxdWVzdENyZHRTdGF0ZVdoZW5Db25uZWN0ZWQgPSBmYWxzZVxuXG4gIHBsYXllcnMub25FbnRlclNjZW5lKChwbGF5ZXIpID0+IHtcbiAgICBpZiAocGxheWVyLnVzZXJJZCA9PT0gbXlQcm9maWxlLnVzZXJJZCAmJiAhcmVxdWVzdENyZHRTdGF0ZVdoZW5Db25uZWN0ZWQpIHtcbiAgICAgIGlmIChSZWFsbUluZm8uZ2V0T3JOdWxsKGVuZ2luZS5Sb290RW50aXR5KT8uaXNDb25uZWN0ZWRTY2VuZVJvb20pIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1JlcXVlc3Rpbmcgc3RhdGUnKVxuICAgICAgICBiaW5hcnlNZXNzYWdlQnVzLmVtaXQoQ29tbXNNZXNzYWdlLlJFUV9DUkRUX1NUQVRFLCBuZXcgVWludDhBcnJheSgpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgdG8gYmUgY29ubmV0ZWQnKVxuICAgICAgICByZXF1ZXN0Q3JkdFN0YXRlV2hlbkNvbm5lY3RlZCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgUmVhbG1JbmZvLm9uQ2hhbmdlKGVuZ2luZS5Sb290RW50aXR5LCAodmFsdWUpID0+IHtcbiAgICBpZiAodmFsdWU/LmlzQ29ubmVjdGVkU2NlbmVSb29tICYmIHJlcXVlc3RDcmR0U3RhdGVXaGVuQ29ubmVjdGVkKSB7XG4gICAgICBjb25zb2xlLmxvZygnUmVxdWVzdGluZyBzdGF0ZS4nKVxuICAgICAgcmVxdWVzdENyZHRTdGF0ZVdoZW5Db25uZWN0ZWQgPSBmYWxzZVxuICAgICAgYmluYXJ5TWVzc2FnZUJ1cy5lbWl0KENvbW1zTWVzc2FnZS5SRVFfQ1JEVF9TVEFURSwgbmV3IFVpbnQ4QXJyYXkoKSlcbiAgICB9XG4gIH0pXG5cbiAgcGxheWVycy5vbkxlYXZlU2NlbmUoKHVzZXJJZCkgPT4ge1xuICAgIGlmICh1c2VySWQgPT09IG15UHJvZmlsZS51c2VySWQpIHtcbiAgICAgIHJlcXVlc3RDcmR0U3RhdGVXaGVuQ29ubmVjdGVkID0gZmFsc2VcbiAgICB9XG4gIH0pXG5cbiAgLy8gUHJvY2VzcyBDUkRUIG1lc3NhZ2VzIGhlcmVcbiAgYmluYXJ5TWVzc2FnZUJ1cy5vbihDb21tc01lc3NhZ2UuQ1JEVCwgKHZhbHVlKSA9PiB7XG4gICAgY29uc29sZS5sb2coQXJyYXkuZnJvbShzZXJpYWxpemVDcmR0TWVzc2FnZXMoJ1tOZXR3b3JrTWVzc2FnZV0nLCB2YWx1ZSwgZW5naW5lKSkpXG4gICAgdHJhbnNwb3J0Lm9ubWVzc2FnZSEodmFsdWUpXG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICAuLi5lbnRpdHlEZWZpbml0aW9ucyxcbiAgICBteVByb2ZpbGVcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2VzIFByb3RvY29sIEVuY29kaW5nXG4gKlxuICogQ1JEVDogUGxhaW4gVWludDhBcnJheVxuICpcbiAqIENSRFRfU1RBVEVfUkVTIHsgc2VuZGVyOiBzdHJpbmcsIGRhdGE6IFVpbnQ4QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGRlY29kZUNSRFRTdGF0ZShkYXRhOiBVaW50OEFycmF5KSB7XG4gIGxldCBvZmZzZXQgPSAwXG4gIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheShkYXRhKVxuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHIuYnVmZmVyKVxuICBjb25zdCBzZW5kZXJMZW5ndGggPSB2aWV3LmdldFVpbnQ4KG9mZnNldClcbiAgb2Zmc2V0ICs9IDFcbiAgY29uc3Qgc2VuZGVyID0gZGVjb2RlU3RyaW5nKGRhdGEuc3ViYXJyYXkoMSwgc2VuZGVyTGVuZ3RoICsgMSkpXG4gIG9mZnNldCArPSBzZW5kZXJMZW5ndGhcbiAgY29uc3Qgc3RhdGUgPSByLnN1YmFycmF5KG9mZnNldClcblxuICByZXR1cm4geyBzZW5kZXIsIGRhdGE6IHN0YXRlIH1cbn1cblxuZnVuY3Rpb24gZW5jb2RlQ1JEVFN0YXRlKGFkZHJlc3M6IHN0cmluZywgZGF0YTogVWludDhBcnJheSkge1xuICAvLyBhZGRyZXNzIHRvIHVpbnQ4YXJyYXlcbiAgY29uc3QgYWRkcmVzc0J1ZmZlciA9IGVuY29kZVN0cmluZyhhZGRyZXNzKVxuICBjb25zdCBhZGRyZXNzT2Zmc2V0ID0gMVxuICBjb25zdCBtZXNzYWdlTGVuZ3RoID0gYWRkcmVzc09mZnNldCArIGFkZHJlc3NCdWZmZXIuYnl0ZUxlbmd0aCArIGRhdGEuYnl0ZUxlbmd0aFxuXG4gIGNvbnN0IHNlcmlhbGl6ZWRNZXNzYWdlID0gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZUxlbmd0aClcbiAgc2VyaWFsaXplZE1lc3NhZ2Uuc2V0KG5ldyBVaW50OEFycmF5KFthZGRyZXNzQnVmZmVyLmJ5dGVMZW5ndGhdKSwgMClcbiAgc2VyaWFsaXplZE1lc3NhZ2Uuc2V0KGFkZHJlc3NCdWZmZXIsIDEpXG4gIHNlcmlhbGl6ZWRNZXNzYWdlLnNldChkYXRhLCBhZGRyZXNzQnVmZmVyLmJ5dGVMZW5ndGggKyAxKVxuICByZXR1cm4gc2VyaWFsaXplZE1lc3NhZ2Vcbn1cbiJdfQ==
|
package/network/state.d.ts
CHANGED
@@ -1,2 +1,3 @@
|
|
1
1
|
import { IEngine } from '@dcl/ecs';
|
2
|
+
export declare const NOT_SYNC_COMPONENTS: (import("@dcl/ecs").AudioSourceComponentDefinitionExtended | import("@dcl/ecs").GrowOnlyValueSetComponentDefinition<import("@dcl/ecs").PBAudioEvent> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBEngineInfo> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBGltfContainerLoadingState> | import("@dcl/ecs").GrowOnlyValueSetComponentDefinition<import("@dcl/ecs").PBPointerEventsResult> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBRaycastResult> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBRealmInfo> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBTweenState> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBUiDropdown> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBUiDropdownResult> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBUiInput> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBUiInputResult> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBUiText> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBUiTransform> | import("@dcl/ecs").GrowOnlyValueSetComponentDefinition<import("@dcl/ecs").PBVideoEvent> | import("@dcl/ecs").LastWriteWinElementSetComponentDefinition<import("@dcl/ecs").PBVideoPlayer>)[];
|
2
3
|
export declare function engineToCrdt(engine: IEngine): Uint8Array;
|
package/network/state.js
CHANGED
@@ -1,22 +1,35 @@
|
|
1
1
|
import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
|
2
|
-
import { CrdtMessageProtocol, CrdtMessageType, PutComponentOperation, PutNetworkComponentOperation,
|
2
|
+
import { CrdtMessageProtocol, CrdtMessageType, PutComponentOperation, PutNetworkComponentOperation, NetworkEntity as _NetworkEntity, VideoEvent, AudioEvent, AudioSource, EngineInfo, GltfContainerLoadingState, PointerEventsResult, RaycastResult, RealmInfo, TweenState, UiDropdown, UiDropdownResult, UiInput, UiInputResult, UiText, UiTransform, VideoPlayer } from '@dcl/ecs';
|
3
|
+
export const NOT_SYNC_COMPONENTS = [
|
4
|
+
VideoEvent,
|
5
|
+
VideoPlayer,
|
6
|
+
TweenState,
|
7
|
+
AudioEvent,
|
8
|
+
AudioSource,
|
9
|
+
EngineInfo,
|
10
|
+
GltfContainerLoadingState,
|
11
|
+
PointerEventsResult,
|
12
|
+
RaycastResult,
|
13
|
+
RealmInfo,
|
14
|
+
UiDropdown,
|
15
|
+
UiDropdownResult,
|
16
|
+
UiInput,
|
17
|
+
UiInputResult,
|
18
|
+
UiTransform,
|
19
|
+
UiText
|
20
|
+
];
|
21
|
+
const NOT_SYNC_COMPONENTS_IDS = NOT_SYNC_COMPONENTS.map(($) => $.componentId);
|
3
22
|
export function engineToCrdt(engine) {
|
4
23
|
const crdtBuffer = new ReadWriteByteBuffer();
|
5
24
|
const networkBuffer = new ReadWriteByteBuffer();
|
6
|
-
const SyncComponents = engine.getComponent(_SyncComponents.componentId);
|
7
25
|
const NetworkEntity = engine.getComponent(_NetworkEntity.componentId);
|
8
26
|
for (const itComponentDefinition of engine.componentsIter()) {
|
27
|
+
if (NOT_SYNC_COMPONENTS_IDS.includes(itComponentDefinition.componentId)) {
|
28
|
+
continue;
|
29
|
+
}
|
9
30
|
itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
|
10
31
|
const isNetworkEntity = NetworkEntity.has(entity);
|
11
|
-
|
12
|
-
return false;
|
13
|
-
}
|
14
|
-
const isDynamicEntity = NetworkEntity.get(entity).networkId;
|
15
|
-
if (isDynamicEntity) {
|
16
|
-
return true;
|
17
|
-
}
|
18
|
-
// For the static entities we only send the updates of the SyncComponents
|
19
|
-
return SyncComponents.get(entity).componentIds.includes(itComponentDefinition.componentId);
|
32
|
+
return isNetworkEntity;
|
20
33
|
});
|
21
34
|
}
|
22
35
|
let header;
|
@@ -37,4 +50,4 @@ export function engineToCrdt(engine) {
|
|
37
50
|
}
|
38
51
|
return networkBuffer.toBinary();
|
39
52
|
}
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsNEJBQTRCLEVBRTVCLGFBQWEsSUFBSSxjQUFjLEVBRS9CLFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsbUJBQW1CLEVBQ25CLGFBQWEsRUFDYixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGFBQWEsRUFDYixNQUFNLEVBQ04sV0FBVyxFQUNYLFdBQVcsRUFDWixNQUFNLFVBQVUsQ0FBQTtBQUVqQixNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRztJQUNqQyxVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVixVQUFVO0lBQ1YsV0FBVztJQUNYLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixTQUFTO0lBQ1QsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsYUFBYTtJQUNiLFdBQVc7SUFDWCxNQUFNO0NBQ1AsQ0FBQTtBQUVELE1BQU0sdUJBQXVCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUE7QUFFN0UsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFlO0lBQzFDLE1BQU0sVUFBVSxHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQTtJQUM1QyxNQUFNLGFBQWEsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUE7SUFDL0MsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFtQixDQUFBO0lBRXZGLEtBQUssTUFBTSxxQkFBcUIsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUU7UUFDM0QsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDdkUsU0FBUTtTQUNUO1FBQ0QscUJBQXFCLENBQUMscUJBQXFCLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDakUsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqRCxPQUFPLGVBQWUsQ0FBQTtRQUN4QixDQUFDLENBQUMsQ0FBQTtLQUNIO0lBRUQsSUFBSSxNQUFnQyxDQUFBO0lBQ3BDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUU7UUFDM0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxhQUFhLEVBQUU7WUFDakQsTUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBRSxDQUFBO1lBQ3ZELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQy9ELElBQUksYUFBYSxFQUFFO2dCQUNqQiw0QkFBNEIsQ0FBQyxLQUFLLENBQ2hDLGFBQWEsQ0FBQyxRQUFRLEVBQ3RCLE9BQU8sQ0FBQyxTQUFTLEVBQ2pCLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLGFBQWEsQ0FBQyxTQUFTLEVBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQ1osYUFBYSxDQUNkLENBQUE7YUFDRjtpQkFBTTtnQkFDTCxxQkFBcUIsQ0FBQyxLQUFLLENBQ3pCLE9BQU8sQ0FBQyxRQUFRLEVBQ2hCLE9BQU8sQ0FBQyxTQUFTLEVBQ2pCLE9BQU8sQ0FBQyxXQUFXLEVBQ25CLE9BQU8sQ0FBQyxJQUFJLEVBQ1osYUFBYSxDQUNkLENBQUE7YUFDRjtTQUNGO2FBQU07WUFDTCxVQUFVLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQzlDO0tBQ0Y7SUFFRCxPQUFPLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuaW1wb3J0IHtcbiAgQ3JkdE1lc3NhZ2VIZWFkZXIsXG4gIENyZHRNZXNzYWdlUHJvdG9jb2wsXG4gIENyZHRNZXNzYWdlVHlwZSxcbiAgSUVuZ2luZSxcbiAgUHV0Q29tcG9uZW50T3BlcmF0aW9uLFxuICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLFxuICBTeW5jQ29tcG9uZW50cyBhcyBfU3luY0NvbXBvbmVudHMsXG4gIE5ldHdvcmtFbnRpdHkgYXMgX05ldHdvcmtFbnRpdHksXG4gIElOZXRvd3JrRW50aXR5LFxuICBWaWRlb0V2ZW50LFxuICBBdWRpb0V2ZW50LFxuICBBdWRpb1NvdXJjZSxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUG9pbnRlckV2ZW50c1Jlc3VsdCxcbiAgUmF5Y2FzdFJlc3VsdCxcbiAgUmVhbG1JbmZvLFxuICBUd2VlblN0YXRlLFxuICBVaURyb3Bkb3duLFxuICBVaURyb3Bkb3duUmVzdWx0LFxuICBVaUlucHV0LFxuICBVaUlucHV0UmVzdWx0LFxuICBVaVRleHQsXG4gIFVpVHJhbnNmb3JtLFxuICBWaWRlb1BsYXllclxufSBmcm9tICdAZGNsL2VjcydcblxuZXhwb3J0IGNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFMgPSBbXG4gIFZpZGVvRXZlbnQsXG4gIFZpZGVvUGxheWVyLFxuICBUd2VlblN0YXRlLFxuICBBdWRpb0V2ZW50LFxuICBBdWRpb1NvdXJjZSxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUG9pbnRlckV2ZW50c1Jlc3VsdCxcbiAgUmF5Y2FzdFJlc3VsdCxcbiAgUmVhbG1JbmZvLFxuICBVaURyb3Bkb3duLFxuICBVaURyb3Bkb3duUmVzdWx0LFxuICBVaUlucHV0LFxuICBVaUlucHV0UmVzdWx0LFxuICBVaVRyYW5zZm9ybSxcbiAgVWlUZXh0XG5dXG5cbmNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFNfSURTID0gTk9UX1NZTkNfQ09NUE9ORU5UUy5tYXAoKCQpID0+ICQuY29tcG9uZW50SWQpXG5cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmVUb0NyZHQoZW5naW5lOiBJRW5naW5lKTogVWludDhBcnJheSB7XG4gIGNvbnN0IGNyZHRCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrRW50aXR5LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya0VudGl0eVxuXG4gIGZvciAoY29uc3QgaXRDb21wb25lbnREZWZpbml0aW9uIG9mIGVuZ2luZS5jb21wb25lbnRzSXRlcigpKSB7XG4gICAgaWYgKE5PVF9TWU5DX0NPTVBPTkVOVFNfSURTLmluY2x1ZGVzKGl0Q29tcG9uZW50RGVmaW5pdGlvbi5jb21wb25lbnRJZCkpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGl0Q29tcG9uZW50RGVmaW5pdGlvbi5kdW1wQ3JkdFN0YXRlVG9CdWZmZXIoY3JkdEJ1ZmZlciwgKGVudGl0eSkgPT4ge1xuICAgICAgY29uc3QgaXNOZXR3b3JrRW50aXR5ID0gTmV0d29ya0VudGl0eS5oYXMoZW50aXR5KVxuICAgICAgcmV0dXJuIGlzTmV0d29ya0VudGl0eVxuICAgIH0pXG4gIH1cblxuICBsZXQgaGVhZGVyOiBDcmR0TWVzc2FnZUhlYWRlciB8IG51bGxcbiAgd2hpbGUgKChoZWFkZXIgPSBDcmR0TWVzc2FnZVByb3RvY29sLmdldEhlYWRlcihjcmR0QnVmZmVyKSkpIHtcbiAgICBpZiAoaGVhZGVyLnR5cGUgPT09IENyZHRNZXNzYWdlVHlwZS5QVVRfQ09NUE9ORU5UKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gUHV0Q29tcG9uZW50T3BlcmF0aW9uLnJlYWQoY3JkdEJ1ZmZlcikhXG4gICAgICBjb25zdCBuZXR3b3JrRW50aXR5ID0gTmV0d29ya0VudGl0eS5nZXRPck51bGwobWVzc2FnZS5lbnRpdHlJZClcbiAgICAgIGlmIChuZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgICBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtFbnRpdHkubmV0d29ya0lkLFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFB1dENvbXBvbmVudE9wZXJhdGlvbi53cml0ZShcbiAgICAgICAgICBtZXNzYWdlLmVudGl0eUlkLFxuICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wLFxuICAgICAgICAgIG1lc3NhZ2UuY29tcG9uZW50SWQsXG4gICAgICAgICAgbWVzc2FnZS5kYXRhLFxuICAgICAgICAgIG5ldHdvcmtCdWZmZXJcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjcmR0QnVmZmVyLmluY3JlbWVudFJlYWRPZmZzZXQoaGVhZGVyLmxlbmd0aClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV0d29ya0J1ZmZlci50b0JpbmFyeSgpXG59XG4iXX0=
|
package/network/utils.d.ts
CHANGED
@@ -1,33 +1,4 @@
|
|
1
1
|
/// <reference types="@dcl/js-runtime" />
|
2
|
-
import { Entity, IEngine } from '@dcl/ecs';
|
3
2
|
import type { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity';
|
4
|
-
import { SyncEntity } from './entities';
|
5
3
|
import { IProfile } from './message-bus-sync';
|
6
|
-
export declare const definePlayersInScene: (engine: IEngine) => import("@dcl/ecs").MapComponentDefinition<import("@dcl/ecs").MapResult<{
|
7
|
-
timestamp: import("@dcl/ecs").ISchema<number>;
|
8
|
-
userId: import("@dcl/ecs").ISchema<string>;
|
9
|
-
}>>;
|
10
|
-
export declare let stateInitialized: boolean;
|
11
|
-
export declare let playerSceneEntity: Entity;
|
12
|
-
export declare function setInitialized(): void;
|
13
|
-
export declare let INITIAL_CRDT_RENDERER_MESSAGES_SENT: boolean;
|
14
4
|
export declare function fetchProfile(myProfile: IProfile, getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>): void;
|
15
|
-
/**
|
16
|
-
* Add's the user information about when he joined the scene.
|
17
|
-
* It's used to check who is the oldest one, to sync the state
|
18
|
-
*/
|
19
|
-
export declare function createPlayerTimestampData(engine: IEngine, profile: IProfile, syncEntity: SyncEntity): Entity | undefined;
|
20
|
-
/**
|
21
|
-
* Check if I'm the older user to send the initial state
|
22
|
-
*/
|
23
|
-
export declare function oldestUser(engine: IEngine, profile: IProfile, syncEntity: SyncEntity): boolean;
|
24
|
-
/**
|
25
|
-
* Ignore CRDT's initial messages from the renderer.
|
26
|
-
*/
|
27
|
-
export declare function syncTransportIsReady(engine: IEngine): boolean;
|
28
|
-
/**
|
29
|
-
* Check if we are already initialized
|
30
|
-
* Add the playerSceneData component and syncronize it till we receive the state.
|
31
|
-
* This fn should be added as a system so it runs on every tick
|
32
|
-
*/
|
33
|
-
export declare function stateInitializedChecker(engine: IEngine, _profile: IProfile, _syncEntity: SyncEntity): void;
|
package/network/utils.js
CHANGED
@@ -1,21 +1,4 @@
|
|
1
|
-
import { EngineInfo as _EngineInfo, Schemas } from '@dcl/ecs';
|
2
1
|
import { componentNumberFromName } from '@dcl/ecs/dist/components/component-number';
|
3
|
-
// Component to track all the players and when they enter to the scene.
|
4
|
-
// Know who is in charge of sending the initial state (oldest one)
|
5
|
-
export const definePlayersInScene = (engine) => engine.defineComponent('players-scene', {
|
6
|
-
timestamp: Schemas.Number,
|
7
|
-
userId: Schemas.String
|
8
|
-
});
|
9
|
-
// Already initialized my state. Ignore new states messages.
|
10
|
-
export let stateInitialized = false;
|
11
|
-
// My player entity to check if I'm the oldest player in the scend
|
12
|
-
export let playerSceneEntity;
|
13
|
-
export function setInitialized() {
|
14
|
-
stateInitialized = true;
|
15
|
-
}
|
16
|
-
// Flag to avoid sending over the wire all the initial messages that the engine add's to the rendererTransport
|
17
|
-
// INITIAL_CRDT_MESSAGES that are being processed on the onStart loop, before the onUpdate.
|
18
|
-
export let INITIAL_CRDT_RENDERER_MESSAGES_SENT = false;
|
19
2
|
// Retrieve userId to start sending this info as the networkId
|
20
3
|
export function fetchProfile(myProfile, getUserData) {
|
21
4
|
void getUserData({}).then(({ data }) => {
|
@@ -30,88 +13,4 @@ export function fetchProfile(myProfile, getUserData) {
|
|
30
13
|
}
|
31
14
|
});
|
32
15
|
}
|
33
|
-
|
34
|
-
* Add's the user information about when he joined the scene.
|
35
|
-
* It's used to check who is the oldest one, to sync the state
|
36
|
-
*/
|
37
|
-
export function createPlayerTimestampData(engine, profile, syncEntity) {
|
38
|
-
if (!profile?.userId)
|
39
|
-
return undefined;
|
40
|
-
const PlayersInScene = definePlayersInScene(engine);
|
41
|
-
const entity = engine.addEntity();
|
42
|
-
PlayersInScene.create(entity, { timestamp: Date.now(), userId: profile.userId });
|
43
|
-
syncEntity(entity, [PlayersInScene.componentId]);
|
44
|
-
playerSceneEntity = entity;
|
45
|
-
return playerSceneEntity;
|
46
|
-
}
|
47
|
-
/**
|
48
|
-
* Check if I'm the older user to send the initial state
|
49
|
-
*/
|
50
|
-
export function oldestUser(engine, profile, syncEntity) {
|
51
|
-
const PlayersInScene = definePlayersInScene(engine);
|
52
|
-
// When the user leaves the scene but it's still connected.
|
53
|
-
if (!PlayersInScene.has(playerSceneEntity)) {
|
54
|
-
createPlayerTimestampData(engine, profile, syncEntity);
|
55
|
-
return oldestUser(engine, profile, syncEntity);
|
56
|
-
}
|
57
|
-
const { timestamp } = PlayersInScene.get(playerSceneEntity);
|
58
|
-
for (const [_, player] of engine.getEntitiesWith(PlayersInScene)) {
|
59
|
-
if (player.timestamp < timestamp)
|
60
|
-
return false;
|
61
|
-
}
|
62
|
-
return true;
|
63
|
-
}
|
64
|
-
/**
|
65
|
-
* Ignore CRDT's initial messages from the renderer.
|
66
|
-
*/
|
67
|
-
export function syncTransportIsReady(engine) {
|
68
|
-
const EngineInfo = engine.getComponent(_EngineInfo.componentId);
|
69
|
-
if (!INITIAL_CRDT_RENDERER_MESSAGES_SENT) {
|
70
|
-
const engineInfo = EngineInfo.getOrNull(engine.RootEntity);
|
71
|
-
if (engineInfo && engineInfo.tickNumber > 1) {
|
72
|
-
INITIAL_CRDT_RENDERER_MESSAGES_SENT = true;
|
73
|
-
}
|
74
|
-
}
|
75
|
-
return INITIAL_CRDT_RENDERER_MESSAGES_SENT;
|
76
|
-
}
|
77
|
-
/**
|
78
|
-
* Check if we are already initialized
|
79
|
-
* Add the playerSceneData component and syncronize it till we receive the state.
|
80
|
-
* This fn should be added as a system so it runs on every tick
|
81
|
-
*/
|
82
|
-
// TODO: Had to comment all the logic because getConnectedPlayers was not working as expected
|
83
|
-
// A lot of raise conditions. For now we will go with the approach that every client that it's initialized will send his crdt state.
|
84
|
-
export function stateInitializedChecker(engine, _profile, _syncEntity) {
|
85
|
-
// const PlayersInScene = definePlayersInScene(engine)
|
86
|
-
const EngineInfo = engine.getComponent(_EngineInfo.componentId);
|
87
|
-
// const NetworkEntity = engine.getComponent(_NetworkEntity.componentId) as INetowrkEntity
|
88
|
-
async function enterScene() {
|
89
|
-
// if (!playerSceneEntity) {
|
90
|
-
// createPlayerTimestampData(engine, profile, syncEntity)
|
91
|
-
// }
|
92
|
-
/**
|
93
|
-
* Keeps PlayersInScene up-to-date with the current players.
|
94
|
-
*/
|
95
|
-
// const connectedPlayers = await getConnectedPlayers({})
|
96
|
-
// for (const [entity, player] of engine.getEntitiesWith(PlayersInScene)) {
|
97
|
-
// if (!connectedPlayers.players.find(($) => $.userId === player.userId)) {
|
98
|
-
// PlayersInScene.deleteFrom(entity)
|
99
|
-
// }
|
100
|
-
// }
|
101
|
-
// Wait for comms to be ready ?? ~3000ms
|
102
|
-
if ((EngineInfo.getOrNull(engine.RootEntity)?.tickNumber ?? 0) > 100) {
|
103
|
-
setInitialized();
|
104
|
-
return;
|
105
|
-
}
|
106
|
-
// If we already have data from players, dont send the heartbeat messages
|
107
|
-
// if (connectedPlayers.players.length) return
|
108
|
-
// if (!stateInitialized && playerSceneEntity) {
|
109
|
-
// // Send this data to all the players connected (new and old)
|
110
|
-
// // So everyone can decide if it's the oldest one or no.
|
111
|
-
// // It's for the case that multiple users enters ~ at the same time.
|
112
|
-
// PlayersInScene.getMutable(playerSceneEntity)
|
113
|
-
// }
|
114
|
-
}
|
115
|
-
void enterScene();
|
116
|
-
}
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxJQUFJLFdBQVcsRUFJekIsT0FBTyxFQUdSLE1BQU0sVUFBVSxDQUFBO0FBQ2pCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFBO0FBTW5GLHVFQUF1RTtBQUN2RSxrRUFBa0U7QUFDbEUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFlLEVBQUUsRUFBRSxDQUN0RCxNQUFNLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRTtJQUN0QyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU07SUFDekIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO0NBQ3ZCLENBQUMsQ0FBQTtBQUVKLDREQUE0RDtBQUM1RCxNQUFNLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7QUFFbkMsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxJQUFJLGlCQUF5QixDQUFBO0FBRXBDLE1BQU0sVUFBVSxjQUFjO0lBQzVCLGdCQUFnQixHQUFHLElBQUksQ0FBQTtBQUN6QixDQUFDO0FBRUQsOEdBQThHO0FBQzlHLDJGQUEyRjtBQUMzRixNQUFNLENBQUMsSUFBSSxtQ0FBbUMsR0FBRyxLQUFLLENBQUE7QUFFdEQsOERBQThEO0FBQzlELE1BQU0sVUFBVSxZQUFZLENBQzFCLFNBQW1CLEVBQ25CLFdBQXdFO0lBRXhFLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtRQUNyQyxJQUFJLElBQUksRUFBRSxNQUFNLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQTtZQUMxQixNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDdEQsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUE7WUFDL0IsU0FBUyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7U0FDMUI7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtTQUMvQztJQUNILENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxNQUFlLEVBQUUsT0FBaUIsRUFBRSxVQUFzQjtJQUNsRyxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU07UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUN0QyxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDakMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtJQUNoRixVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUE7SUFDaEQsaUJBQWlCLEdBQUcsTUFBTSxDQUFBO0lBQzFCLE9BQU8saUJBQWlCLENBQUE7QUFDMUIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFlLEVBQUUsT0FBaUIsRUFBRSxVQUFzQjtJQUNuRixNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNuRCwyREFBMkQ7SUFDM0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUMxQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ3RELE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUE7S0FDL0M7SUFDRCxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO0lBQzNELEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ2hFLElBQUksTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUE7S0FDL0M7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxNQUFlO0lBQ2xELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQ3BDLFdBQVcsQ0FBQyxXQUFXLENBQ21DLENBQUE7SUFDNUQsSUFBSSxDQUFDLG1DQUFtQyxFQUFFO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQzFELElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQzNDLG1DQUFtQyxHQUFHLElBQUksQ0FBQTtTQUMzQztLQUNGO0lBQ0QsT0FBTyxtQ0FBbUMsQ0FBQTtBQUM1QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILDZGQUE2RjtBQUM3RixvSUFBb0k7QUFDcEksTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWUsRUFBRSxRQUFrQixFQUFFLFdBQXVCO0lBQ2xHLHNEQUFzRDtJQUN0RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQXVCLENBQUE7SUFDckYsMEZBQTBGO0lBQzFGLEtBQUssVUFBVSxVQUFVO1FBQ3ZCLDRCQUE0QjtRQUM1QiwyREFBMkQ7UUFDM0QsSUFBSTtRQUVKOztXQUVHO1FBQ0gseURBQXlEO1FBQ3pELDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0Usd0NBQXdDO1FBQ3hDLE1BQU07UUFDTixJQUFJO1FBRUosd0NBQXdDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxVQUFVLElBQUksQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFO1lBQ3BFLGNBQWMsRUFBRSxDQUFBO1lBQ2hCLE9BQU07U0FDUDtRQUVELHlFQUF5RTtRQUN6RSw4Q0FBOEM7UUFFOUMsZ0RBQWdEO1FBQ2hELGlFQUFpRTtRQUNqRSw0REFBNEQ7UUFDNUQsd0VBQXdFO1FBQ3hFLGlEQUFpRDtRQUNqRCxJQUFJO0lBQ04sQ0FBQztJQUNELEtBQUssVUFBVSxFQUFFLENBQUE7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVuZ2luZUluZm8gYXMgX0VuZ2luZUluZm8sXG4gIEVudGl0eSxcbiAgSUVuZ2luZSxcbiAgTmV0d29ya0VudGl0eSBhcyBfTmV0d29ya0VudGl0eSxcbiAgU2NoZW1hcyxcbiAgTGFzdFdyaXRlV2luRWxlbWVudFNldENvbXBvbmVudERlZmluaXRpb24sXG4gIFBCRW5naW5lSW5mb1xufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IGNvbXBvbmVudE51bWJlckZyb21OYW1lIH0gZnJvbSAnQGRjbC9lY3MvZGlzdC9jb21wb25lbnRzL2NvbXBvbmVudC1udW1iZXInXG5cbmltcG9ydCB0eXBlIHsgR2V0VXNlckRhdGFSZXF1ZXN0LCBHZXRVc2VyRGF0YVJlc3BvbnNlIH0gZnJvbSAnfnN5c3RlbS9Vc2VySWRlbnRpdHknXG5pbXBvcnQgeyBTeW5jRW50aXR5IH0gZnJvbSAnLi9lbnRpdGllcydcbmltcG9ydCB7IElQcm9maWxlIH0gZnJvbSAnLi9tZXNzYWdlLWJ1cy1zeW5jJ1xuXG4vLyBDb21wb25lbnQgdG8gdHJhY2sgYWxsIHRoZSBwbGF5ZXJzIGFuZCB3aGVuIHRoZXkgZW50ZXIgdG8gdGhlIHNjZW5lLlxuLy8gS25vdyB3aG8gaXMgaW4gY2hhcmdlIG9mIHNlbmRpbmcgdGhlIGluaXRpYWwgc3RhdGUgKG9sZGVzdCBvbmUpXG5leHBvcnQgY29uc3QgZGVmaW5lUGxheWVyc0luU2NlbmUgPSAoZW5naW5lOiBJRW5naW5lKSA9PlxuICBlbmdpbmUuZGVmaW5lQ29tcG9uZW50KCdwbGF5ZXJzLXNjZW5lJywge1xuICAgIHRpbWVzdGFtcDogU2NoZW1hcy5OdW1iZXIsXG4gICAgdXNlcklkOiBTY2hlbWFzLlN0cmluZ1xuICB9KVxuXG4vLyBBbHJlYWR5IGluaXRpYWxpemVkIG15IHN0YXRlLiBJZ25vcmUgbmV3IHN0YXRlcyBtZXNzYWdlcy5cbmV4cG9ydCBsZXQgc3RhdGVJbml0aWFsaXplZCA9IGZhbHNlXG5cbi8vIE15IHBsYXllciBlbnRpdHkgdG8gY2hlY2sgaWYgSSdtIHRoZSBvbGRlc3QgcGxheWVyIGluIHRoZSBzY2VuZFxuZXhwb3J0IGxldCBwbGF5ZXJTY2VuZUVudGl0eTogRW50aXR5XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbml0aWFsaXplZCgpIHtcbiAgc3RhdGVJbml0aWFsaXplZCA9IHRydWVcbn1cblxuLy8gRmxhZyB0byBhdm9pZCBzZW5kaW5nIG92ZXIgdGhlIHdpcmUgYWxsIHRoZSBpbml0aWFsIG1lc3NhZ2VzIHRoYXQgdGhlIGVuZ2luZSBhZGQncyB0byB0aGUgcmVuZGVyZXJUcmFuc3BvcnRcbi8vIElOSVRJQUxfQ1JEVF9NRVNTQUdFUyB0aGF0IGFyZSBiZWluZyBwcm9jZXNzZWQgb24gdGhlIG9uU3RhcnQgbG9vcCwgYmVmb3JlIHRoZSBvblVwZGF0ZS5cbmV4cG9ydCBsZXQgSU5JVElBTF9DUkRUX1JFTkRFUkVSX01FU1NBR0VTX1NFTlQgPSBmYWxzZVxuXG4vLyBSZXRyaWV2ZSB1c2VySWQgdG8gc3RhcnQgc2VuZGluZyB0aGlzIGluZm8gYXMgdGhlIG5ldHdvcmtJZFxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoUHJvZmlsZShcbiAgbXlQcm9maWxlOiBJUHJvZmlsZSxcbiAgZ2V0VXNlckRhdGE6ICh2YWx1ZTogR2V0VXNlckRhdGFSZXF1ZXN0KSA9PiBQcm9taXNlPEdldFVzZXJEYXRhUmVzcG9uc2U+XG4pIHtcbiAgdm9pZCBnZXRVc2VyRGF0YSh7fSkudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICBpZiAoZGF0YT8udXNlcklkKSB7XG4gICAgICBjb25zdCB1c2VySWQgPSBkYXRhLnVzZXJJZFxuICAgICAgY29uc3QgbmV0d29ya0lkID0gY29tcG9uZW50TnVtYmVyRnJvbU5hbWUoZGF0YS51c2VySWQpXG4gICAgICBteVByb2ZpbGUubmV0d29ya0lkID0gbmV0d29ya0lkXG4gICAgICBteVByb2ZpbGUudXNlcklkID0gdXNlcklkXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmV0Y2ggcHJvZmlsZSBkYXRhYClcbiAgICB9XG4gIH0pXG59XG5cbi8qKlxuICogQWRkJ3MgdGhlIHVzZXIgaW5mb3JtYXRpb24gYWJvdXQgd2hlbiBoZSBqb2luZWQgdGhlIHNjZW5lLlxuICogSXQncyB1c2VkIHRvIGNoZWNrIHdobyBpcyB0aGUgb2xkZXN0IG9uZSwgdG8gc3luYyB0aGUgc3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBsYXllclRpbWVzdGFtcERhdGEoZW5naW5lOiBJRW5naW5lLCBwcm9maWxlOiBJUHJvZmlsZSwgc3luY0VudGl0eTogU3luY0VudGl0eSkge1xuICBpZiAoIXByb2ZpbGU/LnVzZXJJZCkgcmV0dXJuIHVuZGVmaW5lZFxuICBjb25zdCBQbGF5ZXJzSW5TY2VuZSA9IGRlZmluZVBsYXllcnNJblNjZW5lKGVuZ2luZSlcbiAgY29uc3QgZW50aXR5ID0gZW5naW5lLmFkZEVudGl0eSgpXG4gIFBsYXllcnNJblNjZW5lLmNyZWF0ZShlbnRpdHksIHsgdGltZXN0YW1wOiBEYXRlLm5vdygpLCB1c2VySWQ6IHByb2ZpbGUudXNlcklkIH0pXG4gIHN5bmNFbnRpdHkoZW50aXR5LCBbUGxheWVyc0luU2NlbmUuY29tcG9uZW50SWRdKVxuICBwbGF5ZXJTY2VuZUVudGl0eSA9IGVudGl0eVxuICByZXR1cm4gcGxheWVyU2NlbmVFbnRpdHlcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBJJ20gdGhlIG9sZGVyIHVzZXIgdG8gc2VuZCB0aGUgaW5pdGlhbCBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb2xkZXN0VXNlcihlbmdpbmU6IElFbmdpbmUsIHByb2ZpbGU6IElQcm9maWxlLCBzeW5jRW50aXR5OiBTeW5jRW50aXR5KTogYm9vbGVhbiB7XG4gIGNvbnN0IFBsYXllcnNJblNjZW5lID0gZGVmaW5lUGxheWVyc0luU2NlbmUoZW5naW5lKVxuICAvLyBXaGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgc2NlbmUgYnV0IGl0J3Mgc3RpbGwgY29ubmVjdGVkLlxuICBpZiAoIVBsYXllcnNJblNjZW5lLmhhcyhwbGF5ZXJTY2VuZUVudGl0eSkpIHtcbiAgICBjcmVhdGVQbGF5ZXJUaW1lc3RhbXBEYXRhKGVuZ2luZSwgcHJvZmlsZSwgc3luY0VudGl0eSlcbiAgICByZXR1cm4gb2xkZXN0VXNlcihlbmdpbmUsIHByb2ZpbGUsIHN5bmNFbnRpdHkpXG4gIH1cbiAgY29uc3QgeyB0aW1lc3RhbXAgfSA9IFBsYXllcnNJblNjZW5lLmdldChwbGF5ZXJTY2VuZUVudGl0eSlcbiAgZm9yIChjb25zdCBbXywgcGxheWVyXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcnNJblNjZW5lKSkge1xuICAgIGlmIChwbGF5ZXIudGltZXN0YW1wIDwgdGltZXN0YW1wKSByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIElnbm9yZSBDUkRUJ3MgaW5pdGlhbCBtZXNzYWdlcyBmcm9tIHRoZSByZW5kZXJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN5bmNUcmFuc3BvcnRJc1JlYWR5KGVuZ2luZTogSUVuZ2luZSkge1xuICBjb25zdCBFbmdpbmVJbmZvID0gZW5naW5lLmdldENvbXBvbmVudChcbiAgICBfRW5naW5lSW5mby5jb21wb25lbnRJZFxuICApIGFzIExhc3RXcml0ZVdpbkVsZW1lbnRTZXRDb21wb25lbnREZWZpbml0aW9uPFBCRW5naW5lSW5mbz5cbiAgaWYgKCFJTklUSUFMX0NSRFRfUkVOREVSRVJfTUVTU0FHRVNfU0VOVCkge1xuICAgIGNvbnN0IGVuZ2luZUluZm8gPSBFbmdpbmVJbmZvLmdldE9yTnVsbChlbmdpbmUuUm9vdEVudGl0eSlcbiAgICBpZiAoZW5naW5lSW5mbyAmJiBlbmdpbmVJbmZvLnRpY2tOdW1iZXIgPiAxKSB7XG4gICAgICBJTklUSUFMX0NSRFRfUkVOREVSRVJfTUVTU0FHRVNfU0VOVCA9IHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIElOSVRJQUxfQ1JEVF9SRU5ERVJFUl9NRVNTQUdFU19TRU5UXG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAqIEFkZCB0aGUgcGxheWVyU2NlbmVEYXRhIGNvbXBvbmVudCBhbmQgc3luY3Jvbml6ZSBpdCB0aWxsIHdlIHJlY2VpdmUgdGhlIHN0YXRlLlxuICogVGhpcyBmbiBzaG91bGQgYmUgYWRkZWQgYXMgYSBzeXN0ZW0gc28gaXQgcnVucyBvbiBldmVyeSB0aWNrXG4gKi9cbi8vIFRPRE86IEhhZCB0byBjb21tZW50IGFsbCB0aGUgbG9naWMgYmVjYXVzZSBnZXRDb25uZWN0ZWRQbGF5ZXJzIHdhcyBub3Qgd29ya2luZyBhcyBleHBlY3RlZFxuLy8gQSBsb3Qgb2YgcmFpc2UgY29uZGl0aW9ucy4gRm9yIG5vdyB3ZSB3aWxsIGdvIHdpdGggdGhlIGFwcHJvYWNoIHRoYXQgZXZlcnkgY2xpZW50IHRoYXQgaXQncyBpbml0aWFsaXplZCB3aWxsIHNlbmQgaGlzIGNyZHQgc3RhdGUuXG5leHBvcnQgZnVuY3Rpb24gc3RhdGVJbml0aWFsaXplZENoZWNrZXIoZW5naW5lOiBJRW5naW5lLCBfcHJvZmlsZTogSVByb2ZpbGUsIF9zeW5jRW50aXR5OiBTeW5jRW50aXR5KSB7XG4gIC8vIGNvbnN0IFBsYXllcnNJblNjZW5lID0gZGVmaW5lUGxheWVyc0luU2NlbmUoZW5naW5lKVxuICBjb25zdCBFbmdpbmVJbmZvID0gZW5naW5lLmdldENvbXBvbmVudChfRW5naW5lSW5mby5jb21wb25lbnRJZCkgYXMgdHlwZW9mIF9FbmdpbmVJbmZvXG4gIC8vIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrRW50aXR5LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya0VudGl0eVxuICBhc3luYyBmdW5jdGlvbiBlbnRlclNjZW5lKCkge1xuICAgIC8vIGlmICghcGxheWVyU2NlbmVFbnRpdHkpIHtcbiAgICAvLyAgIGNyZWF0ZVBsYXllclRpbWVzdGFtcERhdGEoZW5naW5lLCBwcm9maWxlLCBzeW5jRW50aXR5KVxuICAgIC8vIH1cblxuICAgIC8qKlxuICAgICAqIEtlZXBzIFBsYXllcnNJblNjZW5lIHVwLXRvLWRhdGUgd2l0aCB0aGUgY3VycmVudCBwbGF5ZXJzLlxuICAgICAqL1xuICAgIC8vIGNvbnN0IGNvbm5lY3RlZFBsYXllcnMgPSBhd2FpdCBnZXRDb25uZWN0ZWRQbGF5ZXJzKHt9KVxuICAgIC8vIGZvciAoY29uc3QgW2VudGl0eSwgcGxheWVyXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcnNJblNjZW5lKSkge1xuICAgIC8vICAgaWYgKCFjb25uZWN0ZWRQbGF5ZXJzLnBsYXllcnMuZmluZCgoJCkgPT4gJC51c2VySWQgPT09IHBsYXllci51c2VySWQpKSB7XG4gICAgLy8gICAgIFBsYXllcnNJblNjZW5lLmRlbGV0ZUZyb20oZW50aXR5KVxuICAgIC8vICAgfVxuICAgIC8vIH1cblxuICAgIC8vIFdhaXQgZm9yIGNvbW1zIHRvIGJlIHJlYWR5ID8/IH4zMDAwbXNcbiAgICBpZiAoKEVuZ2luZUluZm8uZ2V0T3JOdWxsKGVuZ2luZS5Sb290RW50aXR5KT8udGlja051bWJlciA/PyAwKSA+IDEwMCkge1xuICAgICAgc2V0SW5pdGlhbGl6ZWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gSWYgd2UgYWxyZWFkeSBoYXZlIGRhdGEgZnJvbSBwbGF5ZXJzLCBkb250IHNlbmQgdGhlIGhlYXJ0YmVhdCBtZXNzYWdlc1xuICAgIC8vIGlmIChjb25uZWN0ZWRQbGF5ZXJzLnBsYXllcnMubGVuZ3RoKSByZXR1cm5cblxuICAgIC8vIGlmICghc3RhdGVJbml0aWFsaXplZCAmJiBwbGF5ZXJTY2VuZUVudGl0eSkge1xuICAgIC8vICAgLy8gU2VuZCB0aGlzIGRhdGEgdG8gYWxsIHRoZSBwbGF5ZXJzIGNvbm5lY3RlZCAobmV3IGFuZCBvbGQpXG4gICAgLy8gICAvLyBTbyBldmVyeW9uZSBjYW4gZGVjaWRlIGlmIGl0J3MgdGhlIG9sZGVzdCBvbmUgb3Igbm8uXG4gICAgLy8gICAvLyBJdCdzIGZvciB0aGUgY2FzZSB0aGF0IG11bHRpcGxlIHVzZXJzIGVudGVycyB+IGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgLy8gICBQbGF5ZXJzSW5TY2VuZS5nZXRNdXRhYmxlKHBsYXllclNjZW5lRW50aXR5KVxuICAgIC8vIH1cbiAgfVxuICB2b2lkIGVudGVyU2NlbmUoKVxufVxuIl19
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQTtBQUtuRiw4REFBOEQ7QUFDOUQsTUFBTSxVQUFVLFlBQVksQ0FDMUIsU0FBbUIsRUFDbkIsV0FBd0U7SUFFeEUsS0FBSyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQ3JDLElBQUksSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNoQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1lBQzFCLE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN0RCxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtZQUMvQixTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtTQUMxQjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1NBQy9DO0lBQ0gsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW5naW5lSW5mbyBhcyBfRW5naW5lSW5mbywgTmV0d29ya0VudGl0eSBhcyBfTmV0d29ya0VudGl0eSB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgY29tcG9uZW50TnVtYmVyRnJvbU5hbWUgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMvY29tcG9uZW50LW51bWJlcidcblxuaW1wb3J0IHR5cGUgeyBHZXRVc2VyRGF0YVJlcXVlc3QsIEdldFVzZXJEYXRhUmVzcG9uc2UgfSBmcm9tICd+c3lzdGVtL1VzZXJJZGVudGl0eSdcbmltcG9ydCB7IElQcm9maWxlIH0gZnJvbSAnLi9tZXNzYWdlLWJ1cy1zeW5jJ1xuXG4vLyBSZXRyaWV2ZSB1c2VySWQgdG8gc3RhcnQgc2VuZGluZyB0aGlzIGluZm8gYXMgdGhlIG5ldHdvcmtJZFxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoUHJvZmlsZShcbiAgbXlQcm9maWxlOiBJUHJvZmlsZSxcbiAgZ2V0VXNlckRhdGE6ICh2YWx1ZTogR2V0VXNlckRhdGFSZXF1ZXN0KSA9PiBQcm9taXNlPEdldFVzZXJEYXRhUmVzcG9uc2U+XG4pIHtcbiAgdm9pZCBnZXRVc2VyRGF0YSh7fSkudGhlbigoeyBkYXRhIH0pID0+IHtcbiAgICBpZiAoZGF0YT8udXNlcklkKSB7XG4gICAgICBjb25zdCB1c2VySWQgPSBkYXRhLnVzZXJJZFxuICAgICAgY29uc3QgbmV0d29ya0lkID0gY29tcG9uZW50TnVtYmVyRnJvbU5hbWUoZGF0YS51c2VySWQpXG4gICAgICBteVByb2ZpbGUubmV0d29ya0lkID0gbmV0d29ya0lkXG4gICAgICBteVByb2ZpbGUudXNlcklkID0gdXNlcklkXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmV0Y2ggcHJvZmlsZSBkYXRhYClcbiAgICB9XG4gIH0pXG59XG4iXX0=
|
package/package.json
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
{
|
2
2
|
"name": "@dcl/sdk",
|
3
3
|
"description": "",
|
4
|
-
"version": "7.5.8-
|
4
|
+
"version": "7.5.8-11020113946.commit-53f6ae5",
|
5
5
|
"author": "Decentraland",
|
6
6
|
"dependencies": {
|
7
|
-
"@dcl/ecs": "7.5.8-
|
7
|
+
"@dcl/ecs": "7.5.8-11020113946.commit-53f6ae5",
|
8
8
|
"@dcl/ecs-math": "2.0.2",
|
9
9
|
"@dcl/explorer": "1.0.164509-20240802172549.commit-fb95b9b",
|
10
|
-
"@dcl/js-runtime": "7.5.8-
|
11
|
-
"@dcl/react-ecs": "7.5.8-
|
12
|
-
"@dcl/sdk-commands": "7.5.8-
|
10
|
+
"@dcl/js-runtime": "7.5.8-11020113946.commit-53f6ae5",
|
11
|
+
"@dcl/react-ecs": "7.5.8-11020113946.commit-53f6ae5",
|
12
|
+
"@dcl/sdk-commands": "7.5.8-11020113946.commit-53f6ae5",
|
13
13
|
"text-encoding": "0.7.0"
|
14
14
|
},
|
15
15
|
"keywords": [],
|
@@ -35,5 +35,5 @@
|
|
35
35
|
},
|
36
36
|
"types": "./index.d.ts",
|
37
37
|
"typings": "./index.d.ts",
|
38
|
-
"commit": "
|
38
|
+
"commit": "53f6ae5fc2241d00eb0b1e8251cf611e7e8f2efd"
|
39
39
|
}
|
package/players/index.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
import { Entity, TransformType } from '@dcl/ecs';
|
1
|
+
import { Entity, IEngine, TransformType } from '@dcl/ecs';
|
2
2
|
import { PBAvatarBase, PBAvatarEquippedData } from '@dcl/ecs/dist/components';
|
3
3
|
type GetPlayerDataReq = {
|
4
4
|
userId: string;
|
@@ -13,6 +13,14 @@ type GetPlayerDataRes = {
|
|
13
13
|
emotes: PBAvatarEquippedData['emoteUrns'];
|
14
14
|
position: TransformType['position'] | undefined;
|
15
15
|
};
|
16
|
+
export declare function definePlayerHelper(engine: IEngine): {
|
17
|
+
onEnterScene(cb: (player: GetPlayerDataRes) => void): void;
|
18
|
+
onLeaveScene(cb: (userId: string) => void): void;
|
19
|
+
/**
|
20
|
+
* Returns the info of the player if it's in the scene.
|
21
|
+
*/
|
22
|
+
getPlayer(user?: GetPlayerDataReq): GetPlayerDataRes | null;
|
23
|
+
};
|
16
24
|
declare const players: {
|
17
25
|
onEnterScene(cb: (player: GetPlayerDataRes) => void): void;
|
18
26
|
onLeaveScene(cb: (userId: string) => void): void;
|
package/players/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
import { engine } from '@dcl/ecs';
|
2
2
|
import { PlayerIdentityData as definePlayerIdenityData, AvatarBase as defineAvatarBase, AvatarEquippedData as defineAvatarEquippedData, Transform as defineTransform } from '@dcl/ecs/dist/components';
|
3
|
-
function definePlayerHelper(engine) {
|
3
|
+
export function definePlayerHelper(engine) {
|
4
4
|
const Transform = defineTransform(engine);
|
5
5
|
const PlayerIdentityData = definePlayerIdenityData(engine);
|
6
6
|
const AvatarEquippedData = defineAvatarEquippedData(engine);
|
@@ -75,4 +75,4 @@ const players = definePlayerHelper(engine);
|
|
75
75
|
const { getPlayer, onEnterScene, onLeaveScene } = players;
|
76
76
|
export { getPlayer, onEnterScene, onLeaveScene };
|
77
77
|
export default players;
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGxheWVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtDLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRSxPQUFPLEVBQ0wsa0JBQWtCLElBQUksdUJBQXVCLEVBQzdDLFVBQVUsSUFBSSxnQkFBZ0IsRUFDOUIsa0JBQWtCLElBQUksd0JBQXdCLEVBRzlDLFNBQVMsSUFBSSxlQUFlLEVBQzdCLE1BQU0sMEJBQTBCLENBQUE7QUFnQmpDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFlO0lBQ2hELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFELE1BQU0sa0JBQWtCLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0QsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUE7SUFFaEQsTUFBTSxjQUFjLEdBQTJDLEVBQUUsQ0FBQTtJQUNqRSxNQUFNLGNBQWMsR0FBaUMsRUFBRSxDQUFBO0lBRXZELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ2xGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsSUFBSTtZQUFFLE9BQU07UUFFbEQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE9BQU8sRUFBRTtZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDL0IsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUU1Qyx3QkFBd0I7Z0JBQ3hCLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRTtvQkFDekIsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUUsQ0FBQyxDQUFDLENBQUE7aUJBQzdFO2dCQUVELHFDQUFxQztnQkFDckMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7d0JBQ2pFLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBRSxDQUFDLENBQUMsQ0FBQTt3QkFDL0QsY0FBYyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtxQkFDOUI7Z0JBQ0gsQ0FBQyxDQUFDLENBQUE7YUFDSDtTQUNGO0lBQ0gsQ0FBQyxDQUFDLENBQUE7SUFFRixPQUFPO1FBQ0wsWUFBWSxDQUFDLEVBQXNDO1lBQ2pELGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDekIsQ0FBQztRQUNELFlBQVksQ0FBQyxFQUE0QjtZQUN2QyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3pCLENBQUM7UUFDRDs7V0FFRztRQUNILFNBQVMsQ0FBQyxJQUF1QjtZQUMvQixTQUFTLFNBQVM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTTtvQkFBRSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUE7Z0JBQzdDLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLEVBQUU7b0JBQ3ZFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFO3dCQUNoQyxPQUFPLE1BQU0sQ0FBQTtxQkFDZDtpQkFDRjtnQkFDRCxPQUFPLFNBQVMsQ0FBQTtZQUNsQixDQUFDO1lBRUQsTUFBTSxVQUFVLEdBQUcsU0FBUyxFQUFFLENBQUE7WUFDOUIsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTyxJQUFJLENBQUE7WUFFNUIsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzNELE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUE7WUFDbkQsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRTlELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxhQUFhO2dCQUFFLE9BQU8sSUFBSSxDQUFBO1lBRTdELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0JBQzVCLE9BQU8sRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU87Z0JBQzlCLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxJQUFJLEVBQUU7Z0JBQ2pDLE1BQU0sRUFBRSxVQUFVLElBQUksU0FBUztnQkFDL0IsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLElBQUksRUFBRTtnQkFDNUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxTQUFTLElBQUksRUFBRTtnQkFDdEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUTthQUNwRCxDQUFBO1FBQ0gsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDMUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFBO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFBO0FBQ2hELGVBQWUsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBJRW5naW5lLCBUcmFuc2Zvcm1UeXBlLCBlbmdpbmUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7XG4gIFBsYXllcklkZW50aXR5RGF0YSBhcyBkZWZpbmVQbGF5ZXJJZGVuaXR5RGF0YSxcbiAgQXZhdGFyQmFzZSBhcyBkZWZpbmVBdmF0YXJCYXNlLFxuICBBdmF0YXJFcXVpcHBlZERhdGEgYXMgZGVmaW5lQXZhdGFyRXF1aXBwZWREYXRhLFxuICBQQkF2YXRhckJhc2UsXG4gIFBCQXZhdGFyRXF1aXBwZWREYXRhLFxuICBUcmFuc2Zvcm0gYXMgZGVmaW5lVHJhbnNmb3JtXG59IGZyb20gJ0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cydcblxudHlwZSBHZXRQbGF5ZXJEYXRhUmVxID0ge1xuICB1c2VySWQ6IHN0cmluZ1xufVxudHlwZSBHZXRQbGF5ZXJEYXRhUmVzID0ge1xuICBlbnRpdHk6IEVudGl0eVxuICBuYW1lOiBzdHJpbmdcbiAgaXNHdWVzdDogYm9vbGVhblxuICB1c2VySWQ6IHN0cmluZ1xuICBhdmF0YXI/OiBQQkF2YXRhckJhc2VcbiAgd2VhcmFibGVzOiBQQkF2YXRhckVxdWlwcGVkRGF0YVsnd2VhcmFibGVVcm5zJ11cbiAgZW1vdGVzOiBQQkF2YXRhckVxdWlwcGVkRGF0YVsnZW1vdGVVcm5zJ11cbiAgcG9zaXRpb246IFRyYW5zZm9ybVR5cGVbJ3Bvc2l0aW9uJ10gfCB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVBsYXllckhlbHBlcihlbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgVHJhbnNmb3JtID0gZGVmaW5lVHJhbnNmb3JtKGVuZ2luZSlcbiAgY29uc3QgUGxheWVySWRlbnRpdHlEYXRhID0gZGVmaW5lUGxheWVySWRlbml0eURhdGEoZW5naW5lKVxuICBjb25zdCBBdmF0YXJFcXVpcHBlZERhdGEgPSBkZWZpbmVBdmF0YXJFcXVpcHBlZERhdGEoZW5naW5lKVxuICBjb25zdCBBdmF0YXJCYXNlID0gZGVmaW5lQXZhdGFyQmFzZShlbmdpbmUpXG4gIGNvbnN0IHBsYXllckVudGl0aWVzID0gbmV3IE1hcDxFbnRpdHksIHN0cmluZz4oKVxuXG4gIGNvbnN0IG9uRW50ZXJTY2VuZUNiOiAoKHBsYXllcjogR2V0UGxheWVyRGF0YVJlcykgPT4gdm9pZClbXSA9IFtdXG4gIGNvbnN0IG9uTGVhdmVTY2VuZUNiOiAoKHVzZXJJZDogc3RyaW5nKSA9PiB2b2lkKVtdID0gW11cblxuICBlbmdpbmUuYWRkU3lzdGVtKCgpID0+IHtcbiAgICBjb25zdCBwbGF5ZXJzID0gQXJyYXkuZnJvbShlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSwgQXZhdGFyQmFzZSkpXG4gICAgaWYgKHBsYXllcnMubGVuZ3RoID09PSBwbGF5ZXJFbnRpdGllcy5zaXplKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgW2VudGl0eSwgaWRlbnRpdHldIG9mIHBsYXllcnMpIHtcbiAgICAgIGlmICghcGxheWVyRW50aXRpZXMuaGFzKGVudGl0eSkpIHtcbiAgICAgICAgcGxheWVyRW50aXRpZXMuc2V0KGVudGl0eSwgaWRlbnRpdHkuYWRkcmVzcylcblxuICAgICAgICAvLyBDYWxsIG9uRW50ZXIgY2FsbGJhY2tcbiAgICAgICAgaWYgKG9uRW50ZXJTY2VuZUNiLmxlbmd0aCkge1xuICAgICAgICAgIG9uRW50ZXJTY2VuZUNiLmZvckVhY2goKGNiKSA9PiBjYihnZXRQbGF5ZXIoeyB1c2VySWQ6IGlkZW50aXR5LmFkZHJlc3MgfSkhKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBjaGFuZ2VzL3JlbW92ZSBjYWxsYmFja3NcbiAgICAgICAgQXZhdGFyQmFzZS5vbkNoYW5nZShlbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUgJiYgb25MZWF2ZVNjZW5lQ2IubGVuZ3RoICYmIHBsYXllckVudGl0aWVzLmdldChlbnRpdHkpKSB7XG4gICAgICAgICAgICBvbkxlYXZlU2NlbmVDYi5mb3JFYWNoKChjYikgPT4gY2IocGxheWVyRW50aXRpZXMuZ2V0KGVudGl0eSkhKSlcbiAgICAgICAgICAgIHBsYXllckVudGl0aWVzLmRlbGV0ZShlbnRpdHkpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfSlcblxuICByZXR1cm4ge1xuICAgIG9uRW50ZXJTY2VuZShjYjogKHBsYXllcjogR2V0UGxheWVyRGF0YVJlcykgPT4gdm9pZCkge1xuICAgICAgb25FbnRlclNjZW5lQ2IucHVzaChjYilcbiAgICB9LFxuICAgIG9uTGVhdmVTY2VuZShjYjogKHVzZXJJZDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgICBvbkxlYXZlU2NlbmVDYi5wdXNoKGNiKVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5mbyBvZiB0aGUgcGxheWVyIGlmIGl0J3MgaW4gdGhlIHNjZW5lLlxuICAgICAqL1xuICAgIGdldFBsYXllcih1c2VyPzogR2V0UGxheWVyRGF0YVJlcSk6IEdldFBsYXllckRhdGFSZXMgfCBudWxsIHtcbiAgICAgIGZ1bmN0aW9uIGdldEVudGl0eSgpIHtcbiAgICAgICAgaWYgKCF1c2VyPy51c2VySWQpIHJldHVybiBlbmdpbmUuUGxheWVyRW50aXR5XG4gICAgICAgIGZvciAoY29uc3QgW2VudGl0eSwgZGF0YV0gb2YgZW5naW5lLmdldEVudGl0aWVzV2l0aChQbGF5ZXJJZGVudGl0eURhdGEpKSB7XG4gICAgICAgICAgaWYgKGRhdGEuYWRkcmVzcyA9PT0gdXNlci51c2VySWQpIHtcbiAgICAgICAgICAgIHJldHVybiBlbnRpdHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBjb25zdCB1c2VyRW50aXR5ID0gZ2V0RW50aXR5KClcbiAgICAgIGlmICghdXNlckVudGl0eSkgcmV0dXJuIG51bGxcblxuICAgICAgY29uc3QgcGxheWVyRGF0YSA9IFBsYXllcklkZW50aXR5RGF0YS5nZXRPck51bGwodXNlckVudGl0eSlcbiAgICAgIGNvbnN0IGF2YXRhckRhdGEgPSBBdmF0YXJCYXNlLmdldE9yTnVsbCh1c2VyRW50aXR5KVxuICAgICAgY29uc3Qgd2VhcmFibGVzRGF0YSA9IEF2YXRhckVxdWlwcGVkRGF0YS5nZXRPck51bGwodXNlckVudGl0eSlcblxuICAgICAgaWYgKCFwbGF5ZXJEYXRhICYmICFhdmF0YXJEYXRhICYmICF3ZWFyYWJsZXNEYXRhKSByZXR1cm4gbnVsbFxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBlbnRpdHk6IHVzZXJFbnRpdHksXG4gICAgICAgIG5hbWU6IGF2YXRhckRhdGE/Lm5hbWUgPz8gJycsXG4gICAgICAgIGlzR3Vlc3Q6ICEhcGxheWVyRGF0YT8uaXNHdWVzdCxcbiAgICAgICAgdXNlcklkOiBwbGF5ZXJEYXRhPy5hZGRyZXNzID8/ICcnLFxuICAgICAgICBhdmF0YXI6IGF2YXRhckRhdGEgPz8gdW5kZWZpbmVkLFxuICAgICAgICB3ZWFyYWJsZXM6IHdlYXJhYmxlc0RhdGE/LndlYXJhYmxlVXJucyA/PyBbXSxcbiAgICAgICAgZW1vdGVzOiB3ZWFyYWJsZXNEYXRhPy5lbW90ZVVybnMgPz8gW10sXG4gICAgICAgIHBvc2l0aW9uOiBUcmFuc2Zvcm0uZ2V0T3JOdWxsKHVzZXJFbnRpdHkpPy5wb3NpdGlvblxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBwbGF5ZXJzID0gZGVmaW5lUGxheWVySGVscGVyKGVuZ2luZSlcbmNvbnN0IHsgZ2V0UGxheWVyLCBvbkVudGVyU2NlbmUsIG9uTGVhdmVTY2VuZSB9ID0gcGxheWVyc1xuXG5leHBvcnQgeyBnZXRQbGF5ZXIsIG9uRW50ZXJTY2VuZSwgb25MZWF2ZVNjZW5lIH1cbmV4cG9ydCBkZWZhdWx0IHBsYXllcnNcbiJdfQ==
|
package/src/network/entities.ts
CHANGED
@@ -8,25 +8,10 @@ import {
|
|
8
8
|
SyncComponents as _SyncComponents,
|
9
9
|
INetowrkParent,
|
10
10
|
TransformComponent,
|
11
|
-
ISyncComponents
|
12
|
-
VideoEvent,
|
13
|
-
TweenState,
|
14
|
-
AudioEvent,
|
15
|
-
AudioSource,
|
16
|
-
EngineInfo,
|
17
|
-
GltfContainerLoadingState,
|
18
|
-
PointerEventsResult,
|
19
|
-
RaycastResult,
|
20
|
-
RealmInfo,
|
21
|
-
VideoPlayer,
|
22
|
-
UiDropdown,
|
23
|
-
UiDropdownResult,
|
24
|
-
UiInput,
|
25
|
-
UiInputResult,
|
26
|
-
UiText,
|
27
|
-
UiTransform
|
11
|
+
ISyncComponents
|
28
12
|
} from '@dcl/ecs'
|
29
13
|
import { IProfile } from './message-bus-sync'
|
14
|
+
import { NOT_SYNC_COMPONENTS } from './state'
|
30
15
|
|
31
16
|
export type SyncEntity = (entityId: Entity, componentIds: number[], entityEnumId?: number) => void
|
32
17
|
|
@@ -64,24 +49,6 @@ export function entityUtils(engine: IEngine, profile: IProfile) {
|
|
64
49
|
}
|
65
50
|
}
|
66
51
|
|
67
|
-
const NOT_SYNC_COMPONENTS = [
|
68
|
-
VideoEvent,
|
69
|
-
VideoPlayer,
|
70
|
-
TweenState,
|
71
|
-
AudioEvent,
|
72
|
-
AudioSource,
|
73
|
-
EngineInfo,
|
74
|
-
GltfContainerLoadingState,
|
75
|
-
PointerEventsResult,
|
76
|
-
RaycastResult,
|
77
|
-
RealmInfo,
|
78
|
-
UiDropdown,
|
79
|
-
UiDropdownResult,
|
80
|
-
UiInput,
|
81
|
-
UiInputResult,
|
82
|
-
UiTransform,
|
83
|
-
UiText
|
84
|
-
]
|
85
52
|
for (const component of NOT_SYNC_COMPONENTS) {
|
86
53
|
if (componentsIdsMutable.includes(component.componentId)) {
|
87
54
|
console.log(`⚠️ ${component.componentName} can't be sync through the network!`)
|
@@ -1,20 +1,14 @@
|
|
1
|
-
import { IEngine, Transport } from '@dcl/ecs'
|
2
|
-
import type
|
1
|
+
import { IEngine, Transport, RealmInfo } from '@dcl/ecs'
|
2
|
+
import { type SendBinaryRequest, type SendBinaryResponse } from '~system/CommunicationsController'
|
3
3
|
|
4
4
|
import { syncFilter } from './filter'
|
5
5
|
import { engineToCrdt } from './state'
|
6
|
-
import { BinaryMessageBus, CommsMessage } from './binary-message-bus'
|
7
|
-
import {
|
8
|
-
definePlayersInScene,
|
9
|
-
fetchProfile,
|
10
|
-
oldestUser as _oldestUser,
|
11
|
-
setInitialized,
|
12
|
-
stateInitialized,
|
13
|
-
stateInitializedChecker
|
14
|
-
} from './utils'
|
6
|
+
import { BinaryMessageBus, CommsMessage, decodeString, encodeString } from './binary-message-bus'
|
7
|
+
import { fetchProfile } from './utils'
|
15
8
|
import { entityUtils } from './entities'
|
16
9
|
import { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity'
|
17
|
-
|
10
|
+
import { definePlayerHelper } from '../players'
|
11
|
+
import { serializeCrdtMessages } from '../internal/transports/logger'
|
18
12
|
|
19
13
|
export type IProfile = { networkId: number; userId: string }
|
20
14
|
// user that we asked for the inital crdt state
|
@@ -23,7 +17,6 @@ export function addSyncTransport(
|
|
23
17
|
sendBinary: (msg: SendBinaryRequest) => Promise<SendBinaryResponse>,
|
24
18
|
getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>
|
25
19
|
) {
|
26
|
-
definePlayersInScene(engine)
|
27
20
|
// Profile Info
|
28
21
|
const myProfile: IProfile = {} as IProfile
|
29
22
|
fetchProfile(myProfile!, getUserData)
|
@@ -34,6 +27,7 @@ export function addSyncTransport(
|
|
34
27
|
// List of MessageBuss messsages to be sent on every frame to comms
|
35
28
|
const pendingMessageBusMessagesToSend: Uint8Array[] = []
|
36
29
|
const binaryMessageBus = BinaryMessageBus((message) => pendingMessageBusMessagesToSend.push(message))
|
30
|
+
|
37
31
|
function getMessagesToSend() {
|
38
32
|
const messages = [...pendingMessageBusMessagesToSend]
|
39
33
|
pendingMessageBusMessagesToSend.length = 0
|
@@ -57,33 +51,51 @@ export function addSyncTransport(
|
|
57
51
|
engine.addTransport(transport)
|
58
52
|
// End add sync transport
|
59
53
|
|
60
|
-
// Add state intialized checker
|
61
|
-
engine.addSystem(() => stateInitializedChecker(engine, myProfile, entityDefinitions.syncEntity))
|
62
|
-
|
63
|
-
// Request initial state
|
64
|
-
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array())
|
65
|
-
|
66
54
|
// If we dont have any state initialized, and recieve a state message.
|
67
55
|
binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => {
|
68
|
-
|
69
|
-
|
70
|
-
|
56
|
+
const { sender, data } = decodeCRDTState(value)
|
57
|
+
if (sender !== myProfile.userId) return
|
58
|
+
console.log('[Processing CRDT State]', data.byteLength)
|
59
|
+
transport.onmessage!(data)
|
60
|
+
})
|
61
|
+
|
62
|
+
binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, (_, userId) => {
|
63
|
+
binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, encodeCRDTState(userId, engineToCrdt(engine)))
|
64
|
+
})
|
65
|
+
|
66
|
+
const players = definePlayerHelper(engine)
|
67
|
+
|
68
|
+
let requestCrdtStateWhenConnected = false
|
69
|
+
|
70
|
+
players.onEnterScene((player) => {
|
71
|
+
if (player.userId === myProfile.userId && !requestCrdtStateWhenConnected) {
|
72
|
+
if (RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom) {
|
73
|
+
console.log('Requesting state')
|
74
|
+
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array())
|
75
|
+
} else {
|
76
|
+
console.log('Waiting to be conneted')
|
77
|
+
requestCrdtStateWhenConnected = true
|
78
|
+
}
|
71
79
|
}
|
72
80
|
})
|
73
81
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
82
|
+
RealmInfo.onChange(engine.RootEntity, (value) => {
|
83
|
+
if (value?.isConnectedSceneRoom && requestCrdtStateWhenConnected) {
|
84
|
+
console.log('Requesting state.')
|
85
|
+
requestCrdtStateWhenConnected = false
|
86
|
+
binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array())
|
87
|
+
}
|
88
|
+
})
|
89
|
+
|
90
|
+
players.onLeaveScene((userId) => {
|
91
|
+
if (userId === myProfile.userId) {
|
92
|
+
requestCrdtStateWhenConnected = false
|
81
93
|
}
|
82
94
|
})
|
83
95
|
|
84
96
|
// Process CRDT messages here
|
85
97
|
binaryMessageBus.on(CommsMessage.CRDT, (value) => {
|
86
|
-
|
98
|
+
console.log(Array.from(serializeCrdtMessages('[NetworkMessage]', value, engine)))
|
87
99
|
transport.onmessage!(value)
|
88
100
|
})
|
89
101
|
|
@@ -92,3 +104,36 @@ export function addSyncTransport(
|
|
92
104
|
myProfile
|
93
105
|
}
|
94
106
|
}
|
107
|
+
|
108
|
+
/**
|
109
|
+
* Messages Protocol Encoding
|
110
|
+
*
|
111
|
+
* CRDT: Plain Uint8Array
|
112
|
+
*
|
113
|
+
* CRDT_STATE_RES { sender: string, data: Uint8Array}
|
114
|
+
*/
|
115
|
+
function decodeCRDTState(data: Uint8Array) {
|
116
|
+
let offset = 0
|
117
|
+
const r = new Uint8Array(data)
|
118
|
+
const view = new DataView(r.buffer)
|
119
|
+
const senderLength = view.getUint8(offset)
|
120
|
+
offset += 1
|
121
|
+
const sender = decodeString(data.subarray(1, senderLength + 1))
|
122
|
+
offset += senderLength
|
123
|
+
const state = r.subarray(offset)
|
124
|
+
|
125
|
+
return { sender, data: state }
|
126
|
+
}
|
127
|
+
|
128
|
+
function encodeCRDTState(address: string, data: Uint8Array) {
|
129
|
+
// address to uint8array
|
130
|
+
const addressBuffer = encodeString(address)
|
131
|
+
const addressOffset = 1
|
132
|
+
const messageLength = addressOffset + addressBuffer.byteLength + data.byteLength
|
133
|
+
|
134
|
+
const serializedMessage = new Uint8Array(messageLength)
|
135
|
+
serializedMessage.set(new Uint8Array([addressBuffer.byteLength]), 0)
|
136
|
+
serializedMessage.set(addressBuffer, 1)
|
137
|
+
serializedMessage.set(data, addressBuffer.byteLength + 1)
|
138
|
+
return serializedMessage
|
139
|
+
}
|
package/src/network/state.ts
CHANGED
@@ -8,28 +8,58 @@ import {
|
|
8
8
|
PutNetworkComponentOperation,
|
9
9
|
SyncComponents as _SyncComponents,
|
10
10
|
NetworkEntity as _NetworkEntity,
|
11
|
-
|
12
|
-
|
11
|
+
INetowrkEntity,
|
12
|
+
VideoEvent,
|
13
|
+
AudioEvent,
|
14
|
+
AudioSource,
|
15
|
+
EngineInfo,
|
16
|
+
GltfContainerLoadingState,
|
17
|
+
PointerEventsResult,
|
18
|
+
RaycastResult,
|
19
|
+
RealmInfo,
|
20
|
+
TweenState,
|
21
|
+
UiDropdown,
|
22
|
+
UiDropdownResult,
|
23
|
+
UiInput,
|
24
|
+
UiInputResult,
|
25
|
+
UiText,
|
26
|
+
UiTransform,
|
27
|
+
VideoPlayer
|
13
28
|
} from '@dcl/ecs'
|
14
29
|
|
30
|
+
export const NOT_SYNC_COMPONENTS = [
|
31
|
+
VideoEvent,
|
32
|
+
VideoPlayer,
|
33
|
+
TweenState,
|
34
|
+
AudioEvent,
|
35
|
+
AudioSource,
|
36
|
+
EngineInfo,
|
37
|
+
GltfContainerLoadingState,
|
38
|
+
PointerEventsResult,
|
39
|
+
RaycastResult,
|
40
|
+
RealmInfo,
|
41
|
+
UiDropdown,
|
42
|
+
UiDropdownResult,
|
43
|
+
UiInput,
|
44
|
+
UiInputResult,
|
45
|
+
UiTransform,
|
46
|
+
UiText
|
47
|
+
]
|
48
|
+
|
49
|
+
const NOT_SYNC_COMPONENTS_IDS = NOT_SYNC_COMPONENTS.map(($) => $.componentId)
|
50
|
+
|
15
51
|
export function engineToCrdt(engine: IEngine): Uint8Array {
|
16
52
|
const crdtBuffer = new ReadWriteByteBuffer()
|
17
53
|
const networkBuffer = new ReadWriteByteBuffer()
|
18
|
-
const SyncComponents = engine.getComponent(_SyncComponents.componentId) as ISyncComponents
|
19
54
|
const NetworkEntity = engine.getComponent(_NetworkEntity.componentId) as INetowrkEntity
|
20
55
|
|
21
56
|
for (const itComponentDefinition of engine.componentsIter()) {
|
57
|
+
if (NOT_SYNC_COMPONENTS_IDS.includes(itComponentDefinition.componentId)) {
|
58
|
+
continue
|
59
|
+
}
|
22
60
|
itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
|
23
61
|
const isNetworkEntity = NetworkEntity.has(entity)
|
24
|
-
|
25
|
-
return false
|
26
|
-
}
|
27
|
-
const isDynamicEntity = NetworkEntity.get(entity).networkId
|
28
|
-
if (isDynamicEntity) {
|
29
|
-
return true
|
30
|
-
}
|
31
|
-
// For the static entities we only send the updates of the SyncComponents
|
32
|
-
return SyncComponents.get(entity).componentIds.includes(itComponentDefinition.componentId)
|
62
|
+
return isNetworkEntity
|
33
63
|
})
|
34
64
|
}
|
35
65
|
|
package/src/network/utils.ts
CHANGED
@@ -1,40 +1,9 @@
|
|
1
|
-
import {
|
2
|
-
EngineInfo as _EngineInfo,
|
3
|
-
Entity,
|
4
|
-
IEngine,
|
5
|
-
NetworkEntity as _NetworkEntity,
|
6
|
-
Schemas,
|
7
|
-
LastWriteWinElementSetComponentDefinition,
|
8
|
-
PBEngineInfo
|
9
|
-
} from '@dcl/ecs'
|
1
|
+
import { EngineInfo as _EngineInfo, NetworkEntity as _NetworkEntity } from '@dcl/ecs'
|
10
2
|
import { componentNumberFromName } from '@dcl/ecs/dist/components/component-number'
|
11
3
|
|
12
4
|
import type { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity'
|
13
|
-
import { SyncEntity } from './entities'
|
14
5
|
import { IProfile } from './message-bus-sync'
|
15
6
|
|
16
|
-
// Component to track all the players and when they enter to the scene.
|
17
|
-
// Know who is in charge of sending the initial state (oldest one)
|
18
|
-
export const definePlayersInScene = (engine: IEngine) =>
|
19
|
-
engine.defineComponent('players-scene', {
|
20
|
-
timestamp: Schemas.Number,
|
21
|
-
userId: Schemas.String
|
22
|
-
})
|
23
|
-
|
24
|
-
// Already initialized my state. Ignore new states messages.
|
25
|
-
export let stateInitialized = false
|
26
|
-
|
27
|
-
// My player entity to check if I'm the oldest player in the scend
|
28
|
-
export let playerSceneEntity: Entity
|
29
|
-
|
30
|
-
export function setInitialized() {
|
31
|
-
stateInitialized = true
|
32
|
-
}
|
33
|
-
|
34
|
-
// Flag to avoid sending over the wire all the initial messages that the engine add's to the rendererTransport
|
35
|
-
// INITIAL_CRDT_MESSAGES that are being processed on the onStart loop, before the onUpdate.
|
36
|
-
export let INITIAL_CRDT_RENDERER_MESSAGES_SENT = false
|
37
|
-
|
38
7
|
// Retrieve userId to start sending this info as the networkId
|
39
8
|
export function fetchProfile(
|
40
9
|
myProfile: IProfile,
|
@@ -51,95 +20,3 @@ export function fetchProfile(
|
|
51
20
|
}
|
52
21
|
})
|
53
22
|
}
|
54
|
-
|
55
|
-
/**
|
56
|
-
* Add's the user information about when he joined the scene.
|
57
|
-
* It's used to check who is the oldest one, to sync the state
|
58
|
-
*/
|
59
|
-
export function createPlayerTimestampData(engine: IEngine, profile: IProfile, syncEntity: SyncEntity) {
|
60
|
-
if (!profile?.userId) return undefined
|
61
|
-
const PlayersInScene = definePlayersInScene(engine)
|
62
|
-
const entity = engine.addEntity()
|
63
|
-
PlayersInScene.create(entity, { timestamp: Date.now(), userId: profile.userId })
|
64
|
-
syncEntity(entity, [PlayersInScene.componentId])
|
65
|
-
playerSceneEntity = entity
|
66
|
-
return playerSceneEntity
|
67
|
-
}
|
68
|
-
|
69
|
-
/**
|
70
|
-
* Check if I'm the older user to send the initial state
|
71
|
-
*/
|
72
|
-
export function oldestUser(engine: IEngine, profile: IProfile, syncEntity: SyncEntity): boolean {
|
73
|
-
const PlayersInScene = definePlayersInScene(engine)
|
74
|
-
// When the user leaves the scene but it's still connected.
|
75
|
-
if (!PlayersInScene.has(playerSceneEntity)) {
|
76
|
-
createPlayerTimestampData(engine, profile, syncEntity)
|
77
|
-
return oldestUser(engine, profile, syncEntity)
|
78
|
-
}
|
79
|
-
const { timestamp } = PlayersInScene.get(playerSceneEntity)
|
80
|
-
for (const [_, player] of engine.getEntitiesWith(PlayersInScene)) {
|
81
|
-
if (player.timestamp < timestamp) return false
|
82
|
-
}
|
83
|
-
return true
|
84
|
-
}
|
85
|
-
|
86
|
-
/**
|
87
|
-
* Ignore CRDT's initial messages from the renderer.
|
88
|
-
*/
|
89
|
-
export function syncTransportIsReady(engine: IEngine) {
|
90
|
-
const EngineInfo = engine.getComponent(
|
91
|
-
_EngineInfo.componentId
|
92
|
-
) as LastWriteWinElementSetComponentDefinition<PBEngineInfo>
|
93
|
-
if (!INITIAL_CRDT_RENDERER_MESSAGES_SENT) {
|
94
|
-
const engineInfo = EngineInfo.getOrNull(engine.RootEntity)
|
95
|
-
if (engineInfo && engineInfo.tickNumber > 1) {
|
96
|
-
INITIAL_CRDT_RENDERER_MESSAGES_SENT = true
|
97
|
-
}
|
98
|
-
}
|
99
|
-
return INITIAL_CRDT_RENDERER_MESSAGES_SENT
|
100
|
-
}
|
101
|
-
|
102
|
-
/**
|
103
|
-
* Check if we are already initialized
|
104
|
-
* Add the playerSceneData component and syncronize it till we receive the state.
|
105
|
-
* This fn should be added as a system so it runs on every tick
|
106
|
-
*/
|
107
|
-
// TODO: Had to comment all the logic because getConnectedPlayers was not working as expected
|
108
|
-
// A lot of raise conditions. For now we will go with the approach that every client that it's initialized will send his crdt state.
|
109
|
-
export function stateInitializedChecker(engine: IEngine, _profile: IProfile, _syncEntity: SyncEntity) {
|
110
|
-
// const PlayersInScene = definePlayersInScene(engine)
|
111
|
-
const EngineInfo = engine.getComponent(_EngineInfo.componentId) as typeof _EngineInfo
|
112
|
-
// const NetworkEntity = engine.getComponent(_NetworkEntity.componentId) as INetowrkEntity
|
113
|
-
async function enterScene() {
|
114
|
-
// if (!playerSceneEntity) {
|
115
|
-
// createPlayerTimestampData(engine, profile, syncEntity)
|
116
|
-
// }
|
117
|
-
|
118
|
-
/**
|
119
|
-
* Keeps PlayersInScene up-to-date with the current players.
|
120
|
-
*/
|
121
|
-
// const connectedPlayers = await getConnectedPlayers({})
|
122
|
-
// for (const [entity, player] of engine.getEntitiesWith(PlayersInScene)) {
|
123
|
-
// if (!connectedPlayers.players.find(($) => $.userId === player.userId)) {
|
124
|
-
// PlayersInScene.deleteFrom(entity)
|
125
|
-
// }
|
126
|
-
// }
|
127
|
-
|
128
|
-
// Wait for comms to be ready ?? ~3000ms
|
129
|
-
if ((EngineInfo.getOrNull(engine.RootEntity)?.tickNumber ?? 0) > 100) {
|
130
|
-
setInitialized()
|
131
|
-
return
|
132
|
-
}
|
133
|
-
|
134
|
-
// If we already have data from players, dont send the heartbeat messages
|
135
|
-
// if (connectedPlayers.players.length) return
|
136
|
-
|
137
|
-
// if (!stateInitialized && playerSceneEntity) {
|
138
|
-
// // Send this data to all the players connected (new and old)
|
139
|
-
// // So everyone can decide if it's the oldest one or no.
|
140
|
-
// // It's for the case that multiple users enters ~ at the same time.
|
141
|
-
// PlayersInScene.getMutable(playerSceneEntity)
|
142
|
-
// }
|
143
|
-
}
|
144
|
-
void enterScene()
|
145
|
-
}
|
package/src/players/index.ts
CHANGED
@@ -22,7 +22,7 @@ type GetPlayerDataRes = {
|
|
22
22
|
position: TransformType['position'] | undefined
|
23
23
|
}
|
24
24
|
|
25
|
-
function definePlayerHelper(engine: IEngine) {
|
25
|
+
export function definePlayerHelper(engine: IEngine) {
|
26
26
|
const Transform = defineTransform(engine)
|
27
27
|
const PlayerIdentityData = definePlayerIdenityData(engine)
|
28
28
|
const AvatarEquippedData = defineAvatarEquippedData(engine)
|
package/src/testing/runtime.ts
CHANGED
@@ -50,7 +50,7 @@ export function createTestRuntime(testingModule: TestingModule, engine: IEngine)
|
|
50
50
|
// continue to run until it reaches a yield point
|
51
51
|
function scheduleValue(value: any, env: RunnerEnvironment) {
|
52
52
|
if (value && typeof value === 'object' && typeof value.then === 'function') {
|
53
|
-
|
53
|
+
console.log('⏱️ yield promise')
|
54
54
|
// if the value is a promise, schedule it to be awaited after the current frame is finished
|
55
55
|
nextTickFuture.push(async () => {
|
56
56
|
try {
|
@@ -60,14 +60,14 @@ export function createTestRuntime(testingModule: TestingModule, engine: IEngine)
|
|
60
60
|
}
|
61
61
|
})
|
62
62
|
} else if (typeof value === 'function') {
|
63
|
-
|
63
|
+
console.log('⏱️ yield function')
|
64
64
|
// if the value is a function, schedule it to be called on the next frame
|
65
65
|
nextTickFuture.push(() => {
|
66
66
|
scheduleValue(value(), env)
|
67
67
|
})
|
68
68
|
return
|
69
69
|
} else if (typeof value === 'undefined' || value === null) {
|
70
|
-
|
70
|
+
console.log('⏱️ yield')
|
71
71
|
// if the value is undefined or null, continue processing the generator the next frame
|
72
72
|
nextTickFuture.push(() => {
|
73
73
|
consumeGenerator(env)
|
package/testing/runtime.js
CHANGED
@@ -33,7 +33,7 @@ export function createTestRuntime(testingModule, engine) {
|
|
33
33
|
// continue to run until it reaches a yield point
|
34
34
|
function scheduleValue(value, env) {
|
35
35
|
if (value && typeof value === 'object' && typeof value.then === 'function') {
|
36
|
-
|
36
|
+
console.log('⏱️ yield promise');
|
37
37
|
// if the value is a promise, schedule it to be awaited after the current frame is finished
|
38
38
|
nextTickFuture.push(async () => {
|
39
39
|
try {
|
@@ -45,7 +45,7 @@ export function createTestRuntime(testingModule, engine) {
|
|
45
45
|
});
|
46
46
|
}
|
47
47
|
else if (typeof value === 'function') {
|
48
|
-
|
48
|
+
console.log('⏱️ yield function');
|
49
49
|
// if the value is a function, schedule it to be called on the next frame
|
50
50
|
nextTickFuture.push(() => {
|
51
51
|
scheduleValue(value(), env);
|
@@ -53,7 +53,7 @@ export function createTestRuntime(testingModule, engine) {
|
|
53
53
|
return;
|
54
54
|
}
|
55
55
|
else if (typeof value === 'undefined' || value === null) {
|
56
|
-
|
56
|
+
console.log('⏱️ yield');
|
57
57
|
// if the value is undefined or null, continue processing the generator the next frame
|
58
58
|
nextTickFuture.push(() => {
|
59
59
|
consumeGenerator(env);
|
@@ -194,4 +194,4 @@ function globalFail(error) {
|
|
194
194
|
// for now, the failure is only writing to the console.error.
|
195
195
|
console.error(error);
|
196
196
|
}
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0aW5nL3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQVcsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHdkMsaUZBQWlGO0FBQ2pGLG9JQUFvSTtBQUNwSSxnRkFBZ0Y7QUFDaEYsZUFBZTtBQUNmLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxhQUE0QixFQUFFLE1BQWU7SUFTN0Usc0RBQXNEO0lBQ3RELElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQTtJQUV6QixJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtJQUMzQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtJQUV4QixvQ0FBb0M7SUFDcEMsTUFBTSxjQUFjLEdBQW9CLEVBQUUsQ0FBQTtJQUUxQyxpR0FBaUc7SUFDakcsTUFBTSxjQUFjLEdBQWdDLEVBQUUsQ0FBQTtJQUV0RCxrRUFBa0U7SUFDbEUsS0FBSyxVQUFVLFFBQVE7UUFDckIsT0FBTyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3JDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUywrQkFBK0IsQ0FBQyxFQUFFO1FBQzFELG1CQUFtQixFQUFFLENBQUE7UUFDckIsZ0JBQWdCLElBQUksRUFBRSxDQUFBO1FBQ3RCLGdDQUFnQztRQUNoQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJ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XG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGNyZWF0ZVRlc3RSdW50aW1lIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIHRlc3QgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZWZpbmUgdGVzdHMuXG4gKi9cblxuaW1wb3J0IHsgSUVuZ2luZSwgVHJhbnNmb3JtIH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBhc3NlcnRFcXVhbHMgfSBmcm9tICcuL2Fzc2VydCdcbmltcG9ydCB0eXBlIHsgVGVzdGluZ01vZHVsZSwgVGVzdEZ1bmN0aW9uLCBUZXN0SGVscGVycyB9IGZyb20gJy4vdHlwZXMnXG5cbi8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHRlc3QgcnVudGltZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbmQgcnVuIHRlc3RzLlxuLy8gSXQgdGFrZXMgYSBgVGVzdGluZ01vZHVsZWAgaW5zdGFuY2UgKGxvYWRlZCBmcm9tIHJlcXVpcmUoJ35zeXN0ZW0vVGVzdGluZycpKSBhbmQgYW4gYElFbmdpbmVgIGluc3RhbmNlIChmcm9tIERlY2VudHJhbGFuZCdzIFNESykuXG4vLyBJdCByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgYHRlc3RgIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRlc3RzLlxuLyogQF9fUFVSRV9fICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGVzdFJ1bnRpbWUodGVzdGluZ01vZHVsZTogVGVzdGluZ01vZHVsZSwgZW5naW5lOiBJRW5naW5lKSB7XG4gIHR5cGUgVGVzdFBsYW5FbnRyeSA9IHsgbmFtZTogc3RyaW5nOyBmbjogVGVzdEZ1bmN0aW9uIH1cbiAgdHlwZSBSdW5uZXJFbnZpcm9ubWVudCA9IHtcbiAgICByZXNvbHZlOiAoKSA9PiB2b2lkXG4gICAgcmVqZWN0OiAoZXJyb3I6IGFueSkgPT4gdm9pZFxuICAgIGhlbHBlcnM6IFRlc3RIZWxwZXJzXG4gICAgZ2VuZXJhdG9yOiBHZW5lcmF0b3JcbiAgfVxuXG4gIC8vIHRoaXMgZmxhZyBlbnN1cmVzIG5vIHRlc3RzIGFyZSBhZGRlZCBhc3luY2hyb25vdXNseVxuICBsZXQgcnVudGltZUZyb3plbiA9IGZhbHNlXG5cbiAgbGV0IGN1cnJlbnRGcmFtZUNvdW50ZXIgPSAwXG4gIGxldCBjdXJyZW50RnJhbWVUaW1lID0gMFxuXG4gIC8vIGFycmF5IHRvIGhvbGQgdGhlIHNjaGVkdWxlZCB0ZXN0c1xuICBjb25zdCBzY2hlZHVsZWRUZXN0czogVGVzdFBsYW5FbnRyeVtdID0gW11cblxuICAvLyBhbiBhcnJheSBvZiBwcm9taXNlcyB0aGF0IGFyZSByZXNvbHZlZCBvbiB0aGUgbmV4dCBmcmFtZSAoYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUgaXMgZmluaXNoZWQpXG4gIGNvbnN0IG5leHRUaWNrRnV0dXJlOiBBcnJheTwoZHQ6IG51bWJlcikgPT4gdm9pZD4gPSBbXVxuXG4gIC8vIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbiB0aGUgbmV4dCBmcmFtZVxuICBhc3luYyBmdW5jdGlvbiBuZXh0VGljaygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8bnVtYmVyPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbmV4dFRpY2tGdXR1cmUucHVzaChyZXNvbHZlKVxuICAgIH0pXG4gIH1cblxuICAvLyBhZGQgYSBzeXN0ZW0gdG8gdGhlIGVuZ2luZSB0aGF0IHJlc29sdmVzIGFsbCBwcm9taXNlcyBpbiB0aGUgYG5leHRUaWNrRnV0dXJlYCBhcnJheVxuICBlbmdpbmUuYWRkU3lzdGVtKGZ1bmN0aW9uIFRlc3RpbmdGcmFtZXdvcmtDb3JvdXRpbmVSdW5uZXIoZHQpIHtcbiAgICBjdXJyZW50RnJhbWVDb3VudGVyKytcbiAgICBjdXJyZW50RnJhbWVUaW1lICs9IGR0XG4gICAgLy8gcmVzb2x2ZSBhbGwgbmV4dFRpY2sgZnV0dXJlcy5cbiAgICBuZXh0VGlja0Z1dHVyZS5zcGxpY2UoMCwgbmV4dFRpY2tGdXR1cmUubGVuZ3RoKS5mb3JFYWNoKChfKSA9PiBfKGR0KSlcbiAgfSlcblxuICAvLyB0aGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIHZhbHVlIHRvIGJlIHByb2Nlc3NlZCBvbiB0aGUgbmV4dCBmcmFtZSwgdGhlIHRlc3QgcnVubmVyIHdpbGxcbiAgLy8gY29udGludWUgdG8gcnVuIHVudGlsIGl0IHJlYWNoZXMgYSB5aWVsZCBwb2ludFxuICBmdW5jdGlvbiBzY2hlZHVsZVZhbHVlKHZhbHVlOiBhbnksIGVudjogUnVubmVyRW52aXJvbm1lbnQpIHtcbiAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gY29uc29sZS5sb2coJ+KPse+4jyB5aWVsZCBwcm9taXNlJylcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIHByb21pc2UsIHNjaGVkdWxlIGl0IHRvIGJlIGF3YWl0ZWQgYWZ0ZXIgdGhlIGN1cnJlbnQgZnJhbWUgaXMgZmluaXNoZWRcbiAgICAgIG5leHRUaWNrRnV0dXJlLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNjaGVkdWxlVmFsdWUoYXdhaXQgdmFsdWUsIGVudilcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgZW52LnJlamVjdChlcnIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCfij7HvuI8geWllbGQgZnVuY3Rpb24nKVxuICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIGEgZnVuY3Rpb24sIHNjaGVkdWxlIGl0IHRvIGJlIGNhbGxlZCBvbiB0aGUgbmV4dCBmcmFtZVxuICAgICAgbmV4dFRpY2tGdXR1cmUucHVzaCgoKSA9PiB7XG4gICAgICAgIHNjaGVkdWxlVmFsdWUodmFsdWUoKSwgZW52KVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgLy8gY29uc29sZS5sb2coJ+KPse+4jyB5aWVsZCcpXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgdW5kZWZpbmVkIG9yIG51bGwsIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIGdlbmVyYXRvciB0aGUgbmV4dCBmcmFtZVxuICAgICAgbmV4dFRpY2tGdXR1cmUucHVzaCgoKSA9PiB7XG4gICAgICAgIGNvbnN1bWVHZW5lcmF0b3IoZW52KVxuICAgICAgfSlcbiAgICB9IGVsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZhbHVlIGZyb20gdGVzdCBnZW5lcmF0b3I6ICR7dmFsdWV9YClcbiAgfVxuXG4gIC8vIHRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGJ5IHNjaGVkdWxpbmcgaXRzIHZhbHVlcyB0byBiZSBwcm9jZXNzZWQgb24gdGhlIG5leHQgZnJhbWVcbiAgZnVuY3Rpb24gY29uc3VtZUdlbmVyYXRvcihlbnY6IFJ1bm5lckVudmlyb25tZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJldCA9IGVudi5nZW5lcmF0b3IubmV4dCgpXG4gICAgICBpZiAoIXJldC5kb25lKSB7XG4gICAgICAgIHNjaGVkdWxlVmFsdWUocmV0LnZhbHVlLCBlbnYpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnYucmVzb2x2ZSgpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlbnYucmVqZWN0KGVycilcbiAgICB9XG4gIH1cblxuICAvLyB0aGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIHRlc3QgcnVuIG9uIHRoZSBuZXh0IGZyYW1lXG4gIGZ1bmN0aW9uIHNjaGVkdWxlTmV4dFJ1bigpIHtcbiAgICBpZiAoc2NoZWR1bGVkVGVzdHMubGVuZ3RoKSB7XG4gICAgICBuZXh0VGlja0Z1dHVyZS5wdXNoKHJ1blRlc3RzKVxuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMgZnVuY3Rpb24gcnVucyB0aGUgc2NoZWR1bGVkIHRlc3RzXG4gIGZ1bmN0aW9uIHJ1blRlc3RzKCkge1xuICAgIGlmIChzY2hlZHVsZWRUZXN0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gc2NoZWR1bGVkVGVzdHMuc2hpZnQoKSFcbiAgICAgIGNvbnN0IGluaXRpYWxGcmFtZSA9IGN1cnJlbnRGcmFtZUNvdW50ZXJcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGN1cnJlbnRGcmFtZVRpbWVcblxuICAgICAgbGV0IHJlc29sdmVkID0gZmFsc2VcblxuICAgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIG9ubHkgb25jZS4gaXQgbWFrZXMgdGhlIGN1cnJlbnQgdGVzdCBwYXNzXG4gICAgICBjb25zdCByZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICBpZiAocmVzb2x2ZWQpIHRocm93IG5ldyBFcnJvcigncmVzb2x2ZWQgdHdpY2UnKVxuICAgICAgICByZXNvbHZlZCA9IHRydWVcblxuICAgICAgICBjb25zb2xlLmxvZyhg8J+foiBUZXN0IHBhc3NlZCAke2VudHJ5Lm5hbWV9YClcblxuICAgICAgICB0ZXN0aW5nTW9kdWxlXG4gICAgICAgICAgLmxvZ1Rlc3RSZXN1bHQoe1xuICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgIG9rOiB0cnVlLFxuICAgICAgICAgICAgdG90YWxGcmFtZXM6IGN1cnJlbnRGcmFtZUNvdW50ZXIgLSBpbml0aWFsRnJhbWUsXG4gICAgICAgICAgICB0b3RhbFRpbWU6IGN1cnJlbnRGcmFtZVRpbWUgLSBzdGFydFRpbWVcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maW5hbGx5KHNjaGVkdWxlTmV4dFJ1bilcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVqZWN0ID0gKGVycjogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXNvbHZlZCkgdGhyb3cgbmV3IEVycm9yKCdyZXNvbHZlZCB0d2ljZScpXG4gICAgICAgIHJlc29sdmVkID0gdHJ1ZVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGDwn5S0IFRlc3QgZmFpbGVkICR7ZW50cnkubmFtZX1gKVxuICAgICAgICBjb25zb2xlLmVycm9yKGVycilcblxuICAgICAgICB0ZXN0aW5nTW9kdWxlXG4gICAgICAgICAgLmxvZ1Rlc3RSZXN1bHQoe1xuICAgICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICAgIG9rOiBmYWxzZSxcbiAgICAgICAgICAgIGVycm9yOiBlcnIudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHN0YWNrOiBlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgZXJyLnN0YWNrLFxuICAgICAgICAgICAgdG90YWxGcmFtZXM6IGN1cnJlbnRGcmFtZUNvdW50ZXIgLSBpbml0aWFsRnJhbWUsXG4gICAgICAgICAgICB0b3RhbFRpbWU6IGN1cnJlbnRGcmFtZVRpbWUgLSBzdGFydFRpbWVcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maW5hbGx5KHNjaGVkdWxlTmV4dFJ1bilcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5sb2coYPCfp6ogUnVubmluZyB0ZXN0ICR7ZW50cnkubmFtZX1gKVxuXG4gICAgICAgIGNvbnN0IHRlc3RIZWxwZXJzOiBUZXN0SGVscGVycyA9IHtcbiAgICAgICAgICBhc3luYyBzZXRDYW1lcmFUcmFuc2Zvcm0odHJhbnNmb3JtKSB7XG4gICAgICAgICAgICBhd2FpdCB0ZXN0aW5nTW9kdWxlLnNldENhbWVyYVRyYW5zZm9ybSh0cmFuc2Zvcm0pXG4gICAgICAgICAgICBhd2FpdCBuZXh0VGljaygpXG5cbiAgICAgICAgICAgIGNvbnN0IFRyYW5zZm9ybUNvbXBvbmVudCA9IGVuZ2luZS5nZXRDb21wb25lbnQoVHJhbnNmb3JtLmNvbXBvbmVudElkKSBhcyB0eXBlb2YgVHJhbnNmb3JtXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Db21wb25lbnQuZ2V0KGVuZ2luZS5DYW1lcmFFbnRpdHkpXG5cbiAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxUcmFuc2Zvcm0ucG9zaXRpb24sIHRyYW5zZm9ybS5wb3NpdGlvbiwgXCJwb3NpdGlvbnMgZG9uJ3QgbWF0Y2hcIilcbiAgICAgICAgICAgIGFzc2VydEVxdWFscyhhY3R1YWxUcmFuc2Zvcm0ucm90YXRpb24sIHRyYW5zZm9ybS5yb3RhdGlvbiwgXCJyb3RhdGlvbnMgZG9uJ3QgbWF0Y2hcIilcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGVudHJ5LmZuKHRlc3RIZWxwZXJzKVxuXG4gICAgICAgIGlmIChyZXR1cm5WYWx1ZSAmJiB0eXBlb2YgcmV0dXJuVmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKGlzR2VuZXJhdG9yKHJldHVyblZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgZW52OiBSdW5uZXJFbnZpcm9ubWVudCA9IHtcbiAgICAgICAgICAgICAgZ2VuZXJhdG9yOiByZXR1cm5WYWx1ZSxcbiAgICAgICAgICAgICAgaGVscGVyczogdGVzdEhlbHBlcnMsXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3VtZUdlbmVyYXRvcihlbnYpXG4gICAgICAgICAgfSBlbHNlIGlmIChpc1Byb21pc2UocmV0dXJuVmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZS50aGVuKHJlc29sdmUpLmNhdGNoKHJlamVjdClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHRlc3QgcmVzdWx0IHR5cGU6ICR7cmV0dXJuVmFsdWV9YClcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIHJlamVjdChlcnIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gc2NoZWR1bGUgdGhlIHRlc3QgcnVubmVyIHN0YXJ0IGZvciB0aGUgbmV4dCBmcmFtZVxuICBuZXh0VGlja0Z1dHVyZS5wdXNoKCgpID0+IHtcbiAgICAvLyBvbmNlIHdlIHJ1biB0aGUgbmV4dCB0aWNrLCB0aGUgdGVzdCBydW50aW1lIGJlY29tZXMgZnJvemVuLiB0aGF0IG1lYW5zIG5vIG5ld1xuICAgIC8vIHRlc3QgZGVmaW5pdGlvbnMgYXJlIGFjY2VwdGVkXG4gICAgcnVudGltZUZyb3plbiA9IHRydWVcblxuICAgIGlmICghc2NoZWR1bGVkVGVzdHMubGVuZ3RoKSByZXR1cm5cblxuICAgIC8vIGluZm9ybSB0aGUgdGVzdCBydW5uZXIgYWJvdXQgdGhlIHBsYW5zIGZvciB0aGlzIHRlc3QgcnVuXG4gICAgdGVzdGluZ01vZHVsZS5wbGFuKHsgdGVzdHM6IHNjaGVkdWxlZFRlc3RzIH0pLnRoZW4oc2NoZWR1bGVOZXh0UnVuKS5jYXRjaChnbG9iYWxGYWlsKVxuICB9KVxuXG4gIC8vIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBwbGFuIGEgdGVzdCBmdW5jdGlvbm5cbiAgLyogQF9fUFVSRV9fICovXG4gIGZ1bmN0aW9uIHRlc3QobmFtZTogc3RyaW5nLCBmbjogVGVzdEZ1bmN0aW9uKSB7XG4gICAgaWYgKHJ1bnRpbWVGcm96ZW4pIHRocm93IG5ldyBFcnJvcihcIk5ldyB0ZXN0cyBjYW4ndCBiZSBhZGRlZCBhdCB0aGlzIHN0YWdlLlwiKVxuXG4gICAgaWYgKHNjaGVkdWxlZFRlc3RzLnNvbWUoKCQpID0+ICQubmFtZSA9PT0gbmFtZSkpIHRocm93IG5ldyBFcnJvcihgVGVzdCB3aXRoIG5hbWUgJHtuYW1lfSBhbHJlYWR5IGV4aXN0c2ApXG5cbiAgICBzY2hlZHVsZWRUZXN0cy5wdXNoKHsgZm4sIG5hbWUgfSlcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGVzdFxuICB9XG59XG5cbmZ1bmN0aW9uIGlzR2VuZXJhdG9yKHQ6IGFueSk6IHQgaXMgR2VuZXJhdG9yIHtcbiAgcmV0dXJuIHQgJiYgdHlwZW9mIHQgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0W1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbidcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlKHQ6IGFueSk6IHQgaXMgUHJvbWlzZTx1bmtub3duPiB7XG4gIHJldHVybiB0ICYmIHR5cGVvZiB0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdC50aGVuID09PSAnZnVuY3Rpb24nXG59XG5cbmZ1bmN0aW9uIGdsb2JhbEZhaWwoZXJyb3I6IGFueSkge1xuICAvLyBmb3Igbm93LCB0aGUgZmFpbHVyZSBpcyBvbmx5IHdyaXRpbmcgdG8gdGhlIGNvbnNvbGUuZXJyb3IuXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3IpXG59XG4iXX0=
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90ZXN0aW5nL3J1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxPQUFPLEVBQVcsU0FBUyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFHdkMsaUZBQWlGO0FBQ2pGLG9JQUFvSTtBQUNwSSxnRkFBZ0Y7QUFDaEYsZUFBZTtBQUNmLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxhQUE0QixFQUFFLE1BQWU7SUFTN0Usc0RBQXNEO0lBQ3RELElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQTtJQUV6QixJQUFJLG1CQUFtQixHQUFHLENBQUMsQ0FBQTtJQUMzQixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtJQUV4QixvQ0FBb0M7SUFDcEMsTUFBTSxjQUFjLEdBQW9CLEVBQUUsQ0FBQTtJQUUxQyxpR0FBaUc7SUFDakcsTUFBTSxjQUFjLEdBQWdDLEVBQUUsQ0FBQTtJQUV0RCxrRUFBa0U7SUFDbEUsS0FBSyxVQUFVLFFBQVE7UUFDckIsT0FBTyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3JDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDOUIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsc0ZBQXNGO0lBQ3RGLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUywrQkFBK0IsQ0FBQyxFQUFFO1FBQzFELG1CQUFtQixFQUFFLENBQUE7UUFDckIsZ0JBQWdCLElBQUksRUFBRSxDQUFBO1FBQ3RCLGdDQUFnQztRQUNoQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUVGLDBGQUEwRjtJQUMxRixpREFBaUQ7SUFDakQsU0FBUyxhQUFhLENBQUMsS0FBVSxFQUFFLEdBQXNCO1FBQ3ZELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssVUFBVSxFQUFFO1lBQzFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUMvQiwyRkFBMkY7WUFDM0YsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDN0IsSUFBSTtvQkFDRixhQUFhLENBQUMsTUFBTSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7aUJBQ2hDO2dCQUFDLE9BQU8sR0FBRyxFQUFFO29CQUNaLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUE7aUJBQ2hCO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtZQUNoQyx5RUFBeUU7WUFDekUsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUM3QixDQUFDLENBQUMsQ0FBQTtZQUNGLE9BQU07U0FDUDthQUFNLElBQUksT0FBTyxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7WUFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUN2QixzRkFBc0Y7WUFDdEYsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7Z0JBQ3ZCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ3ZCLENBQUMsQ0FBQyxDQUFBO1NBQ0g7O1lBQU0sTUFBTSxJQUFJLEtBQUssQ0FBQyx5Q0FBeUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsMEdBQTBHO0lBQzFHLFNBQVMsZ0JBQWdCLENBQUMsR0FBc0I7UUFDOUMsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2IsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUE7YUFDOUI7aUJBQU07Z0JBQ0wsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFBO2FBQ2Q7U0FDRjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUNoQjtJQUNILENBQUM7SUFFRCx1REFBdUQ7SUFDdkQsU0FBUyxlQUFlO1FBQ3RCLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUN6QixjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQzlCO0lBQ0gsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxTQUFTLFFBQVE7UUFDZixJQUFJLGNBQWMsQ0FBQyxNQUFNLEVBQUU7WUFDekIsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRyxDQUFBO1lBQ3JDLE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFBO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLGdCQUFnQixDQUFBO1lBRWxDLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQTtZQUVwQiwyRUFBMkU7WUFDM0UsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO2dCQUNuQixJQUFJLFFBQVE7b0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUMvQyxRQUFRLEdBQUcsSUFBSSxDQUFBO2dCQUVmLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUUzQyxhQUFhO3FCQUNWLGFBQWEsQ0FBQztvQkFDYixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7b0JBQ2hCLEVBQUUsRUFBRSxJQUFJO29CQUNSLFdBQVcsRUFBRSxtQkFBbUIsR0FBRyxZQUFZO29CQUMvQyxTQUFTLEVBQUUsZ0JBQWdCLEdBQUcsU0FBUztpQkFDeEMsQ0FBQztxQkFDRCxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDN0IsQ0FBQyxDQUFBO1lBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxRQUFRO29CQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtnQkFDL0MsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFFZixPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDM0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFFbEIsYUFBYTtxQkFDVixhQUFhLENBQUM7b0JBQ2IsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO29CQUNoQixFQUFFLEVBQUUsS0FBSztvQkFDVCxLQUFLLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRTtvQkFDckIsS0FBSyxFQUFFLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLEtBQUs7b0JBQ2xELFdBQVcsRUFBRSxtQkFBbUIsR0FBRyxZQUFZO29CQUMvQyxTQUFTLEVBQUUsZ0JBQWdCLEdBQUcsU0FBUztpQkFDeEMsQ0FBQztxQkFDRCxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDN0IsQ0FBQyxDQUFBO1lBRUQsSUFBSTtnQkFDRixPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFFNUMsTUFBTSxXQUFXLEdBQWdCO29CQUMvQixLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBUzt3QkFDaEMsTUFBTSxhQUFhLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUE7d0JBQ2pELE1BQU0sUUFBUSxFQUFFLENBQUE7d0JBRWhCLE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFxQixDQUFBO3dCQUN6RixNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO3dCQUVuRSxZQUFZLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLHVCQUF1QixDQUFDLENBQUE7d0JBQ25GLFlBQVksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsdUJBQXVCLENBQUMsQ0FBQTtvQkFDckYsQ0FBQztpQkFDRixDQUFBO2dCQUVELE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBRXpDLElBQUksV0FBVyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRTtvQkFDbEQsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQzVCLE1BQU0sR0FBRyxHQUFzQjs0QkFDN0IsU0FBUyxFQUFFLFdBQVc7NEJBQ3RCLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixPQUFPOzRCQUNQLE1BQU07eUJBQ1AsQ0FBQTt3QkFDRCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtxQkFDdEI7eUJBQU0sSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ2pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO3FCQUN4Qzt5QkFBTTt3QkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixXQUFXLEVBQUUsQ0FBQyxDQUFBO3FCQUM1RDtpQkFDRjtxQkFBTTtvQkFDTCxPQUFPLEVBQUUsQ0FBQTtpQkFDVjthQUNGO1lBQUMsT0FBTyxHQUFRLEVBQUU7Z0JBQ2pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTthQUNaO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsb0RBQW9EO0lBQ3BELGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ3ZCLGdGQUFnRjtRQUNoRixnQ0FBZ0M7UUFDaEMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUVwQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU07WUFBRSxPQUFNO1FBRWxDLDJEQUEyRDtRQUMzRCxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUN2RixDQUFDLENBQUMsQ0FBQTtJQUVGLDZEQUE2RDtJQUM3RCxlQUFlO0lBQ2YsU0FBUyxJQUFJLENBQUMsSUFBWSxFQUFFLEVBQWdCO1FBQzFDLElBQUksYUFBYTtZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQTtRQUU3RSxJQUFJLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxpQkFBaUIsQ0FBQyxDQUFBO1FBRXpHLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUk7S0FDTCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLENBQU07SUFDekIsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxVQUFVLENBQUE7QUFDL0UsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLENBQU07SUFDdkIsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUE7QUFDbkUsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQVU7SUFDNUIsNkRBQTZEO0lBQzdELE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBjcmVhdGVUZXN0UnVudGltZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gb2JqZWN0IHdpdGggYSB0ZXN0IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRlc3RzLlxuICovXG5cbmltcG9ydCB7IElFbmdpbmUsIFRyYW5zZm9ybSB9IGZyb20gJ0BkY2wvZWNzJ1xuaW1wb3J0IHsgYXNzZXJ0RXF1YWxzIH0gZnJvbSAnLi9hc3NlcnQnXG5pbXBvcnQgdHlwZSB7IFRlc3RpbmdNb2R1bGUsIFRlc3RGdW5jdGlvbiwgVGVzdEhlbHBlcnMgfSBmcm9tICcuL3R5cGVzJ1xuXG4vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSB0ZXN0IHJ1bnRpbWUgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYW5kIHJ1biB0ZXN0cy5cbi8vIEl0IHRha2VzIGEgYFRlc3RpbmdNb2R1bGVgIGluc3RhbmNlIChsb2FkZWQgZnJvbSByZXF1aXJlKCd+c3lzdGVtL1Rlc3RpbmcnKSkgYW5kIGFuIGBJRW5naW5lYCBpbnN0YW5jZSAoZnJvbSBEZWNlbnRyYWxhbmQncyBTREspLlxuLy8gSXQgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGB0ZXN0YCBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0ZXN0cy5cbi8qIEBfX1BVUkVfXyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlc3RSdW50aW1lKHRlc3RpbmdNb2R1bGU6IFRlc3RpbmdNb2R1bGUsIGVuZ2luZTogSUVuZ2luZSkge1xuICB0eXBlIFRlc3RQbGFuRW50cnkgPSB7IG5hbWU6IHN0cmluZzsgZm46IFRlc3RGdW5jdGlvbiB9XG4gIHR5cGUgUnVubmVyRW52aXJvbm1lbnQgPSB7XG4gICAgcmVzb2x2ZTogKCkgPT4gdm9pZFxuICAgIHJlamVjdDogKGVycm9yOiBhbnkpID0+IHZvaWRcbiAgICBoZWxwZXJzOiBUZXN0SGVscGVyc1xuICAgIGdlbmVyYXRvcjogR2VuZXJhdG9yXG4gIH1cblxuICAvLyB0aGlzIGZsYWcgZW5zdXJlcyBubyB0ZXN0cyBhcmUgYWRkZWQgYXN5bmNocm9ub3VzbHlcbiAgbGV0IHJ1bnRpbWVGcm96ZW4gPSBmYWxzZVxuXG4gIGxldCBjdXJyZW50RnJhbWVDb3VudGVyID0gMFxuICBsZXQgY3VycmVudEZyYW1lVGltZSA9IDBcblxuICAvLyBhcnJheSB0byBob2xkIHRoZSBzY2hlZHVsZWQgdGVzdHNcbiAgY29uc3Qgc2NoZWR1bGVkVGVzdHM6IFRlc3RQbGFuRW50cnlbXSA9IFtdXG5cbiAgLy8gYW4gYXJyYXkgb2YgcHJvbWlzZXMgdGhhdCBhcmUgcmVzb2x2ZWQgb24gdGhlIG5leHQgZnJhbWUgKGFmdGVyIHRoZSBjdXJyZW50IGZyYW1lIGlzIGZpbmlzaGVkKVxuICBjb25zdCBuZXh0VGlja0Z1dHVyZTogQXJyYXk8KGR0OiBudW1iZXIpID0+IHZvaWQ+ID0gW11cblxuICAvLyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb24gdGhlIG5leHQgZnJhbWVcbiAgYXN5bmMgZnVuY3Rpb24gbmV4dFRpY2soKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPG51bWJlcj4oKHJlc29sdmUpID0+IHtcbiAgICAgIG5leHRUaWNrRnV0dXJlLnB1c2gocmVzb2x2ZSlcbiAgICB9KVxuICB9XG5cbiAgLy8gYWRkIGEgc3lzdGVtIHRvIHRoZSBlbmdpbmUgdGhhdCByZXNvbHZlcyBhbGwgcHJvbWlzZXMgaW4gdGhlIGBuZXh0VGlja0Z1dHVyZWAgYXJyYXlcbiAgZW5naW5lLmFkZFN5c3RlbShmdW5jdGlvbiBUZXN0aW5nRnJhbWV3b3JrQ29yb3V0aW5lUnVubmVyKGR0KSB7XG4gICAgY3VycmVudEZyYW1lQ291bnRlcisrXG4gICAgY3VycmVudEZyYW1lVGltZSArPSBkdFxuICAgIC8vIHJlc29sdmUgYWxsIG5leHRUaWNrIGZ1dHVyZXMuXG4gICAgbmV4dFRpY2tGdXR1cmUuc3BsaWNlKDAsIG5leHRUaWNrRnV0dXJlLmxlbmd0aCkuZm9yRWFjaCgoXykgPT4gXyhkdCkpXG4gIH0pXG5cbiAgLy8gdGhpcyBmdW5jdGlvbiBzY2hlZHVsZXMgYSB2YWx1ZSB0byBiZSBwcm9jZXNzZWQgb24gdGhlIG5leHQgZnJhbWUsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsXG4gIC8vIGNvbnRpbnVlIHRvIHJ1biB1bnRpbCBpdCByZWFjaGVzIGEgeWllbGQgcG9pbnRcbiAgZnVuY3Rpb24gc2NoZWR1bGVWYWx1ZSh2YWx1ZTogYW55LCBlbnY6IFJ1bm5lckVudmlyb25tZW50KSB7XG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfij7HvuI8geWllbGQgcHJvbWlzZScpXG4gICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYSBwcm9taXNlLCBzY2hlZHVsZSBpdCB0byBiZSBhd2FpdGVkIGFmdGVyIHRoZSBjdXJyZW50IGZyYW1lIGlzIGZpbmlzaGVkXG4gICAgICBuZXh0VGlja0Z1dHVyZS5wdXNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzY2hlZHVsZVZhbHVlKGF3YWl0IHZhbHVlLCBlbnYpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGVudi5yZWplY3QoZXJyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zb2xlLmxvZygn4o+x77iPIHlpZWxkIGZ1bmN0aW9uJylcbiAgICAgIC8vIGlmIHRoZSB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBzY2hlZHVsZSBpdCB0byBiZSBjYWxsZWQgb24gdGhlIG5leHQgZnJhbWVcbiAgICAgIG5leHRUaWNrRnV0dXJlLnB1c2goKCkgPT4ge1xuICAgICAgICBzY2hlZHVsZVZhbHVlKHZhbHVlKCksIGVudilcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfij7HvuI8geWllbGQnKVxuICAgICAgLy8gaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCBvciBudWxsLCBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBnZW5lcmF0b3IgdGhlIG5leHQgZnJhbWVcbiAgICAgIG5leHRUaWNrRnV0dXJlLnB1c2goKCkgPT4ge1xuICAgICAgICBjb25zdW1lR2VuZXJhdG9yKGVudilcbiAgICAgIH0pXG4gICAgfSBlbHNlIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmcm9tIHRlc3QgZ2VuZXJhdG9yOiAke3ZhbHVlfWApXG4gIH1cblxuICAvLyB0aGlzIGZ1bmN0aW9uIHByb2Nlc3NlcyBhIGdlbmVyYXRvciBmdW5jdGlvbiBieSBzY2hlZHVsaW5nIGl0cyB2YWx1ZXMgdG8gYmUgcHJvY2Vzc2VkIG9uIHRoZSBuZXh0IGZyYW1lXG4gIGZ1bmN0aW9uIGNvbnN1bWVHZW5lcmF0b3IoZW52OiBSdW5uZXJFbnZpcm9ubWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXQgPSBlbnYuZ2VuZXJhdG9yLm5leHQoKVxuICAgICAgaWYgKCFyZXQuZG9uZSkge1xuICAgICAgICBzY2hlZHVsZVZhbHVlKHJldC52YWx1ZSwgZW52KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW52LnJlc29sdmUoKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZW52LnJlamVjdChlcnIpXG4gICAgfVxuICB9XG5cbiAgLy8gdGhpcyBmdW5jdGlvbiBzY2hlZHVsZXMgYSB0ZXN0IHJ1biBvbiB0aGUgbmV4dCBmcmFtZVxuICBmdW5jdGlvbiBzY2hlZHVsZU5leHRSdW4oKSB7XG4gICAgaWYgKHNjaGVkdWxlZFRlc3RzLmxlbmd0aCkge1xuICAgICAgbmV4dFRpY2tGdXR1cmUucHVzaChydW5UZXN0cylcbiAgICB9XG4gIH1cblxuICAvLyB0aGlzIGZ1bmN0aW9uIHJ1bnMgdGhlIHNjaGVkdWxlZCB0ZXN0c1xuICBmdW5jdGlvbiBydW5UZXN0cygpIHtcbiAgICBpZiAoc2NoZWR1bGVkVGVzdHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IHNjaGVkdWxlZFRlc3RzLnNoaWZ0KCkhXG4gICAgICBjb25zdCBpbml0aWFsRnJhbWUgPSBjdXJyZW50RnJhbWVDb3VudGVyXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBjdXJyZW50RnJhbWVUaW1lXG5cbiAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlXG5cbiAgICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuIGl0IG1ha2VzIHRoZSBjdXJyZW50IHRlc3QgcGFzc1xuICAgICAgY29uc3QgcmVzb2x2ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHJlc29sdmVkKSB0aHJvdyBuZXcgRXJyb3IoJ3Jlc29sdmVkIHR3aWNlJylcbiAgICAgICAgcmVzb2x2ZWQgPSB0cnVlXG5cbiAgICAgICAgY29uc29sZS5sb2coYPCfn6IgVGVzdCBwYXNzZWQgJHtlbnRyeS5uYW1lfWApXG5cbiAgICAgICAgdGVzdGluZ01vZHVsZVxuICAgICAgICAgIC5sb2dUZXN0UmVzdWx0KHtcbiAgICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICBvazogdHJ1ZSxcbiAgICAgICAgICAgIHRvdGFsRnJhbWVzOiBjdXJyZW50RnJhbWVDb3VudGVyIC0gaW5pdGlhbEZyYW1lLFxuICAgICAgICAgICAgdG90YWxUaW1lOiBjdXJyZW50RnJhbWVUaW1lIC0gc3RhcnRUaW1lXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluYWxseShzY2hlZHVsZU5leHRSdW4pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlamVjdCA9IChlcnI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzb2x2ZWQpIHRocm93IG5ldyBFcnJvcigncmVzb2x2ZWQgdHdpY2UnKVxuICAgICAgICByZXNvbHZlZCA9IHRydWVcblxuICAgICAgICBjb25zb2xlLmxvZyhg8J+UtCBUZXN0IGZhaWxlZCAke2VudHJ5Lm5hbWV9YClcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXG5cbiAgICAgICAgdGVzdGluZ01vZHVsZVxuICAgICAgICAgIC5sb2dUZXN0UmVzdWx0KHtcbiAgICAgICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICBvazogZmFsc2UsXG4gICAgICAgICAgICBlcnJvcjogZXJyLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBzdGFjazogZXJyICYmIHR5cGVvZiBlcnIgPT09ICdvYmplY3QnICYmIGVyci5zdGFjayxcbiAgICAgICAgICAgIHRvdGFsRnJhbWVzOiBjdXJyZW50RnJhbWVDb3VudGVyIC0gaW5pdGlhbEZyYW1lLFxuICAgICAgICAgICAgdG90YWxUaW1lOiBjdXJyZW50RnJhbWVUaW1lIC0gc3RhcnRUaW1lXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluYWxseShzY2hlZHVsZU5leHRSdW4pXG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGDwn6eqIFJ1bm5pbmcgdGVzdCAke2VudHJ5Lm5hbWV9YClcblxuICAgICAgICBjb25zdCB0ZXN0SGVscGVyczogVGVzdEhlbHBlcnMgPSB7XG4gICAgICAgICAgYXN5bmMgc2V0Q2FtZXJhVHJhbnNmb3JtKHRyYW5zZm9ybSkge1xuICAgICAgICAgICAgYXdhaXQgdGVzdGluZ01vZHVsZS5zZXRDYW1lcmFUcmFuc2Zvcm0odHJhbnNmb3JtKVxuICAgICAgICAgICAgYXdhaXQgbmV4dFRpY2soKVxuXG4gICAgICAgICAgICBjb25zdCBUcmFuc2Zvcm1Db21wb25lbnQgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KFRyYW5zZm9ybS5jb21wb25lbnRJZCkgYXMgdHlwZW9mIFRyYW5zZm9ybVxuICAgICAgICAgICAgY29uc3QgYWN0dWFsVHJhbnNmb3JtID0gVHJhbnNmb3JtQ29tcG9uZW50LmdldChlbmdpbmUuQ2FtZXJhRW50aXR5KVxuXG4gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0dWFsVHJhbnNmb3JtLnBvc2l0aW9uLCB0cmFuc2Zvcm0ucG9zaXRpb24sIFwicG9zaXRpb25zIGRvbid0IG1hdGNoXCIpXG4gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0dWFsVHJhbnNmb3JtLnJvdGF0aW9uLCB0cmFuc2Zvcm0ucm90YXRpb24sIFwicm90YXRpb25zIGRvbid0IG1hdGNoXCIpXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBlbnRyeS5mbih0ZXN0SGVscGVycylcblxuICAgICAgICBpZiAocmV0dXJuVmFsdWUgJiYgdHlwZW9mIHJldHVyblZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGlmIChpc0dlbmVyYXRvcihyZXR1cm5WYWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudjogUnVubmVyRW52aXJvbm1lbnQgPSB7XG4gICAgICAgICAgICAgIGdlbmVyYXRvcjogcmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgIGhlbHBlcnM6IHRlc3RIZWxwZXJzLFxuICAgICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgICByZWplY3RcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN1bWVHZW5lcmF0b3IoZW52KVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNQcm9taXNlKHJldHVyblZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuVmFsdWUudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB0ZXN0IHJlc3VsdCB0eXBlOiAke3JldHVyblZhbHVlfWApXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICByZWplY3QoZXJyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIHNjaGVkdWxlIHRoZSB0ZXN0IHJ1bm5lciBzdGFydCBmb3IgdGhlIG5leHQgZnJhbWVcbiAgbmV4dFRpY2tGdXR1cmUucHVzaCgoKSA9PiB7XG4gICAgLy8gb25jZSB3ZSBydW4gdGhlIG5leHQgdGljaywgdGhlIHRlc3QgcnVudGltZSBiZWNvbWVzIGZyb3plbi4gdGhhdCBtZWFucyBubyBuZXdcbiAgICAvLyB0ZXN0IGRlZmluaXRpb25zIGFyZSBhY2NlcHRlZFxuICAgIHJ1bnRpbWVGcm96ZW4gPSB0cnVlXG5cbiAgICBpZiAoIXNjaGVkdWxlZFRlc3RzLmxlbmd0aCkgcmV0dXJuXG5cbiAgICAvLyBpbmZvcm0gdGhlIHRlc3QgcnVubmVyIGFib3V0IHRoZSBwbGFucyBmb3IgdGhpcyB0ZXN0IHJ1blxuICAgIHRlc3RpbmdNb2R1bGUucGxhbih7IHRlc3RzOiBzY2hlZHVsZWRUZXN0cyB9KS50aGVuKHNjaGVkdWxlTmV4dFJ1bikuY2F0Y2goZ2xvYmFsRmFpbClcbiAgfSlcblxuICAvLyB0aGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gcGxhbiBhIHRlc3QgZnVuY3Rpb25uXG4gIC8qIEBfX1BVUkVfXyAqL1xuICBmdW5jdGlvbiB0ZXN0KG5hbWU6IHN0cmluZywgZm46IFRlc3RGdW5jdGlvbikge1xuICAgIGlmIChydW50aW1lRnJvemVuKSB0aHJvdyBuZXcgRXJyb3IoXCJOZXcgdGVzdHMgY2FuJ3QgYmUgYWRkZWQgYXQgdGhpcyBzdGFnZS5cIilcblxuICAgIGlmIChzY2hlZHVsZWRUZXN0cy5zb21lKCgkKSA9PiAkLm5hbWUgPT09IG5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoYFRlc3Qgd2l0aCBuYW1lICR7bmFtZX0gYWxyZWFkeSBleGlzdHNgKVxuXG4gICAgc2NoZWR1bGVkVGVzdHMucHVzaCh7IGZuLCBuYW1lIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRlc3RcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0dlbmVyYXRvcih0OiBhbnkpOiB0IGlzIEdlbmVyYXRvciB7XG4gIHJldHVybiB0ICYmIHR5cGVvZiB0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdFtTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nXG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZSh0OiBhbnkpOiB0IGlzIFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gdCAmJiB0eXBlb2YgdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHQudGhlbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG5mdW5jdGlvbiBnbG9iYWxGYWlsKGVycm9yOiBhbnkpIHtcbiAgLy8gZm9yIG5vdywgdGhlIGZhaWx1cmUgaXMgb25seSB3cml0aW5nIHRvIHRoZSBjb25zb2xlLmVycm9yLlxuICBjb25zb2xlLmVycm9yKGVycm9yKVxufVxuIl19
|