@dcl/sdk 7.0.0-3548419522.commit-ddcf4b7 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/ecs.d.ts +1 -0
  2. package/ecs.js +2 -0
  3. package/index.d.ts +1 -0
  4. package/index.js +11 -0
  5. package/internal/Observable.d.ts +36 -0
  6. package/internal/Observable.js +190 -0
  7. package/internal/transports/networkTransport.d.ts +2 -0
  8. package/internal/transports/networkTransport.js +16 -0
  9. package/internal/transports/rendererTransport.d.ts +7 -0
  10. package/internal/transports/rendererTransport.js +39 -0
  11. package/math.d.ts +3 -0
  12. package/math.js +4 -0
  13. package/messageBus.d.ts +10 -0
  14. package/messageBus.js +43 -0
  15. package/observables.d.ts +225 -0
  16. package/observables.js +75 -0
  17. package/package.json +12 -18
  18. package/react-ecs.d.ts +3 -0
  19. package/react-ecs.js +4 -0
  20. package/src/ecs.ts +1 -0
  21. package/src/index.ts +18 -0
  22. package/src/internal/Observable.ts +425 -0
  23. package/src/internal/transports/networkTransport.ts +24 -0
  24. package/src/internal/transports/rendererTransport.ts +60 -0
  25. package/src/math.ts +3 -0
  26. package/src/messageBus.ts +62 -0
  27. package/src/observables.ts +579 -0
  28. package/src/react-ecs.ts +3 -0
  29. package/tsconfig.json +11 -0
  30. package/types/tsconfig.ecs7.json +3 -8
  31. package/dist/ecs7/index.d.ts +0 -4679
  32. package/dist/ecs7/index.js +0 -15202
  33. package/dist/ecs7/index.min.js +0 -1
  34. package/dist/ecs7/index.min.js.map +0 -1
  35. package/dist/ecs7/proto-definitions/README.md +0 -32
  36. package/dist/ecs7/proto-definitions/Transform.md +0 -25
  37. package/dist/ecs7/proto-definitions/animator.proto +0 -19
  38. package/dist/ecs7/proto-definitions/audio_source.proto +0 -13
  39. package/dist/ecs7/proto-definitions/audio_stream.proto +0 -11
  40. package/dist/ecs7/proto-definitions/avatar_attach.proto +0 -19
  41. package/dist/ecs7/proto-definitions/avatar_modifier_area.proto +0 -19
  42. package/dist/ecs7/proto-definitions/avatar_shape.proto +0 -32
  43. package/dist/ecs7/proto-definitions/billboard.proto +0 -17
  44. package/dist/ecs7/proto-definitions/camera_mode.proto +0 -10
  45. package/dist/ecs7/proto-definitions/camera_mode_area.proto +0 -14
  46. package/dist/ecs7/proto-definitions/common/camera_type.proto +0 -8
  47. package/dist/ecs7/proto-definitions/common/id.md +0 -2
  48. package/dist/ecs7/proto-definitions/common/id.proto +0 -8
  49. package/dist/ecs7/proto-definitions/common/input_action.proto +0 -20
  50. package/dist/ecs7/proto-definitions/common/texts.proto +0 -20
  51. package/dist/ecs7/proto-definitions/gltf_container.proto +0 -13
  52. package/dist/ecs7/proto-definitions/material.proto +0 -56
  53. package/dist/ecs7/proto-definitions/mesh_collider.proto +0 -35
  54. package/dist/ecs7/proto-definitions/mesh_renderer.proto +0 -30
  55. package/dist/ecs7/proto-definitions/nft_shape.proto +0 -40
  56. package/dist/ecs7/proto-definitions/pointer_events_result.proto +0 -25
  57. package/dist/ecs7/proto-definitions/pointer_hover_feedback.proto +0 -31
  58. package/dist/ecs7/proto-definitions/pointer_lock.proto +0 -9
  59. package/dist/ecs7/proto-definitions/raycast.proto +0 -20
  60. package/dist/ecs7/proto-definitions/raycast_result.proto +0 -25
  61. package/dist/ecs7/proto-definitions/text_shape.proto +0 -33
  62. package/dist/ecs7/proto-definitions/ui_background.proto +0 -11
  63. package/dist/ecs7/proto-definitions/ui_text.proto +0 -17
  64. package/dist/ecs7/proto-definitions/ui_transform.proto +0 -141
  65. package/dist/ecs7/proto-definitions/visibility_component.proto +0 -9
  66. package/dist/playground/snippets/billboard.ts +0 -108
  67. package/dist/playground/snippets/cube-spawner.ts +0 -39
  68. package/dist/playground/snippets/info.json +0 -1
  69. package/dist/playground/snippets/material.ts +0 -48
  70. package/dist/playground/snippets/mesh.ts +0 -68
  71. package/dist/playground/snippets/pointer-events.ts +0 -50
  72. package/dist/playground/snippets/raycast-hit-many.ts +0 -63
  73. package/dist/playground/snippets/raycast-hit.ts +0 -62
  74. package/dist/playground/snippets/ui.tsx +0 -134
  75. package/types/ecs7/index.d.ts +0 -4679
