@dcl/sdk 7.31.1-40536151736.commit-a09f320 → 7.31.1-40604676255.commit-cb3ed84

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 (82) hide show
  1. package/internal/transports/rendererTransport.js +2 -5
  2. package/network/binary-message-bus.d.ts +3 -6
  3. package/network/binary-message-bus.js +5 -9
  4. package/network/index.d.ts +2 -8
  5. package/network/index.js +3 -16
  6. package/network/message-bus-sync.d.ts +3 -16
  7. package/network/message-bus-sync.js +103 -164
  8. package/network/state.js +5 -3
  9. package/package.json +6 -6
  10. package/players/index.d.ts +1 -0
  11. package/players/index.js +2 -1
  12. package/src/internal/transports/rendererTransport.ts +1 -4
  13. package/src/network/binary-message-bus.ts +4 -9
  14. package/src/network/index.ts +3 -40
  15. package/src/network/message-bus-sync.ts +112 -180
  16. package/src/network/state.ts +4 -3
  17. package/src/players/index.ts +2 -0
  18. package/src/testing/runtime.ts +0 -3
  19. package/testing/runtime.js +1 -4
  20. package/atom.d.ts +0 -19
  21. package/atom.js +0 -83
  22. package/future.d.ts +0 -8
  23. package/future.js +0 -26
  24. package/network/chunking.d.ts +0 -5
  25. package/network/chunking.js +0 -38
  26. package/network/events/implementation.d.ts +0 -93
  27. package/network/events/implementation.js +0 -221
  28. package/network/events/index.d.ts +0 -42
  29. package/network/events/index.js +0 -43
  30. package/network/events/protocol.d.ts +0 -27
  31. package/network/events/protocol.js +0 -66
  32. package/network/events/registry.d.ts +0 -8
  33. package/network/events/registry.js +0 -3
  34. package/network/server/index.d.ts +0 -14
  35. package/network/server/index.js +0 -256
  36. package/network/server/utils.d.ts +0 -18
  37. package/network/server/utils.js +0 -135
  38. package/server/env-var.d.ts +0 -15
  39. package/server/env-var.js +0 -31
  40. package/server/index.d.ts +0 -2
  41. package/server/index.js +0 -3
  42. package/server/storage/constants.d.ts +0 -80
  43. package/server/storage/constants.js +0 -19
  44. package/server/storage/error-message.d.ts +0 -1
  45. package/server/storage/error-message.js +0 -9
  46. package/server/storage/index.d.ts +0 -54
  47. package/server/storage/index.js +0 -60
  48. package/server/storage/player.d.ts +0 -60
  49. package/server/storage/player.js +0 -244
  50. package/server/storage/scene.d.ts +0 -55
  51. package/server/storage/scene.js +0 -232
  52. package/server/storage/serialize.d.ts +0 -1
  53. package/server/storage/serialize.js +0 -135
  54. package/server/storage/value-cache.d.ts +0 -1
  55. package/server/storage/value-cache.js +0 -67
  56. package/server/storage/write-queue.d.ts +0 -1
  57. package/server/storage/write-queue.js +0 -113
  58. package/server/storage-url.d.ts +0 -13
  59. package/server/storage-url.js +0 -42
  60. package/server/utils.d.ts +0 -35
  61. package/server/utils.js +0 -74
  62. package/src/atom.ts +0 -98
  63. package/src/future.ts +0 -38
  64. package/src/network/chunking.ts +0 -45
  65. package/src/network/events/implementation.ts +0 -271
  66. package/src/network/events/index.ts +0 -48
  67. package/src/network/events/protocol.ts +0 -94
  68. package/src/network/events/registry.ts +0 -18
  69. package/src/network/server/index.ts +0 -341
  70. package/src/network/server/utils.ts +0 -189
  71. package/src/server/env-var.ts +0 -36
  72. package/src/server/index.ts +0 -12
  73. package/src/server/storage/constants.ts +0 -112
  74. package/src/server/storage/error-message.ts +0 -8
  75. package/src/server/storage/index.ts +0 -83
  76. package/src/server/storage/player.ts +0 -345
  77. package/src/server/storage/scene.ts +0 -324
  78. package/src/server/storage/serialize.ts +0 -132
  79. package/src/server/storage/value-cache.ts +0 -119
  80. package/src/server/storage/write-queue.ts +0 -174
  81. package/src/server/storage-url.ts +0 -49
  82. package/src/server/utils.ts +0 -88
package/network/state.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer';
2
2
  import { CrdtMessageProtocol, CrdtMessageType, PutComponentOperation, PutNetworkComponentOperation, NetworkEntity as _NetworkEntity, VideoEvent, AudioEvent, EngineInfo, GltfContainerLoadingState, PhysicsCombinedForce, PhysicsCombinedImpulse, PointerEventsResult, RaycastResult, RealmInfo, TweenState, UiDropdown, UiDropdownResult, UiInput, UiInputResult, UiText, UiTransform, TriggerAreaResult } from '@dcl/ecs';
3
- import { LIVEKIT_MAX_SIZE } from './server';
3
+ import { LIVEKIT_MAX_SIZE } from '@dcl/ecs/dist/systems/crdt';
4
4
  export const NOT_SYNC_COMPONENTS = [
5
5
  VideoEvent,
6
6
  TweenState,
@@ -42,7 +42,8 @@ export function engineToCrdt(engine) {
42
42
  continue;
43
43
  }
44
44
  itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
45
- return NetworkEntity.has(entity);
45
+ const isNetworkEntity = NetworkEntity.has(entity);
46
+ return isNetworkEntity;
46
47
  });
47
48
  }
48
49
  let header;
@@ -60,6 +61,7 @@ export function engineToCrdt(engine) {
60
61
  networkBuffer.resetBuffer();
61
62
  }
62
63
  // If the message itself is larger than the limit, we need to handle it specially
