@dcl/ecs 7.1.12-4982829389.commit-f2f84bd → 7.1.12-4983011170.commit-adaaaa2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/components/component-number.d.ts +7 -0
- package/dist-cjs/components/component-number.js +44 -0
- package/dist-cjs/components/extended/Animator.d.ts +46 -0
- package/dist-cjs/components/extended/Animator.js +62 -0
- package/dist-cjs/components/extended/Material.d.ts +42 -0
- package/dist-cjs/components/extended/Material.js +54 -0
- package/dist-cjs/components/extended/MeshCollider.d.ts +38 -0
- package/dist-cjs/components/extended/MeshCollider.js +43 -0
- package/dist-cjs/components/extended/MeshRenderer.d.ts +36 -0
- package/dist-cjs/components/extended/MeshRenderer.js +31 -0
- package/dist-cjs/components/generated/Animator.gen.d.ts +1 -0
- package/dist-cjs/components/generated/Animator.gen.js +28 -0
- package/dist-cjs/components/generated/AudioSource.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AudioSource.gen.js +28 -0
- package/dist-cjs/components/generated/AudioStream.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AudioStream.gen.js +28 -0
- package/dist-cjs/components/generated/AvatarAttach.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AvatarAttach.gen.js +28 -0
- package/dist-cjs/components/generated/AvatarModifierArea.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AvatarModifierArea.gen.js +28 -0
- package/dist-cjs/components/generated/AvatarShape.gen.d.ts +1 -0
- package/dist-cjs/components/generated/AvatarShape.gen.js +28 -0
- package/dist-cjs/components/generated/Billboard.gen.d.ts +1 -0
- package/dist-cjs/components/generated/Billboard.gen.js +28 -0
- package/dist-cjs/components/generated/CameraMode.gen.d.ts +1 -0
- package/dist-cjs/components/generated/CameraMode.gen.js +28 -0
- package/dist-cjs/components/generated/CameraModeArea.gen.d.ts +1 -0
- package/dist-cjs/components/generated/CameraModeArea.gen.js +28 -0
- package/dist-cjs/components/generated/EngineInfo.gen.d.ts +1 -0
- package/dist-cjs/components/generated/EngineInfo.gen.js +28 -0
- package/dist-cjs/components/generated/GltfContainer.gen.d.ts +1 -0
- package/dist-cjs/components/generated/GltfContainer.gen.js +28 -0
- package/dist-cjs/components/generated/GltfContainerLoadingState.gen.d.ts +1 -0
- package/dist-cjs/components/generated/GltfContainerLoadingState.gen.js +28 -0
- package/dist-cjs/components/generated/Material.gen.d.ts +1 -0
- package/dist-cjs/components/generated/Material.gen.js +28 -0
- package/dist-cjs/components/generated/MeshCollider.gen.d.ts +1 -0
- package/dist-cjs/components/generated/MeshCollider.gen.js +28 -0
- package/dist-cjs/components/generated/MeshRenderer.gen.d.ts +1 -0
- package/dist-cjs/components/generated/MeshRenderer.gen.js +28 -0
- package/dist-cjs/components/generated/NftShape.gen.d.ts +1 -0
- package/dist-cjs/components/generated/NftShape.gen.js +28 -0
- package/dist-cjs/components/generated/PointerEvents.gen.d.ts +1 -0
- package/dist-cjs/components/generated/PointerEvents.gen.js +28 -0
- package/dist-cjs/components/generated/PointerEventsResult.gen.d.ts +1 -0
- package/dist-cjs/components/generated/PointerEventsResult.gen.js +28 -0
- package/dist-cjs/components/generated/PointerLock.gen.d.ts +1 -0
- package/dist-cjs/components/generated/PointerLock.gen.js +28 -0
- package/dist-cjs/components/generated/Raycast.gen.d.ts +1 -0
- package/dist-cjs/components/generated/Raycast.gen.js +28 -0
- package/dist-cjs/components/generated/RaycastResult.gen.d.ts +1 -0
- package/dist-cjs/components/generated/RaycastResult.gen.js +28 -0
- package/dist-cjs/components/generated/TextShape.gen.d.ts +1 -0
- package/dist-cjs/components/generated/TextShape.gen.js +28 -0
- package/dist-cjs/components/generated/UiBackground.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiBackground.gen.js +28 -0
- package/dist-cjs/components/generated/UiCanvasInformation.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiCanvasInformation.gen.js +28 -0
- package/dist-cjs/components/generated/UiDropdown.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiDropdown.gen.js +28 -0
- package/dist-cjs/components/generated/UiDropdownResult.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiDropdownResult.gen.js +28 -0
- package/dist-cjs/components/generated/UiInput.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiInput.gen.js +28 -0
- package/dist-cjs/components/generated/UiInputResult.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiInputResult.gen.js +28 -0
- package/dist-cjs/components/generated/UiText.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiText.gen.js +28 -0
- package/dist-cjs/components/generated/UiTransform.gen.d.ts +1 -0
- package/dist-cjs/components/generated/UiTransform.gen.js +28 -0
- package/dist-cjs/components/generated/VideoEvent.gen.d.ts +1 -0
- package/dist-cjs/components/generated/VideoEvent.gen.js +28 -0
- package/dist-cjs/components/generated/VideoPlayer.gen.d.ts +1 -0
- package/dist-cjs/components/generated/VideoPlayer.gen.js +28 -0
- package/dist-cjs/components/generated/VisibilityComponent.gen.d.ts +1 -0
- package/dist-cjs/components/generated/VisibilityComponent.gen.js +28 -0
- package/dist-cjs/components/generated/component-names.gen.d.ts +4 -0
- package/dist-cjs/components/generated/component-names.gen.js +42 -0
- package/dist-cjs/components/generated/global.gen.d.ts +60 -0
- package/dist-cjs/components/generated/global.gen.js +61 -0
- package/dist-cjs/components/generated/index.gen.d.ts +139 -0
- package/dist-cjs/components/generated/index.gen.js +222 -0
- package/dist-cjs/components/generated/pb/decentraland/common/border_rect.gen.d.ts +35 -0
- package/dist-cjs/components/generated/pb/decentraland/common/border_rect.gen.js +139 -0
- package/dist-cjs/components/generated/pb/decentraland/common/colors.gen.d.ts +32 -0
- package/dist-cjs/components/generated/pb/decentraland/common/colors.gen.js +130 -0
- package/dist-cjs/components/generated/pb/decentraland/common/texture.gen.d.ts +91 -0
- package/dist-cjs/components/generated/pb/decentraland/common/texture.gen.js +254 -0
- package/dist-cjs/components/generated/pb/decentraland/common/vectors.gen.d.ts +61 -0
- package/dist-cjs/components/generated/pb/decentraland/common/vectors.gen.js +233 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/animator.gen.d.ts +50 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/animator.gen.js +147 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/audio_source.gen.d.ts +34 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/audio_source.gen.js +83 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/audio_stream.gen.d.ts +24 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/audio_stream.gen.js +65 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.d.ts +37 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.js +67 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.d.ts +44 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.js +86 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.d.ts +56 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.js +176 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/billboard.gen.d.ts +38 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/billboard.gen.js +63 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/camera_mode.gen.d.ts +20 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/camera_mode.gen.js +47 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.d.ts +32 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.js +57 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.d.ts +9 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.js +15 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/id.gen.d.ts +1 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/id.gen.js +3 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/input_action.gen.d.ts +29 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/input_action.gen.js +36 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/loading_state.gen.d.ts +10 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/loading_state.gen.js +16 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/raycast_hit.gen.d.ts +29 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/raycast_hit.gen.js +110 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/texts.gen.d.ts +22 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/texts.gen.js +29 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/engine_info.gen.d.ts +25 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/engine_info.gen.js +65 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/gltf_container.gen.d.ts +25 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/gltf_container.gen.js +65 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/gltf_container_loading_state.gen.d.ts +19 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/gltf_container_loading_state.gen.js +47 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/material.gen.d.ts +96 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/material.gen.js +326 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.d.ts +120 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.js +246 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.d.ts +96 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.js +246 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/nft_shape.gen.d.ts +58 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/nft_shape.gen.js +96 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_events.gen.d.ts +67 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_events.gen.js +159 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.d.ts +26 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.js +93 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.d.ts +19 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.js +47 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/raycast.gen.d.ts +63 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/raycast.gen.js +152 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/raycast_result.gen.d.ts +32 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/raycast_result.gen.js +85 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/text_shape.gen.d.ts +65 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/text_shape.gen.js +250 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_background.gen.d.ts +47 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_background.gen.js +119 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_canvas_information.gen.d.ts +29 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_canvas_information.gen.js +75 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_dropdown.gen.d.ts +29 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_dropdown.gen.js +130 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_dropdown_result.gen.d.ts +14 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_dropdown_result.gen.js +47 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_input.gen.d.ts +28 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_input.gen.js +120 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_input_result.gen.d.ts +14 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_input_result.gen.js +47 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_text.gen.d.ts +25 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_text.gen.js +84 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_transform.gen.d.ts +179 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/ui_transform.gen.js +644 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/video_event.gen.d.ts +33 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/video_event.gen.js +97 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/video_player.gen.d.ts +25 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/video_player.gen.js +99 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/visibility_component.gen.d.ts +15 -0
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/visibility_component.gen.js +47 -0
- package/dist-cjs/components/generated/pb/google/protobuf/descriptor.gen.d.ts +468 -0
- package/dist-cjs/components/generated/pb/google/protobuf/descriptor.gen.js +1936 -0
- package/dist-cjs/components/generated/types.gen.d.ts +9 -0
- package/dist-cjs/components/generated/types.gen.js +30 -0
- package/dist-cjs/components/index.d.ts +14 -0
- package/dist-cjs/components/index.js +38 -0
- package/dist-cjs/components/manual/Transform.d.ts +40 -0
- package/dist-cjs/components/manual/Transform.js +110 -0
- package/dist-cjs/components/types.d.ts +5 -0
- package/dist-cjs/components/types.js +2 -0
- package/dist-cjs/composite/components.d.ts +18 -0
- package/dist-cjs/composite/components.js +22 -0
- package/dist-cjs/composite/index.d.ts +51 -0
- package/dist-cjs/composite/index.js +60 -0
- package/dist-cjs/composite/instance.d.ts +34 -0
- package/dist-cjs/composite/instance.js +201 -0
- package/dist-cjs/composite/path.d.ts +3 -0
- package/dist-cjs/composite/path.js +154 -0
- package/dist-cjs/composite/proto/gen/composite.gen.d.ts +71 -0
- package/dist-cjs/composite/proto/gen/composite.gen.js +337 -0
- package/dist-cjs/composite/proto/gen/google/protobuf/struct.gen.d.ts +138 -0
- package/dist-cjs/composite/proto/gen/google/protobuf/struct.gen.js +443 -0
- package/dist-cjs/engine/component.d.ts +149 -0
- package/dist-cjs/engine/component.js +12 -0
- package/dist-cjs/engine/entity.d.ts +49 -0
- package/dist-cjs/engine/entity.js +178 -0
- package/dist-cjs/engine/grow-only-value-set-component-definition.d.ts +8 -0
- package/dist-cjs/engine/grow-only-value-set-component-definition.js +145 -0
- package/dist-cjs/engine/index.d.ts +15 -0
- package/dist-cjs/engine/index.js +247 -0
- package/dist-cjs/engine/input.d.ts +34 -0
- package/dist-cjs/engine/input.js +219 -0
- package/dist-cjs/engine/lww-element-set-component-definition.d.ts +8 -0
- package/dist-cjs/engine/lww-element-set-component-definition.js +264 -0
- package/dist-cjs/engine/readonly.d.ts +29 -0
- package/dist-cjs/engine/readonly.js +10 -0
- package/dist-cjs/engine/systems.d.ts +15 -0
- package/dist-cjs/engine/systems.js +48 -0
- package/dist-cjs/engine/types.d.ts +215 -0
- package/dist-cjs/engine/types.js +17 -0
- package/dist-cjs/index.d.ts +22 -0
- package/dist-cjs/index.js +58 -0
- package/dist-cjs/runtime/crc.d.ts +1 -0
- package/dist-cjs/runtime/crc.js +45 -0
- package/dist-cjs/runtime/helpers/index.d.ts +1 -0
- package/dist-cjs/runtime/helpers/index.js +17 -0
- package/dist-cjs/runtime/helpers/tree.d.ts +32 -0
- package/dist-cjs/runtime/helpers/tree.js +77 -0
- package/dist-cjs/runtime/initialization/index.d.ts +61 -0
- package/dist-cjs/runtime/initialization/index.js +56 -0
- package/dist-cjs/runtime/invariant.d.ts +4 -0
- package/dist-cjs/runtime/invariant.js +17 -0
- package/dist-cjs/runtime/types.d.ts +6 -0
- package/dist-cjs/runtime/types.js +18 -0
- package/dist-cjs/schemas/Array.d.ts +1 -0
- package/dist-cjs/schemas/Array.js +33 -0
- package/dist-cjs/schemas/ISchema.d.ts +35 -0
- package/dist-cjs/schemas/ISchema.js +2 -0
- package/dist-cjs/schemas/Map.d.ts +20 -0
- package/dist-cjs/schemas/Map.js +49 -0
- package/dist-cjs/schemas/OneOf.d.ts +10 -0
- package/dist-cjs/schemas/OneOf.js +35 -0
- package/dist-cjs/schemas/Optional.d.ts +1 -0
- package/dist-cjs/schemas/Optional.js +34 -0
- package/dist-cjs/schemas/basic/Boolean.d.ts +1 -0
- package/dist-cjs/schemas/basic/Boolean.js +21 -0
- package/dist-cjs/schemas/basic/Enum.d.ts +1 -0
- package/dist-cjs/schemas/basic/Enum.js +101 -0
- package/dist-cjs/schemas/basic/Float.d.ts +1 -0
- package/dist-cjs/schemas/basic/Float.js +39 -0
- package/dist-cjs/schemas/basic/Integer.d.ts +9 -0
- package/dist-cjs/schemas/basic/Integer.js +75 -0
- package/dist-cjs/schemas/basic/String.d.ts +1 -0
- package/dist-cjs/schemas/basic/String.js +25 -0
- package/dist-cjs/schemas/buildSchema/index.d.ts +11 -0
- package/dist-cjs/schemas/buildSchema/index.js +114 -0
- package/dist-cjs/schemas/buildSchema/types.d.ts +5 -0
- package/dist-cjs/schemas/buildSchema/types.js +2 -0
- package/dist-cjs/schemas/buildSchema/utils.d.ts +12 -0
- package/dist-cjs/schemas/buildSchema/utils.js +30 -0
- package/dist-cjs/schemas/custom/Color3.d.ts +8 -0
- package/dist-cjs/schemas/custom/Color3.js +32 -0
- package/dist-cjs/schemas/custom/Color4.d.ts +9 -0
- package/dist-cjs/schemas/custom/Color4.js +35 -0
- package/dist-cjs/schemas/custom/Entity.d.ts +1 -0
- package/dist-cjs/schemas/custom/Entity.js +21 -0
- package/dist-cjs/schemas/custom/Quaternion.d.ts +9 -0
- package/dist-cjs/schemas/custom/Quaternion.js +35 -0
- package/dist-cjs/schemas/custom/Vector3.d.ts +8 -0
- package/dist-cjs/schemas/custom/Vector3.js +33 -0
- package/dist-cjs/schemas/index.d.ts +80 -0
- package/dist-cjs/schemas/index.js +84 -0
- package/dist-cjs/schemas/typing.d.ts +30 -0
- package/dist-cjs/schemas/typing.js +2 -0
- package/dist-cjs/serialization/ByteBuffer/index.d.ts +180 -0
- package/dist-cjs/serialization/ByteBuffer/index.js +272 -0
- package/dist-cjs/serialization/crdt/appendValue.d.ts +15 -0
- package/dist-cjs/serialization/crdt/appendValue.js +52 -0
- package/dist-cjs/serialization/crdt/crdtMessageProtocol.d.ts +30 -0
- package/dist-cjs/serialization/crdt/crdtMessageProtocol.js +71 -0
- package/dist-cjs/serialization/crdt/deleteComponent.d.ts +14 -0
- package/dist-cjs/serialization/crdt/deleteComponent.js +45 -0
- package/dist-cjs/serialization/crdt/deleteEntity.d.ts +11 -0
- package/dist-cjs/serialization/crdt/deleteEntity.js +34 -0
- package/dist-cjs/serialization/crdt/index.d.ts +6 -0
- package/dist-cjs/serialization/crdt/index.js +22 -0
- package/dist-cjs/serialization/crdt/message.d.ts +3 -0
- package/dist-cjs/serialization/crdt/message.js +28 -0
- package/dist-cjs/serialization/crdt/putComponent.d.ts +15 -0
- package/dist-cjs/serialization/crdt/putComponent.js +50 -0
- package/dist-cjs/serialization/crdt/types.d.ts +147 -0
- package/dist-cjs/serialization/crdt/types.js +77 -0
- package/dist-cjs/systems/async-task.d.ts +1 -0
- package/dist-cjs/systems/async-task.js +33 -0
- package/dist-cjs/systems/crdt/gset.d.ts +29 -0
- package/dist-cjs/systems/crdt/gset.js +54 -0
- package/dist-cjs/systems/crdt/index.d.ts +7 -0
- package/dist-cjs/systems/crdt/index.js +241 -0
- package/dist-cjs/systems/crdt/types.d.ts +20 -0
- package/dist-cjs/systems/crdt/types.js +2 -0
- package/dist-cjs/systems/crdt/utils.d.ts +15 -0
- package/dist-cjs/systems/crdt/utils.js +52 -0
- package/dist-cjs/systems/cyclicParentingChecker.d.ts +17 -0
- package/dist-cjs/systems/cyclicParentingChecker.js +60 -0
- package/dist-cjs/systems/events.d.ts +49 -0
- package/dist-cjs/systems/events.js +137 -0
- package/dist-cjs/systems/raycast.d.ts +80 -0
- package/dist-cjs/systems/raycast.js +124 -0
- package/dist-cjs/systems/videoEvents.d.ts +14 -0
- package/dist-cjs/systems/videoEvents.js +89 -0
- package/package.json +5 -4
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PutComponentOperation = void 0;
|
|
4
|
+
const crdtMessageProtocol_1 = require("./crdtMessageProtocol");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
var PutComponentOperation;
|
|
10
|
+
(function (PutComponentOperation) {
|
|
11
|
+
PutComponentOperation.MESSAGE_HEADER_LENGTH = 16;
|
|
12
|
+
/**
|
|
13
|
+
* Call this function for an optimal writing data passing the ByteBuffer
|
|
14
|
+
* already allocated
|
|
15
|
+
*/
|
|
16
|
+
function write(entity, timestamp, componentId, data, buf) {
|
|
17
|
+
// reserve the beginning
|
|
18
|
+
const startMessageOffset = buf.incrementWriteOffset(types_1.CRDT_MESSAGE_HEADER_LENGTH + PutComponentOperation.MESSAGE_HEADER_LENGTH);
|
|
19
|
+
// write body
|
|
20
|
+
buf.writeBuffer(data, false);
|
|
21
|
+
const messageLength = buf.currentWriteOffset() - startMessageOffset;
|
|
22
|
+
// Write CrdtMessage header
|
|
23
|
+
buf.setUint32(startMessageOffset, messageLength);
|
|
24
|
+
buf.setUint32(startMessageOffset + 4, types_1.CrdtMessageType.PUT_COMPONENT);
|
|
25
|
+
// Write ComponentOperation header
|
|
26
|
+
buf.setUint32(startMessageOffset + 8, entity);
|
|
27
|
+
buf.setUint32(startMessageOffset + 12, componentId);
|
|
28
|
+
buf.setUint32(startMessageOffset + 16, timestamp);
|
|
29
|
+
const newLocal = messageLength - PutComponentOperation.MESSAGE_HEADER_LENGTH - types_1.CRDT_MESSAGE_HEADER_LENGTH;
|
|
30
|
+
buf.setUint32(startMessageOffset + 20, newLocal);
|
|
31
|
+
}
|
|
32
|
+
PutComponentOperation.write = write;
|
|
33
|
+
function read(buf) {
|
|
34
|
+
const header = crdtMessageProtocol_1.CrdtMessageProtocol.readHeader(buf);
|
|
35
|
+
if (!header) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
if (header.type !== types_1.CrdtMessageType.PUT_COMPONENT) {
|
|
39
|
+
throw new Error('PutComponentOperation tried to read another message type.');
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
...header,
|
|
43
|
+
entityId: buf.readUint32(),
|
|
44
|
+
componentId: buf.readUint32(),
|
|
45
|
+
timestamp: buf.readUint32(),
|
|
46
|
+
data: buf.readBuffer()
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
PutComponentOperation.read = read;
|
|
50
|
+
})(PutComponentOperation = exports.PutComponentOperation || (exports.PutComponentOperation = {}));
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Entity, uint32 } from '../../engine/entity';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export declare enum CrdtMessageType {
|
|
6
|
+
RESERVED = 0,
|
|
7
|
+
PUT_COMPONENT = 1,
|
|
8
|
+
DELETE_COMPONENT = 2,
|
|
9
|
+
DELETE_ENTITY = 3,
|
|
10
|
+
APPEND_VALUE = 4,
|
|
11
|
+
MAX_MESSAGE_TYPE = 5
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Min length = 8 bytes
|
|
15
|
+
* All message length including
|
|
16
|
+
* @param length - uint32 the length of all message (including the header)
|
|
17
|
+
* @param type - define the function which handles the data
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
export type CrdtMessageHeader = {
|
|
21
|
+
length: uint32;
|
|
22
|
+
type: uint32;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
export declare const CRDT_MESSAGE_HEADER_LENGTH = 8;
|
|
28
|
+
/**
|
|
29
|
+
* Min. length = header (8 bytes) + 16 bytes = 24 bytes
|
|
30
|
+
*
|
|
31
|
+
* @param entity - Uint32 number of the entity
|
|
32
|
+
* @param componentId - Uint32 number of id
|
|
33
|
+
* @param timestamp - Uint32 Lamport timestamp
|
|
34
|
+
* @param data - Uint8[] data of component => length(4 bytes) + block of bytes[0..length-1]
|
|
35
|
+
* @public
|
|
36
|
+
*/
|
|
37
|
+
export type PutComponentMessageBody = {
|
|
38
|
+
type: CrdtMessageType.PUT_COMPONENT;
|
|
39
|
+
entityId: Entity;
|
|
40
|
+
componentId: number;
|
|
41
|
+
timestamp: number;
|
|
42
|
+
data: Uint8Array;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Min. length = header (8 bytes) + 16 bytes = 24 bytes
|
|
46
|
+
*
|
|
47
|
+
* @param entity - Uint32 number of the entity
|
|
48
|
+
* @param componentId - Uint32 number of id
|
|
49
|
+
* @param timestamp - Uint32 timestamp
|
|
50
|
+
* @param data - Uint8[] data of component => length(4 bytes) + block of bytes[0..length-1]
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
export type AppendValueMessageBody = {
|
|
54
|
+
type: CrdtMessageType.APPEND_VALUE;
|
|
55
|
+
entityId: Entity;
|
|
56
|
+
componentId: number;
|
|
57
|
+
timestamp: number;
|
|
58
|
+
data: Uint8Array;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* @param entity - Uint32 number of the entity
|
|
62
|
+
* @param componentId - Uint32 number of id
|
|
63
|
+
* @param timestamp - Uint32 Lamport timestamp
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
export type DeleteComponentMessageBody = {
|
|
67
|
+
type: CrdtMessageType.DELETE_COMPONENT;
|
|
68
|
+
entityId: Entity;
|
|
69
|
+
componentId: number;
|
|
70
|
+
timestamp: number;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* @param entity - uint32 number of the entity
|
|
74
|
+
* @public
|
|
75
|
+
*/
|
|
76
|
+
export type DeleteEntityMessageBody = {
|
|
77
|
+
type: CrdtMessageType.DELETE_ENTITY;
|
|
78
|
+
entityId: Entity;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* @public
|
|
82
|
+
*/
|
|
83
|
+
export type AppendValueMessage = CrdtMessageHeader & AppendValueMessageBody;
|
|
84
|
+
/**
|
|
85
|
+
* @public
|
|
86
|
+
*/
|
|
87
|
+
export type PutComponentMessage = CrdtMessageHeader & PutComponentMessageBody;
|
|
88
|
+
/**
|
|
89
|
+
* @public
|
|
90
|
+
*/
|
|
91
|
+
export type DeleteComponentMessage = CrdtMessageHeader & DeleteComponentMessageBody;
|
|
92
|
+
/**
|
|
93
|
+
* @public
|
|
94
|
+
*/
|
|
95
|
+
export type DeleteEntityMessage = CrdtMessageHeader & DeleteEntityMessageBody;
|
|
96
|
+
/**
|
|
97
|
+
* @public
|
|
98
|
+
*/
|
|
99
|
+
export type CrdtMessage = PutComponentMessage | DeleteComponentMessage | DeleteEntityMessage | AppendValueMessage;
|
|
100
|
+
/**
|
|
101
|
+
* @public
|
|
102
|
+
*/
|
|
103
|
+
export type CrdtMessageBody = PutComponentMessageBody | DeleteComponentMessageBody | DeleteEntityMessageBody | AppendValueMessageBody;
|
|
104
|
+
export declare enum ProcessMessageResultType {
|
|
105
|
+
/**
|
|
106
|
+
* Typical message and new state set.
|
|
107
|
+
* @state CHANGE
|
|
108
|
+
* @reason Incoming message has a timestamp greater
|
|
109
|
+
*/
|
|
110
|
+
StateUpdatedTimestamp = 1,
|
|
111
|
+
/**
|
|
112
|
+
* Typical message when it is considered old.
|
|
113
|
+
* @state it does NOT CHANGE.
|
|
114
|
+
* @reason incoming message has a timestamp lower.
|
|
115
|
+
*/
|
|
116
|
+
StateOutdatedTimestamp = 2,
|
|
117
|
+
/**
|
|
118
|
+
* Weird message, same timestamp and data.
|
|
119
|
+
* @state it does NOT CHANGE.
|
|
120
|
+
* @reason consistent state between peers.
|
|
121
|
+
*/
|
|
122
|
+
NoChanges = 3,
|
|
123
|
+
/**
|
|
124
|
+
* Less but typical message, same timestamp, resolution by data.
|
|
125
|
+
* @state it does NOT CHANGE.
|
|
126
|
+
* @reason incoming message has a LOWER data.
|
|
127
|
+
*/
|
|
128
|
+
StateOutdatedData = 4,
|
|
129
|
+
/**
|
|
130
|
+
* Less but typical message, same timestamp, resolution by data.
|
|
131
|
+
* @state CHANGE.
|
|
132
|
+
* @reason incoming message has a GREATER data.
|
|
133
|
+
*/
|
|
134
|
+
StateUpdatedData = 5,
|
|
135
|
+
/**
|
|
136
|
+
* Entity was previously deleted.
|
|
137
|
+
* @state it does NOT CHANGE.
|
|
138
|
+
* @reason The message is considered old.
|
|
139
|
+
*/
|
|
140
|
+
EntityWasDeleted = 6,
|
|
141
|
+
/**
|
|
142
|
+
* Entity should be deleted.
|
|
143
|
+
* @state CHANGE.
|
|
144
|
+
* @reason the state is storing old entities
|
|
145
|
+
*/
|
|
146
|
+
EntityDeleted = 7
|
|
147
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProcessMessageResultType = exports.CRDT_MESSAGE_HEADER_LENGTH = exports.CrdtMessageType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
var CrdtMessageType;
|
|
8
|
+
(function (CrdtMessageType) {
|
|
9
|
+
CrdtMessageType[CrdtMessageType["RESERVED"] = 0] = "RESERVED";
|
|
10
|
+
// Component Operation
|
|
11
|
+
CrdtMessageType[CrdtMessageType["PUT_COMPONENT"] = 1] = "PUT_COMPONENT";
|
|
12
|
+
CrdtMessageType[CrdtMessageType["DELETE_COMPONENT"] = 2] = "DELETE_COMPONENT";
|
|
13
|
+
CrdtMessageType[CrdtMessageType["DELETE_ENTITY"] = 3] = "DELETE_ENTITY";
|
|
14
|
+
CrdtMessageType[CrdtMessageType["APPEND_VALUE"] = 4] = "APPEND_VALUE";
|
|
15
|
+
CrdtMessageType[CrdtMessageType["MAX_MESSAGE_TYPE"] = 5] = "MAX_MESSAGE_TYPE";
|
|
16
|
+
})(CrdtMessageType = exports.CrdtMessageType || (exports.CrdtMessageType = {}));
|
|
17
|
+
/**
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
20
|
+
exports.CRDT_MESSAGE_HEADER_LENGTH = 8;
|
|
21
|
+
var ProcessMessageResultType;
|
|
22
|
+
(function (ProcessMessageResultType) {
|
|
23
|
+
/**
|
|
24
|
+
* Typical message and new state set.
|
|
25
|
+
* @state CHANGE
|
|
26
|
+
* @reason Incoming message has a timestamp greater
|
|
27
|
+
*/
|
|
28
|
+
ProcessMessageResultType[ProcessMessageResultType["StateUpdatedTimestamp"] = 1] = "StateUpdatedTimestamp";
|
|
29
|
+
/**
|
|
30
|
+
* Typical message when it is considered old.
|
|
31
|
+
* @state it does NOT CHANGE.
|
|
32
|
+
* @reason incoming message has a timestamp lower.
|
|
33
|
+
*/
|
|
34
|
+
ProcessMessageResultType[ProcessMessageResultType["StateOutdatedTimestamp"] = 2] = "StateOutdatedTimestamp";
|
|
35
|
+
/**
|
|
36
|
+
* Weird message, same timestamp and data.
|
|
37
|
+
* @state it does NOT CHANGE.
|
|
38
|
+
* @reason consistent state between peers.
|
|
39
|
+
*/
|
|
40
|
+
ProcessMessageResultType[ProcessMessageResultType["NoChanges"] = 3] = "NoChanges";
|
|
41
|
+
/**
|
|
42
|
+
* Less but typical message, same timestamp, resolution by data.
|
|
43
|
+
* @state it does NOT CHANGE.
|
|
44
|
+
* @reason incoming message has a LOWER data.
|
|
45
|
+
*/
|
|
46
|
+
ProcessMessageResultType[ProcessMessageResultType["StateOutdatedData"] = 4] = "StateOutdatedData";
|
|
47
|
+
/**
|
|
48
|
+
* Less but typical message, same timestamp, resolution by data.
|
|
49
|
+
* @state CHANGE.
|
|
50
|
+
* @reason incoming message has a GREATER data.
|
|
51
|
+
*/
|
|
52
|
+
ProcessMessageResultType[ProcessMessageResultType["StateUpdatedData"] = 5] = "StateUpdatedData";
|
|
53
|
+
/**
|
|
54
|
+
* Entity was previously deleted.
|
|
55
|
+
* @state it does NOT CHANGE.
|
|
56
|
+
* @reason The message is considered old.
|
|
57
|
+
*/
|
|
58
|
+
ProcessMessageResultType[ProcessMessageResultType["EntityWasDeleted"] = 6] = "EntityWasDeleted";
|
|
59
|
+
/**
|
|
60
|
+
* Entity should be deleted.
|
|
61
|
+
* @state CHANGE.
|
|
62
|
+
* @reason the state is storing old entities
|
|
63
|
+
*/
|
|
64
|
+
ProcessMessageResultType[ProcessMessageResultType["EntityDeleted"] = 7] = "EntityDeleted";
|
|
65
|
+
})(ProcessMessageResultType = exports.ProcessMessageResultType || (exports.ProcessMessageResultType = {}));
|
|
66
|
+
// we receive LWW, v=6, we have v=5 => we receive with delay the deleteEntity(v=5)
|
|
67
|
+
// => we should generate the deleteEntity message effects internally with deleteEntity(v=5),
|
|
68
|
+
// but don't resend the deleteEntity
|
|
69
|
+
// - (CRDT) addDeletedEntitySet v=5 (with crdt state cleaning) and then LWW v=6
|
|
70
|
+
// - (engine) engine.deleteEntity v=5
|
|
71
|
+
// we receive LWW, v=7, we have v=5 => we receive with delay the deleteEntity(v=5), deleteEntity(v=6), ..., N
|
|
72
|
+
// => we should generate the deleteEntity message effects internally with deleteEntity(v=5),
|
|
73
|
+
// but don't resend the deleteEntity
|
|
74
|
+
// - (CRDT) addDeletedEntitySet v=5 (with crdt state cleaning) and then LWW v=6
|
|
75
|
+
// - (engine) engine.deleteEntity v=5
|
|
76
|
+
// msg delete entity: it only should be sent by deleter
|
|
77
|
+
//
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Task<T = unknown> = () => Promise<T>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTaskSystem = void 0;
|
|
4
|
+
function getAndClean(value) {
|
|
5
|
+
const messagesToProcess = Array.from(value);
|
|
6
|
+
value.length = 0;
|
|
7
|
+
return messagesToProcess;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* @internal
|
|
11
|
+
*/
|
|
12
|
+
function createTaskSystem(engine) {
|
|
13
|
+
const tasks = [];
|
|
14
|
+
async function runTask(task) {
|
|
15
|
+
try {
|
|
16
|
+
const resp = await task();
|
|
17
|
+
return resp;
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
console.error(e);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function executeTasks() {
|
|
24
|
+
for (const task of getAndClean(tasks)) {
|
|
25
|
+
runTask(task).catch(console.error);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
engine.addSystem(executeTasks);
|
|
29
|
+
return function (task) {
|
|
30
|
+
tasks.push(task);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
exports.createTaskSystem = createTaskSystem;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Grow-only set is a implementation with a memory optimization.
|
|
3
|
+
*
|
|
4
|
+
* Each number has a version, no matter how the final compound number is mixed.
|
|
5
|
+
*
|
|
6
|
+
* The function `add` isn't defined (for this implementation), instead, the addTo is: add all versions of a number `n` until (and including) `v`.
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
export type OptimizedGrowonlySet = {
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*
|
|
13
|
+
* @param n
|
|
14
|
+
* @param v
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
addTo(n: number, v: number): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* @public
|
|
20
|
+
*
|
|
21
|
+
* @returns the set with [number, version] of each value
|
|
22
|
+
*/
|
|
23
|
+
has(n: number, v: number): boolean;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
* @returns a new GSet
|
|
28
|
+
*/
|
|
29
|
+
export declare function createVersionGSet(): OptimizedGrowonlySet;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createVersionGSet = void 0;
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @returns a new GSet
|
|
7
|
+
*/
|
|
8
|
+
function createVersionGSet() {
|
|
9
|
+
const lastVersion = new Map();
|
|
10
|
+
return {
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @param number
|
|
14
|
+
* @param version
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
addTo(number, version) {
|
|
18
|
+
/* istanbul ignore next */
|
|
19
|
+
if (version < 0) {
|
|
20
|
+
/* istanbul ignore next */
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const currentValue = lastVersion.get(number);
|
|
24
|
+
// If the version is >=, it means the value it's already in the set
|
|
25
|
+
if (currentValue !== undefined && currentValue >= version) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
lastVersion.set(number, version);
|
|
29
|
+
return true;
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* @returns the set with [number, version] of each value
|
|
33
|
+
*/
|
|
34
|
+
has(n, v) {
|
|
35
|
+
const currentValue = lastVersion.get(n);
|
|
36
|
+
// If the version is >=, it means the value it's already in the set
|
|
37
|
+
if (currentValue !== undefined && currentValue >= v) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Warning: this function returns the reference to the internal map,
|
|
44
|
+
* if you need to mutate some value, make a copy.
|
|
45
|
+
* For optimization purpose the copy isn't made here.
|
|
46
|
+
*
|
|
47
|
+
* @returns the map of number to version
|
|
48
|
+
*/
|
|
49
|
+
getMap() {
|
|
50
|
+
return lastVersion;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
exports.createVersionGSet = createVersionGSet;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Entity } from '../../engine/entity';
|
|
2
|
+
import type { ComponentDefinition } from '../../engine';
|
|
3
|
+
import { CrdtMessageType } from '../../serialization/crdt/types';
|
|
4
|
+
/**
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export type OnChangeFunction = (entity: Entity, operation: CrdtMessageType, component?: ComponentDefinition<any>, componentValue?: any) => void;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.crdtSceneSystem = void 0;
|
|
4
|
+
const entity_1 = require("../../engine/entity");
|
|
5
|
+
const ByteBuffer_1 = require("../../serialization/ByteBuffer");
|
|
6
|
+
const crdt_1 = require("../../serialization/crdt");
|
|
7
|
+
const deleteComponent_1 = require("../../serialization/crdt/deleteComponent");
|
|
8
|
+
const deleteEntity_1 = require("../../serialization/crdt/deleteEntity");
|
|
9
|
+
const putComponent_1 = require("../../serialization/crdt/putComponent");
|
|
10
|
+
const types_1 = require("../../serialization/crdt/types");
|
|
11
|
+
/**
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
15
|
+
const transports = [];
|
|
16
|
+
// Messages that we received at transport.onMessage waiting to be processed
|
|
17
|
+
const receivedMessages = [];
|
|
18
|
+
// Messages already processed by the engine but that we need to broadcast to other transports.
|
|
19
|
+
const broadcastMessages = [];
|
|
20
|
+
// Messages receieved by a transport that were outdated. We need to correct them
|
|
21
|
+
const outdatedMessages = [];
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @param transportId tranport id to identiy messages
|
|
25
|
+
* @returns a function to process received messages
|
|
26
|
+
*/
|
|
27
|
+
function parseChunkMessage(transportId) {
|
|
28
|
+
/**
|
|
29
|
+
* Receives a chunk of binary messages and stores all the valid
|
|
30
|
+
* Component Operation Messages at messages queue
|
|
31
|
+
* @param chunkMessage A chunk of binary messages
|
|
32
|
+
*/
|
|
33
|
+
return function parseChunkMessage(chunkMessage) {
|
|
34
|
+
const buffer = new ByteBuffer_1.ReadWriteByteBuffer(chunkMessage);
|
|
35
|
+
let header;
|
|
36
|
+
while ((header = crdt_1.CrdtMessageProtocol.getHeader(buffer))) {
|
|
37
|
+
const offset = buffer.currentReadOffset();
|
|
38
|
+
if (header.type === types_1.CrdtMessageType.DELETE_COMPONENT) {
|
|
39
|
+
const message = deleteComponent_1.DeleteComponent.read(buffer);
|
|
40
|
+
receivedMessages.push({
|
|
41
|
+
...message,
|
|
42
|
+
transportId,
|
|
43
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentReadOffset())
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else if (header.type === types_1.CrdtMessageType.PUT_COMPONENT) {
|
|
47
|
+
const message = putComponent_1.PutComponentOperation.read(buffer);
|
|
48
|
+
receivedMessages.push({
|
|
49
|
+
...message,
|
|
50
|
+
transportId,
|
|
51
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentReadOffset())
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else if (header.type === types_1.CrdtMessageType.DELETE_ENTITY) {
|
|
55
|
+
const message = deleteEntity_1.DeleteEntity.read(buffer);
|
|
56
|
+
receivedMessages.push({
|
|
57
|
+
...message,
|
|
58
|
+
transportId,
|
|
59
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentReadOffset())
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else if (header.type === types_1.CrdtMessageType.APPEND_VALUE) {
|
|
63
|
+
const message = crdt_1.AppendValueOperation.read(buffer);
|
|
64
|
+
receivedMessages.push({
|
|
65
|
+
...message,
|
|
66
|
+
transportId,
|
|
67
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentReadOffset())
|
|
68
|
+
});
|
|
69
|
+
// Unknown message, we skip it
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// consume the message
|
|
73
|
+
buffer.incrementReadOffset(header.length);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// TODO: do something if buffler.len>0
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Return and clear the messaes queue
|
|
81
|
+
* @returns messages recieved by the transport to process on the next tick
|
|
82
|
+
*/
|
|
83
|
+
function getMessages(value) {
|
|
84
|
+
const messagesToProcess = value.splice(0, value.length);
|
|
85
|
+
return messagesToProcess;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* This fn will be called on every tick.
|
|
89
|
+
* Process all the messages queue received by the transport
|
|
90
|
+
*/
|
|
91
|
+
async function receiveMessages() {
|
|
92
|
+
const messagesToProcess = getMessages(receivedMessages);
|
|
93
|
+
const bufferForOutdated = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
94
|
+
const entitiesShouldBeCleaned = [];
|
|
95
|
+
for (const msg of messagesToProcess) {
|
|
96
|
+
if (msg.type === types_1.CrdtMessageType.DELETE_ENTITY) {
|
|
97
|
+
entitiesShouldBeCleaned.push(msg.entityId);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const entityState = engine.entityContainer.getEntityState(msg.entityId);
|
|
101
|
+
// Skip updates from removed entityes
|
|
102
|
+
if (entityState === entity_1.EntityState.Removed)
|
|
103
|
+
continue;
|
|
104
|
+
// Entities with unknown entities should update its entity state
|
|
105
|
+
if (entityState === entity_1.EntityState.Unknown) {
|
|
106
|
+
engine.entityContainer.updateUsedEntity(msg.entityId);
|
|
107
|
+
}
|
|
108
|
+
const component = engine.getComponentOrNull(msg.componentId);
|
|
109
|
+
/* istanbul ignore else */
|
|
110
|
+
if (component) {
|
|
111
|
+
const [conflictMessage, value] = component.updateFromCrdt(msg);
|
|
112
|
+
if (conflictMessage) {
|
|
113
|
+
const offset = bufferForOutdated.currentWriteOffset();
|
|
114
|
+
if (conflictMessage.type === types_1.CrdtMessageType.PUT_COMPONENT) {
|
|
115
|
+
putComponent_1.PutComponentOperation.write(msg.entityId, conflictMessage.timestamp, conflictMessage.componentId, conflictMessage.data, bufferForOutdated);
|
|
116
|
+
}
|
|
117
|
+
else if (conflictMessage.type === types_1.CrdtMessageType.DELETE_COMPONENT) {
|
|
118
|
+
deleteComponent_1.DeleteComponent.write(msg.entityId, component.componentId, conflictMessage.timestamp, bufferForOutdated);
|
|
119
|
+
}
|
|
120
|
+
outdatedMessages.push({
|
|
121
|
+
...msg,
|
|
122
|
+
messageBuffer: bufferForOutdated.buffer().subarray(offset, bufferForOutdated.currentWriteOffset())
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Add message to transport queue to be processed by others transports
|
|
127
|
+
broadcastMessages.push(msg);
|
|
128
|
+
onProcessEntityComponentChange && onProcessEntityComponentChange(msg.entityId, msg.type, component, value);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// TODO: test this line, it is fundammental to make the editor work
|
|
133
|
+
broadcastMessages.push(msg);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// the last stage of the syncrhonization is to delete the entities
|
|
138
|
+
for (const entity of entitiesShouldBeCleaned) {
|
|
139
|
+
// If we tried to resend outdated message and the entity was deleted before, we avoid sending them.
|
|
140
|
+
for (let i = outdatedMessages.length - 1; i >= 0; i--) {
|
|
141
|
+
if (outdatedMessages[i].entityId === entity && outdatedMessages[i].type !== types_1.CrdtMessageType.DELETE_ENTITY) {
|
|
142
|
+
outdatedMessages.splice(i, 1);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const definition of engine.componentsIter()) {
|
|
146
|
+
definition.entityDeleted(entity, false);
|
|
147
|
+
}
|
|
148
|
+
engine.entityContainer.updateRemovedEntity(entity);
|
|
149
|
+
onProcessEntityComponentChange && onProcessEntityComponentChange(entity, types_1.CrdtMessageType.DELETE_ENTITY);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Iterates the dirty map and generates crdt messages to be send
|
|
154
|
+
*/
|
|
155
|
+
async function sendMessages(entitiesDeletedThisTick) {
|
|
156
|
+
// CRDT Messages will be the merge between the recieved transport messages and the new crdt messages
|
|
157
|
+
const crdtMessages = getMessages(broadcastMessages);
|
|
158
|
+
const outdatedMessagesBkp = getMessages(outdatedMessages);
|
|
159
|
+
const buffer = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
160
|
+
for (const component of engine.componentsIter()) {
|
|
161
|
+
for (const message of component.getCrdtUpdates()) {
|
|
162
|
+
const offset = buffer.currentWriteOffset();
|
|
163
|
+
// Avoid creating messages if there is no transport that will handle it
|
|
164
|
+
if (transports.some((t) => t.filter(message))) {
|
|
165
|
+
if (message.type === types_1.CrdtMessageType.PUT_COMPONENT) {
|
|
166
|
+
putComponent_1.PutComponentOperation.write(message.entityId, message.timestamp, message.componentId, message.data, buffer);
|
|
167
|
+
}
|
|
168
|
+
else if (message.type === types_1.CrdtMessageType.DELETE_COMPONENT) {
|
|
169
|
+
deleteComponent_1.DeleteComponent.write(message.entityId, component.componentId, message.timestamp, buffer);
|
|
170
|
+
}
|
|
171
|
+
else if (message.type === types_1.CrdtMessageType.APPEND_VALUE) {
|
|
172
|
+
crdt_1.AppendValueOperation.write(message.entityId, message.timestamp, message.componentId, message.data, buffer);
|
|
173
|
+
}
|
|
174
|
+
crdtMessages.push({
|
|
175
|
+
...message,
|
|
176
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentWriteOffset())
|
|
177
|
+
});
|
|
178
|
+
if (onProcessEntityComponentChange) {
|
|
179
|
+
const rawValue = message.type === types_1.CrdtMessageType.PUT_COMPONENT || message.type === types_1.CrdtMessageType.APPEND_VALUE
|
|
180
|
+
? component.get(message.entityId)
|
|
181
|
+
: undefined;
|
|
182
|
+
onProcessEntityComponentChange(message.entityId, message.type, component, rawValue);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// After all updates, I execute the DeletedEntity messages
|
|
188
|
+
for (const entityId of entitiesDeletedThisTick) {
|
|
189
|
+
const offset = buffer.currentWriteOffset();
|
|
190
|
+
deleteEntity_1.DeleteEntity.write(entityId, buffer);
|
|
191
|
+
crdtMessages.push({
|
|
192
|
+
type: types_1.CrdtMessageType.DELETE_ENTITY,
|
|
193
|
+
entityId,
|
|
194
|
+
messageBuffer: buffer.buffer().subarray(offset, buffer.currentWriteOffset())
|
|
195
|
+
});
|
|
196
|
+
onProcessEntityComponentChange && onProcessEntityComponentChange(entityId, types_1.CrdtMessageType.DELETE_ENTITY);
|
|
197
|
+
}
|
|
198
|
+
// Send CRDT messages to transports
|
|
199
|
+
const transportBuffer = new ByteBuffer_1.ReadWriteByteBuffer();
|
|
200
|
+
for (const index in transports) {
|
|
201
|
+
const transportIndex = Number(index);
|
|
202
|
+
const transport = transports[transportIndex];
|
|
203
|
+
transportBuffer.resetBuffer();
|
|
204
|
+
// First we need to send all the messages that were outdated from a transport
|
|
205
|
+
// So we can fix their crdt state
|
|
206
|
+
for (const message of outdatedMessagesBkp) {
|
|
207
|
+
if (message.transportId === transportIndex &&
|
|
208
|
+
// TODO: This is an optimization, the state should converge anyway, whatever the message is sent.
|
|
209
|
+
// Avoid sending multiple messages for the same entity-componentId
|
|
210
|
+
!crdtMessages.find((m) => m.entityId === message.entityId &&
|
|
211
|
+
// TODO: as any, with multiple type of messages, it should have many checks before the check for similar messages
|
|
212
|
+
m.componentId &&
|
|
213
|
+
m.componentId === message.componentId)) {
|
|
214
|
+
transportBuffer.writeBuffer(message.messageBuffer, false);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Then we send all the new crdtMessages that the transport needs to process
|
|
218
|
+
for (const message of crdtMessages) {
|
|
219
|
+
if (message.transportId !== transportIndex && transport.filter(message)) {
|
|
220
|
+
transportBuffer.writeBuffer(message.messageBuffer, false);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const message = transportBuffer.currentWriteOffset() ? transportBuffer.toBinary() : new Uint8Array([]);
|
|
224
|
+
await transport.send(message);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* @public
|
|
229
|
+
* Add a transport to the crdt system
|
|
230
|
+
*/
|
|
231
|
+
function addTransport(transport) {
|
|
232
|
+
const id = transports.push(transport) - 1;
|
|
233
|
+
transport.onmessage = parseChunkMessage(id);
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
sendMessages,
|
|
237
|
+
receiveMessages,
|
|
238
|
+
addTransport
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
exports.crdtSceneSystem = crdtSceneSystem;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CrdtMessageBody } from '../../serialization/crdt/types';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export type ReceiveMessage = CrdtMessageBody & {
|
|
6
|
+
transportId?: number;
|
|
7
|
+
messageBuffer: Uint8Array;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export type TransportMessage = Omit<ReceiveMessage, 'data'>;
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export type Transport = {
|
|
17
|
+
send(message: Uint8Array): Promise<void>;
|
|
18
|
+
onmessage?(message: Uint8Array): void;
|
|
19
|
+
filter(message: Omit<TransportMessage, 'messageBuffer'>): boolean;
|
|
20
|
+
};
|