package/ecs.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from '@dcl/ecs';
package/ecs.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from '@dcl/ecs';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3JjL2Vjcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJ0BkY2wvZWNzJ1xuIl19
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function onUpdate(deltaTime: number): Promise<void>;
package/index.js ADDED
@@ -0,0 +1,11 @@
1
+ import { engine } from '@dcl/ecs';
2
+ import { pollEvents, setSubscribeFunction } from './observables';
3
+ import { subscribe, sendBatch, crdtSendToRenderer } from '~system/EngineApi';
4
+ import { createRendererTransport } from './internal/transports/rendererTransport';
5
+ engine.addTransport(createRendererTransport({ crdtSendToRenderer }));
6
+ setSubscribeFunction(subscribe);
7
+ export async function onUpdate(deltaTime) {
8
+ engine.update(deltaTime);
9
+ await pollEvents(sendBatch);
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqQyxPQUFPLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDNUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0seUNBQXlDLENBQUE7QUFHakYsTUFBTSxDQUFDLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFBO0FBSXBFLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBRS9CLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLFNBQWlCO0lBQzlDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDeEIsTUFBTSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7QUFDN0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAYWxwaGEgVEhJUyBGSUxFIElOSVRJQUxJWkVTIFRIRSBERUNFTlRSQUxBTkQgUlVOVElNRS4gV0lMTCBDSEFOR0UgU09PTiAqL1xuXG5pbXBvcnQgeyBlbmdpbmUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IHBvbGxFdmVudHMsIHNldFN1YnNjcmliZUZ1bmN0aW9uIH0gZnJvbSAnLi9vYnNlcnZhYmxlcydcbmltcG9ydCB7IHN1YnNjcmliZSwgc2VuZEJhdGNoLCBjcmR0U2VuZFRvUmVuZGVyZXIgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcbmltcG9ydCB7IGNyZWF0ZVJlbmRlcmVyVHJhbnNwb3J0IH0gZnJvbSAnLi9pbnRlcm5hbC90cmFuc3BvcnRzL3JlbmRlcmVyVHJhbnNwb3J0J1xuXG4vLyBBdHRhY2ggQ1JEVCB0cmFuc3BvcnRcbmVuZ2luZS5hZGRUcmFuc3BvcnQoY3JlYXRlUmVuZGVyZXJUcmFuc3BvcnQoeyBjcmR0U2VuZFRvUmVuZGVyZXIgfSkpXG5cbi8vIGF0dGFjaCBlbmdpbmVBcGkuc3Vic2NyaWJlIGZ1bmN0aW9uIGZvciBldmVudHMuIFRoaXMgaXMgb25seSBhIHRyYW5zaXRpb25cbi8vIHBhdGNoIHVudGlsIGV2ZW50cyBhcmUgY29tcGxldGVseSBtaWdyYXRlZCB0byBDUkRUIG1lc3NhZ2VzXG5zZXRTdWJzY3JpYmVGdW5jdGlvbihzdWJzY3JpYmUpXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvblVwZGF0ZShkZWx0YVRpbWU6IG51bWJlcikge1xuICBlbmdpbmUudXBkYXRlKGRlbHRhVGltZSlcbiAgYXdhaXQgcG9sbEV2ZW50cyhzZW5kQmF0Y2gpXG59XG4iXX0=
@@ -0,0 +1,36 @@
1
+ export declare class ObserverEventState {
2
+ skipNextObservers: boolean;
3
+ mask: number;
4
+ target?: any;
5
+ currentTarget?: any;
6
+ lastReturnValue?: any;
7
+ constructor(mask: number, skipNextObservers?: boolean, target?: any, currentTarget?: any);
8
+ initalize(mask: number, skipNextObservers?: boolean, target?: any, currentTarget?: any): ObserverEventState;
9
+ }
10
+ export declare class Observer<T> {
11
+ callback: (eventData: T, eventState: ObserverEventState) => void;
12
+ mask: number;
13
+ scope: any;
14
+ unregisterOnNextCall: boolean;
15
+ _willBeUnregistered: boolean;
16
+ constructor(callback: (eventData: T, eventState: ObserverEventState) => void, mask: number, scope?: any);
17
+ }
18
+ export declare class Observable<T> {
19
+ private _observers;
20
+ private _eventState;
21
+ private _onObserverAdded;
22
+ constructor(onObserverAdded?: (observer: Observer<T>) => void);
23
+ add(callback: (eventData: T, eventState: ObserverEventState) => void, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): null | Observer<T>;
24
+ addOnce(callback: (eventData: T, eventState: ObserverEventState) => void): null | Observer<T>;
25
+ remove(observer: null | Observer<T>): boolean;
26
+ removeCallback(callback: (eventData: T, eventState: ObserverEventState) => void, scope?: any): boolean;
27
+ notifyObservers(eventData: T, mask?: number, target?: any, currentTarget?: any): boolean;
28
+ notifyObserversWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any): Promise<T>;
29
+ notifyObserver(observer: Observer<T>, eventData: T, mask?: number): void;
30
+ hasObservers(): boolean;
31
+ clear(): void;
32
+ clone(): Observable<T>;
33
+ hasSpecificMask(mask?: number): boolean;
34
+ private _deferUnregister;
35
+ private _remove;
36
+ }
@@ -0,0 +1,190 @@
1
+ export class ObserverEventState {
2
+ constructor(mask, skipNextObservers = false, target, currentTarget) {
3
+ this.initalize(mask, skipNextObservers, target, currentTarget);
4
+ }
5
+ initalize(mask, skipNextObservers = false, target, currentTarget) {
6
+ this.mask = mask;
7
+ this.skipNextObservers = skipNextObservers;
8
+ this.target = target;
9
+ this.currentTarget = currentTarget;
10
+ return this;
11
+ }
12
+ }
13
+ export class Observer {
14
+ constructor(callback, mask, scope = null) {
15
+ this.callback = callback;
16
+ this.mask = mask;
17
+ this.scope = scope;
18
+ this.unregisterOnNextCall = false;
19
+ this._willBeUnregistered = false;
20
+ }
21
+ }
22
+ export class Observable {
23
+ constructor(onObserverAdded) {
24
+ this._observers = new Array();
25
+ this._onObserverAdded = null;
26
+ this._eventState = new ObserverEventState(0);
27
+ if (onObserverAdded) {
28
+ this._onObserverAdded = onObserverAdded;
29
+ }
30
+ }
31
+ add(callback, mask = -1, insertFirst = false, scope = null, unregisterOnFirstCall = false) {
32
+ if (!callback) {
33
+ return null;
34
+ }
35
+ const observer = new Observer(callback, mask, scope);
36
+ observer.unregisterOnNextCall = unregisterOnFirstCall;
37
+ if (insertFirst) {
38
+ this._observers.unshift(observer);
39
+ }
40
+ else {
41
+ this._observers.push(observer);
42
+ }
43
+ if (this._onObserverAdded) {
44
+ this._onObserverAdded(observer);
45
+ }
46
+ return observer;
47
+ }
48
+ addOnce(callback) {
49
+ return this.add(callback, undefined, undefined, undefined, true);
50
+ }
51
+ remove(observer) {
52
+ if (!observer) {
53
+ return false;
54
+ }
55
+ const index = this._observers.indexOf(observer);
56
+ if (index !== -1) {
57
+ this._deferUnregister(observer);
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+ removeCallback(callback, scope) {
63
+ for (let index = 0; index < this._observers.length; index++) {
64
+ if (this._observers[index].callback === callback &&
65
+ (!scope || scope === this._observers[index].scope)) {
66
+ this._deferUnregister(this._observers[index]);
67
+ return true;
68
+ }
69
+ }
70
+ return false;
71
+ }
72
+ notifyObservers(eventData, mask = -1, target, currentTarget) {
73
+ if (!this._observers.length) {
74
+ return true;
75
+ }
76
+ const state = this._eventState;
77
+ state.mask = mask;
78
+ state.target = target;
79
+ state.currentTarget = currentTarget;
80
+ state.skipNextObservers = false;
81
+ state.lastReturnValue = eventData;
82
+ for (const obs of this._observers) {
83
+ if (obs._willBeUnregistered) {
84
+ continue;
85
+ }
86
+ if (obs.mask & mask) {
87
+ if (obs.scope) {
88
+ state.lastReturnValue = obs.callback.apply(obs.scope, [
89
+ eventData,
90
+ state
91
+ ]);
92
+ }
93
+ else {
94
+ state.lastReturnValue = obs.callback(eventData, state);
95
+ }
96
+ if (obs.unregisterOnNextCall) {
97
+ this._deferUnregister(obs);
98
+ }
99
+ }
100
+ if (state.skipNextObservers) {
101
+ return false;
102
+ }
103
+ }
104
+ return true;
105
+ }
106
+ notifyObserversWithPromise(eventData, mask = -1, target, currentTarget) {
107
+ let p = Promise.resolve(eventData);
108
+ if (!this._observers.length) {
109
+ return p;
110
+ }
111
+ const state = this._eventState;
112
+ state.mask = mask;
113
+ state.target = target;
114
+ state.currentTarget = currentTarget;
115
+ state.skipNextObservers = false;
116
+ this._observers.forEach((obs) => {
117
+ if (state.skipNextObservers) {
118
+ return;
119
+ }
120
+ if (obs._willBeUnregistered) {
121
+ return;
122
+ }
123
+ if (obs.mask & mask) {
124
+ if (obs.scope) {
125
+ p = p.then((lastReturnedValue) => {
126
+ state.lastReturnValue = lastReturnedValue;
127
+ return obs.callback.apply(obs.scope, [eventData, state]);
128
+ });
129
+ }
130
+ else {
131
+ p = p.then((lastReturnedValue) => {
132
+ state.lastReturnValue = lastReturnedValue;
133
+ return obs.callback(eventData, state);
134
+ });
135
+ }
136
+ if (obs.unregisterOnNextCall) {
137
+ this._deferUnregister(obs);
138
+ }
139
+ }
140
+ });
141
+ return p.then(() => {
142
+ return eventData;
143
+ });
144
+ }
145
+ notifyObserver(observer, eventData, mask = -1) {
146
+ const state = this._eventState;
147
+ state.mask = mask;
148
+ state.skipNextObservers = false;
149
+ observer.callback(eventData, state);
150
+ }
151
+ hasObservers() {
152
+ return this._observers.length > 0;
153
+ }
154
+ clear() {
155
+ this._observers = new Array();
156
+ this._onObserverAdded = null;
157
+ }
158
+ clone() {
159
+ const result = new Observable();
160
+ result._observers = this._observers.slice(0);
161
+ return result;
162
+ }
163
+ hasSpecificMask(mask = -1) {
164
+ for (const obs of this._observers) {
165
+ if (obs.mask & mask || obs.mask === mask) {
166
+ return true;
167
+ }
168
+ }
169
+ return false;
170
+ }
171
+ _deferUnregister(observer) {
172
+ observer.unregisterOnNextCall = false;
173
+ observer._willBeUnregistered = true;
174
+ Promise.resolve()
175
+ .then.bind(Promise.resolve())(async () => this._remove(observer))
176
+ .catch(console.error);
177
+ }
178
+ _remove(observer) {
179
+ if (!observer) {
180
+ return false;
181
+ }
182
+ const index = this._observers.indexOf(observer);
183
+ if (index !== -1) {
184
+ this._observers.splice(index, 1);
185
+ return true;
186
+ }
187
+ return false;
188
+ }
189
+ }
190
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT2JzZXJ2YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbnRlcm5hbC9PYnNlcnZhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxrQkFBa0I7SUFrQzdCLFlBQ0UsSUFBWSxFQUNaLGlCQUFpQixHQUFHLEtBQUssRUFDekIsTUFBWSxFQUNaLGFBQW1CO1FBRW5CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUNoRSxDQUFDO0lBVU0sU0FBUyxDQUNkLElBQVksRUFDWixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLE1BQVksRUFDWixhQUFtQjtRQUVuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNoQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUE7UUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUE7UUFDcEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7UUFDbEMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0NBQ0Y7QUFNRCxNQUFNLE9BQU8sUUFBUTtJQWVuQixZQUlTLFFBQWdFLEVBSWhFLElBQVksRUFJWixRQUFhLElBQUk7UUFSakIsYUFBUSxHQUFSLFFBQVEsQ0FBd0Q7UUFJaEUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUlaLFVBQUssR0FBTCxLQUFLLENBQVk7UUF2Qm5CLHlCQUFvQixHQUFHLEtBQUssQ0FBQTtRQUc1Qix3QkFBbUIsR0FBRyxLQUFLLENBQUE7SUFxQi9CLENBQUM7Q0FDTDtBQVlELE1BQU0sT0FBTyxVQUFVO0lBV3JCLFlBQVksZUFBaUQ7UUFWckQsZUFBVSxHQUFHLElBQUksS0FBSyxFQUFlLENBQUE7UUFJckMscUJBQWdCLEdBQTZDLElBQUksQ0FBQTtRQU92RSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksa0JBQWtCLENBQUMsQ0FBQyxD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TyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2hFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDekIsQ0FBQztJQUlPLE9BQU8sQ0FBQyxRQUE0QjtRQUMxQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBRS9DLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUNoQyxPQUFPLElBQUksQ0FBQTtTQUNaO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgY2xhc3Mgc2VydmVzIGFzIGEgbWVkaXVtIGJldHdlZW4gdGhlIG9ic2VydmFibGUgYW5kIGl0cyBvYnNlcnZlcnNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWRcbiAqL1xuZXhwb3J0IGNsYXNzIE9ic2VydmVyRXZlbnRTdGF0ZSB7XG4gIC8qKlxuICAgKiBBbiBPYnNlcnZlciBjYW4gc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBwcmV2ZW50IHN1YnNlcXVlbnQgb2JzZXJ2ZXJzIG9mIGJlaW5nIG5vdGlmaWVkXG4gICAqL1xuICBwdWJsaWMgc2tpcE5leHRPYnNlcnZlcnMhOiBib29sZWFuXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbWFzayB2YWx1ZSB0aGF0IHdlcmUgdXNlZCB0byB0cmlnZ2VyIHRoZSBldmVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgRXZlbnRTdGF0ZSBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBtYXNrITogbnVtYmVyXG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgdGhhdCBvcmlnaW5hbGx5IG5vdGlmaWVkIHRoZSBldmVudFxuICAgKi9cbiAgcHVibGljIHRhcmdldD86IGFueVxuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBvYmplY3QgaW4gdGhlIGJ1YmJsaW5nIHBoYXNlXG4gICAqL1xuICBwdWJsaWMgY3VycmVudFRhcmdldD86IGFueVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBmdW5jdGlvbiB0aGF0IHdhcyBleGVjdXRlZC5cbiAgICogSWYgaXQgaXMgdGhlIGZpcnN0IGZ1bmN0aW9uIGluIHRoZSBjYWxsYmFjayBjaGFpbiBpdCB3aWxsIGJlIHRoZSBldmVudCBkYXRhLlxuICAgKi9cbiAgcHVibGljIGxhc3RSZXR1cm5WYWx1ZT86IGFueVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgRXZlbnRTdGF0ZVxuICAgKiBAcGFyYW0gbWFzayAtIGRlZmluZXMgdGhlIG1hc2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RhdGVcbiAgICogQHBhcmFtIHNraXBOZXh0T2JzZXJ2ZXJzIC0gZGVmaW5lcyBhIGZsYWcgd2hpY2ggd2lsbCBpbnN0cnVjdCB0aGUgb2JzZXJ2YWJsZSB0byBza2lwIGZvbGxvd2luZyBvYnNlcnZlcnMgd2hlbiBzZXQgdG8gdHJ1ZVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gZGVmaW5lcyB0aGUgb3JpZ2luYWwgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKiBAcGFyYW0gY3VycmVudFRhcmdldCAtIGRlZmluZXMgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgbWFzazogbnVtYmVyLFxuICAgIHNraXBOZXh0T2JzZXJ2ZXJzID0gZmFsc2UsXG4gICAgdGFyZ2V0PzogYW55LFxuICAgIGN1cnJlbnRUYXJnZXQ/OiBhbnlcbiAgKSB7XG4gICAgdGhpcy5pbml0YWxpemUobWFzaywgc2tpcE5leHRPYnNlcnZlcnMsIHRhcmdldCwgY3VycmVudFRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRoZSBjdXJyZW50IGV2ZW50IHN0YXRlXG4gICAqIEBwYXJhbSBtYXNrIC0gZGVmaW5lcyB0aGUgbWFzayBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZVxuICAgKiBAcGFyYW0gc2tpcE5leHRPYnNlcnZlcnMgLSBkZWZpbmVzIGEgZmxhZyB3aGljaCB3aWxsIGluc3RydWN0IHRoZSBvYnNlcnZhYmxlIHRvIHNraXAgZm9sbG93aW5nIG9ic2VydmVycyB3aGVuIHNldCB0byB0cnVlXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBkZWZpbmVzIHRoZSBvcmlnaW5hbCB0YXJnZXQgb2YgdGhlIHN0YXRlXG4gICAqIEBwYXJhbSBjdXJyZW50VGFyZ2V0IC0gZGVmaW5lcyB0aGUgY3VycmVudCB0YXJnZXQgb2YgdGhlIHN0YXRlXG4gICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IGV2ZW50IHN0YXRlXG4gICAqL1xuICBwdWJsaWMgaW5pdGFsaXplKFxuICAgIG1hc2s6IG51bWJlcixcbiAgICBza2lwTmV4dE9ic2VydmVycyA9IGZhbHNlLFxuICAgIHRhcmdldD86IGFueSxcbiAgICBjdXJyZW50VGFyZ2V0PzogYW55XG4gICk6IE9ic2VydmVyRXZlbnRTdGF0ZSB7XG4gICAgdGhpcy5tYXNrID0gbWFza1xuICAgIHRoaXMuc2tpcE5leHRPYnNlcnZlcnMgPSBza2lwTmV4dE9ic2VydmVyc1xuICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldFxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnQgYW4gT2JzZXJ2ZXIgcmVnaXN0ZXJlZCB0byBhIGdpdmVuIE9ic2VydmFibGUgb2JqZWN0LlxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZXI8VD4ge1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgcHJvcGVydHkgZGVmaW5pbmcgdGhhdCB0aGUgb2JzZXJ2ZXIgYXMgdG8gYmUgdW5yZWdpc3RlcmVkIGFmdGVyIHRoZSBuZXh0IG5vdGlmaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHVucmVnaXN0ZXJPbk5leHRDYWxsID0gZmFsc2VcblxuICAvKiogRm9yIGludGVybmFsIHVzYWdlICovXG4gIHB1YmxpYyBfd2lsbEJlVW5yZWdpc3RlcmVkID0gZmFsc2VcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBvYnNlcnZlclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBkZWZpbmVzIHRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIG9ic2VydmVyIGlzIG5vdGlmaWVkXG4gICAqIEBwYXJhbSBtYXNrIC0gZGVmaW5lcyB0aGUgbWFzayBvZiB0aGUgb2JzZXJ2ZXIgKHVzZWQgdG8gZmlsdGVyIG5vdGlmaWNhdGlvbnMpXG4gICAqIEBwYXJhbSBzY29wZSAtIGRlZmluZXMgdGhlIGN1cnJlbnQgc2NvcGUgdXNlZCB0byByZXN0b3JlIHRoZSBKUyBjb250ZXh0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIG9ic2VydmVyIGlzIG5vdGlmaWVkXG4gICAgICovXG4gICAgcHVibGljIGNhbGxiYWNrOiAoZXZlbnREYXRhOiBULCBldmVudFN0YXRlOiBPYnNlcnZlckV2ZW50U3RhdGUpID0+IHZvaWQsXG4gICAgLyoqXG4gICAgICogRGVmaW5lcyB0aGUgbWFzayBvZiB0aGUgb2JzZXJ2ZXIgKHVzZWQgdG8gZmlsdGVyIG5vdGlmaWNhdGlvbnMpXG4gICAgICovXG4gICAgcHVibGljIG1hc2s6IG51bWJlcixcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHRoZSBjdXJyZW50IHNjb3BlIHVzZWQgdG8gcmVzdG9yZSB0aGUgSlMgY29udGV4dFxuICAgICAqL1xuICAgIHB1YmxpYyBzY29wZTogYW55ID0gbnVsbFxuICApIHt9XG59XG5cbi8qKlxuICogVGhlIE9ic2VydmFibGUgY2xhc3MgaXMgYSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9ic2VydmFibGUgcGF0dGVybi5cbiAqXG4gKiBUaGVyZSdzIG9uZSBzbGlnaHQgcGFydGljdWxhcml0eSB0aG91Z2g6IGEgZ2l2ZW4gT2JzZXJ2YWJsZSBjYW4gbm90aWZ5IGl0cyBvYnNlcnZlciB1c2luZyBhIHBhcnRpY3VsYXIgbWFzayB2YWx1ZSwgb25seSB0aGUgT2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIG1hc2sgdmFsdWUgd2lsbCBiZSBub3RpZmllZC5cbiAqIFRoaXMgZW5hYmxlIGEgbW9yZSBmaW5lIGdyYWluZWQgZXhlY3V0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIHJlbHkgb24gbXVsdGlwbGUgZGlmZmVyZW50IE9ic2VydmFibGUgb2JqZWN0cy5cbiAqIEZvciBpbnN0YW5jZSB5b3UgbWF5IGhhdmUgYSBnaXZlbiBPYnNlcnZhYmxlIHRoYXQgaGF2ZSBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBub3RpZmljYXRpb25zOiBNb3ZlIChtYXNrID0gMHgwMSksIFN0b3AgKG1hc2sgPSAweDAyKSwgVHVybiBSaWdodCAobWFzayA9IDBYMDQpLCBUdXJuIExlZnQgKG1hc2sgPSAwWDA4KS5cbiAqIEEgZ2l2ZW4gb2JzZXJ2ZXIgY2FuIHJlZ2lzdGVyIGl0c2VsZiB3aXRoIG9ubHkgTW92ZSBhbmQgU3RvcCAobWFzayA9IDB4MDMpLCB0aGVuIGl0IHdpbGwgb25seSBiZSBub3RpZmllZCB3aGVuIG9uZSBvZiB0aGVzZSB0d28gb2NjdXJzIGFuZCB3aWxsIG5ldmVyIGJlIGZvciBUdXJuIExlZnQvUmlnaHQuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZFxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2YWJsZTxUPiB7XG4gIHByaXZhdGUgX29ic2VydmVycyA9IG5ldyBBcnJheTxPYnNlcnZlcjxUPj4oKVxuXG4gIHByaXZhdGUgX2V2ZW50U3RhdGU6IE9ic2VydmVyRXZlbnRTdGF0ZVxuXG4gIHByaXZhdGUgX29uT2JzZXJ2ZXJBZGRlZDogbnVsbCB8ICgob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB2b2lkKSA9IG51bGxcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBvYnNlcnZhYmxlXG4gICAqIEBwYXJhbSBvbk9ic2VydmVyQWRkZWQgLSBkZWZpbmVzIGEgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIGEgbmV3IG9ic2VydmVyIGlzIGFkZGVkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihvbk9ic2VydmVyQWRkZWQ/OiAob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB2b2lkKSB7XG4gICAgdGhpcy5fZXZlbnRTdGF0ZSA9IG5ldyBPYnNlcnZlckV2ZW50U3RhdGUoMClcblxuICAgIGlmIChvbk9ic2VydmVyQWRkZWQpIHtcbiAgICAgIHRoaXMuX29uT2JzZXJ2ZXJBZGRlZCA9IG9uT2JzZXJ2ZXJBZGRlZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgT2JzZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIHRoYXQgT2JzZXJ2ZXJcbiAgICogQHBhcmFtIG1hc2sgLSB0aGUgbWFzayB1c2VkIHRvIGZpbHRlciBvYnNlcnZlcnNcbiAgICogQHBhcmFtIGluc2VydEZpcnN0IC0gaWYgdHJ1ZSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgZmlyc3QgcG9zaXRpb24sIGhlbmNlIGV4ZWN1dGVkIGJlZm9yZSB0aGUgb3RoZXJzIG9uZXMuIElmIGZhbHNlIChkZWZhdWx0IGJlaGF2aW9yKSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnNlcnRlZCBhdCB0aGUgbGFzdCBwb3NpdGlvbiwgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBvdGhlcnMgYWxyZWFkeSBwcmVzZW50LlxuICAgKiBAcGFyYW0gc2NvcGUgLSBvcHRpb25hbCBzY29wZSBmb3IgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBmcm9tXG4gICAqIEBwYXJhbSB1bnJlZ2lzdGVyT25GaXJzdENhbGwgLSBkZWZpbmVzIGlmIHRoZSBvYnNlcnZlciBhcyB0byBiZSB1bnJlZ2lzdGVyZWQgYWZ0ZXIgdGhlIG5leHQgbm90aWZpY2F0aW9uXG4gICAqIEByZXR1cm5zIHRoZSBuZXcgb2JzZXJ2ZXIgY3JlYXRlZCBmb3IgdGhlIGNhbGxiYWNrXG4gICAqL1xuICBwdWJsaWMgYWRkKFxuICAgIGNhbGxiYWNrOiAoZXZlbnREYXRhOiBULCBldmVudFN0YXRlOiBPYnNlcnZlckV2ZW50U3RhdGUpID0+IHZvaWQsXG4gICAgbWFzazogbnVtYmVyID0gLTEsXG4gICAgaW5zZXJ0Rmlyc3QgPSBmYWxzZSxcbiAgICBzY29wZTogYW55ID0gbnVsbCxcbiAgICB1bnJlZ2lzdGVyT25GaXJzdENhbGwgPSBmYWxzZVxuICApOiBudWxsIHwgT2JzZXJ2ZXI8VD4ge1xuICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgT2JzZXJ2ZXIoY2FsbGJhY2ssIG1hc2ssIHNjb3BlKVxuICAgIG9ic2VydmVyLnVucmVnaXN0ZXJPbk5leHRDYWxsID0gdW5yZWdpc3Rlck9uRmlyc3RDYWxsXG5cbiAgICBpZiAoaW5zZXJ0Rmlyc3QpIHtcbiAgICAgIHRoaXMuX29ic2VydmVycy51bnNoaWZ0KG9ic2VydmVyKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vYnNlcnZlcnMucHVzaChvYnNlcnZlcilcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb25PYnNlcnZlckFkZGVkKSB7XG4gICAgICB0aGlzLl9vbk9ic2VydmVyQWRkZWQob2JzZXJ2ZXIpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic2VydmVyXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IE9ic2VydmVyIHdpdGggdGhlIHNwZWNpZmllZCBjYWxsYmFjayBhbmQgdW5yZWdpc3RlcnMgYWZ0ZXIgdGhlIG5leHQgbm90aWZpY2F0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yIHRoYXQgT2JzZXJ2ZXJcbiAgICogQHJldHVybnMgdGhlIG5ldyBvYnNlcnZlciBjcmVhdGVkIGZvciB0aGUgY2FsbGJhY2tcbiAgICovXG4gIHB1YmxpYyBhZGRPbmNlKFxuICAgIGNhbGxiYWNrOiAoZXZlbnREYXRhOiBULCBldmVudFN0YXRlOiBPYnNlcnZlckV2ZW50U3RhdGUpID0+IHZvaWRcbiAgKTogbnVsbCB8IE9ic2VydmVyPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZGQoY2FsbGJhY2ssIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIE9ic2VydmVyIGZyb20gdGhlIE9ic2VydmFibGUgb2JqZWN0XG4gICAqIEBwYXJhbSBvYnNlcnZlciAtIHRoZSBpbnN0YW5jZSBvZiB0aGUgT2JzZXJ2ZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIGZhbHNlIGlmIGl0IGRvZXNuJ3QgYmVsb25nIHRvIHRoaXMgT2JzZXJ2YWJsZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZShvYnNlcnZlcjogbnVsbCB8IE9ic2VydmVyPFQ+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvYnNlcnZlcikge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcilcblxuICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2RlZmVyVW5yZWdpc3RlcihvYnNlcnZlcilcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY2FsbGJhY2sgZnJvbSB0aGUgT2JzZXJ2YWJsZSBvYmplY3RcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gdGhlIGNhbGxiYWNrIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gc2NvcGUgLSBvcHRpb25hbCBzY29wZS4gSWYgdXNlZCBvbmx5IHRoZSBjYWxsYmFja3Mgd2l0aCB0aGlzIHNjb3BlIHdpbGwgYmUgcmVtb3ZlZFxuICAgKiBAcmV0dXJucyBmYWxzZSBpZiBpdCBkb2Vzbid0IGJlbG9uZyB0byB0aGlzIE9ic2VydmFibGVcbiAgICovXG4gIHB1YmxpYyByZW1vdmVDYWxsYmFjayhcbiAgICBjYWxsYmFjazogKGV2ZW50RGF0YTogVCwgZXZlbnRTdGF0ZTogT2JzZXJ2ZXJFdmVudFN0YXRlKSA9PiB2b2lkLFxuICAgIHNjb3BlPzogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9vYnNlcnZlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX29ic2VydmVyc1tpbmRleF0uY2FsbGJhY2sgPT09IGNhbGxiYWNrICYmXG4gICAgICAgICghc2NvcGUgfHwgc2NvcGUgPT09IHRoaXMuX29ic2VydmVyc1tpbmRleF0uc2NvcGUpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fZGVmZXJVbnJlZ2lzdGVyKHRoaXMuX29ic2VydmVyc1tpbmRleF0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IGFsbCBPYnNlcnZlcnMgYnkgY2FsbGluZyB0aGVpciByZXNwZWN0aXZlIGNhbGxiYWNrIHdpdGggdGhlIGdpdmVuIGRhdGFcbiAgICogV2lsbCByZXR1cm4gdHJ1ZSBpZiBhbGwgb2JzZXJ2ZXJzIHdlcmUgZXhlY3V0ZWQsIGZhbHNlIGlmIGFuIG9ic2VydmVyIHNldCBza2lwTmV4dE9ic2VydmVycyB0byB0cnVlLCB0aGVuIHByZXZlbnQgdGhlIHN1YnNlcXVlbnQgb25lcyB0byBleGVjdXRlXG4gICAqIEBwYXJhbSBldmVudERhdGEgLSBkZWZpbmVzIHRoZSBkYXRhIHRvIHNlbmQgdG8gYWxsIG9ic2VydmVyc1xuICAgKiBAcGFyYW0gbWFzayAtIGRlZmluZXMgdGhlIG1hc2sgb2YgdGhlIGN1cnJlbnQgbm90aWZpY2F0aW9uIChvYnNlcnZlcnMgd2l0aCBpbmNvbXBhdGlibGUgbWFzayAoaWUgbWFzayAmIG9ic2VydmVyLm1hc2sgPT09IDApIHdpbGwgbm90IGJlIG5vdGlmaWVkKVxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gZGVmaW5lcyB0aGUgb3JpZ2luYWwgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKiBAcGFyYW0gY3VycmVudFRhcmdldCAtIGRlZmluZXMgdGhlIGN1cnJlbnQgdGFyZ2V0IG9mIHRoZSBzdGF0ZVxuICAgKiBAcmV0dXJucyBmYWxzZSBpZiB0aGUgY29tcGxldGUgb2JzZXJ2ZXIgY2hhaW4gd2FzIG5vdCBwcm9jZXNzZWQgKGJlY2F1c2Ugb25lIG9ic2VydmVyIHNldCB0aGUgc2tpcE5leHRPYnNlcnZlcnMgdG8gdHJ1ZSlcbiAgICovXG4gIHB1YmxpYyBub3RpZnlPYnNlcnZlcnMoXG4gICAgZXZlbnREYXRhOiBULFxuICAgIG1hc2s6IG51bWJlciA9IC0xLFxuICAgIHRhcmdldD86IGFueSxcbiAgICBjdXJyZW50VGFyZ2V0PzogYW55XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5fb2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX2V2ZW50U3RhdGVcbiAgICBzdGF0ZS5tYXNrID0gbWFza1xuICAgIHN0YXRlLnRhcmdldCA9IHRhcmdldFxuICAgIHN0YXRlLmN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0XG4gICAgc3RhdGUuc2tpcE5leHRPYnNlcnZlcnMgPSBmYWxzZVxuICAgIHN0YXRlLmxhc3RSZXR1cm5WYWx1ZSA9IGV2ZW50RGF0YVxuXG4gICAgZm9yIChjb25zdCBvYnMgb2YgdGhpcy5fb2JzZXJ2ZXJzKSB7XG4gICAgICBpZiAob2JzLl93aWxsQmVVbnJlZ2lzdGVyZWQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKG9icy5tYXNrICYgbWFzaykge1xuICAgICAgICBpZiAob2JzLnNjb3BlKSB7XG4gICAgICAgICAgc3RhdGUubGFzdFJldHVyblZhbHVlID0gb2JzLmNhbGxiYWNrLmFwcGx5KG9icy5zY29wZSwgW1xuICAgICAgICAgICAgZXZlbnREYXRhLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICBdKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLmxhc3RSZXR1cm5WYWx1ZSA9IG9icy5jYWxsYmFjayhldmVudERhdGEsIHN0YXRlKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9icy51bnJlZ2lzdGVyT25OZXh0Q2FsbCkge1xuICAgICAgICAgIHRoaXMuX2RlZmVyVW5yZWdpc3RlcihvYnMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5za2lwTmV4dE9ic2VydmVycykge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsaW5nIHRoaXMgd2lsbCBleGVjdXRlIGVhY2ggY2FsbGJhY2ssIGV4cGVjdGluZyBpdCB0byBiZSBhIHByb21pc2Ugb3IgcmV0dXJuIGEgdmFsdWUuXG4gICAqIElmIGF0IGFueSBwb2ludCBpbiB0aGUgY2hhaW4gb25lIGZ1bmN0aW9uIGZhaWxzLCB0aGUgcHJvbWlzZSB3aWxsIGZhaWwgYW5kIHRoZSBleGVjdXRpb24gd2lsbCBub3QgY29udGludWUuXG4gICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSBjaGFpbiBvZiBldmVudHMgKHNvbWV0aW1lcyBhc3luYyBldmVudHMpIGlzIG5lZWRlZCB0byBpbml0aWFsaXplIGEgY2VydGFpbiBvYmplY3RcbiAgICogYW5kIGl0IGlzIGNydWNpYWwgdGhhdCBhbGwgY2FsbGJhY2tzIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAqIFRoZSBvcmRlciBvZiB0aGUgY2FsbGJhY2tzIGlzIGtlcHQsIGNhbGxiYWNrcyBhcmUgbm90IGV4ZWN1dGVkIHBhcmFsbGVsLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnREYXRhIC0gVGhlIGRhdGEgdG8gYmUgc2VudCB0byBlYWNoIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBtYXNrIC0gaXMgdXNlZCB0byBmaWx0ZXIgb2JzZXJ2ZXJzIGRlZmF1bHRzIHRvIC0xXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBkZWZpbmVzIHRoZSBjYWxsYmFjayB0YXJnZXQgKHNlZSBFdmVudFN0YXRlKVxuICAgKiBAcGFyYW0gY3VycmVudFRhcmdldCAtIGRlZmluZXMgaGUgY3VycmVudCBvYmplY3QgaW4gdGhlIGJ1YmJsaW5nIHBoYXNlXG4gICAqIEByZXR1cm5zIHdpbGwgcmV0dXJuIGEgUHJvbWlzZSB0aGFuIHJlc29sdmVzIHdoZW4gYWxsIGNhbGxiYWNrcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkuXG4gICAqL1xuICBwdWJsaWMgbm90aWZ5T2JzZXJ2ZXJzV2l0aFByb21pc2UoXG4gICAgZXZlbnREYXRhOiBULFxuICAgIG1hc2s6IG51bWJlciA9IC0xLFxuICAgIHRhcmdldD86IGFueSxcbiAgICBjdXJyZW50VGFyZ2V0PzogYW55XG4gICk6IFByb21pc2U8VD4ge1xuICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBwcm9taXNlXG4gICAgbGV0IHA6IFByb21pc2U8YW55PiA9IFByb21pc2UucmVzb2x2ZShldmVudERhdGEpXG5cbiAgICAvLyBubyBvYnNlcnZlcnM/IHJldHVybiB0aGlzIHByb21pc2UuXG4gICAgaWYgKCF0aGlzLl9vYnNlcnZlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcFxuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fZXZlbnRTdGF0ZVxuICAgIHN0YXRlLm1hc2sgPSBtYXNrXG4gICAgc3RhdGUudGFyZ2V0ID0gdGFyZ2V0XG4gICAgc3RhdGUuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXRcbiAgICBzdGF0ZS5za2lwTmV4dE9ic2VydmVycyA9IGZhbHNlXG5cbiAgICAvLyBleGVjdXRlIG9uZSBjYWxsYmFjayBhZnRlciBhbm90aGVyIChub3QgdXNpbmcgUHJvbWlzZS5hbGwsIHRoZSBvcmRlciBpcyBpbXBvcnRhbnQpXG4gICAgdGhpcy5fb2JzZXJ2ZXJzLmZvckVhY2goKG9icykgPT4ge1xuICAgICAgaWYgKHN0YXRlLnNraXBOZXh0T2JzZXJ2ZXJzKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG9icy5fd2lsbEJlVW5yZWdpc3RlcmVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKG9icy5tYXNrICYgbWFzaykge1xuICAgICAgICBpZiAob2JzLnNjb3BlKSB7XG4gICAgICAgICAgcCA9IHAudGhlbigobGFzdFJldHVybmVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLmxhc3RSZXR1cm5WYWx1ZSA9IGxhc3RSZXR1cm5lZFZhbHVlXG4gICAgICAgICAgICByZXR1cm4gb2JzLmNhbGxiYWNrLmFwcGx5KG9icy5zY29wZSwgW2V2ZW50RGF0YSwgc3RhdGVdKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcCA9IHAudGhlbigobGFzdFJldHVybmVkVmFsdWUpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLmxhc3RSZXR1cm5WYWx1ZSA9IGxhc3RSZXR1cm5lZFZhbHVlXG4gICAgICAgICAgICByZXR1cm4gb2JzLmNhbGxiYWNrKGV2ZW50RGF0YSwgc3RhdGUpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAob2JzLnVucmVnaXN0ZXJPbk5leHRDYWxsKSB7XG4gICAgICAgICAgdGhpcy5fZGVmZXJVbnJlZ2lzdGVyKG9icylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyByZXR1cm4gdGhlIGV2ZW50RGF0YVxuICAgIHJldHVybiBwLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGV2ZW50RGF0YVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IGEgc3BlY2lmaWMgb2JzZXJ2ZXJcbiAgICogQHBhcmFtIG9ic2VydmVyIC0gZGVmaW5lcyB0aGUgb2JzZXJ2ZXIgdG8gbm90aWZ5XG4gICAqIEBwYXJhbSBldmVudERhdGEgLSBkZWZpbmVzIHRoZSBkYXRhIHRvIGJlIHNlbnQgdG8gZWFjaCBjYWxsYmFja1xuICAgKiBAcGFyYW0gbWFzayAtIGlzIHVzZWQgdG8gZmlsdGVyIG9ic2VydmVycyBkZWZhdWx0cyB0byAtMVxuICAgKi9cbiAgcHVibGljIG5vdGlmeU9ic2VydmVyKFxuICAgIG9ic2VydmVyOiBPYnNlcnZlcjxUPixcbiAgICBldmVudERhdGE6IFQsXG4gICAgbWFzazogbnVtYmVyID0gLTFcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9ldmVudFN0YXRlXG4gICAgc3RhdGUubWFzayA9IG1hc2tcbiAgICBzdGF0ZS5za2lwTmV4dE9ic2VydmVycyA9IGZhbHNlXG5cbiAgICBvYnNlcnZlci5jYWxsYmFjayhldmVudERhdGEsIHN0YXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlIG9ic2VydmFibGUgaGFzIGF0IGxlYXN0IG9uZSBvYnNlcnZlclxuICAgKiBAcmV0dXJucyB0cnVlIGlzIHRoZSBPYnNlcnZhYmxlIGhhcyBhdCBsZWFzdCBvbmUgT2JzZXJ2ZXIgcmVnaXN0ZXJlZFxuICAgKi9cbiAgcHVibGljIGhhc09ic2VydmVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb2JzZXJ2ZXJzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgbGlzdCBvZiBvYnNlcnZlcnNcbiAgICovXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLl9vYnNlcnZlcnMgPSBuZXcgQXJyYXk8T2JzZXJ2ZXI8VD4+KClcbiAgICB0aGlzLl9vbk9ic2VydmVyQWRkZWQgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQ2xvbmUgdGhlIGN1cnJlbnQgb2JzZXJ2YWJsZVxuICAgKiBAcmV0dXJucyBhIG5ldyBvYnNlcnZhYmxlXG4gICAqL1xuICBwdWJsaWMgY2xvbmUoKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IE9ic2VydmFibGU8VD4oKVxuXG4gICAgcmVzdWx0Ll9vYnNlcnZlcnMgPSB0aGlzLl9vYnNlcnZlcnMuc2xpY2UoMClcblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIHRoaXMgb2JzZXJ2YWJsZSBoYW5kbGVzIG9ic2VydmVyIHJlZ2lzdGVyZWQgd2l0aCBhIGdpdmVuIG1hc2tcbiAgICogQHBhcmFtIG1hc2sgLSBkZWZpbmVzIHRoZSBtYXNrIHRvIGJlIHRlc3RlZFxuICAgKiBAcmV0dXJucyB3aGV0aGVyIG9yIG5vdCBvbmUgb2JzZXJ2ZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSBnaXZlbiBtYXNrIGlzIGhhbmRlbGVkXG4gICAqL1xuICBwdWJsaWMgaGFzU3BlY2lmaWNNYXNrKG1hc2s6IG51bWJlciA9IC0xKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBvYnMgb2YgdGhpcy5fb2JzZXJ2ZXJzKSB7XG4gICAgICBpZiAob2JzLm1hc2sgJiBtYXNrIHx8IG9icy5tYXNrID09PSBtYXNrKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVmZXJVbnJlZ2lzdGVyKG9ic2VydmVyOiBPYnNlcnZlcjxUPik6IHZvaWQge1xuICAgIG9ic2VydmVyLnVucmVnaXN0ZXJPbk5leHRDYWxsID0gZmFsc2VcbiAgICBvYnNlcnZlci5fd2lsbEJlVW5yZWdpc3RlcmVkID0gdHJ1ZVxuICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAudGhlbi5iaW5kKFByb21pc2UucmVzb2x2ZSgpKShhc3luYyAoKSA9PiB0aGlzLl9yZW1vdmUob2JzZXJ2ZXIpKVxuICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpXG4gIH1cblxuICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIG5vdCBpdGVyYXRpbmcgb3ZlciBfb2JzZXJ2ZXJzIHRvIGF2b2lkIGNhbGxiYWNrIHNraXBwaW5nLlxuICAvLyBSZW1vdmVzIGFuIG9ic2VydmVyIGZyb20gdGhlIF9vYnNlcnZlciBBcnJheS5cbiAgcHJpdmF0ZSBfcmVtb3ZlKG9ic2VydmVyOiBudWxsIHwgT2JzZXJ2ZXI8VD4pOiBib29sZWFuIHtcbiAgICBpZiAoIW9ic2VydmVyKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX29ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKVxuXG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { Transport } from '@dcl/ecs';
2
+ export declare function createNetworkTransport(): Transport;
@@ -0,0 +1,16 @@
1
+ export function createNetworkTransport() {
2
+ function send(..._args) {
3
+ }
4
+ const type = 'network-transport';
5
+ return {
6
+ send,
7
+ type,
8
+ filter(message) {
9
+ if (message.transportType === type) {
10
+ return false;
11
+ }
12
+ return !!message;
13
+ }
14
+ };
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya1RyYW5zcG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnRlcm5hbC90cmFuc3BvcnRzL25ldHdvcmtUcmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxVQUFVLHNCQUFzQjtJQUVwQyxTQUFTLElBQUksQ0FBQyxHQUFHLEtBQVk7SUFFN0IsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFBO0lBQ2hDLE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSTtRQUNKLE1BQU0sQ0FBQyxPQUF5QjtZQUU5QixJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO2dCQUNsQyxPQUFPLEtBQUssQ0FBQTthQUNiO1lBSUQsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFBO1FBQ2xCLENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRyYW5zcG9ydE1lc3NhZ2UsIFRyYW5zcG9ydCB9IGZyb20gJ0BkY2wvZWNzJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmV0d29ya1RyYW5zcG9ydCgpOiBUcmFuc3BvcnQge1xuICAvLyBjb25zdCBycGMgPSBuZXcgUnBjVHJhbnNwb3J0KClcbiAgZnVuY3Rpb24gc2VuZCguLi5fYXJnczogYW55W10pIHtcbiAgICAvLyBjb25zb2xlLmxvZygnTmV0d29ya01lc3NhZ2UgU2VudDogJywgLi4uYXJncylcbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSAnbmV0d29yay10cmFuc3BvcnQnXG4gIHJldHVybiB7XG4gICAgc2VuZCxcbiAgICB0eXBlLFxuICAgIGZpbHRlcihtZXNzYWdlOiBUcmFuc3BvcnRNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAvLyBFY2hvIG1lc3NhZ2UsIGlnbm9yZSB0aGVtXG4gICAgICBpZiAobWVzc2FnZS50cmFuc3BvcnRUeXBlID09PSB0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBUT0RPOiBTdGF0aWMgZW50aXRpZXMgJiBOZXR3b3JrIGNvbXBvbmVudHNcblxuICAgICAgcmV0dXJuICEhbWVzc2FnZSAvLyB2YWxpZENvbXBvbmVudHMuaW5jbHVkZXMoY29tcG9uZW50SWQpXG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /// <reference types="@dcl/js-runtime" />
2
+ import { Transport } from '@dcl/ecs';
3
+ import type { CrdtSendToRendererRequest, CrdtSendToResponse } from '~system/EngineApi';
4
+ export declare type EngineApiForTransport = {
5
+ crdtSendToRenderer(body: CrdtSendToRendererRequest): Promise<CrdtSendToResponse>;
6
+ };
7
+ export declare function createRendererTransport(engineApi: EngineApiForTransport): Transport;
@@ -0,0 +1,39 @@
1
+ import { ECSComponentIDs } from '@dcl/ecs/dist/components/generated/ids.gen';
2
+ const componentIds = Object.values(ECSComponentIDs)
3
+ .filter((a) => typeof a === 'number')
4
+ .map(Number);
5
+ export function createRendererTransport(engineApi) {
6
+ async function sendToRenderer(message) {
7
+ const response = await engineApi.crdtSendToRenderer({
8
+ data: new Uint8Array(message)
9
+ });
10
+ if (response && response.data && response.data.length) {
11
+ if (rendererTransport.onmessage) {
12
+ for (const byteArray of response.data) {
13
+ rendererTransport.onmessage(byteArray);
14
+ }
15
+ }
16
+ }
17
+ }
18
+ const type = 'renderer';
19
+ const rendererTransport = {
20
+ type,
21
+ send(message) {
22
+ sendToRenderer(message).catch((error) => {
23
+ console.error(error);
24
+ debugger;
25
+ });
26
+ },
27
+ filter(message) {
28
+ if (message.transportType === type) {
29
+ return false;
30
+ }
31
+ if (!componentIds.includes(message.componentId)) {
32
+ return false;
33
+ }
34
+ return !!message;
35
+ }
36
+ };
37
+ return rendererTransport;
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyZXJUcmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJuYWwvdHJhbnNwb3J0cy9yZW5kZXJlclRyYW5zcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUE7QUFNNUUsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUM7S0FDaEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUM7S0FDcEMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBUWQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxTQUFnQztJQUVoQyxLQUFLLFVBQVUsY0FBYyxDQUFDLE9BQW1CO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLGtCQUFrQixDQUFDO1lBQ2xELElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUM7U0FDOUIsQ0FBQyxDQUFBO1FBRUYsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNyRCxJQUFJLGlCQUFpQixDQUFDLFNBQVMsRUFBRTtnQkFDL0IsS0FBSyxNQUFNLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFO29CQUNyQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUE7aUJBQ3ZDO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxVQUFVLENBQUE7SUFDdkIsTUFBTSxpQkFBaUIsR0FBYztRQUNuQyxJQUFJO1FBQ0osSUFBSSxDQUFDLE9BQW1CO1lBQ3RCLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDcEIsUUFBUSxDQUFBO1lBQ1YsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBQ0QsTUFBTSxDQUFDLE9BQXlCO1lBRTlCLElBQUksT0FBTyxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUU7Z0JBQ2xDLE9BQU8sS0FBSyxDQUFBO2FBQ2I7WUFHRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUU7Z0JBQy9DLE9BQU8sS0FBSyxDQUFBO2FBQ2I7WUFFRCxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUE7UUFDbEIsQ0FBQztLQUNGLENBQUE7SUFFRCxPQUFPLGlCQUFpQixDQUFBO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmFuc3BvcnQsIFRyYW5zcG9ydE1lc3NhZ2UgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IEVDU0NvbXBvbmVudElEcyB9IGZyb20gJ0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cy9nZW5lcmF0ZWQvaWRzLmdlbidcbmltcG9ydCB0eXBlIHtcbiAgQ3JkdFNlbmRUb1JlbmRlcmVyUmVxdWVzdCxcbiAgQ3JkdFNlbmRUb1Jlc3BvbnNlXG59IGZyb20gJ35zeXN0ZW0vRW5naW5lQXBpJ1xuXG5jb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3QudmFsdWVzKEVDU0NvbXBvbmVudElEcylcbiAgLmZpbHRlcigoYSkgPT4gdHlwZW9mIGEgPT09ICdudW1iZXInKVxuICAubWFwKE51bWJlcilcblxuZXhwb3J0IHR5cGUgRW5naW5lQXBpRm9yVHJhbnNwb3J0ID0ge1xuICBjcmR0U2VuZFRvUmVuZGVyZXIoXG4gICAgYm9keTogQ3JkdFNlbmRUb1JlbmRlcmVyUmVxdWVzdFxuICApOiBQcm9taXNlPENyZHRTZW5kVG9SZXNwb25zZT5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlbmRlcmVyVHJhbnNwb3J0KFxuICBlbmdpbmVBcGk6IEVuZ2luZUFwaUZvclRyYW5zcG9ydFxuKTogVHJhbnNwb3J0IHtcbiAgYXN5bmMgZnVuY3Rpb24gc2VuZFRvUmVuZGVyZXIobWVzc2FnZTogVWludDhBcnJheSkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZW5naW5lQXBpLmNyZHRTZW5kVG9SZW5kZXJlcih7XG4gICAgICBkYXRhOiBuZXcgVWludDhBcnJheShtZXNzYWdlKVxuICAgIH0pXG5cbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLmxlbmd0aCkge1xuICAgICAgaWYgKHJlbmRlcmVyVHJhbnNwb3J0Lm9ubWVzc2FnZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGJ5dGVBcnJheSBvZiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgcmVuZGVyZXJUcmFuc3BvcnQub25tZXNzYWdlKGJ5dGVBcnJheSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHR5cGUgPSAncmVuZGVyZXInXG4gIGNvbnN0IHJlbmRlcmVyVHJhbnNwb3J0OiBUcmFuc3BvcnQgPSB7XG4gICAgdHlwZSxcbiAgICBzZW5kKG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICAgIHNlbmRUb1JlbmRlcmVyKG1lc3NhZ2UpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKVxuICAgICAgICBkZWJ1Z2dlclxuICAgICAgfSlcbiAgICB9LFxuICAgIGZpbHRlcihtZXNzYWdlOiBUcmFuc3BvcnRNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAvLyBFY2hvIG1lc3NhZ2UsIGlnbm9yZSB0aGVtXG4gICAgICBpZiAobWVzc2FnZS50cmFuc3BvcnRUeXBlID09PSB0eXBlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICAvLyBPbmx5IHNlbmQgcmVuZGVyZXIgY29tcG9uZW50cyAoUHJvdG8gR2VuZXJhdGVkKVxuICAgICAgaWYgKCFjb21wb25lbnRJZHMuaW5jbHVkZXMobWVzc2FnZS5jb21wb25lbnRJZCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhIW1lc3NhZ2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVuZGVyZXJUcmFuc3BvcnRcbn1cbiJdfQ==
package/math.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from '@dcl/ecs-math';
2
+ export * from '@dcl/ecs-math/dist/Matrix';
3
+ export * from '@dcl/ecs-math/dist/Plane';
package/math.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from '@dcl/ecs-math';
2
+ export * from '@dcl/ecs-math/dist/Matrix';
3
+ export * from '@dcl/ecs-math/dist/Plane';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy9tYXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZUFBZSxDQUFBO0FBQzdCLGNBQWMsMkJBQTJCLENBQUE7QUFDekMsY0FBYywwQkFBMEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJ0BkY2wvZWNzLW1hdGgnXG5leHBvcnQgKiBmcm9tICdAZGNsL2Vjcy1tYXRoL2Rpc3QvTWF0cml4J1xuZXhwb3J0ICogZnJvbSAnQGRjbC9lY3MtbWF0aC9kaXN0L1BsYW5lJ1xuIl19
@@ -0,0 +1,10 @@
1
+ import { Observer } from './internal/Observable';
2
+ import { IEvents } from './observables';
3
+ export declare class MessageBus {
4
+ private messageQueue;
5
+ private flushing;
6
+ constructor();
7
+ on(message: string, callback: (value: any, sender: string) => void): Observer<IEvents['comms']>;
8
+ emit(message: string, payload: Record<any, any>): void;
9
+ private flush;
10
+ }
package/messageBus.js ADDED
@@ -0,0 +1,43 @@
1
+ import { onCommsMessage } from './observables';
2
+ import * as communicationsController from '~system/CommunicationsController';
3
+ export class MessageBus {
4
+ constructor() {
5
+ this.messageQueue = [];
6
+ this.flushing = false;
7
+ }
8
+ on(message, callback) {
9
+ return onCommsMessage.add((e) => {
10
+ const m = JSON.parse(e.message);
11
+ if (m.message === message) {
12
+ callback(m.payload, e.sender);
13
+ }
14
+ });
15
+ }
16
+ sendRaw(message) {
17
+ this.messageQueue.push(message);
18
+ this.flush();
19
+ }
20
+ emit(message, payload) {
21
+ const messageToSend = JSON.stringify({ message, payload });
22
+ this.sendRaw(messageToSend);
23
+ onCommsMessage.notifyObservers({
24
+ message: messageToSend,
25
+ sender: 'self'
26
+ });
27
+ }
28
+ flush() {
29
+ if (this.messageQueue.length === 0)
30
+ return;
31
+ if (this.flushing)
32
+ return;
33
+ const message = this.messageQueue.shift();
34
+ this.flushing = true;
35
+ communicationsController.send({ message }).then((_) => {
36
+ this.flushing = false;
37
+ this.flush();
38
+ }, (_) => {
39
+ this.flushing = false;
40
+ });
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZUJ1cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy9tZXNzYWdlQnVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBVyxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdkQsT0FBTyxLQUFLLHdCQUF3QixNQUFNLGtDQUFrQyxDQUFBO0FBTTVFLE1BQU0sT0FBTyxVQUFVO0lBSXJCO1FBSFEsaUJBQVksR0FBYSxFQUFFLENBQUE7UUFDM0IsYUFBUSxHQUFHLEtBQUssQ0FBQTtJQUVULENBQUM7SUFFaEIsRUFBRSxDQUNBLE9BQWUsRUFDZixRQUE4QztRQUU5QyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUUvQixJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO2dCQUN6QixRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7YUFDOUI7UUFDSCxDQUFDLENBQUUsQ0FBQTtJQUNMLENBQUM7SUFHRCxPQUFPLENBQUMsT0FBZTtRQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUUvQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxPQUF5QjtRQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDMUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtRQUMzQixjQUFjLENBQUMsZUFBZSxDQUFDO1lBQzdCLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFNO1FBQzFDLElBQUksSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFNO1FBRXpCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFHLENBQUE7UUFFMUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFFcEIsd0JBQXdCLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzdDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDSixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtZQUNyQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDZCxDQUFDLEVBQ0QsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNKLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLENBQUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JzZXJ2ZXIgfSBmcm9tICcuL2ludGVybmFsL09ic2VydmFibGUnXG5pbXBvcnQgeyBJRXZlbnRzLCBvbkNvbW1zTWVzc2FnZSB9IGZyb20gJy4vb2JzZXJ2YWJsZXMnXG5pbXBvcnQgKiBhcyBjb21tdW5pY2F0aW9uc0NvbnRyb2xsZXIgZnJvbSAnfnN5c3RlbS9Db21tdW5pY2F0aW9uc0NvbnRyb2xsZXInXG5cbi8qKlxuICogQGFscGhhXG4gKiBAZGVwcmVjYXRlZCB0aGlzIHdpbGwgb25seSBleGlzdCBmb3IgYSBmZXcgcmVsZWFzZXMgaW4gRUNTN1xuICovXG5leHBvcnQgY2xhc3MgTWVzc2FnZUJ1cyB7XG4gIHByaXZhdGUgbWVzc2FnZVF1ZXVlOiBzdHJpbmdbXSA9IFtdXG4gIHByaXZhdGUgZmx1c2hpbmcgPSBmYWxzZVxuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBvbihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgY2FsbGJhY2s6ICh2YWx1ZTogYW55LCBzZW5kZXI6IHN0cmluZykgPT4gdm9pZFxuICApOiBPYnNlcnZlcjxJRXZlbnRzWydjb21tcyddPiB7XG4gICAgcmV0dXJuIG9uQ29tbXNNZXNzYWdlLmFkZCgoZSkgPT4ge1xuICAgICAgY29uc3QgbSA9IEpTT04ucGFyc2UoZS5tZXNzYWdlKVxuXG4gICAgICBpZiAobS5tZXNzYWdlID09PSBtZXNzYWdlKSB7XG4gICAgICAgIGNhbGxiYWNrKG0ucGF5bG9hZCwgZS5zZW5kZXIpXG4gICAgICB9XG4gICAgfSkhXG4gIH1cblxuICAvLyBAaW50ZXJuYWxcbiAgc2VuZFJhdyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICB0aGlzLm1lc3NhZ2VRdWV1ZS5wdXNoKG1lc3NhZ2UpXG5cbiAgICB0aGlzLmZsdXNoKClcbiAgfVxuXG4gIGVtaXQobWVzc2FnZTogc3RyaW5nLCBwYXlsb2FkOiBSZWNvcmQ8YW55LCBhbnk+KSB7XG4gICAgY29uc3QgbWVzc2FnZVRvU2VuZCA9IEpTT04uc3RyaW5naWZ5KHsgbWVzc2FnZSwgcGF5bG9hZCB9KVxuICAgIHRoaXMuc2VuZFJhdyhtZXNzYWdlVG9TZW5kKVxuICAgIG9uQ29tbXNNZXNzYWdlLm5vdGlmeU9ic2VydmVycyh7XG4gICAgICBtZXNzYWdlOiBtZXNzYWdlVG9TZW5kLFxuICAgICAgc2VuZGVyOiAnc2VsZidcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaCgpIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlUXVldWUubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBpZiAodGhpcy5mbHVzaGluZykgcmV0dXJuXG5cbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5tZXNzYWdlUXVldWUuc2hpZnQoKSFcblxuICAgIHRoaXMuZmx1c2hpbmcgPSB0cnVlXG5cbiAgICBjb21tdW5pY2F0aW9uc0NvbnRyb2xsZXIuc2VuZCh7IG1lc3NhZ2UgfSkudGhlbihcbiAgICAgIChfKSA9PiB7XG4gICAgICAgIHRoaXMuZmx1c2hpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLmZsdXNoKClcbiAgICAgIH0sXG4gICAgICAoXykgPT4ge1xuICAgICAgICB0aGlzLmZsdXNoaW5nID0gZmFsc2VcbiAgICAgIH1cbiAgICApXG4gIH1cbn1cbiJdfQ==