64
+ // For now, we'll skip it to prevent infinite loops
63
65
  if (messageSize / 1024 > LIVEKIT_MAX_SIZE) {
64
66
  console.error(`Message too large (${messageSize} bytes), skipping component ${message.componentId} for entity ${message.entityId}`);
65
67
  continue;
@@ -79,4 +81,4 @@ export function engineToCrdt(engine) {
79
81
  }
80
82
  return chunks;
81
83
  }
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsNEJBQTRCLEVBRTVCLGFBQWEsSUFBSSxjQUFjLEVBRS9CLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxhQUFhLEVBQ2IsTUFBTSxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsRUFFbEIsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBRTNDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFtQztJQUNqRSxVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YseUJBQXlCO0lBQ3pCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixTQUFTO0lBQ1QsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixPQUFPO0lBQ1AsYUFBYTtJQUNiLFdBQVc7SUFDWCxNQUFNO0lBQ04saUJBQWlCO0NBQ2xCLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtBQUNwRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBYTtJQUNqRCxxQkFBcUI7SUFDckIsMEJBQTBCO0NBQzNCLENBQUE7QUFFRCxNQUFN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TUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1NBQzlDO0tBQ0Y7SUFFRCw0Q0FBNEM7SUFDNUMsSUFBSSxhQUFhLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQTtLQUN0QztJQUVELE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlYWRXcml0ZUJ5dGVCdWZmZXIgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3NlcmlhbGl6YXRpb24vQnl0ZUJ1ZmZlcidcbmltcG9ydCB7XG4gIENyZHRNZXNzYWdlSGVhZGVyLFxuICBDcmR0TWVzc2FnZVByb3RvY29sLFxuICBDcmR0TWVzc2FnZVR5cGUsXG4gIElFbmdpbmUsXG4gIFB1dENvbXBvbmVudE9wZXJhdGlvbixcbiAgUHV0TmV0d29ya0NvbXBvbmVudE9wZXJhdGlvbixcbiAgU3luY0NvbXBvbmVudHMgYXMgX1N5bmNDb21wb25lbnRzLFxuICBOZXR3b3JrRW50aXR5IGFzIF9OZXR3b3JrRW50aXR5LFxuICBJTmV0b3dya0VudGl0eSxcbiAgVmlkZW9FdmVudCxcbiAgQXVkaW9FdmVudCxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUGh5c2ljc0NvbWJpbmVkRm9yY2UsXG4gIFBoeXNpY3NDb21iaW5lZEltcHVsc2UsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVHdlZW5TdGF0ZSxcbiAgVWlEcm9wZG93bixcbiAgVWlEcm9wZG93blJlc3VsdCxcbiAgVWlJbnB1dCxcbiAgVWlJbnB1dFJlc3VsdCxcbiAgVWlUZXh0LFxuICBVaVRyYW5zZm9ybSxcbiAgVHJpZ2dlckFyZWFSZXN1bHQsXG4gIENvbXBvbmVudERlZmluaXRpb25cbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBMSVZFS0lUX01BWF9TSVpFIH0gZnJvbSAnLi9zZXJ2ZXInXG5cbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTOiBDb21wb25lbnREZWZpbml0aW9uPHVua25vd24+W10gPSBbXG4gIFZpZGVvRXZlbnQsXG4gIFR3ZWVuU3RhdGUsXG4gIEF1ZGlvRXZlbnQsXG4gIEVuZ2luZUluZm8sXG4gIEdsdGZDb250YWluZXJMb2FkaW5nU3RhdGUsXG4gIFBoeXNpY3NDb21iaW5lZEZvcmNlLFxuICBQaHlzaWNzQ29tYmluZWRJbXB1bHNlLFxuICBQb2ludGVyRXZlbnRzUmVzdWx0LFxuICBSYXljYXN0UmVzdWx0LFxuICBSZWFsbUluZm8sXG4gIFVpRHJvcGRvd24sXG4gIFVpRHJvcGRvd25SZXN1bHQsXG4gIFVpSW5wdXQsXG4gIFVpSW5wdXRSZXN1bHQsXG4gIFVpVHJhbnNmb3JtLFxuICBVaVRleHQsXG4gIFRyaWdnZXJBcmVhUmVzdWx0XG5dXG5cbmV4cG9ydCBjb25zdCBOT1RfU1lOQ19DT01QT05FTlRTX0lEUyA9IE5PVF9TWU5DX0NPTVBPTkVOVFMubWFwKCgkKSA9PiAkLmNvbXBvbmVudElkKVxuZXhwb3J0IGNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFNfTkFNRVM6IHN0cmluZ1tdID0gW1xuICAnYXNzZXQtcGFja3M6OlNjcmlwdCcsIC8vIENvbXBvbmVudE5hbWUgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2RlY2VudHJhbGFuZC9hc3NldC1wYWNrcy9ibG9iL21haW4vc3JjL2VudW1zLnRzXG4gICdhc3NldC1wYWNrczo6QWN0aW9uVHlwZXMnXG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTeW5jQ29tcG9uZW50KGNvbXBvbmVudDogQ29tcG9uZW50RGVmaW5pdGlvbjx1bmtub3duPik6IGJvb2xlYW4ge1xuICByZXR1cm4gIShcbiAgICBOT1RfU1lOQ19DT01QT05FTlRTX0lEUy5pbmNsdWRlcyhjb21wb25lbnQuY29tcG9uZW50SWQpIHx8XG4gICAgTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUy5pbmNsdWRlcyhjb21wb25lbnQuY29tcG9uZW50TmFtZSlcbiAgKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVzeW5jZWRDb21wb25lbnRzKGVuZ2luZTogSUVuZ2luZSk6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXSB7XG4gIHJldHVybiBbLi4uTk9UX1NZTkNfQ09NUE9ORU5UUywgLi4uTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUy5tYXAoKCQpID0+IGVuZ2luZS5nZXRDb21wb25lbnRPck51bGwoJCkpXS5maWx0ZXIoXG4gICAgQm9vbGVhblxuICApIGFzIENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5naW5lVG9DcmR0KGVuZ2luZTogSUVuZ2luZSk6IFVpbnQ4QXJyYXlbXSB7XG4gIGNvbnN0IGNyZHRCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IG5ldHdvcmtCdWZmZXIgPSBuZXcgUmVhZFdyaXRlQnl0ZUJ1ZmZlcigpXG4gIGNvbnN0IE5ldHdvcmtFbnRpdHkgPSBlbmdpbmUuZ2V0Q29tcG9uZW50KF9OZXR3b3JrRW50aXR5LmNvbXBvbmVudElkKSBhcyBJTmV0b3dya0VudGl0eVxuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdXG5cbiAgZm9yIChjb25zdCBpdENvbXBvbmVudERlZmluaXRpb24gb2YgZW5naW5lLmNvbXBvbmVudHNJdGVyKCkpIHtcbiAgICBpZiAoIXNob3VsZFN5bmNDb21wb25lbnQoaXRDb21wb25lbnREZWZpbml0aW9uKSkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBpdENvbXBvbmVudERlZmluaXRpb24uZHVtcENyZHRTdGF0ZVRvQnVmZmVyKGNyZHRCdWZmZXIsIChlbnRpdHkpID0+IHtcbiAgICAgIHJldHVybiBOZXR3b3JrRW50aXR5LmhhcyhlbnRpdHkpXG4gICAgfSlcbiAgfVxuXG4gIGxldCBoZWFkZXI6IENyZHRNZXNzYWdlSGVhZGVyIHwgbnVsbFxuICB3aGlsZSAoKGhlYWRlciA9IENyZHRNZXNzYWdlUHJvdG9jb2wuZ2V0SGVhZGVyKGNyZHRCdWZmZXIpKSkge1xuICAgIGlmIChoZWFkZXIudHlwZSA9PT0gQ3JkdE1lc3NhZ2VUeXBlLlBVVF9DT01QT05FTlQpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBQdXRDb21wb25lbnRPcGVyYXRpb24ucmVhZChjcmR0QnVmZmVyKSFcbiAgICAgIGNvbnN0IG5ldHdvcmtFbnRpdHkgPSBOZXR3b3JrRW50aXR5LmdldE9yTnVsbChtZXNzYWdlLmVudGl0eUlkKVxuXG4gICAgICAvLyBDaGVjayBpZiBhZGRpbmcgdGhpcyBtZXNzYWdlIHdvdWxkIGV4Y2VlZCB0aGUgc2l6ZSBsaW1pdFxuICAgICAgY29uc3QgY3VycmVudEJ1ZmZlclNpemUgPSBuZXR3b3JrQnVmZmVyLnRvQmluYXJ5KCkuYnl0ZUxlbmd0aFxuICAgICAgY29uc3QgbWVzc2FnZVNpemUgPSBtZXNzYWdlLmRhdGEuYnl0ZUxlbmd0aFxuXG4gICAgICBpZiAoKGN1cnJlbnRCdWZmZXJTaXplICsgbWVzc2FnZVNpemUpIC8gMTAyNCA+IExJVkVLSVRfTUFYX1NJWkUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgYnVmZmVyIGhhcyBjb250ZW50LCBzYXZlIGl0IGFzIGEgY2h1bmtcbiAgICAgICAgaWYgKGN1cnJlbnRCdWZmZXJTaXplID4gMCkge1xuICAgICAgICAgIGNodW5rcy5wdXNoKG5ldHdvcmtCdWZmZXIudG9Db3BpZWRCaW5hcnkoKSlcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyLnJlc2V0QnVmZmVyKClcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQsIHdlIG5lZWQgdG8gaGFuZGxlIGl0IHNwZWNpYWxseVxuICAgICAgICBpZiAobWVzc2FnZVNpemUgLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgTWVzc2FnZSB0b28gbGFyZ2UgKCR7bWVzc2FnZVNpemV9IGJ5dGVzKSwgc2tpcHBpbmcgY29tcG9uZW50ICR7bWVzc2FnZS5jb21wb25lbnRJZH0gZm9yIGVudGl0eSAke21lc3NhZ2UuZW50aXR5SWR9YFxuICAgICAgICAgIClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgICBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtFbnRpdHkubmV0d29ya0lkLFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3JkdEJ1ZmZlci5pbmNyZW1lbnRSZWFkT2Zmc2V0KGhlYWRlci5sZW5ndGgpXG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgZGF0YSBhcyB0aGUgZmluYWwgY2h1bmtcbiAgaWYgKG5ldHdvcmtCdWZmZXIuY3VycmVudFdyaXRlT2Zmc2V0KCkgPiAwKSB7XG4gICAgY2h1bmtzLnB1c2gobmV0d29ya0J1ZmZlci50b0JpbmFyeSgpKVxuICB9XG5cbiAgcmV0dXJuIGNodW5rc1xufVxuIl19
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbmV0d29yay9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUM1RSxPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLGVBQWUsRUFFZixxQkFBcUIsRUFDckIsNEJBQTRCLEVBRTVCLGFBQWEsSUFBSSxjQUFjLEVBRS9CLFVBQVUsRUFDVixVQUFVLEVBQ1YsVUFBVSxFQUNWLHlCQUF5QixFQUN6QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxhQUFhLEVBQ2IsTUFBTSxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsRUFFbEIsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFN0QsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQW1DO0lBQ2pFLFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsb0JBQW9CO0lBQ3BCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLFNBQVM7SUFDVCxVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLE9BQU87SUFDUCxhQUFhO0lBQ2IsV0FBVztJQUNYLE1BQU07SUFDTixpQkFBaUI7Q0FDbEIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFBO0FBQ3BGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFhO0lBQ2pELHFCQUFxQjtJQUNyQiwwQkFBMEI7Q0FDM0IsQ0FBQTtBQUVELE1B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Q0FBQTthQUNGO1NBQ0Y7YUFBTTtZQUNMLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7U0FDOUM7S0FDRjtJQUVELDRDQUE0QztJQUM1QyxJQUFJLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLENBQUMsRUFBRTtRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0tBQ3RDO0lBRUQsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZFdyaXRlQnl0ZUJ1ZmZlciB9IGZyb20gJ0BkY2wvZWNzL2Rpc3Qvc2VyaWFsaXphdGlvbi9CeXRlQnVmZmVyJ1xuaW1wb3J0IHtcbiAgQ3JkdE1lc3NhZ2VIZWFkZXIsXG4gIENyZHRNZXNzYWdlUHJvdG9jb2wsXG4gIENyZHRNZXNzYWdlVHlwZSxcbiAgSUVuZ2luZSxcbiAgUHV0Q29tcG9uZW50T3BlcmF0aW9uLFxuICBQdXROZXR3b3JrQ29tcG9uZW50T3BlcmF0aW9uLFxuICBTeW5jQ29tcG9uZW50cyBhcyBfU3luY0NvbXBvbmVudHMsXG4gIE5ldHdvcmtFbnRpdHkgYXMgX05ldHdvcmtFbnRpdHksXG4gIElOZXRvd3JrRW50aXR5LFxuICBWaWRlb0V2ZW50LFxuICBBdWRpb0V2ZW50LFxuICBFbmdpbmVJbmZvLFxuICBHbHRmQ29udGFpbmVyTG9hZGluZ1N0YXRlLFxuICBQaHlzaWNzQ29tYmluZWRGb3JjZSxcbiAgUGh5c2ljc0NvbWJpbmVkSW1wdWxzZSxcbiAgUG9pbnRlckV2ZW50c1Jlc3VsdCxcbiAgUmF5Y2FzdFJlc3VsdCxcbiAgUmVhbG1JbmZvLFxuICBUd2VlblN0YXRlLFxuICBVaURyb3Bkb3duLFxuICBVaURyb3Bkb3duUmVzdWx0LFxuICBVaUlucHV0LFxuICBVaUlucHV0UmVzdWx0LFxuICBVaVRleHQsXG4gIFVpVHJhbnNmb3JtLFxuICBUcmlnZ2VyQXJlYVJlc3VsdCxcbiAgQ29tcG9uZW50RGVmaW5pdGlvblxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IExJVkVLSVRfTUFYX1NJWkUgfSBmcm9tICdAZGNsL2Vjcy9kaXN0L3N5c3RlbXMvY3JkdCdcblxuZXhwb3J0IGNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFM6IENvbXBvbmVudERlZmluaXRpb248dW5rbm93bj5bXSA9IFtcbiAgVmlkZW9FdmVudCxcbiAgVHdlZW5TdGF0ZSxcbiAgQXVkaW9FdmVudCxcbiAgRW5naW5lSW5mbyxcbiAgR2x0ZkNvbnRhaW5lckxvYWRpbmdTdGF0ZSxcbiAgUGh5c2ljc0NvbWJpbmVkRm9yY2UsXG4gIFBoeXNpY3NDb21iaW5lZEltcHVsc2UsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJheWNhc3RSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVWlEcm9wZG93bixcbiAgVWlEcm9wZG93blJlc3VsdCxcbiAgVWlJbnB1dCxcbiAgVWlJbnB1dFJlc3VsdCxcbiAgVWlUcmFuc2Zvcm0sXG4gIFVpVGV4dCxcbiAgVHJpZ2dlckFyZWFSZXN1bHRcbl1cblxuZXhwb3J0IGNvbnN0IE5PVF9TWU5DX0NPTVBPTkVOVFNfSURTID0gTk9UX1NZTkNfQ09NUE9ORU5UUy5tYXAoKCQpID0+ICQuY29tcG9uZW50SWQpXG5leHBvcnQgY29uc3QgTk9UX1NZTkNfQ09NUE9ORU5UU19OQU1FUzogc3RyaW5nW10gPSBbXG4gICdhc3NldC1wYWNrczo6U2NyaXB0JywgLy8gQ29tcG9uZW50TmFtZSBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vZGVjZW50cmFsYW5kL2Fzc2V0LXBhY2tzL2Jsb2IvbWFpbi9zcmMvZW51bXMudHNcbiAgJ2Fzc2V0LXBhY2tzOjpBY3Rpb25UeXBlcydcbl1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFN5bmNDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnREZWZpbml0aW9uPHVua25vd24+KTogYm9vbGVhbiB7XG4gIHJldHVybiAhKFxuICAgIE5PVF9TWU5DX0NPTVBPTkVOVFNfSURTLmluY2x1ZGVzKGNvbXBvbmVudC5jb21wb25lbnRJZCkgfHxcbiAgICBOT1RfU1lOQ19DT01QT05FTlRTX05BTUVTLmluY2x1ZGVzKGNvbXBvbmVudC5jb21wb25lbnROYW1lKVxuICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZXN5bmNlZENvbXBvbmVudHMoZW5naW5lOiBJRW5naW5lKTogQ29tcG9uZW50RGVmaW5pdGlvbjx1bmtub3duPltdIHtcbiAgcmV0dXJuIFsuLi5OT1RfU1lOQ19DT01QT05FTlRTLCAuLi5OT1RfU1lOQ19DT01QT05FTlRTX05BTUVTLm1hcCgoJCkgPT4gZW5naW5lLmdldENvbXBvbmVudE9yTnVsbCgkKSldLmZpbHRlcihcbiAgICBCb29sZWFuXG4gICkgYXMgQ29tcG9uZW50RGVmaW5pdGlvbjx1bmtub3duPltdXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmdpbmVUb0NyZHQoZW5naW5lOiBJRW5naW5lKTogVWludDhBcnJheVtdIHtcbiAgY29uc3QgY3JkdEJ1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcbiAgY29uc3QgbmV0d29ya0J1ZmZlciA9IG5ldyBSZWFkV3JpdGVCeXRlQnVmZmVyKClcbiAgY29uc3QgTmV0d29ya0VudGl0eSA9IGVuZ2luZS5nZXRDb21wb25lbnQoX05ldHdvcmtFbnRpdHkuY29tcG9uZW50SWQpIGFzIElOZXRvd3JrRW50aXR5XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW11cblxuICBmb3IgKGNvbnN0IGl0Q29tcG9uZW50RGVmaW5pdGlvbiBvZiBlbmdpbmUuY29tcG9uZW50c0l0ZXIoKSkge1xuICAgIGlmICghc2hvdWxkU3luY0NvbXBvbmVudChpdENvbXBvbmVudERlZmluaXRpb24pKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpdENvbXBvbmVudERlZmluaXRpb24uZHVtcENyZHRTdGF0ZVRvQnVmZmVyKGNyZHRCdWZmZXIsIChlbnRpdHkpID0+IHtcbiAgICAgIGNvbnN0IGlzTmV0d29ya0VudGl0eSA9IE5ldHdvcmtFbnRpdHkuaGFzKGVudGl0eSlcbiAgICAgIHJldHVybiBpc05ldHdvcmtFbnRpdHlcbiAgICB9KVxuICB9XG5cbiAgbGV0IGhlYWRlcjogQ3JkdE1lc3NhZ2VIZWFkZXIgfCBudWxsXG4gIHdoaWxlICgoaGVhZGVyID0gQ3JkdE1lc3NhZ2VQcm90b2NvbC5nZXRIZWFkZXIoY3JkdEJ1ZmZlcikpKSB7XG4gICAgaWYgKGhlYWRlci50eXBlID09PSBDcmR0TWVzc2FnZVR5cGUuUFVUX0NPTVBPTkVOVCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IFB1dENvbXBvbmVudE9wZXJhdGlvbi5yZWFkKGNyZHRCdWZmZXIpIVxuICAgICAgY29uc3QgbmV0d29ya0VudGl0eSA9IE5ldHdvcmtFbnRpdHkuZ2V0T3JOdWxsKG1lc3NhZ2UuZW50aXR5SWQpXG5cbiAgICAgIC8vIENoZWNrIGlmIGFkZGluZyB0aGlzIG1lc3NhZ2Ugd291bGQgZXhjZWVkIHRoZSBzaXplIGxpbWl0XG4gICAgICBjb25zdCBjdXJyZW50QnVmZmVyU2l6ZSA9IG5ldHdvcmtCdWZmZXIudG9CaW5hcnkoKS5ieXRlTGVuZ3RoXG4gICAgICBjb25zdCBtZXNzYWdlU2l6ZSA9IG1lc3NhZ2UuZGF0YS5ieXRlTGVuZ3RoXG5cbiAgICAgIGlmICgoY3VycmVudEJ1ZmZlclNpemUgKyBtZXNzYWdlU2l6ZSkgLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBidWZmZXIgaGFzIGNvbnRlbnQsIHNhdmUgaXQgYXMgYSBjaHVua1xuICAgICAgICBpZiAoY3VycmVudEJ1ZmZlclNpemUgPiAwKSB7XG4gICAgICAgICAgY2h1bmtzLnB1c2gobmV0d29ya0J1ZmZlci50b0NvcGllZEJpbmFyeSgpKVxuICAgICAgICAgIG5ldHdvcmtCdWZmZXIucmVzZXRCdWZmZXIoKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIGlzIGxhcmdlciB0aGFuIHRoZSBsaW1pdCwgd2UgbmVlZCB0byBoYW5kbGUgaXQgc3BlY2lhbGx5XG4gICAgICAgIC8vIEZvciBub3csIHdlJ2xsIHNraXAgaXQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgICAgICBpZiAobWVzc2FnZVNpemUgLyAxMDI0ID4gTElWRUtJVF9NQVhfU0laRSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgTWVzc2FnZSB0b28gbGFyZ2UgKCR7bWVzc2FnZVNpemV9IGJ5dGVzKSwgc2tpcHBpbmcgY29tcG9uZW50ICR7bWVzc2FnZS5jb21wb25lbnRJZH0gZm9yIGVudGl0eSAke21lc3NhZ2UuZW50aXR5SWR9YFxuICAgICAgICAgIClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChuZXR3b3JrRW50aXR5KSB7XG4gICAgICAgIFB1dE5ldHdvcmtDb21wb25lbnRPcGVyYXRpb24ud3JpdGUoXG4gICAgICAgICAgbmV0d29ya0VudGl0eS5lbnRpdHlJZCxcbiAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcCxcbiAgICAgICAgICBtZXNzYWdlLmNvbXBvbmVudElkLFxuICAgICAgICAgIG5ldHdvcmtFbnRpdHkubmV0d29ya0lkLFxuICAgICAgICAgIG1lc3NhZ2UuZGF0YSxcbiAgICAgICAgICBuZXR3b3JrQnVmZmVyXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3JkdEJ1ZmZlci5pbmNyZW1lbnRSZWFkT2Zmc2V0KGhlYWRlci5sZW5ndGgpXG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGFueSByZW1haW5pbmcgZGF0YSBhcyB0aGUgZmluYWwgY2h1bmtcbiAgaWYgKG5ldHdvcmtCdWZmZXIuY3VycmVudFdyaXRlT2Zmc2V0KCkgPiAwKSB7XG4gICAgY2h1bmtzLnB1c2gobmV0d29ya0J1ZmZlci50b0JpbmFyeSgpKVxuICB9XG5cbiAgcmV0dXJuIGNodW5rc1xufVxuIl19
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@dcl/sdk",
3
3
  "description": "",
4
- "version": "7.31.1-40536151736.commit-a09f320",
4
+ "version": "7.31.1-40604676255.commit-cb3ed84",
5
5
  "author": "Decentraland",
6
6
  "dependencies": {
7
- "@dcl/ecs": "7.31.1-40536151736.commit-a09f320",
7
+ "@dcl/ecs": "7.31.1-40604676255.commit-cb3ed84",
8
8
  "@dcl/ecs-math": "2.1.0",
9
- "@dcl/js-runtime": "7.31.1-40536151736.commit-a09f320",
10
- "@dcl/react-ecs": "7.31.1-40536151736.commit-a09f320",
11
- "@dcl/sdk-commands": "7.31.1-40536151736.commit-a09f320"
9
+ "@dcl/js-runtime": "7.31.1-40604676255.commit-cb3ed84",
10
+ "@dcl/react-ecs": "7.31.1-40604676255.commit-cb3ed84",
11
+ "@dcl/sdk-commands": "7.31.1-40604676255.commit-cb3ed84"
12
12
  },
13
13
  "keywords": [],
14
14
  "license": "Apache-2.0",
@@ -33,5 +33,5 @@
33
33
  },
34
34
  "types": "./index.d.ts",
35
35
  "typings": "./index.d.ts",
36
- "commit": "a09f320ef8fd6ea8fd94aa651198df1eecaaa7c2"
36
+ "commit": "cb3ed840b67e8695a9dfd9461e8a54736d349e03"
37
37
  }
@@ -11,6 +11,7 @@ type GetPlayerDataRes = {
11
11
  avatar?: PBAvatarBase;
12
12
  wearables: PBAvatarEquippedData['wearableUrns'];
13
13
  emotes: PBAvatarEquippedData['emoteUrns'];
14
+ forceRender: PBAvatarEquippedData['forceRender'];
14
15
  position: TransformType['position'] | undefined;
15
16
  };
16
17
  export declare function definePlayerHelper(engine: IEngine): {
package/players/index.js CHANGED
@@ -69,6 +69,7 @@ export function definePlayerHelper(engine) {
69
69
  // out the component's own frozen array would throw on any caller that writes.
70
70
  wearables: [...(wearablesData?.wearableUrns ?? [])],
71
71
  emotes: [...(wearablesData?.emoteUrns ?? [])],
72
+ forceRender: [...(wearablesData?.forceRender ?? [])],
72
73
  position: Transform.getOrNull(userEntity)?.position
73
74
  };
74
75
  }
@@ -78,4 +79,4 @@ const players = definePlayerHelper(engine);
78
79
  const { getPlayer, onEnterScene, onLeaveScene } = players;
79
80
  export { getPlayer, onEnterScene, onLeaveScene };
80
81
  export default players;
81
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGxheWVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtDLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRSxPQUFPLEVBQ0wsa0JBQWtCLElBQUksdUJBQXVCLEVBQzdDLFVBQVUsSUFBSSxnQkFBZ0IsRUFDOUIsa0JBQWtCLElBQUksd0JBQXdCLEVBRzlDLFNBQVMsSUFBSSxlQUFlLEVBQzdCLE1BQU0sMEJBQTBCLENBQUE7QUFnQmpDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFlO0lBQ2hELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFELE1BQU0sa0JBQWtCLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0QsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUE7SUFFaEQsTUFBTSxjQUFjLEdBQTJDLEVBQUUsQ0FBQTtJQUNqRSxNQUFNLGNBQWMsR0FBaUMsRUFBRSxDQUFBO0lBRXZELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ2xGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsSUFBSTtZQUFFLE9BQU07UUFFbEQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE9BQU8sRUFBRTtZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFB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RCxDQUFBO1FBQ0gsQ0FBQztLQUNGLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDMUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFBO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFBO0FBQ2hELGVBQWUsT0FBTyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRW50aXR5LCBJRW5naW5lLCBUcmFuc2Zvcm1UeXBlLCBlbmdpbmUgfSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7XG4gIFBsYXllcklkZW50aXR5RGF0YSBhcyBkZWZpbmVQbGF5ZXJJZGVuaXR5RGF0YSxcbiAgQXZhdGFyQmFzZSBhcyBkZWZpbmVBdmF0YXJCYXNlLFxuICBBdmF0YXJFcXVpcHBlZERhdGEgYXMgZGVmaW5lQXZhdGFyRXF1aXBwZWREYXRhLFxuICBQQkF2YXRhckJhc2UsXG4gIFBCQXZhdGFyRXF1aXBwZWREYXRhLFxuICBUcmFuc2Zvcm0gYXMgZGVmaW5lVHJhbnNmb3JtXG59IGZyb20gJ0BkY2wvZWNzL2Rpc3QvY29tcG9uZW50cydcblxudHlwZSBHZXRQbGF5ZXJEYXRhUmVxID0ge1xuICB1c2VySWQ6IHN0cmluZ1xufVxudHlwZSBHZXRQbGF5ZXJEYXRhUmVzID0ge1xuICBlbnRpdHk6IEVudGl0eVxuICBuYW1lOiBzdHJpbmdcbiAgaXNHdWVzdDogYm9vbGVhblxuICB1c2VySWQ6IHN0cmluZ1xuICBhdmF0YXI/OiBQQkF2YXRhckJhc2VcbiAgd2VhcmFibGVzOiBQQkF2YXRhckVxdWlwcGVkRGF0YVsnd2VhcmFibGVVcm5zJ11cbiAgZW1vdGVzOiBQQkF2YXRhckVxdWlwcGVkRGF0YVsnZW1vdGVVcm5zJ11cbiAgcG9zaXRpb246IFRyYW5zZm9ybVR5cGVbJ3Bvc2l0aW9uJ10gfCB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVBsYXllckhlbHBlcihlbmdpbmU6IElFbmdpbmUpIHtcbiAgY29uc3QgVHJhbnNmb3JtID0gZGVmaW5lVHJhbnNmb3JtKGVuZ2luZSlcbiAgY29uc3QgUGxheWVySWRlbnRpdHlEYXRhID0gZGVmaW5lUGxheWVySWRlbml0eURhdGEoZW5naW5lKVxuICBjb25zdCBBdmF0YXJFcXVpcHBlZERhdGEgPSBkZWZpbmVBdmF0YXJFcXVpcHBlZERhdGEoZW5naW5lKVxuICBjb25zdCBBdmF0YXJCYXNlID0gZGVmaW5lQXZhdGFyQmFzZShlbmdpbmUpXG4gIGNvbnN0IHBsYXllckVudGl0aWVzID0gbmV3IE1hcDxFbnRpdHksIHN0cmluZz4oKVxuXG4gIGNvbnN0IG9uRW50ZXJTY2VuZUNiOiAoKHBsYXllcjogR2V0UGxheWVyRGF0YVJlcykgPT4gdm9pZClbXSA9IFtdXG4gIGNvbnN0IG9uTGVhdmVTY2VuZUNiOiAoKHVzZXJJZDogc3RyaW5nKSA9PiB2b2lkKVtdID0gW11cblxuICBlbmdpbmUuYWRkU3lzdGVtKCgpID0+IHtcbiAgICBjb25zdCBwbGF5ZXJzID0gQXJyYXkuZnJvbShlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSwgQXZhdGFyQmFzZSkpXG4gICAgaWYgKHBsYXllcnMubGVuZ3RoID09PSBwbGF5ZXJFbnRpdGllcy5zaXplKSByZXR1cm5cblxuICAgIGZvciAoY29uc3QgW2VudGl0eSwgaWRlbnRpdHldIG9mIHBsYXllcnMpIHtcbiAgICAgIGlmICghcGxheWVyRW50aXRpZXMuaGFzKGVudGl0eSkpIHtcbiAgICAgICAgcGxheWVyRW50aXRpZXMuc2V0KGVudGl0eSwgaWRlbnRpdHkuYWRkcmVzcylcblxuICAgICAgICAvLyBDYWxsIG9uRW50ZXIgY2FsbGJhY2tcbiAgICAgICAgaWYgKG9uRW50ZXJTY2VuZUNiLmxlbmd0aCkge1xuICAgICAgICAgIG9uRW50ZXJTY2VuZUNiLmZvckVhY2goKGNiKSA9PiBjYihnZXRQbGF5ZXIoeyB1c2VySWQ6IGlkZW50aXR5LmFkZHJlc3MgfSkhKSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBjaGFuZ2VzL3JlbW92ZSBjYWxsYmFja3NcbiAgICAgICAgQXZhdGFyQmFzZS5vbkNoYW5nZShlbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICghdmFsdWUgJiYgcGxheWVyRW50aXRpZXMuZ2V0KGVudGl0eSkpIHtcbiAgICAgICAgICAgIG9uTGVhdmVTY2VuZUNiLmZvckVhY2goKGNiKSA9PiBjYihwbGF5ZXJFbnRpdGllcy5nZXQoZW50aXR5KSEpKVxuICAgICAgICAgICAgcGxheWVyRW50aXRpZXMuZGVsZXRlKGVudGl0eSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiB7XG4gICAgb25FbnRlclNjZW5lKGNiOiAocGxheWVyOiBHZXRQbGF5ZXJEYXRhUmVzKSA9PiB2b2lkKSB7XG4gICAgICBvbkVudGVyU2NlbmVDYi5wdXNoKGNiKVxuICAgIH0sXG4gICAgb25MZWF2ZVNjZW5lKGNiOiAodXNlcklkOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICAgIG9uTGVhdmVTY2VuZUNiLnB1c2goY2IpXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbmZvIG9mIHRoZSBwbGF5ZXIgaWYgaXQncyBpbiB0aGUgc2NlbmUuXG4gICAgICovXG4gICAgZ2V0UGxheWVyKHVzZXI/OiBHZXRQbGF5ZXJEYXRhUmVxKTogR2V0UGxheWVyRGF0YVJlcyB8IG51bGwge1xuICAgICAgZnVuY3Rpb24gZ2V0RW50aXR5KCkge1xuICAgICAgICBpZiAoIXVzZXI/LnVzZXJJZCkgcmV0dXJuIGVuZ2luZS5QbGF5ZXJFbnRpdHlcbiAgICAgICAgZm9yIChjb25zdCBbZW50aXR5LCBkYXRhXSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSkpIHtcbiAgICAgICAgICBpZiAoZGF0YS5hZGRyZXNzID09PSB1c2VyLnVzZXJJZCkge1xuICAgICAgICAgICAgcmV0dXJuIGVudGl0eVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXJFbnRpdHkgPSBnZXRFbnRpdHkoKVxuICAgICAgaWYgKCF1c2VyRW50aXR5KSByZXR1cm4gbnVsbFxuXG4gICAgICBjb25zdCBwbGF5ZXJEYXRhID0gUGxheWVySWRlbnRpdHlEYXRhLmdldE9yTnVsbCh1c2VyRW50aXR5KVxuICAgICAgY29uc3QgYXZhdGFyRGF0YSA9IEF2YXRhckJhc2UuZ2V0T3JOdWxsKHVzZXJFbnRpdHkpXG4gICAgICBjb25zdCB3ZWFyYWJsZXNEYXRhID0gQXZhdGFyRXF1aXBwZWREYXRhLmdldE9yTnVsbCh1c2VyRW50aXR5KVxuXG4gICAgICBpZiAoIXBsYXllckRhdGEgJiYgIWF2YXRhckRhdGEgJiYgIXdlYXJhYmxlc0RhdGEpIHJldHVybiBudWxsXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGVudGl0eTogdXNlckVudGl0eSxcbiAgICAgICAgbmFtZTogYXZhdGFyRGF0YT8ubmFtZSA/PyAnJyxcbiAgICAgICAgaXNHdWVzdDogISFwbGF5ZXJEYXRhPy5pc0d1ZXN0LFxuICAgICAgICB1c2VySWQ6IHBsYXllckRhdGE/LmFkZHJlc3MgPz8gJycsXG4gICAgICAgIGF2YXRhcjogYXZhdGFyRGF0YSA/PyB1bmRlZmluZWQsXG4gICAgICAgIC8vIENvbXBvbmVudCByZWFkcyBjb21lIGJhY2sgZGVlcGx5IHJlYWRvbmx5LCBzbyB0aGVzZSBhcmUgY29waWVkIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGFsaWFzZWQ6IHRoZSBwdWJsaWMgUGxheWVyIHR5cGUgcHJvbWlzZXMgcGxhaW4gbXV0YWJsZSBhcnJheXMsIGFuZCBoYW5kaW5nXG4gICAgICAgIC8vIG91dCB0aGUgY29tcG9uZW50J3Mgb3duIGZyb3plbiBhcnJheSB3b3VsZCB0aHJvdyBvbiBhbnkgY2FsbGVyIHRoYXQgd3JpdGVzLlxuICAgICAgICB3ZWFyYWJsZXM6IFsuLi4od2VhcmFibGVzRGF0YT8ud2VhcmFibGVVcm5zID8/IFtdKV0sXG4gICAgICAgIGVtb3RlczogWy4uLih3ZWFyYWJsZXNEYXRhPy5lbW90ZVVybnMgPz8gW10pXSxcbiAgICAgICAgcG9zaXRpb246IFRyYW5zZm9ybS5nZXRPck51bGwodXNlckVudGl0eSk/LnBvc2l0aW9uXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IHBsYXllcnMgPSBkZWZpbmVQbGF5ZXJIZWxwZXIoZW5naW5lKVxuY29uc3QgeyBnZXRQbGF5ZXIsIG9uRW50ZXJTY2VuZSwgb25MZWF2ZVNjZW5lIH0gPSBwbGF5ZXJzXG5cbmV4cG9ydCB7IGdldFBsYXllciwgb25FbnRlclNjZW5lLCBvbkxlYXZlU2NlbmUgfVxuZXhwb3J0IGRlZmF1bHQgcGxheWVyc1xuIl19
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGxheWVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtDLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUNqRSxPQUFPLEVBQ0wsa0JBQWtCLElBQUksdUJBQXVCLEVBQzdDLFVBQVUsSUFBSSxnQkFBZ0IsRUFDOUIsa0JBQWtCLElBQUksd0JBQXdCLEVBRzlDLFNBQVMsSUFBSSxlQUFlLEVBQzdCLE1BQU0sMEJBQTBCLENBQUE7QUFpQmpDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFlO0lBQ2hELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzFELE1BQU0sa0JBQWtCLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0QsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUE7SUFFaEQsTUFBTSxjQUFjLEdBQTJDLEVBQUUsQ0FBQTtJQUNqRSxNQUFNLGNBQWMsR0FBaUMsRUFBRSxDQUFBO0lBRXZELE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ3BCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO1FBQ2xGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsSUFBSTtZQUFFLE9BQU07UUFFbEQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE9BQU8sRUFBRTtZQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFB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LENBQUM7Z0JBQ3BELFFBQVEsRUFBRSxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVE7YUFDcEQsQ0FBQTtRQUNILENBQUM7S0FDRixDQUFBO0FBQ0gsQ0FBQztBQUVELE1BQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFBO0FBQzFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQTtBQUV6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQTtBQUNoRCxlQUFlLE9BQU8sQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eSwgSUVuZ2luZSwgVHJhbnNmb3JtVHlwZSwgZW5naW5lIH0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQge1xuICBQbGF5ZXJJZGVudGl0eURhdGEgYXMgZGVmaW5lUGxheWVySWRlbml0eURhdGEsXG4gIEF2YXRhckJhc2UgYXMgZGVmaW5lQXZhdGFyQmFzZSxcbiAgQXZhdGFyRXF1aXBwZWREYXRhIGFzIGRlZmluZUF2YXRhckVxdWlwcGVkRGF0YSxcbiAgUEJBdmF0YXJCYXNlLFxuICBQQkF2YXRhckVxdWlwcGVkRGF0YSxcbiAgVHJhbnNmb3JtIGFzIGRlZmluZVRyYW5zZm9ybVxufSBmcm9tICdAZGNsL2Vjcy9kaXN0L2NvbXBvbmVudHMnXG5cbnR5cGUgR2V0UGxheWVyRGF0YVJlcSA9IHtcbiAgdXNlcklkOiBzdHJpbmdcbn1cbnR5cGUgR2V0UGxheWVyRGF0YVJlcyA9IHtcbiAgZW50aXR5OiBFbnRpdHlcbiAgbmFtZTogc3RyaW5nXG4gIGlzR3Vlc3Q6IGJvb2xlYW5cbiAgdXNlcklkOiBzdHJpbmdcbiAgYXZhdGFyPzogUEJBdmF0YXJCYXNlXG4gIHdlYXJhYmxlczogUEJBdmF0YXJFcXVpcHBlZERhdGFbJ3dlYXJhYmxlVXJucyddXG4gIGVtb3RlczogUEJBdmF0YXJFcXVpcHBlZERhdGFbJ2Vtb3RlVXJucyddXG4gIGZvcmNlUmVuZGVyOiBQQkF2YXRhckVxdWlwcGVkRGF0YVsnZm9yY2VSZW5kZXInXVxuICBwb3NpdGlvbjogVHJhbnNmb3JtVHlwZVsncG9zaXRpb24nXSB8IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUGxheWVySGVscGVyKGVuZ2luZTogSUVuZ2luZSkge1xuICBjb25zdCBUcmFuc2Zvcm0gPSBkZWZpbmVUcmFuc2Zvcm0oZW5naW5lKVxuICBjb25zdCBQbGF5ZXJJZGVudGl0eURhdGEgPSBkZWZpbmVQbGF5ZXJJZGVuaXR5RGF0YShlbmdpbmUpXG4gIGNvbnN0IEF2YXRhckVxdWlwcGVkRGF0YSA9IGRlZmluZUF2YXRhckVxdWlwcGVkRGF0YShlbmdpbmUpXG4gIGNvbnN0IEF2YXRhckJhc2UgPSBkZWZpbmVBdmF0YXJCYXNlKGVuZ2luZSlcbiAgY29uc3QgcGxheWVyRW50aXRpZXMgPSBuZXcgTWFwPEVudGl0eSwgc3RyaW5nPigpXG5cbiAgY29uc3Qgb25FbnRlclNjZW5lQ2I6ICgocGxheWVyOiBHZXRQbGF5ZXJEYXRhUmVzKSA9PiB2b2lkKVtdID0gW11cbiAgY29uc3Qgb25MZWF2ZVNjZW5lQ2I6ICgodXNlcklkOiBzdHJpbmcpID0+IHZvaWQpW10gPSBbXVxuXG4gIGVuZ2luZS5hZGRTeXN0ZW0oKCkgPT4ge1xuICAgIGNvbnN0IHBsYXllcnMgPSBBcnJheS5mcm9tKGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoUGxheWVySWRlbnRpdHlEYXRhLCBBdmF0YXJCYXNlKSlcbiAgICBpZiAocGxheWVycy5sZW5ndGggPT09IHBsYXllckVudGl0aWVzLnNpemUpIHJldHVyblxuXG4gICAgZm9yIChjb25zdCBbZW50aXR5LCBpZGVudGl0eV0gb2YgcGxheWVycykge1xuICAgICAgaWYgKCFwbGF5ZXJFbnRpdGllcy5oYXMoZW50aXR5KSkge1xuICAgICAgICBwbGF5ZXJFbnRpdGllcy5zZXQoZW50aXR5LCBpZGVudGl0eS5hZGRyZXNzKVxuXG4gICAgICAgIC8vIENhbGwgb25FbnRlciBjYWxsYmFja1xuICAgICAgICBpZiAob25FbnRlclNjZW5lQ2IubGVuZ3RoKSB7XG4gICAgICAgICAgb25FbnRlclNjZW5lQ2IuZm9yRWFjaCgoY2IpID0+IGNiKGdldFBsYXllcih7IHVzZXJJZDogaWRlbnRpdHkuYWRkcmVzcyB9KSEpKVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIGNoYW5nZXMvcmVtb3ZlIGNhbGxiYWNrc1xuICAgICAgICBBdmF0YXJCYXNlLm9uQ2hhbmdlKGVudGl0eSwgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSAmJiBwbGF5ZXJFbnRpdGllcy5nZXQoZW50aXR5KSkge1xuICAgICAgICAgICAgb25MZWF2ZVNjZW5lQ2IuZm9yRWFjaCgoY2IpID0+IGNiKHBsYXllckVudGl0aWVzLmdldChlbnRpdHkpISkpXG4gICAgICAgICAgICBwbGF5ZXJFbnRpdGllcy5kZWxldGUoZW50aXR5KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgcmV0dXJuIHtcbiAgICBvbkVudGVyU2NlbmUoY2I6IChwbGF5ZXI6IEdldFBsYXllckRhdGFSZXMpID0+IHZvaWQpIHtcbiAgICAgIG9uRW50ZXJTY2VuZUNiLnB1c2goY2IpXG4gICAgfSxcbiAgICBvbkxlYXZlU2NlbmUoY2I6ICh1c2VySWQ6IHN0cmluZykgPT4gdm9pZCkge1xuICAgICAgb25MZWF2ZVNjZW5lQ2IucHVzaChjYilcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGluZm8gb2YgdGhlIHBsYXllciBpZiBpdCdzIGluIHRoZSBzY2VuZS5cbiAgICAgKi9cbiAgICBnZXRQbGF5ZXIodXNlcj86IEdldFBsYXllckRhdGFSZXEpOiBHZXRQbGF5ZXJEYXRhUmVzIHwgbnVsbCB7XG4gICAgICBmdW5jdGlvbiBnZXRFbnRpdHkoKSB7XG4gICAgICAgIGlmICghdXNlcj8udXNlcklkKSByZXR1cm4gZW5naW5lLlBsYXllckVudGl0eVxuICAgICAgICBmb3IgKGNvbnN0IFtlbnRpdHksIGRhdGFdIG9mIGVuZ2luZS5nZXRFbnRpdGllc1dpdGgoUGxheWVySWRlbnRpdHlEYXRhKSkge1xuICAgICAgICAgIGlmIChkYXRhLmFkZHJlc3MgPT09IHVzZXIudXNlcklkKSB7XG4gICAgICAgICAgICByZXR1cm4gZW50aXR5XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXNlckVudGl0eSA9IGdldEVudGl0eSgpXG4gICAgICBpZiAoIXVzZXJFbnRpdHkpIHJldHVybiBudWxsXG5cbiAgICAgIGNvbnN0IHBsYXllckRhdGEgPSBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKHVzZXJFbnRpdHkpXG4gICAgICBjb25zdCBhdmF0YXJEYXRhID0gQXZhdGFyQmFzZS5nZXRPck51bGwodXNlckVudGl0eSlcbiAgICAgIGNvbnN0IHdlYXJhYmxlc0RhdGEgPSBBdmF0YXJFcXVpcHBlZERhdGEuZ2V0T3JOdWxsKHVzZXJFbnRpdHkpXG5cbiAgICAgIGlmICghcGxheWVyRGF0YSAmJiAhYXZhdGFyRGF0YSAmJiAhd2VhcmFibGVzRGF0YSkgcmV0dXJuIG51bGxcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW50aXR5OiB1c2VyRW50aXR5LFxuICAgICAgICBuYW1lOiBhdmF0YXJEYXRhPy5uYW1lID8/ICcnLFxuICAgICAgICBpc0d1ZXN0OiAhIXBsYXllckRhdGE/LmlzR3Vlc3QsXG4gICAgICAgIHVzZXJJZDogcGxheWVyRGF0YT8uYWRkcmVzcyA/PyAnJyxcbiAgICAgICAgYXZhdGFyOiBhdmF0YXJEYXRhID8/IHVuZGVmaW5lZCxcbiAgICAgICAgLy8gQ29tcG9uZW50IHJlYWRzIGNvbWUgYmFjayBkZWVwbHkgcmVhZG9ubHksIHNvIHRoZXNlIGFyZSBjb3BpZWQgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gYWxpYXNlZDogdGhlIHB1YmxpYyBQbGF5ZXIgdHlwZSBwcm9taXNlcyBwbGFpbiBtdXRhYmxlIGFycmF5cywgYW5kIGhhbmRpbmdcbiAgICAgICAgLy8gb3V0IHRoZSBjb21wb25lbnQncyBvd24gZnJvemVuIGFycmF5IHdvdWxkIHRocm93IG9uIGFueSBjYWxsZXIgdGhhdCB3cml0ZXMuXG4gICAgICAgIHdlYXJhYmxlczogWy4uLih3ZWFyYWJsZXNEYXRhPy53ZWFyYWJsZVVybnMgPz8gW10pXSxcbiAgICAgICAgZW1vdGVzOiBbLi4uKHdlYXJhYmxlc0RhdGE/LmVtb3RlVXJucyA/PyBbXSldLFxuICAgICAgICBmb3JjZVJlbmRlcjogWy4uLih3ZWFyYWJsZXNEYXRhPy5mb3JjZVJlbmRlciA/PyBbXSldLFxuICAgICAgICBwb3NpdGlvbjogVHJhbnNmb3JtLmdldE9yTnVsbCh1c2VyRW50aXR5KT8ucG9zaXRpb25cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgcGxheWVycyA9IGRlZmluZVBsYXllckhlbHBlcihlbmdpbmUpXG5jb25zdCB7IGdldFBsYXllciwgb25FbnRlclNjZW5lLCBvbkxlYXZlU2NlbmUgfSA9IHBsYXllcnNcblxuZXhwb3J0IHsgZ2V0UGxheWVyLCBvbkVudGVyU2NlbmUsIG9uTGVhdmVTY2VuZSB9XG5leHBvcnQgZGVmYXVsdCBwbGF5ZXJzXG4iXX0=
@@ -41,10 +41,7 @@ export function createRendererTransport(engineApi: EngineApiForTransport): Trans
41
41
  }
42
42
  return !!message
43
43
  },
44
- type: 'renderer',
45
- // The renderer/host is the authority for reserved-range entities (avatars,
46
- // root/player/camera): it is the only transport allowed to mutate or delete them.
47
- allowReservedEntities: true
44
+ type: 'renderer'
48
45
  }
49
46
 
50
47
  return rendererTransport
@@ -1,12 +1,9 @@
1
1
  import { ReadWriteByteBuffer } from '@dcl/ecs/dist/serialization/ByteBuffer'
2
2
 
3
3
  export enum CommsMessage {
4
- CRDT = 7,
5
- REQ_CRDT_STATE = 8,
6
- RES_CRDT_STATE = 9,
7
- CRDT_SERVER = 4,
8
- CRDT_AUTHORITATIVE = 5,
9
- CUSTOM_EVENT = 6
4
+ CRDT = 1,
5
+ REQ_CRDT_STATE = 2,
6
+ RES_CRDT_STATE = 3
10
7
  }
11
8
 
12
9
  export function BinaryMessageBus<T extends CommsMessage>(
@@ -23,9 +20,7 @@ export function BinaryMessageBus<T extends CommsMessage>(
23
20
  __processMessages: (messages: Uint8Array[]) => {
24
21
  for (const message of messages) {
25
22
  const commsMsg = decodeCommsMessage<T>(message)
26
- if (!commsMsg) {
27
- continue
28
- }
23
+ if (!commsMsg) continue
29
24
  const { sender, messageType, data } = commsMsg
30
25
  const fn = mapping.get(messageType)
31
26
  if (fn) fn(data, sender)
@@ -2,46 +2,9 @@ import { sendBinary } from '~system/CommunicationsController'
2
2
  import { engine } from '@dcl/ecs'
3
3
  import { addSyncTransport } from './message-bus-sync'
4
4
  import { getUserData } from '~system/UserIdentity'
5
- import { isServer as isServerApi } from '~system/EngineApi'
6
- import { Atom } from '../atom'
7
-
8
- // Create isServer atom for consistent state
9
- const isServerAtom = Atom<boolean>(false)
10
- void isServerApi({}).then((response) => {
11
- isServerAtom.swap(!!response.isServer)
12
- })
13
-
14
- // Helper function to check if running on server
15
- export function isServer(): boolean {
16
- return isServerAtom.getOrNull() ?? false
17
- }
18
5
 
19
6
  // initialize sync transport for sdk engine
20
- const {
21
- getChildren,
22
- syncEntity,
23
- parentEntity,
24
- getParent,
25
- myProfile,
26
- removeParent,
27
- getFirstChild,
28
- isStateSyncronized,
29
- binaryMessageBus,
30
- eventBus
31
- } = addSyncTransport(engine, sendBinary, getUserData, isServerApi, 'network')
32
-
33
- // Re-export the room messaging system
34
- export { registerMessages, getRoom } from './events'
7
+ const { getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, getFirstChild, isStateSyncronized } =
8
+ addSyncTransport(engine, sendBinary, getUserData)
35
9
 
36
- export {
37
- getFirstChild,
38
- getChildren,
39
- syncEntity,
40
- parentEntity,
41
- getParent,
42
- myProfile,
43
- removeParent,
44
- isStateSyncronized,
45
- binaryMessageBus,
46
- eventBus
47
- }
10
+ export { getFirstChild, getChildren, syncEntity, parentEntity, getParent, myProfile, removeParent, isStateSyncronized }
@@ -1,53 +1,27 @@
1
- import { IEngine, Transport, RealmInfo } from '@dcl/ecs'
2
- import type { SendBinaryRequest, SendBinaryResponse } from '~system/CommunicationsController'
1
+ import { IEngine, Transport, RealmInfo, PlayerIdentityData } 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'
6
+ import { BinaryMessageBus, CommsMessage, decodeString, encodeString } from './binary-message-bus'
7
7
  import { fetchProfile } from './utils'
8
8
  import { entityUtils } from './entities'
9
- import { createServerValidator } from './server'
10
- import type { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity'
9
+ import { GetUserDataRequest, GetUserDataResponse } from '~system/UserIdentity'
11
10
  import { definePlayerHelper } from '../players'
12
11
  import { serializeCrdtMessages } from '../internal/transports/logger'
13
- import { IsServerRequest, IsServerResponse } from '~system/EngineApi'
14
- import { Atom } from '../atom'
15
- import { setGlobalRoom, Room } from './events/implementation'
16
12
 
17
13
  export type IProfile = { networkId: number; userId: string }
18
14
  // user that we asked for the inital crdt state
19
- export const AUTH_SERVER_PEER_ID = 'authoritative-server'
20
- export const DEBUG_NETWORK_MESSAGES = () => (globalThis as any).DEBUG_NETWORK_MESSAGES ?? false
21
-
22
- // Test environment detection without 'as any'
23
- const isTestEnvironment = (): boolean => {
24
- try {
25
- if (typeof globalThis === 'undefined') return false
26
- const globalWithProcess = globalThis as unknown as { process?: { env?: { NODE_ENV?: string } } }
27
- return globalWithProcess.process?.env?.NODE_ENV === 'test'
28
- } catch {
29
- return false
30
- }
31
- }
32
-
33
15
  export function addSyncTransport(
34
16
  engine: IEngine,
35
17
  sendBinary: (msg: SendBinaryRequest) => Promise<SendBinaryResponse>,
36
- getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>,
37
- isServerFn: (request: IsServerRequest) => Promise<IsServerResponse>,
38
- name: string
18
+ getUserData: (value: GetUserDataRequest) => Promise<GetUserDataResponse>
39
19
  ) {
20
+ const DEBUG_NETWORK_MESSAGES = () => (globalThis as any).DEBUG_NETWORK_MESSAGES ?? false
40
21
  // Profile Info
41
22
  const myProfile: IProfile = {} as IProfile
42
23
  fetchProfile(myProfile!, getUserData)
43
24
 
44
- const isServerAtom = Atom<boolean>()
45
- const isRoomReadyAtom = Atom<boolean>(false)
46
-
47
- void isServerFn({}).then(($: IsServerResponse) => {
48
- return isServerAtom.swap(!!$.isServer)
49
- })
50
-
51
25
  // Entity utils
52
26
  const entityDefinitions = entityUtils(engine, myProfile)
53
27
 
@@ -66,194 +40,108 @@ export function addSyncTransport(
66
40
  const players = definePlayerHelper(engine)
67
41
 
68
42
  let stateIsSyncronized = false
43
+ let transportInitialzed = false
69
44
 
70
- /**
71
- * We need to wait till 2 ticks that is when the engine is ready to send new messages.
72
- * The first tick is for the client engine processing the CRDT messages,
73
- * and the second one are the messages created by the main() function.
74
- * So to avoid sending those messages, that all the clients have, through the network we put this validation here.
75
- */
76
- let tick = 0
77
- const TRANSPORT_INITIALIZED_NUMBER = isTestEnvironment() ? 0 : 2
78
45
  // Add Sync Transport
79
46
  const transport: Transport = {
80
47
  filter: syncFilter(engine),
81
48
  send: async (messages) => {
82
- if (tick <= TRANSPORT_INITIALIZED_NUMBER) tick++
83
- for (const message of tick > TRANSPORT_INITIALIZED_NUMBER ? [messages].flat() : []) {
84
- if (message.byteLength) {
49
+ for (const message of [messages].flat()) {
50
+ if (message.byteLength && transportInitialzed) {
85
51
  DEBUG_NETWORK_MESSAGES() &&
86
52
  console.log(...Array.from(serializeCrdtMessages('[NetworkMessage sent]:', message, engine)))
87
-
88
- // Convert regular messages to network messages for broadcasting with chunking
89
- for (const chunk of serverValidator.convertRegularToNetworkMessage(message)) {
90
- binaryMessageBus.emit(CommsMessage.CRDT, chunk)
91
- }
53
+ binaryMessageBus.emit(CommsMessage.CRDT, message)
92
54
  }
93
55
  }
94
56
  const peerMessages = getMessagesToSend()
57
+ let totalSize = 0
58
+ for (const message of peerMessages) {
59
+ for (const data of message.data) {
60
+ totalSize += data.byteLength
61
+ }
62
+ }
63
+ if (totalSize) {
64
+ DEBUG_NETWORK_MESSAGES() && console.log('Sending network messages: ', totalSize / 1024, 'KB')
65
+ }
95
66
  const response = await sendBinary({ data: [], peerData: peerMessages })
96
67
  binaryMessageBus.__processMessages(response.data)
68
+ transportInitialzed = true
97
69
  },
98
- type: name
70
+ type: 'network'
99
71
  }
100
-
101
- // Server validation setup
102
- const serverValidator = createServerValidator({
103
- engine,
104
- binaryMessageBus
105
- })
106
-
107
- // Initialize Event Bus with registered schemas
108
- const eventBus = new Room(engine, binaryMessageBus, isServerAtom, isRoomReadyAtom)
109
-
110
- // Set global eventBus instance
111
- setGlobalRoom(eventBus)
112
-
113
72
  engine.addTransport(transport)
114
73
  // End add sync transport
115
74
 
116
75
  // Receive & Process CRDT_STATE
117
- binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (data, sender) => {
118
- // Requests arriving before role resolution are recovered by the requester's retry.
119
- if (!isServerAtom.getOrNull()) return
120
-
121
- DEBUG_NETWORK_MESSAGES() && console.log('[REQ_CRDT_STATE]', sender, Date.now())
122
- const chunks = engineToCrdt(engine)
123
- if (chunks.length === 0) {
124
- DEBUG_NETWORK_MESSAGES() && console.log('[Emiting empty state:]', sender, Date.now())
125
- binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, new Uint8Array(), [sender])
126
- } else {
127
- for (const chunk of chunks) {
128
- DEBUG_NETWORK_MESSAGES() && console.log('[Emiting:]', sender, Date.now())
129
- binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, chunk, [sender])
130
- }
131
- }
132
- })
133
- binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, async (data, sender) => {
134
- if (isServerAtom.getOrNull() || sender !== AUTH_SERVER_PEER_ID) return
135
-
136
- requestingState = false
137
- elapsedTimeSinceRequest = 0
76
+ binaryMessageBus.on(CommsMessage.RES_CRDT_STATE, (value) => {
77
+ const { sender, data } = decodeCRDTState(value)
78
+ if (sender !== myProfile.userId) return
138
79
  DEBUG_NETWORK_MESSAGES() && console.log('[Processing CRDT State]', data.byteLength / 1024, 'KB')
139
- if (data.byteLength > 0) {
140
- transport.onmessage!(serverValidator.processClientMessages(data, sender))
141
- }
80
+ transport.onmessage!(data)
142
81
  stateIsSyncronized = true
82
+ })
143
83
 
144
- // IMPORTANT: Only mark room as ready AFTER state is synchronized
145
- // This ensures comms is truly connected and working
146
- const realmInfo = RealmInfo.getOrNull(engine.RootEntity)
147
- if (realmInfo) {
148
- DEBUG_NETWORK_MESSAGES() && console.log('[isRoomReady] Marking room as ready after state sync')
149
- isRoomReadyAtom.swap(true)
84
+ // Answer to REQ_CRDT_STATE
85
+ binaryMessageBus.on(CommsMessage.REQ_CRDT_STATE, async (_, userId) => {
86
+ DEBUG_NETWORK_MESSAGES() && console.log(`Sending CRDT State to: ${userId}`)
87
+
88
+ for (const chunk of engineToCrdt(engine)) {
89
+ binaryMessageBus.emit(CommsMessage.RES_CRDT_STATE, encodeCRDTState(userId, chunk), [userId])
150
90
  }
151
91
  })
152
92
 
153
- // received message from the network
154
- binaryMessageBus.on(CommsMessage.CRDT, (value, sender) => {
155
- const isServer = isServerAtom.getOrNull()
93
+ // Process CRDT messages here
94
+ binaryMessageBus.on(CommsMessage.CRDT, (value) => {
156
95
  DEBUG_NETWORK_MESSAGES() &&
157
- console.log(
158
- transport.type,
159
- ...Array.from(serializeCrdtMessages('[NetworkMessage received]:', value, engine)),
160
- isServer
161
- )
162
- if (isServer) {
163
- transport.onmessage!(serverValidator.processServerMessages(value, sender))
164
- } else if (sender === AUTH_SERVER_PEER_ID) {
165
- // Process network messages from server and convert to regular messages
166
- transport.onmessage!(serverValidator.processClientMessages(value, sender))
167
- }
96
+ console.log(Array.from(serializeCrdtMessages('[NetworkMessage received]:', value, engine)))
97
+ transport.onmessage!(value)
168
98
  })
169
99
 
170
- // received authoritative message from server - force apply to fix invalid local state
171
- binaryMessageBus.on(CommsMessage.CRDT_AUTHORITATIVE, (value, sender) => {
172
- // Only accept authoritative messages from authoritative server
173
- if (sender !== AUTH_SERVER_PEER_ID) return
100
+ async function requestState(retryCount: number = 1) {
101
+ let players = Array.from(engine.getEntitiesWith(PlayerIdentityData))
102
+ DEBUG_NETWORK_MESSAGES() && console.log(`Requesting state. Players connected: ${players.length - 1}`)
174
103
 
175
- // DEBUG_NETWORK_MESSAGES() &&
176
- console.log('[AUTHORITATIVE] Received authoritative message from server:', value.byteLength, 'bytes')
104
+ if (!RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom) {
105
+ DEBUG_NETWORK_MESSAGES() && console.log(`Aborting Requesting state?. Disconnected`)
106
+ return
107
+ }
177
108
 
178
- // Process authoritative messages by forcing them through normal CRDT processing
179
- // but with a timestamp that's guaranteed to be accepted
180
- const authoritativeBuffer = serverValidator.processClientMessages(value, sender, true)
181
- if (authoritativeBuffer.byteLength > 0) {
182
- // Apply authoritative message through normal transport, but the server's messages
183
- // should be processed as authoritative with special timestamp handling
184
- transport.onmessage!(authoritativeBuffer)
109
+ binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array())
185
110
 
186
- DEBUG_NETWORK_MESSAGES() && console.log('[AUTHORITATIVE] Applied server authoritative message to local state')
111
+ // Wait ~5s for the response.
112
+ await sleep(5000)
113
+
114
+ players = Array.from(engine.getEntitiesWith(PlayerIdentityData))
115
+
116
+ if (!stateIsSyncronized) {
117
+ if (players.length > 1 && retryCount <= 2) {
118
+ DEBUG_NETWORK_MESSAGES() &&
119
+ console.log(`Requesting state again ${retryCount} (no response). Players connected: ${players.length - 1}`)
120
+ void requestState(retryCount + 1)
121
+ } else {
122
+ DEBUG_NETWORK_MESSAGES() && console.log('No active players. State syncronized')
123
+ stateIsSyncronized = true
124
+ }
187
125
  }
188
- })
126
+ }
189
127
 
190
128
  players.onEnterScene((player) => {
191
129
  DEBUG_NETWORK_MESSAGES() && console.log('[onEnterScene]', player.userId)
192
- if (!isServerAtom.getOrNull() && myProfile.userId === player.userId) {
193
- requestState()
194
- }
195
130
  })
196
131
 
197
132
  // Asks for the REQ_CRDT_STATE when its connected to comms
198
133
  RealmInfo.onChange(engine.RootEntity, (value) => {
199
- const isServer = isServerAtom.getOrNull()
200
-
201
134
  if (!value?.isConnectedSceneRoom) {
202
- // Only react when actually transitioning from ready to not ready
203
- if (isRoomReadyAtom.getOrNull() === true) {
204
- DEBUG_NETWORK_MESSAGES() && console.log('Disconnected from comms')
205
- isRoomReadyAtom.swap(false)
206
- if (!isServer) {
207
- stateIsSyncronized = false
208
- }
209
- }
135
+ DEBUG_NETWORK_MESSAGES() && console.log('Disconnected from comms')
136
+ stateIsSyncronized = false
210
137
  }
211
138
 
212
139
  if (value?.isConnectedSceneRoom) {
213
- requestState()
214
-
215
- // For servers, mark as ready immediately when connected
216
- // (servers don't need to sync state from anyone)
217
- if (isServer && isRoomReadyAtom.getOrNull() === false) {
218
- DEBUG_NETWORK_MESSAGES() && console.log('[isRoomReady] Server marking room as ready')
219
- isRoomReadyAtom.swap(true)
220
- }
221
- // For clients, room will be marked ready after receiving CRDT state (above)
140
+ DEBUG_NETWORK_MESSAGES() && console.log('Connected to comms')
222
141
  }
223
- })
224
-
225
- let requestingState = false
226
- let elapsedTimeSinceRequest = 0
227
- const STATE_REQUEST_RETRY_INTERVAL = 2.0 // seconds
228
142
 
229
- /**
230
- * Why we have to request the state if we have a server that can send us the state when we joined?
231
- * The thing is that when the server detects a new JOIN_PARTICIPANT on livekit room, it sends automatically the state to that peer.
232
- * But in unity, it takes more time, so that message is not being delivered to the client.
233
- * So instead, when we are finally connected to the room, we request the state, and then the server answers with the state :)
234
- *
235
- * If no response is received within 2 seconds, the request is automatically retried.
236
- */
237
- function requestState() {
238
- if (isServerAtom.getOrNull()) return
239
- if (RealmInfo.getOrNull(engine.RootEntity)?.isConnectedSceneRoom && !requestingState) {
240
- requestingState = true
241
- elapsedTimeSinceRequest = 0
242
- DEBUG_NETWORK_MESSAGES() && console.log('Requesting state...')
243
- binaryMessageBus.emit(CommsMessage.REQ_CRDT_STATE, new Uint8Array())
244
- }
245
- }
246
-
247
- // System to retry state request if no response is received within the retry interval
248
- engine.addSystem((dt: number) => {
249
- if (requestingState && !stateIsSyncronized) {
250
- elapsedTimeSinceRequest += dt
251
- if (elapsedTimeSinceRequest >= STATE_REQUEST_RETRY_INTERVAL) {
252
- DEBUG_NETWORK_MESSAGES() && console.log('State request timed out, retrying...')
253
- elapsedTimeSinceRequest = 0
254
- requestingState = false
255
- requestState()
256
- }
143
+ if (value?.isConnectedSceneRoom && !stateIsSyncronized) {
144
+ void requestState()
257
145
  }
258
146
  })
259
147
 
@@ -265,12 +153,56 @@ export function addSyncTransport(
265
153
  return stateIsSyncronized
266
154
  }
267
155
 
156
+ function sleep(ms: number) {
157
+ return new Promise<void>((resolve) => {
158
+ let timer = 0
159
+ function sleepSystem(dt: number) {
160
+ timer += dt
161
+ if (timer * 1000 >= ms) {
162
+ engine.removeSystem(sleepSystem)
163
+ resolve()
164
+ }
165
+ }
166
+ engine.addSystem(sleepSystem)
167
+ })
168
+ }
169
+
268
170
  return {
269
171
  ...entityDefinitions,
270
172
  myProfile,
271
- isStateSyncronized,
272
- binaryMessageBus,
273
- eventBus,
274
- isRoomReadyAtom
173
+ isStateSyncronized
275
174
  }
276
175
  }
176
+
177
+ /**
178
+ * Messages Protocol Encoding
179
+ *
180
+ * CRDT: Plain Uint8Array
181
+ *
182
+ * CRDT_STATE_RES { sender: string, data: Uint8Array}
183
+ */
184
+ function decodeCRDTState(data: Uint8Array) {
185
+ let offset = 0
186
+ const r = new Uint8Array(data)
187
+ const view = new DataView(r.buffer)
188
+ const senderLength = view.getUint8(offset)
189
+ offset += 1
190
+ const sender = decodeString(data.subarray(1, senderLength + 1))
191
+ offset += senderLength
192
+ const state = r.subarray(offset)
193
+
194
+ return { sender, data: state }
195
+ }
196
+
197
+ function encodeCRDTState(address: string, data: Uint8Array) {
198
+ // address to uint8array
199
+ const addressBuffer = encodeString(address)
200
+ const addressOffset = 1
201
+ const messageLength = addressOffset + addressBuffer.byteLength + data.byteLength
202
+
203
+ const serializedMessage = new Uint8Array(messageLength)
204
+ serializedMessage.set(new Uint8Array([addressBuffer.byteLength]), 0)
205
+ serializedMessage.set(addressBuffer, 1)
206
+ serializedMessage.set(data, addressBuffer.byteLength + 1)
207
+ return serializedMessage
208
+ }
@@ -28,7 +28,7 @@ import {
28
28
  TriggerAreaResult,
29
29
  ComponentDefinition
30
30
  } from '@dcl/ecs'
31
- import { LIVEKIT_MAX_SIZE } from './server'
31
+ import { LIVEKIT_MAX_SIZE } from '@dcl/ecs/dist/systems/crdt'
32
32
 
33
33
  export const NOT_SYNC_COMPONENTS: ComponentDefinition<unknown>[] = [
34
34
  VideoEvent,
@@ -79,9 +79,9 @@ export function engineToCrdt(engine: IEngine): Uint8Array[] {
79
79
  if (!shouldSyncComponent(itComponentDefinition)) {
80
80
  continue
81
81
  }
82
-
83
82
  itComponentDefinition.dumpCrdtStateToBuffer(crdtBuffer, (entity) => {
84
- return NetworkEntity.has(entity)
83
+ const isNetworkEntity = NetworkEntity.has(entity)
84
+ return isNetworkEntity
85
85
  })
86
86
  }
87
87
 
@@ -103,6 +103,7 @@ export function engineToCrdt(engine: IEngine): Uint8Array[] {
103
103
  }
104
104
 
105
105
  // If the message itself is larger than the limit, we need to handle it specially
106
+ // For now, we'll skip it to prevent infinite loops
106
107
  if (messageSize / 1024 > LIVEKIT_MAX_SIZE) {
107
108
  console.error(
108
109
  `Message too large (${messageSize} bytes), skipping component ${message.componentId} for entity ${message.entityId}`