@needle-tools/engine 4.5.5-next.f053174 → 4.5.6
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/CHANGELOG.md +3740 -3740
- package/LICENSE.md +10 -10
- package/README.md +64 -64
- package/components.needle.json +1 -1
- package/dist/{needle-engine.bundle-DFfLpZpn.min.js → needle-engine.bundle-2nTaeeW3.min.js} +62 -62
- package/dist/{needle-engine.bundle-Dx2hV9Bu.umd.cjs → needle-engine.bundle-B3qVc_uH.umd.cjs} +54 -54
- package/dist/{needle-engine.bundle-DvRTYg0j.js → needle-engine.bundle-B9tUMvDR.js} +623 -623
- package/dist/{needle-engine.bundle-BxW8rOic.light.min.js → needle-engine.bundle-BWeBylyu.light.min.js} +62 -62
- package/dist/{needle-engine.bundle-5YrltOTW.light.umd.cjs → needle-engine.bundle-Bx32FU5Z.light.umd.cjs} +54 -54
- package/dist/{needle-engine.bundle-Bjtl-M4D.light.js → needle-engine.bundle-CAuuubKQ.light.js} +623 -623
- package/dist/needle-engine.d.ts +129 -130
- package/dist/needle-engine.js +2 -2
- package/dist/needle-engine.light.d.ts +129 -130
- package/dist/needle-engine.light.js +2 -2
- package/dist/needle-engine.light.min.js +1 -1
- package/dist/needle-engine.light.umd.cjs +1 -1
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/lib/asap/needle-asap.d.ts +1 -1
- package/lib/asap/needle-asap.js +95 -95
- package/lib/asap/sessiongranted.d.ts +3 -3
- package/lib/asap/sessiongranted.js +65 -65
- package/lib/asap/utils.d.ts +1 -1
- package/lib/asap/utils.js +3 -3
- package/lib/engine/analytics/index.d.ts +6 -6
- package/lib/engine/analytics/index.js +12 -12
- package/lib/engine/analytics/lcp.d.ts +3 -3
- package/lib/engine/analytics/lcp.js +34 -34
- package/lib/engine/api.d.ts +82 -82
- package/lib/engine/api.js +81 -81
- package/lib/engine/assets/index.d.ts +11 -11
- package/lib/engine/assets/index.js +47 -47
- package/lib/engine/assets/static.d.ts +1 -1
- package/lib/engine/assets/static.js +4 -4
- package/lib/engine/codegen/register_types.d.ts +1 -1
- package/lib/engine/codegen/register_types.js +300 -300
- package/lib/engine/debug/debug.d.ts +15 -15
- package/lib/engine/debug/debug.js +44 -44
- package/lib/engine/debug/debug_console.d.ts +2 -2
- package/lib/engine/debug/debug_console.js +307 -307
- package/lib/engine/debug/debug_overlay.d.ts +22 -22
- package/lib/engine/debug/debug_overlay.js +316 -316
- package/lib/engine/debug/debug_spatial_console.d.ts +2 -2
- package/lib/engine/debug/debug_spatial_console.js +390 -390
- package/lib/engine/debug/index.d.ts +2 -2
- package/lib/engine/debug/index.js +2 -2
- package/lib/engine/engine_addressables.d.ts +166 -166
- package/lib/engine/engine_addressables.js +608 -608
- package/lib/engine/engine_animation.d.ts +43 -43
- package/lib/engine/engine_animation.js +133 -133
- package/lib/engine/engine_application.d.ts +45 -45
- package/lib/engine/engine_application.js +104 -104
- package/lib/engine/engine_assetdatabase.d.ts +25 -25
- package/lib/engine/engine_assetdatabase.js +344 -344
- package/lib/engine/engine_audio.d.ts +4 -4
- package/lib/engine/engine_audio.js +23 -23
- package/lib/engine/engine_camera.d.ts +13 -13
- package/lib/engine/engine_camera.js +30 -30
- package/lib/engine/engine_components.d.ts +110 -110
- package/lib/engine/engine_components.js +374 -374
- package/lib/engine/engine_components_internal.d.ts +9 -9
- package/lib/engine/engine_components_internal.js +36 -36
- package/lib/engine/engine_constants.d.ts +10 -10
- package/lib/engine/engine_constants.js +41 -41
- package/lib/engine/engine_context.d.ts +472 -472
- package/lib/engine/engine_context.js +1664 -1664
- package/lib/engine/engine_context_registry.d.ts +71 -71
- package/lib/engine/engine_context_registry.js +117 -117
- package/lib/engine/engine_coroutine.d.ts +35 -35
- package/lib/engine/engine_coroutine.js +52 -52
- package/lib/engine/engine_create_objects.d.ts +119 -119
- package/lib/engine/engine_create_objects.js +320 -320
- package/lib/engine/engine_default_parameters.d.ts +2 -2
- package/lib/engine/engine_default_parameters.js +3 -3
- package/lib/engine/engine_editor-sync.d.ts +21 -21
- package/lib/engine/engine_editor-sync.js +4 -4
- package/lib/engine/engine_fileloader.d.ts +2 -2
- package/lib/engine/engine_fileloader.js +8 -8
- package/lib/engine/engine_gameobject.d.ts +68 -68
- package/lib/engine/engine_gameobject.js +616 -616
- package/lib/engine/engine_generic_utils.d.ts +1 -1
- package/lib/engine/engine_generic_utils.js +13 -13
- package/lib/engine/engine_gizmos.d.ts +149 -149
- package/lib/engine/engine_gizmos.js +530 -530
- package/lib/engine/engine_gltf.d.ts +12 -12
- package/lib/engine/engine_gltf.js +15 -15
- package/lib/engine/engine_gltf_builtin_components.d.ts +11 -11
- package/lib/engine/engine_gltf_builtin_components.js +341 -341
- package/lib/engine/engine_hot_reload.d.ts +8 -8
- package/lib/engine/engine_hot_reload.js +197 -197
- package/lib/engine/engine_input.d.ts +362 -362
- package/lib/engine/engine_input.js +1294 -1294
- package/lib/engine/engine_input_utils.d.ts +2 -2
- package/lib/engine/engine_input_utils.js +22 -22
- package/lib/engine/engine_instancing.d.ts +19 -19
- package/lib/engine/engine_instancing.js +39 -39
- package/lib/engine/engine_license.d.ts +11 -11
- package/lib/engine/engine_license.js +369 -369
- package/lib/engine/engine_lifecycle_api.d.ts +83 -83
- package/lib/engine/engine_lifecycle_api.js +106 -106
- package/lib/engine/engine_lifecycle_functions_internal.d.ts +32 -32
- package/lib/engine/engine_lifecycle_functions_internal.js +146 -146
- package/lib/engine/engine_lightdata.d.ts +23 -23
- package/lib/engine/engine_lightdata.js +91 -91
- package/lib/engine/engine_loaders.callbacks.d.ts +97 -97
- package/lib/engine/engine_loaders.callbacks.js +86 -86
- package/lib/engine/engine_loaders.d.ts +48 -48
- package/lib/engine/engine_loaders.gltf.d.ts +13 -13
- package/lib/engine/engine_loaders.gltf.js +62 -62
- package/lib/engine/engine_loaders.js +337 -337
- package/lib/engine/engine_lods.d.ts +31 -31
- package/lib/engine/engine_lods.js +146 -146
- package/lib/engine/engine_mainloop_utils.d.ts +32 -32
- package/lib/engine/engine_mainloop_utils.js +466 -466
- package/lib/engine/engine_math.d.ts +114 -114
- package/lib/engine/engine_math.js +247 -247
- package/lib/engine/engine_modules.d.ts +36 -36
- package/lib/engine/engine_modules.js +85 -85
- package/lib/engine/engine_networking.d.ts +260 -260
- package/lib/engine/engine_networking.js +764 -764
- package/lib/engine/engine_networking_auto.d.ts +24 -24
- package/lib/engine/engine_networking_auto.js +310 -310
- package/lib/engine/engine_networking_blob.d.ts +48 -48
- package/lib/engine/engine_networking_blob.js +228 -228
- package/lib/engine/engine_networking_files.d.ts +35 -35
- package/lib/engine/engine_networking_files.js +172 -172
- package/lib/engine/engine_networking_files_default_components.d.ts +6 -6
- package/lib/engine/engine_networking_files_default_components.js +42 -42
- package/lib/engine/engine_networking_instantiate.d.ts +100 -100
- package/lib/engine/engine_networking_instantiate.js +345 -345
- package/lib/engine/engine_networking_peer.d.ts +15 -15
- package/lib/engine/engine_networking_peer.js +132 -132
- package/lib/engine/engine_networking_streams.d.ts +123 -123
- package/lib/engine/engine_networking_streams.js +645 -645
- package/lib/engine/engine_networking_types.d.ts +22 -22
- package/lib/engine/engine_networking_types.js +7 -7
- package/lib/engine/engine_networking_utils.d.ts +2 -2
- package/lib/engine/engine_networking_utils.js +20 -20
- package/lib/engine/engine_networking_websocket.d.ts +1 -1
- package/lib/engine/engine_networking_websocket.js +2 -2
- package/lib/engine/engine_patcher.d.ts +10 -10
- package/lib/engine/engine_patcher.js +142 -142
- package/lib/engine/engine_physics.d.ts +152 -152
- package/lib/engine/engine_physics.js +645 -645
- package/lib/engine/engine_physics.types.d.ts +40 -40
- package/lib/engine/engine_physics.types.js +33 -33
- package/lib/engine/engine_physics_rapier.d.ts +147 -147
- package/lib/engine/engine_physics_rapier.js +1433 -1433
- package/lib/engine/engine_playerview.d.ts +26 -26
- package/lib/engine/engine_playerview.js +64 -64
- package/lib/engine/engine_scenelighting.d.ts +71 -71
- package/lib/engine/engine_scenelighting.js +226 -226
- package/lib/engine/engine_serialization.d.ts +3 -3
- package/lib/engine/engine_serialization.js +3 -3
- package/lib/engine/engine_serialization_builtin_serializer.d.ts +72 -72
- package/lib/engine/engine_serialization_builtin_serializer.js +403 -403
- package/lib/engine/engine_serialization_core.d.ts +94 -94
- package/lib/engine/engine_serialization_core.js +607 -607
- package/lib/engine/engine_serialization_decorator.d.ts +23 -23
- package/lib/engine/engine_serialization_decorator.js +66 -66
- package/lib/engine/engine_setup.d.ts +1 -1
- package/lib/engine/engine_setup.js +2 -2
- package/lib/engine/engine_shaders.d.ts +53 -53
- package/lib/engine/engine_shaders.js +252 -252
- package/lib/engine/engine_shims.d.ts +4 -4
- package/lib/engine/engine_shims.js +24 -24
- package/lib/engine/engine_test_utils.d.ts +39 -39
- package/lib/engine/engine_test_utils.js +83 -83
- package/lib/engine/engine_texture.d.ts +28 -28
- package/lib/engine/engine_texture.js +64 -64
- package/lib/engine/engine_three_utils.d.ts +201 -201
- package/lib/engine/engine_three_utils.js +731 -731
- package/lib/engine/engine_time.d.ts +51 -51
- package/lib/engine/engine_time.js +82 -82
- package/lib/engine/engine_time_utils.d.ts +88 -88
- package/lib/engine/engine_time_utils.js +215 -215
- package/lib/engine/engine_tonemapping.d.ts +2 -2
- package/lib/engine/engine_tonemapping.js +194 -194
- package/lib/engine/engine_types.d.ts +578 -578
- package/lib/engine/engine_types.js +95 -95
- package/lib/engine/engine_typestore.d.ts +28 -28
- package/lib/engine/engine_typestore.js +55 -55
- package/lib/engine/engine_util_decorator.d.ts +13 -13
- package/lib/engine/engine_util_decorator.js +116 -116
- package/lib/engine/engine_utils.d.ts +248 -248
- package/lib/engine/engine_utils.js +993 -993
- package/lib/engine/engine_utils_format.d.ts +24 -24
- package/lib/engine/engine_utils_format.js +239 -239
- package/lib/engine/engine_utils_screenshot.d.ts +159 -159
- package/lib/engine/engine_utils_screenshot.js +513 -513
- package/lib/engine/engine_utils_screenshot.xr.d.ts +5 -5
- package/lib/engine/engine_utils_screenshot.xr.js +90 -90
- package/lib/engine/engine_xr.d.ts +1 -1
- package/lib/engine/engine_xr.js +1 -1
- package/lib/engine/export/gltf/Writers.d.ts +19 -19
- package/lib/engine/export/gltf/Writers.js +24 -24
- package/lib/engine/export/gltf/index.d.ts +11 -11
- package/lib/engine/export/gltf/index.js +123 -123
- package/lib/engine/export/index.d.ts +2 -2
- package/lib/engine/export/index.js +2 -2
- package/lib/engine/export/state.d.ts +7 -7
- package/lib/engine/export/state.js +17 -17
- package/lib/engine/export/utils.d.ts +2 -2
- package/lib/engine/export/utils.js +7 -7
- package/lib/engine/extensions/EXT_texture_exr.d.ts +8 -8
- package/lib/engine/extensions/EXT_texture_exr.js +32 -32
- package/lib/engine/extensions/NEEDLE_animator_controller_model.d.ts +122 -122
- package/lib/engine/extensions/NEEDLE_animator_controller_model.js +95 -95
- package/lib/engine/extensions/NEEDLE_components.d.ts +35 -35
- package/lib/engine/extensions/NEEDLE_components.js +220 -220
- package/lib/engine/extensions/NEEDLE_gameobject_data.d.ts +10 -10
- package/lib/engine/extensions/NEEDLE_gameobject_data.js +57 -57
- package/lib/engine/extensions/NEEDLE_lighting_settings.d.ts +37 -37
- package/lib/engine/extensions/NEEDLE_lighting_settings.js +157 -157
- package/lib/engine/extensions/NEEDLE_lightmaps.d.ts +18 -18
- package/lib/engine/extensions/NEEDLE_lightmaps.js +99 -99
- package/lib/engine/extensions/NEEDLE_persistent_assets.d.ts +11 -11
- package/lib/engine/extensions/NEEDLE_persistent_assets.js +63 -63
- package/lib/engine/extensions/NEEDLE_progressive.d.ts +1 -1
- package/lib/engine/extensions/NEEDLE_progressive.js +1 -1
- package/lib/engine/extensions/NEEDLE_render_objects.d.ts +13 -13
- package/lib/engine/extensions/NEEDLE_render_objects.js +159 -159
- package/lib/engine/extensions/NEEDLE_techniques_webgl.d.ts +38 -38
- package/lib/engine/extensions/NEEDLE_techniques_webgl.js +564 -564
- package/lib/engine/extensions/extension_resolver.d.ts +4 -4
- package/lib/engine/extensions/extension_resolver.js +1 -1
- package/lib/engine/extensions/extension_utils.d.ts +12 -12
- package/lib/engine/extensions/extension_utils.js +152 -152
- package/lib/engine/extensions/extensions.d.ts +32 -32
- package/lib/engine/extensions/extensions.js +107 -107
- package/lib/engine/extensions/index.d.ts +6 -6
- package/lib/engine/extensions/index.js +6 -6
- package/lib/engine/extensions/usage_tracker.d.ts +13 -13
- package/lib/engine/extensions/usage_tracker.js +65 -65
- package/lib/engine/js-extensions/Camera.d.ts +1 -1
- package/lib/engine/js-extensions/Camera.js +39 -39
- package/lib/engine/js-extensions/ExtensionUtils.d.ts +9 -9
- package/lib/engine/js-extensions/ExtensionUtils.js +67 -67
- package/lib/engine/js-extensions/Layers.d.ts +6 -6
- package/lib/engine/js-extensions/Layers.js +22 -22
- package/lib/engine/js-extensions/Object3D.d.ts +120 -120
- package/lib/engine/js-extensions/Object3D.js +136 -136
- package/lib/engine/js-extensions/RGBAColor.d.ts +23 -23
- package/lib/engine/js-extensions/RGBAColor.js +111 -111
- package/lib/engine/js-extensions/Vector.d.ts +3 -3
- package/lib/engine/js-extensions/Vector.js +13 -13
- package/lib/engine/js-extensions/index.d.ts +5 -5
- package/lib/engine/js-extensions/index.js +5 -5
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.d.ts +4 -4
- package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +79 -79
- package/lib/engine/shaders/shaderData.d.ts +55 -55
- package/lib/engine/shaders/shaderData.js +58 -58
- package/lib/engine/tests/test_utils.d.ts +2 -2
- package/lib/engine/tests/test_utils.js +53 -53
- package/lib/engine/webcomponents/WebXRButtons.d.ts +56 -56
- package/lib/engine/webcomponents/WebXRButtons.js +230 -230
- package/lib/engine/webcomponents/api.d.ts +5 -5
- package/lib/engine/webcomponents/api.js +4 -4
- package/lib/engine/webcomponents/buttons.d.ts +51 -51
- package/lib/engine/webcomponents/buttons.js +264 -264
- package/lib/engine/webcomponents/fonts.d.ts +9 -9
- package/lib/engine/webcomponents/fonts.js +32 -32
- package/lib/engine/webcomponents/icons.d.ts +9 -9
- package/lib/engine/webcomponents/icons.js +52 -52
- package/lib/engine/webcomponents/index.d.ts +1 -1
- package/lib/engine/webcomponents/index.js +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +10 -10
- package/lib/engine/webcomponents/logo-element.js +67 -67
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.d.ts +37 -37
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +513 -513
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +155 -155
- package/lib/engine/webcomponents/needle menu/needle-menu.js +1029 -1029
- package/lib/engine/webcomponents/needle-button.d.ts +34 -34
- package/lib/engine/webcomponents/needle-button.js +161 -161
- package/lib/engine/webcomponents/needle-engine.ar-overlay.d.ts +21 -21
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +166 -166
- package/lib/engine/webcomponents/needle-engine.attributes.d.ts +69 -69
- package/lib/engine/webcomponents/needle-engine.attributes.js +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +113 -113
- package/lib/engine/webcomponents/needle-engine.extras.d.ts +6 -6
- package/lib/engine/webcomponents/needle-engine.extras.js +13 -13
- package/lib/engine/webcomponents/needle-engine.js +831 -831
- package/lib/engine/webcomponents/needle-engine.loading.d.ts +44 -44
- package/lib/engine/webcomponents/needle-engine.loading.js +341 -341
- package/lib/engine/xr/NeedleXRController.d.ts +313 -313
- package/lib/engine/xr/NeedleXRController.js +1007 -1007
- package/lib/engine/xr/NeedleXRSession.d.ts +340 -340
- package/lib/engine/xr/NeedleXRSession.js +1463 -1463
- package/lib/engine/xr/NeedleXRSync.d.ts +22 -22
- package/lib/engine/xr/NeedleXRSync.js +188 -188
- package/lib/engine/xr/SceneTransition.d.ts +18 -18
- package/lib/engine/xr/SceneTransition.js +69 -69
- package/lib/engine/xr/TempXRContext.d.ts +34 -34
- package/lib/engine/xr/TempXRContext.js +187 -187
- package/lib/engine/xr/XRRig.d.ts +7 -7
- package/lib/engine/xr/XRRig.js +1 -1
- package/lib/engine/xr/api.d.ts +6 -6
- package/lib/engine/xr/api.js +6 -6
- package/lib/engine/xr/events.d.ts +66 -66
- package/lib/engine/xr/events.js +93 -93
- package/lib/engine/xr/internal.d.ts +12 -12
- package/lib/engine/xr/internal.js +25 -25
- package/lib/engine/xr/usdz.d.ts +12 -12
- package/lib/engine/xr/usdz.js +29 -29
- package/lib/engine/xr/utils.d.ts +11 -11
- package/lib/engine/xr/utils.js +34 -34
- package/lib/engine-components/AlignmentConstraint.d.ts +10 -10
- package/lib/engine-components/AlignmentConstraint.js +39 -39
- package/lib/engine-components/Animation.d.ts +156 -156
- package/lib/engine-components/Animation.js +508 -508
- package/lib/engine-components/AnimationCurve.d.ts +40 -40
- package/lib/engine-components/AnimationCurve.js +159 -159
- package/lib/engine-components/AnimationUtils.d.ts +8 -8
- package/lib/engine-components/AnimationUtils.js +27 -27
- package/lib/engine-components/AnimationUtilsAutoplay.d.ts +1 -1
- package/lib/engine-components/AnimationUtilsAutoplay.js +39 -39
- package/lib/engine-components/Animator.d.ts +217 -217
- package/lib/engine-components/Animator.js +354 -354
- package/lib/engine-components/AnimatorController.d.ts +227 -227
- package/lib/engine-components/AnimatorController.js +1152 -1152
- package/lib/engine-components/AudioListener.d.ts +33 -33
- package/lib/engine-components/AudioListener.js +86 -86
- package/lib/engine-components/AudioSource.d.ts +217 -217
- package/lib/engine-components/AudioSource.js +634 -634
- package/lib/engine-components/AvatarLoader.d.ts +80 -80
- package/lib/engine-components/AvatarLoader.js +231 -231
- package/lib/engine-components/AxesHelper.d.ts +32 -32
- package/lib/engine-components/AxesHelper.js +67 -67
- package/lib/engine-components/BasicIKConstraint.d.ts +9 -9
- package/lib/engine-components/BasicIKConstraint.js +43 -43
- package/lib/engine-components/BoxCollider.d.ts +2 -2
- package/lib/engine-components/BoxCollider.js +2 -2
- package/lib/engine-components/BoxHelperComponent.d.ts +47 -47
- package/lib/engine-components/BoxHelperComponent.js +102 -102
- package/lib/engine-components/Camera.d.ts +231 -231
- package/lib/engine-components/Camera.js +700 -700
- package/lib/engine-components/CameraUtils.d.ts +1 -1
- package/lib/engine-components/CameraUtils.js +121 -121
- package/lib/engine-components/CharacterController.d.ts +55 -55
- package/lib/engine-components/CharacterController.js +236 -236
- package/lib/engine-components/Collider.d.ts +188 -188
- package/lib/engine-components/Collider.js +369 -369
- package/lib/engine-components/Component.d.ts +792 -792
- package/lib/engine-components/Component.js +920 -920
- package/lib/engine-components/ContactShadows.d.ts +94 -94
- package/lib/engine-components/ContactShadows.js +453 -453
- package/lib/engine-components/DeleteBox.d.ts +19 -19
- package/lib/engine-components/DeleteBox.js +58 -58
- package/lib/engine-components/DeviceFlag.d.ts +16 -16
- package/lib/engine-components/DeviceFlag.js +47 -47
- package/lib/engine-components/DragControls.d.ts +170 -170
- package/lib/engine-components/DragControls.js +1421 -1421
- package/lib/engine-components/DropListener.d.ts +215 -215
- package/lib/engine-components/DropListener.js +642 -642
- package/lib/engine-components/Duplicatable.d.ts +35 -35
- package/lib/engine-components/Duplicatable.js +202 -202
- package/lib/engine-components/EventList.d.ts +54 -54
- package/lib/engine-components/EventList.js +232 -232
- package/lib/engine-components/EventTrigger.d.ts +33 -33
- package/lib/engine-components/EventTrigger.js +75 -75
- package/lib/engine-components/EventType.d.ts +22 -22
- package/lib/engine-components/EventType.js +23 -23
- package/lib/engine-components/Fog.d.ts +22 -22
- package/lib/engine-components/Fog.js +61 -61
- package/lib/engine-components/Gizmos.d.ts +17 -17
- package/lib/engine-components/Gizmos.js +64 -64
- package/lib/engine-components/GridHelper.d.ts +20 -20
- package/lib/engine-components/GridHelper.js +54 -54
- package/lib/engine-components/GroundProjection.d.ts +67 -67
- package/lib/engine-components/GroundProjection.js +343 -343
- package/lib/engine-components/Interactable.d.ts +12 -12
- package/lib/engine-components/Interactable.js +12 -12
- package/lib/engine-components/Joints.d.ts +19 -19
- package/lib/engine-components/Joints.js +51 -51
- package/lib/engine-components/LODGroup.d.ts +35 -35
- package/lib/engine-components/LODGroup.js +152 -152
- package/lib/engine-components/Light.d.ts +180 -180
- package/lib/engine-components/Light.js +535 -535
- package/lib/engine-components/LookAtConstraint.d.ts +19 -19
- package/lib/engine-components/LookAtConstraint.js +35 -35
- package/lib/engine-components/NeedleMenu.d.ts +50 -50
- package/lib/engine-components/NeedleMenu.js +92 -92
- package/lib/engine-components/NestedGltf.d.ts +25 -25
- package/lib/engine-components/NestedGltf.js +88 -88
- package/lib/engine-components/Networking.d.ts +54 -54
- package/lib/engine-components/Networking.js +112 -112
- package/lib/engine-components/OffsetConstraint.d.ts +14 -14
- package/lib/engine-components/OffsetConstraint.js +65 -65
- package/lib/engine-components/OrbitControls.d.ts +268 -268
- package/lib/engine-components/OrbitControls.js +1015 -1015
- package/lib/engine-components/PlayerColor.d.ts +19 -19
- package/lib/engine-components/PlayerColor.js +94 -94
- package/lib/engine-components/ReflectionProbe.d.ts +27 -27
- package/lib/engine-components/ReflectionProbe.js +201 -201
- package/lib/engine-components/Renderer.d.ts +153 -153
- package/lib/engine-components/Renderer.js +830 -830
- package/lib/engine-components/RendererInstancing.d.ts +140 -140
- package/lib/engine-components/RendererInstancing.js +744 -744
- package/lib/engine-components/RendererLightmap.d.ts +24 -24
- package/lib/engine-components/RendererLightmap.js +182 -182
- package/lib/engine-components/RigidBody.d.ts +155 -155
- package/lib/engine-components/RigidBody.js +517 -517
- package/lib/engine-components/SceneSwitcher.d.ts +263 -263
- package/lib/engine-components/SceneSwitcher.js +971 -971
- package/lib/engine-components/ScreenCapture.d.ts +144 -144
- package/lib/engine-components/ScreenCapture.js +547 -547
- package/lib/engine-components/ShadowCatcher.d.ts +33 -33
- package/lib/engine-components/ShadowCatcher.js +166 -166
- package/lib/engine-components/Skybox.d.ts +82 -82
- package/lib/engine-components/Skybox.js +448 -448
- package/lib/engine-components/SmoothFollow.d.ts +34 -34
- package/lib/engine-components/SmoothFollow.js +82 -82
- package/lib/engine-components/SpatialTrigger.d.ts +102 -102
- package/lib/engine-components/SpatialTrigger.js +225 -225
- package/lib/engine-components/SpectatorCamera.d.ts +111 -111
- package/lib/engine-components/SpectatorCamera.js +715 -715
- package/lib/engine-components/SphereCollider.d.ts +2 -2
- package/lib/engine-components/SphereCollider.js +2 -2
- package/lib/engine-components/SpriteRenderer.d.ts +132 -132
- package/lib/engine-components/SpriteRenderer.js +472 -472
- package/lib/engine-components/SyncedCamera.d.ts +41 -41
- package/lib/engine-components/SyncedCamera.js +199 -199
- package/lib/engine-components/SyncedRoom.d.ts +106 -106
- package/lib/engine-components/SyncedRoom.js +371 -371
- package/lib/engine-components/SyncedTransform.d.ts +94 -94
- package/lib/engine-components/SyncedTransform.js +331 -331
- package/lib/engine-components/TestRunner.d.ts +16 -16
- package/lib/engine-components/TestRunner.js +102 -102
- package/lib/engine-components/TransformGizmo.d.ts +75 -75
- package/lib/engine-components/TransformGizmo.js +209 -209
- package/lib/engine-components/VideoPlayer.d.ts +184 -184
- package/lib/engine-components/VideoPlayer.js +978 -978
- package/lib/engine-components/Voip.d.ts +67 -67
- package/lib/engine-components/Voip.js +360 -360
- package/lib/engine-components/api.d.ts +51 -51
- package/lib/engine-components/api.js +50 -50
- package/lib/engine-components/avatar/AvatarBlink_Simple.d.ts +11 -11
- package/lib/engine-components/avatar/AvatarBlink_Simple.js +76 -76
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.d.ts +14 -14
- package/lib/engine-components/avatar/AvatarEyeLook_Rotation.js +68 -68
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.d.ts +29 -29
- package/lib/engine-components/avatar/Avatar_Brain_LookAt.js +121 -121
- package/lib/engine-components/avatar/Avatar_MouthShapes.d.ts +15 -15
- package/lib/engine-components/avatar/Avatar_MouthShapes.js +79 -79
- package/lib/engine-components/avatar/Avatar_MustacheShake.d.ts +9 -9
- package/lib/engine-components/avatar/Avatar_MustacheShake.js +29 -29
- package/lib/engine-components/codegen/components.d.ts +216 -216
- package/lib/engine-components/codegen/components.js +218 -218
- package/lib/engine-components/debug/LogStats.d.ts +5 -5
- package/lib/engine-components/debug/LogStats.js +18 -18
- package/lib/engine-components/export/gltf/GltfExport.d.ts +30 -30
- package/lib/engine-components/export/gltf/GltfExport.js +246 -246
- package/lib/engine-components/export/gltf/index.d.ts +1 -1
- package/lib/engine-components/export/gltf/index.js +1 -1
- package/lib/engine-components/export/index.d.ts +1 -1
- package/lib/engine-components/export/index.js +1 -1
- package/lib/engine-components/export/usdz/Extension.d.ts +22 -22
- package/lib/engine-components/export/usdz/Extension.js +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.d.ts +160 -160
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +1782 -1782
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +130 -130
- package/lib/engine-components/export/usdz/USDZExporter.js +663 -663
- package/lib/engine-components/export/usdz/extensions/Animation.d.ts +106 -106
- package/lib/engine-components/export/usdz/extensions/Animation.js +1071 -1071
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.d.ts +5 -5
- package/lib/engine-components/export/usdz/extensions/DocumentExtension.js +6 -6
- package/lib/engine-components/export/usdz/extensions/USDZText.d.ts +54 -54
- package/lib/engine-components/export/usdz/extensions/USDZText.js +203 -203
- package/lib/engine-components/export/usdz/extensions/USDZUI.d.ts +8 -8
- package/lib/engine-components/export/usdz/extensions/USDZUI.js +158 -158
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.d.ts +30 -30
- package/lib/engine-components/export/usdz/extensions/behavior/Actions.js +88 -88
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.d.ts +10 -10
- package/lib/engine-components/export/usdz/extensions/behavior/AudioExtension.js +86 -86
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.d.ts +28 -28
- package/lib/engine-components/export/usdz/extensions/behavior/Behaviour.js +290 -290
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.d.ts +190 -190
- package/lib/engine-components/export/usdz/extensions/behavior/BehaviourComponents.js +1060 -1060
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.d.ts +135 -135
- package/lib/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.js +548 -548
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.d.ts +7 -7
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +115 -115
- package/lib/engine-components/export/usdz/index.d.ts +3 -3
- package/lib/engine-components/export/usdz/index.js +2 -2
- package/lib/engine-components/export/usdz/utils/animationutils.d.ts +7 -7
- package/lib/engine-components/export/usdz/utils/animationutils.js +163 -163
- package/lib/engine-components/export/usdz/utils/quicklook.d.ts +2 -2
- package/lib/engine-components/export/usdz/utils/quicklook.js +43 -43
- package/lib/engine-components/particlesystem/ParticleSystem.d.ts +177 -177
- package/lib/engine-components/particlesystem/ParticleSystem.js +1176 -1176
- package/lib/engine-components/particlesystem/ParticleSystemModules.d.ts +526 -526
- package/lib/engine-components/particlesystem/ParticleSystemModules.js +1930 -1930
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.d.ts +25 -25
- package/lib/engine-components/particlesystem/ParticleSystemSubEmitter.js +87 -87
- package/lib/engine-components/particlesystem/api.d.ts +2 -2
- package/lib/engine-components/particlesystem/api.js +2 -2
- package/lib/engine-components/postprocessing/Effects/Antialiasing.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/Antialiasing.js +50 -50
- package/lib/engine-components/postprocessing/Effects/BloomEffect.d.ts +46 -46
- package/lib/engine-components/postprocessing/Effects/BloomEffect.js +113 -113
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/ChromaticAberration.js +39 -39
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/ColorAdjustments.js +92 -92
- package/lib/engine-components/postprocessing/Effects/DepthOfField.d.ts +25 -25
- package/lib/engine-components/postprocessing/Effects/DepthOfField.js +104 -104
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.d.ts +12 -12
- package/lib/engine-components/postprocessing/Effects/EffectWrapper.js +18 -18
- package/lib/engine-components/postprocessing/Effects/Pixelation.d.ts +11 -11
- package/lib/engine-components/postprocessing/Effects/Pixelation.js +32 -32
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.d.ts +18 -18
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.js +91 -91
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.d.ts +70 -70
- package/lib/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.js +175 -175
- package/lib/engine-components/postprocessing/Effects/Sharpening.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/Sharpening.js +123 -123
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.d.ts +17 -17
- package/lib/engine-components/postprocessing/Effects/TiltShiftEffect.js +70 -70
- package/lib/engine-components/postprocessing/Effects/Tonemapping.d.ts +26 -26
- package/lib/engine-components/postprocessing/Effects/Tonemapping.js +138 -138
- package/lib/engine-components/postprocessing/Effects/Vignette.d.ts +15 -15
- package/lib/engine-components/postprocessing/Effects/Vignette.js +60 -60
- package/lib/engine-components/postprocessing/PostProcessingEffect.d.ts +72 -72
- package/lib/engine-components/postprocessing/PostProcessingEffect.js +149 -149
- package/lib/engine-components/postprocessing/PostProcessingHandler.d.ts +25 -25
- package/lib/engine-components/postprocessing/PostProcessingHandler.js +350 -350
- package/lib/engine-components/postprocessing/Volume.d.ts +89 -89
- package/lib/engine-components/postprocessing/Volume.js +367 -367
- package/lib/engine-components/postprocessing/VolumeParameter.d.ts +26 -26
- package/lib/engine-components/postprocessing/VolumeParameter.js +136 -136
- package/lib/engine-components/postprocessing/VolumeProfile.d.ts +15 -15
- package/lib/engine-components/postprocessing/VolumeProfile.js +60 -60
- package/lib/engine-components/postprocessing/index.d.ts +5 -5
- package/lib/engine-components/postprocessing/index.js +5 -5
- package/lib/engine-components/postprocessing/utils.d.ts +11 -11
- package/lib/engine-components/postprocessing/utils.js +37 -37
- package/lib/engine-components/timeline/PlayableDirector.d.ts +163 -163
- package/lib/engine-components/timeline/PlayableDirector.js +686 -686
- package/lib/engine-components/timeline/SignalAsset.d.ts +24 -24
- package/lib/engine-components/timeline/SignalAsset.js +130 -130
- package/lib/engine-components/timeline/TimelineModels.d.ts +89 -89
- package/lib/engine-components/timeline/TimelineModels.js +22 -22
- package/lib/engine-components/timeline/TimelineTracks.d.ts +110 -110
- package/lib/engine-components/timeline/TimelineTracks.js +879 -879
- package/lib/engine-components/timeline/index.d.ts +4 -4
- package/lib/engine-components/timeline/index.js +3 -3
- package/lib/engine-components/ui/BaseUIComponent.d.ts +48 -48
- package/lib/engine-components/ui/BaseUIComponent.js +170 -170
- package/lib/engine-components/ui/Button.d.ts +64 -64
- package/lib/engine-components/ui/Button.js +315 -315
- package/lib/engine-components/ui/Canvas.d.ts +74 -74
- package/lib/engine-components/ui/Canvas.js +407 -407
- package/lib/engine-components/ui/CanvasGroup.d.ts +19 -19
- package/lib/engine-components/ui/CanvasGroup.js +58 -58
- package/lib/engine-components/ui/EventSystem.d.ts +125 -125
- package/lib/engine-components/ui/EventSystem.js +765 -765
- package/lib/engine-components/ui/Graphic.d.ts +55 -55
- package/lib/engine-components/ui/Graphic.js +255 -255
- package/lib/engine-components/ui/Image.d.ts +35 -35
- package/lib/engine-components/ui/Image.js +116 -116
- package/lib/engine-components/ui/InputField.d.ts +42 -42
- package/lib/engine-components/ui/InputField.js +268 -268
- package/lib/engine-components/ui/Interfaces.d.ts +38 -38
- package/lib/engine-components/ui/Interfaces.js +12 -12
- package/lib/engine-components/ui/Layout.d.ts +84 -84
- package/lib/engine-components/ui/Layout.js +330 -330
- package/lib/engine-components/ui/Outline.d.ts +7 -7
- package/lib/engine-components/ui/Outline.js +20 -20
- package/lib/engine-components/ui/PointerEvents.d.ts +115 -115
- package/lib/engine-components/ui/PointerEvents.js +145 -145
- package/lib/engine-components/ui/RaycastUtils.d.ts +11 -11
- package/lib/engine-components/ui/RaycastUtils.js +67 -67
- package/lib/engine-components/ui/Raycaster.d.ts +30 -30
- package/lib/engine-components/ui/Raycaster.js +95 -95
- package/lib/engine-components/ui/RectTransform.d.ts +61 -61
- package/lib/engine-components/ui/RectTransform.js +356 -356
- package/lib/engine-components/ui/SpatialHtml.d.ts +8 -8
- package/lib/engine-components/ui/SpatialHtml.js +79 -79
- package/lib/engine-components/ui/Symbols.d.ts +1 -1
- package/lib/engine-components/ui/Symbols.js +1 -1
- package/lib/engine-components/ui/Text.d.ts +78 -78
- package/lib/engine-components/ui/Text.js +539 -539
- package/lib/engine-components/ui/Utils.d.ts +24 -24
- package/lib/engine-components/ui/Utils.js +90 -90
- package/lib/engine-components/ui/index.d.ts +1 -1
- package/lib/engine-components/ui/index.js +1 -1
- package/lib/engine-components/utils/EnvironmentScene.d.ts +5 -5
- package/lib/engine-components/utils/EnvironmentScene.js +205 -205
- package/lib/engine-components/utils/LookAt.d.ts +31 -31
- package/lib/engine-components/utils/LookAt.js +82 -82
- package/lib/engine-components/utils/OpenURL.d.ts +42 -42
- package/lib/engine-components/utils/OpenURL.js +119 -119
- package/lib/engine-components/webxr/Avatar.d.ts +25 -25
- package/lib/engine-components/webxr/Avatar.js +255 -255
- package/lib/engine-components/webxr/TeleportTarget.d.ts +7 -7
- package/lib/engine-components/webxr/TeleportTarget.js +7 -7
- package/lib/engine-components/webxr/WebARCameraBackground.d.ts +30 -30
- package/lib/engine-components/webxr/WebARCameraBackground.js +155 -155
- package/lib/engine-components/webxr/WebARSessionRoot.d.ts +98 -98
- package/lib/engine-components/webxr/WebARSessionRoot.js +770 -770
- package/lib/engine-components/webxr/WebXR.d.ts +232 -232
- package/lib/engine-components/webxr/WebXR.js +561 -561
- package/lib/engine-components/webxr/WebXRAvatar.d.ts +27 -27
- package/lib/engine-components/webxr/WebXRAvatar.js +44 -44
- package/lib/engine-components/webxr/WebXRImageTracking.d.ts +86 -86
- package/lib/engine-components/webxr/WebXRImageTracking.js +471 -471
- package/lib/engine-components/webxr/WebXRPlaneTracking.d.ts +92 -92
- package/lib/engine-components/webxr/WebXRPlaneTracking.js +500 -500
- package/lib/engine-components/webxr/WebXRRig.d.ts +32 -32
- package/lib/engine-components/webxr/WebXRRig.js +72 -72
- package/lib/engine-components/webxr/XRFlag.d.ts +38 -38
- package/lib/engine-components/webxr/XRFlag.js +139 -139
- package/lib/engine-components/webxr/controllers/XRControllerFollow.d.ts +47 -47
- package/lib/engine-components/webxr/controllers/XRControllerFollow.js +120 -120
- package/lib/engine-components/webxr/controllers/XRControllerModel.d.ts +43 -43
- package/lib/engine-components/webxr/controllers/XRControllerModel.js +352 -352
- package/lib/engine-components/webxr/controllers/XRControllerMovement.d.ts +78 -78
- package/lib/engine-components/webxr/controllers/XRControllerMovement.js +506 -506
- package/lib/engine-components/webxr/index.d.ts +3 -3
- package/lib/engine-components/webxr/index.js +3 -3
- package/lib/engine-components/webxr/types.d.ts +3 -3
- package/lib/engine-components/webxr/types.js +1 -1
- package/lib/engine-components-experimental/Presentation.d.ts +6 -6
- package/lib/engine-components-experimental/Presentation.js +9 -9
- package/lib/engine-components-experimental/api.d.ts +4 -4
- package/lib/engine-components-experimental/api.js +4 -4
- package/lib/engine-components-experimental/networking/PlayerSync.d.ts +156 -156
- package/lib/engine-components-experimental/networking/PlayerSync.js +377 -377
- package/lib/engine-schemes/api.d.ts +12 -12
- package/lib/engine-schemes/api.js +12 -12
- package/lib/engine-schemes/schemes.d.ts +7 -7
- package/lib/engine-schemes/schemes.js +19 -19
- package/lib/engine-schemes/synced-camera-model.d.ts +25 -25
- package/lib/engine-schemes/synced-camera-model.js +67 -67
- package/lib/engine-schemes/synced-transform-model.d.ts +31 -31
- package/lib/engine-schemes/synced-transform-model.js +66 -66
- package/lib/engine-schemes/transform.d.ts +12 -12
- package/lib/engine-schemes/transform.js +39 -39
- package/lib/engine-schemes/vec2.d.ts +10 -10
- package/lib/engine-schemes/vec2.js +25 -25
- package/lib/engine-schemes/vec3.d.ts +11 -11
- package/lib/engine-schemes/vec3.js +29 -29
- package/lib/engine-schemes/vec4.d.ts +12 -12
- package/lib/engine-schemes/vec4.js +33 -33
- package/lib/engine-schemes/vr-user-state-buffer.d.ts +37 -37
- package/lib/engine-schemes/vr-user-state-buffer.js +110 -110
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.d.ts +6 -6
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js +45 -45
- package/lib/needle-engine.d.ts +7 -7
- package/lib/needle-engine.js +64 -64
- package/package.json +2 -2
- package/plugins/common/buildinfo.js +64 -64
- package/plugins/common/cloud.js +1 -1
- package/plugins/common/config.cjs +31 -31
- package/plugins/common/config.js +35 -35
- package/plugins/common/files.js +31 -31
- package/plugins/common/generator.js +10 -10
- package/plugins/common/license.js +452 -442
- package/plugins/common/npm.js +15 -15
- package/plugins/common/timers.js +7 -7
- package/plugins/common/version.js +37 -37
- package/plugins/gltf-packer.mjs +1 -1
- package/plugins/next/alias.cjs +39 -39
- package/plugins/next/license.cjs +24 -24
- package/plugins/next/meshbvhworker.cjs +18 -18
- package/plugins/next/next.js +141 -141
- package/plugins/types/index.d.ts +2 -2
- package/plugins/types/license.d.ts +24 -24
- package/plugins/types/needleConfig.d.ts +27 -27
- package/plugins/types/next.d.ts +2 -2
- package/plugins/types/userconfig.d.ts +120 -120
- package/plugins/types/vite.d.ts +13 -13
- package/plugins/types/webmanifest.d.ts +32 -32
- package/plugins/vite/alias.js +174 -174
- package/plugins/vite/asap.js +245 -245
- package/plugins/vite/build-pipeline.js +371 -371
- package/plugins/vite/build.js +19 -19
- package/plugins/vite/buildinfo.js +41 -41
- package/plugins/vite/config.js +106 -106
- package/plugins/vite/copyfiles.js +138 -138
- package/plugins/vite/defines.js +70 -70
- package/plugins/vite/dependencies.js +232 -232
- package/plugins/vite/dependency-watcher.js +231 -231
- package/plugins/vite/drop-client.js +76 -76
- package/plugins/vite/drop.js +87 -87
- package/plugins/vite/editor-connection.js +124 -124
- package/plugins/vite/facebook-instant-games.js +102 -102
- package/plugins/vite/gzip.js +5 -5
- package/plugins/vite/imports-logger.js +143 -143
- package/plugins/vite/index.js +143 -143
- package/plugins/vite/license.js +56 -56
- package/plugins/vite/local-files.js +231 -231
- package/plugins/vite/meta.js +163 -163
- package/plugins/vite/npm.js +7 -7
- package/plugins/vite/peer.js +29 -29
- package/plugins/vite/poster-client.js +73 -73
- package/plugins/vite/poster.js +79 -79
- package/plugins/vite/pwa.js +604 -604
- package/plugins/vite/reload-client.js +15 -15
- package/plugins/vite/reload.js +351 -351
- package/plugins/vite/server.js +66 -66
- package/plugins/vite/transform-codegen.js +55 -55
- package/plugins/vite/transform.js +31 -31
- package/plugins/vite/vite-4.4-hack.js +31 -31
- package/src/asap/needle-asap.ts +111 -111
- package/src/asap/sessiongranted.ts +75 -75
- package/src/asap/utils.ts +4 -4
- package/src/engine/analytics/index.ts +10 -10
- package/src/engine/analytics/lcp.ts +35 -35
- package/src/engine/api.ts +82 -82
- package/src/engine/assets/index.ts +59 -59
- package/src/engine/assets/static.js +5 -5
- package/src/engine/codegen/register_types.ts +300 -300
- package/src/engine/debug/debug.ts +51 -51
- package/src/engine/debug/debug_console.ts +333 -333
- package/src/engine/debug/debug_overlay.ts +332 -332
- package/src/engine/debug/debug_spatial_console.ts +429 -429
- package/src/engine/debug/index.ts +1 -1
- package/src/engine/engine_addressables.ts +680 -680
- package/src/engine/engine_animation.ts +145 -145
- package/src/engine/engine_application.ts +113 -113
- package/src/engine/engine_assetdatabase.ts +387 -387
- package/src/engine/engine_audio.ts +24 -24
- package/src/engine/engine_camera.ts +39 -39
- package/src/engine/engine_components.ts +366 -366
- package/src/engine/engine_components_internal.ts +40 -40
- package/src/engine/engine_constants.ts +52 -52
- package/src/engine/engine_context.ts +1811 -1811
- package/src/engine/engine_context_registry.ts +129 -129
- package/src/engine/engine_coroutine.ts +54 -54
- package/src/engine/engine_create_objects.ts +411 -411
- package/src/engine/engine_default_parameters.ts +3 -3
- package/src/engine/engine_editor-sync.ts +28 -28
- package/src/engine/engine_fileloader.js +9 -9
- package/src/engine/engine_gameobject.ts +709 -709
- package/src/engine/engine_generic_utils.js +13 -13
- package/src/engine/engine_gizmos.ts +577 -577
- package/src/engine/engine_gltf.ts +29 -29
- package/src/engine/engine_gltf_builtin_components.ts +403 -403
- package/src/engine/engine_hot_reload.ts +210 -210
- package/src/engine/engine_input.ts +1500 -1500
- package/src/engine/engine_input_utils.ts +23 -23
- package/src/engine/engine_instancing.ts +45 -45
- package/src/engine/engine_license.ts +386 -386
- package/src/engine/engine_lifecycle_api.ts +113 -113
- package/src/engine/engine_lifecycle_functions_internal.ts +193 -193
- package/src/engine/engine_lightdata.ts +117 -117
- package/src/engine/engine_loaders.callbacks.ts +136 -136
- package/src/engine/engine_loaders.gltf.ts +82 -82
- package/src/engine/engine_loaders.ts +378 -378
- package/src/engine/engine_lods.ts +168 -168
- package/src/engine/engine_mainloop_utils.ts +472 -472
- package/src/engine/engine_math.ts +282 -282
- package/src/engine/engine_modules.ts +83 -83
- package/src/engine/engine_networking.ts +862 -862
- package/src/engine/engine_networking_auto.ts +352 -352
- package/src/engine/engine_networking_blob.ts +275 -275
- package/src/engine/engine_networking_files.ts +217 -217
- package/src/engine/engine_networking_files_default_components.ts +58 -58
- package/src/engine/engine_networking_instantiate.ts +419 -419
- package/src/engine/engine_networking_peer.ts +159 -159
- package/src/engine/engine_networking_streams.ts +713 -713
- package/src/engine/engine_networking_types.ts +24 -24
- package/src/engine/engine_networking_utils.ts +23 -23
- package/src/engine/engine_networking_websocket.ts +2 -2
- package/src/engine/engine_patcher.ts +199 -199
- package/src/engine/engine_physics.ts +783 -783
- package/src/engine/engine_physics.types.ts +46 -46
- package/src/engine/engine_physics_rapier.ts +1577 -1577
- package/src/engine/engine_playerview.ts +80 -80
- package/src/engine/engine_scenelighting.ts +294 -294
- package/src/engine/engine_serialization.ts +2 -2
- package/src/engine/engine_serialization_builtin_serializer.ts +473 -473
- package/src/engine/engine_serialization_core.ts +720 -720
- package/src/engine/engine_serialization_decorator.ts +80 -80
- package/src/engine/engine_setup.ts +1 -1
- package/src/engine/engine_shaders.ts +267 -267
- package/src/engine/engine_shims.ts +32 -32
- package/src/engine/engine_test_utils.ts +109 -109
- package/src/engine/engine_texture.ts +82 -82
- package/src/engine/engine_three_utils.ts +849 -849
- package/src/engine/engine_time.ts +94 -94
- package/src/engine/engine_time_utils.ts +237 -237
- package/src/engine/engine_tonemapping.ts +210 -210
- package/src/engine/engine_types.ts +730 -730
- package/src/engine/engine_typestore.ts +63 -63
- package/src/engine/engine_util_decorator.ts +136 -136
- package/src/engine/engine_utils.ts +1093 -1093
- package/src/engine/engine_utils_format.ts +273 -273
- package/src/engine/engine_utils_screenshot.ts +698 -698
- package/src/engine/engine_utils_screenshot.xr.ts +103 -103
- package/src/engine/export/gltf/Writers.ts +34 -34
- package/src/engine/export/gltf/index.ts +158 -158
- package/src/engine/export/index.ts +2 -2
- package/src/engine/export/state.ts +19 -19
- package/src/engine/export/utils.ts +9 -9
- package/src/engine/extensions/EXT_texture_exr.ts +50 -50
- package/src/engine/extensions/NEEDLE_animator_controller_model.ts +195 -195
- package/src/engine/extensions/NEEDLE_components.ts +268 -268
- package/src/engine/extensions/NEEDLE_gameobject_data.ts +81 -81
- package/src/engine/extensions/NEEDLE_lighting_settings.ts +185 -185
- package/src/engine/extensions/NEEDLE_lightmaps.ts +119 -119
- package/src/engine/extensions/NEEDLE_persistent_assets.ts +76 -76
- package/src/engine/extensions/NEEDLE_render_objects.ts +209 -209
- package/src/engine/extensions/NEEDLE_techniques_webgl.ts +640 -640
- package/src/engine/extensions/extension_resolver.ts +4 -4
- package/src/engine/extensions/extension_utils.ts +166 -166
- package/src/engine/extensions/extensions.ts +140 -140
- package/src/engine/extensions/index.ts +5 -5
- package/src/engine/extensions/usage_tracker.ts +100 -100
- package/src/engine/js-extensions/Camera.ts +37 -37
- package/src/engine/js-extensions/ExtensionUtils.ts +85 -85
- package/src/engine/js-extensions/Layers.ts +23 -23
- package/src/engine/js-extensions/Object3D.ts +296 -296
- package/src/engine/js-extensions/RGBAColor.ts +126 -126
- package/src/engine/js-extensions/Vector.ts +18 -18
- package/src/engine/js-extensions/index.ts +4 -4
- package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +125 -125
- package/src/engine/shaders/shaderData.ts +67 -67
- package/src/engine/tests/test_utils.ts +63 -63
- package/src/engine/webcomponents/WebXRButtons.ts +260 -260
- package/src/engine/webcomponents/api.ts +6 -6
- package/src/engine/webcomponents/buttons.ts +292 -292
- package/src/engine/webcomponents/fonts.ts +41 -41
- package/src/engine/webcomponents/icons.ts +57 -57
- package/src/engine/webcomponents/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +78 -78
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +573 -573
- package/src/engine/webcomponents/needle menu/needle-menu.ts +1118 -1118
- package/src/engine/webcomponents/needle-button.ts +181 -181
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +186 -186
- package/src/engine/webcomponents/needle-engine.attributes.ts +82 -82
- package/src/engine/webcomponents/needle-engine.extras.ts +16 -16
- package/src/engine/webcomponents/needle-engine.loading.ts +373 -373
- package/src/engine/webcomponents/needle-engine.ts +871 -871
- package/src/engine/xr/NeedleXRController.ts +1125 -1125
- package/src/engine/xr/NeedleXRSession.ts +1624 -1624
- package/src/engine/xr/NeedleXRSync.ts +220 -220
- package/src/engine/xr/SceneTransition.ts +78 -78
- package/src/engine/xr/TempXRContext.ts +216 -216
- package/src/engine/xr/XRRig.ts +9 -9
- package/src/engine/xr/api.ts +5 -5
- package/src/engine/xr/events.ts +102 -102
- package/src/engine/xr/internal.ts +34 -34
- package/src/engine/xr/usdz.ts +30 -30
- package/src/engine/xr/utils.ts +39 -39
- package/src/engine-components/AlignmentConstraint.ts +36 -36
- package/src/engine-components/Animation.ts +557 -557
- package/src/engine-components/AnimationCurve.ts +150 -150
- package/src/engine-components/AnimationUtils.ts +28 -28
- package/src/engine-components/AnimationUtilsAutoplay.ts +43 -43
- package/src/engine-components/Animator.ts +397 -397
- package/src/engine-components/AnimatorController.ts +1293 -1293
- package/src/engine-components/AudioListener.ts +92 -92
- package/src/engine-components/AudioSource.ts +644 -644
- package/src/engine-components/AvatarLoader.ts +263 -263
- package/src/engine-components/AxesHelper.ts +59 -59
- package/src/engine-components/BasicIKConstraint.ts +54 -54
- package/src/engine-components/BoxCollider.ts +1 -1
- package/src/engine-components/BoxHelperComponent.ts +114 -114
- package/src/engine-components/Camera.ts +719 -719
- package/src/engine-components/CameraUtils.ts +136 -136
- package/src/engine-components/CharacterController.ts +253 -253
- package/src/engine-components/Collider.ts +374 -374
- package/src/engine-components/Component.ts +1297 -1297
- package/src/engine-components/ContactShadows.ts +506 -506
- package/src/engine-components/DeleteBox.ts +62 -62
- package/src/engine-components/DeviceFlag.ts +46 -46
- package/src/engine-components/DragControls.ts +1623 -1623
- package/src/engine-components/DropListener.ts +713 -713
- package/src/engine-components/Duplicatable.ts +198 -198
- package/src/engine-components/EventList.ts +266 -266
- package/src/engine-components/EventTrigger.ts +74 -74
- package/src/engine-components/EventType.ts +22 -22
- package/src/engine-components/Fog.ts +60 -60
- package/src/engine-components/Gizmos.ts +56 -56
- package/src/engine-components/GridHelper.ts +48 -48
- package/src/engine-components/GroundProjection.ts +356 -356
- package/src/engine-components/Interactable.ts +14 -14
- package/src/engine-components/Joints.ts +52 -52
- package/src/engine-components/LODGroup.ts +153 -153
- package/src/engine-components/Light.ts +558 -558
- package/src/engine-components/LookAtConstraint.ts +25 -25
- package/src/engine-components/NeedleMenu.ts +84 -84
- package/src/engine-components/NestedGltf.ts +86 -86
- package/src/engine-components/Networking.ts +114 -114
- package/src/engine-components/OffsetConstraint.ts +60 -60
- package/src/engine-components/OrbitControls.ts +1074 -1074
- package/src/engine-components/PlayerColor.ts +103 -103
- package/src/engine-components/ReflectionProbe.ts +216 -216
- package/src/engine-components/Renderer.ts +900 -900
- package/src/engine-components/RendererInstancing.ts +855 -855
- package/src/engine-components/RendererLightmap.ts +198 -198
- package/src/engine-components/RigidBody.ts +526 -526
- package/src/engine-components/SceneSwitcher.ts +1030 -1030
- package/src/engine-components/ScreenCapture.ts +592 -592
- package/src/engine-components/ShadowCatcher.ts +172 -172
- package/src/engine-components/Skybox.ts +455 -455
- package/src/engine-components/SmoothFollow.ts +76 -76
- package/src/engine-components/SpatialTrigger.ts +229 -229
- package/src/engine-components/SpectatorCamera.ts +787 -787
- package/src/engine-components/SphereCollider.ts +1 -1
- package/src/engine-components/SpriteRenderer.ts +468 -468
- package/src/engine-components/SyncedCamera.ts +220 -220
- package/src/engine-components/SyncedRoom.ts +380 -380
- package/src/engine-components/SyncedTransform.ts +383 -383
- package/src/engine-components/TestRunner.ts +118 -118
- package/src/engine-components/TransformGizmo.ts +219 -219
- package/src/engine-components/VideoPlayer.ts +1025 -1025
- package/src/engine-components/Voip.ts +363 -363
- package/src/engine-components/api.ts +60 -60
- package/src/engine-components/avatar/AvatarBlink_Simple.ts +69 -69
- package/src/engine-components/avatar/AvatarEyeLook_Rotation.ts +63 -63
- package/src/engine-components/avatar/Avatar_Brain_LookAt.ts +139 -139
- package/src/engine-components/avatar/Avatar_MouthShapes.ts +83 -83
- package/src/engine-components/avatar/Avatar_MustacheShake.ts +31 -31
- package/src/engine-components/codegen/components.ts +217 -217
- package/src/engine-components/debug/LogStats.ts +21 -21
- package/src/engine-components/export/gltf/GltfExport.ts +265 -265
- package/src/engine-components/export/usdz/Extension.ts +24 -24
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2413 -2413
- package/src/engine-components/export/usdz/USDZExporter.ts +705 -705
- package/src/engine-components/export/usdz/extensions/Animation.ts +1204 -1204
- package/src/engine-components/export/usdz/extensions/DocumentExtension.ts +9 -9
- package/src/engine-components/export/usdz/extensions/USDZText.ts +240 -240
- package/src/engine-components/export/usdz/extensions/USDZUI.ts +189 -189
- package/src/engine-components/export/usdz/extensions/behavior/Actions.ts +99 -99
- package/src/engine-components/export/usdz/extensions/behavior/AudioExtension.ts +102 -102
- package/src/engine-components/export/usdz/extensions/behavior/Behaviour.ts +320 -320
- package/src/engine-components/export/usdz/extensions/behavior/BehaviourComponents.ts +1225 -1225
- package/src/engine-components/export/usdz/extensions/behavior/BehavioursBuilder.ts +646 -646
- package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +132 -132
- package/src/engine-components/export/usdz/index.ts +2 -2
- package/src/engine-components/export/usdz/utils/animationutils.ts +191 -191
- package/src/engine-components/export/usdz/utils/quicklook.ts +50 -50
- package/src/engine-components/particlesystem/ParticleSystem.ts +1287 -1287
- package/src/engine-components/particlesystem/ParticleSystemModules.ts +1765 -1765
- package/src/engine-components/particlesystem/ParticleSystemSubEmitter.ts +111 -111
- package/src/engine-components/particlesystem/api.ts +1 -1
- package/src/engine-components/postprocessing/Effects/Antialiasing.ts +55 -55
- package/src/engine-components/postprocessing/Effects/BloomEffect.ts +116 -116
- package/src/engine-components/postprocessing/Effects/ChromaticAberration.ts +37 -37
- package/src/engine-components/postprocessing/Effects/ColorAdjustments.ts +95 -95
- package/src/engine-components/postprocessing/Effects/DepthOfField.ts +103 -103
- package/src/engine-components/postprocessing/Effects/EffectWrapper.ts +25 -25
- package/src/engine-components/postprocessing/Effects/Pixelation.ts +32 -32
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusion.ts +90 -90
- package/src/engine-components/postprocessing/Effects/ScreenspaceAmbientOcclusionN8.ts +191 -191
- package/src/engine-components/postprocessing/Effects/Sharpening.ts +138 -138
- package/src/engine-components/postprocessing/Effects/TiltShiftEffect.ts +61 -61
- package/src/engine-components/postprocessing/Effects/Tonemapping.ts +155 -155
- package/src/engine-components/postprocessing/Effects/Vignette.ts +59 -59
- package/src/engine-components/postprocessing/PostProcessingEffect.ts +172 -172
- package/src/engine-components/postprocessing/PostProcessingHandler.ts +398 -398
- package/src/engine-components/postprocessing/Volume.ts +410 -410
- package/src/engine-components/postprocessing/VolumeParameter.ts +158 -158
- package/src/engine-components/postprocessing/VolumeProfile.ts +61 -61
- package/src/engine-components/postprocessing/index.ts +5 -5
- package/src/engine-components/postprocessing/utils.ts +52 -52
- package/src/engine-components/timeline/PlayableDirector.ts +722 -722
- package/src/engine-components/timeline/SignalAsset.ts +144 -144
- package/src/engine-components/timeline/TimelineModels.ts +92 -92
- package/src/engine-components/timeline/TimelineTracks.ts +967 -967
- package/src/engine-components/timeline/index.ts +3 -3
- package/src/engine-components/ui/BaseUIComponent.ts +203 -203
- package/src/engine-components/ui/Button.ts +307 -307
- package/src/engine-components/ui/Canvas.ts +419 -419
- package/src/engine-components/ui/CanvasGroup.ts +54 -54
- package/src/engine-components/ui/EventSystem.ts +854 -854
- package/src/engine-components/ui/Graphic.ts +275 -275
- package/src/engine-components/ui/Image.ts +112 -112
- package/src/engine-components/ui/InputField.ts +321 -321
- package/src/engine-components/ui/Interfaces.ts +57 -57
- package/src/engine-components/ui/Layout.ts +334 -334
- package/src/engine-components/ui/Outline.ts +13 -13
- package/src/engine-components/ui/PointerEvents.ts +206 -206
- package/src/engine-components/ui/RaycastUtils.ts +69 -69
- package/src/engine-components/ui/Raycaster.ts +102 -102
- package/src/engine-components/ui/RectTransform.ts +375 -375
- package/src/engine-components/ui/SpatialHtml.ts +79 -79
- package/src/engine-components/ui/Symbols.ts +1 -1
- package/src/engine-components/ui/Text.ts +578 -578
- package/src/engine-components/ui/Utils.ts +113 -113
- package/src/engine-components/utils/EnvironmentScene.ts +245 -245
- package/src/engine-components/utils/LookAt.ts +88 -88
- package/src/engine-components/utils/OpenURL.ts +114 -114
- package/src/engine-components/webxr/Avatar.ts +265 -265
- package/src/engine-components/webxr/TeleportTarget.ts +9 -9
- package/src/engine-components/webxr/WebARCameraBackground.ts +175 -175
- package/src/engine-components/webxr/WebARSessionRoot.ts +880 -880
- package/src/engine-components/webxr/WebXR.ts +585 -585
- package/src/engine-components/webxr/WebXRAvatar.ts +66 -66
- package/src/engine-components/webxr/WebXRImageTracking.ts +519 -519
- package/src/engine-components/webxr/WebXRPlaneTracking.ts +570 -570
- package/src/engine-components/webxr/WebXRRig.ts +77 -77
- package/src/engine-components/webxr/XRFlag.ts +147 -147
- package/src/engine-components/webxr/controllers/XRControllerFollow.ts +118 -118
- package/src/engine-components/webxr/controllers/XRControllerModel.ts +373 -373
- package/src/engine-components/webxr/controllers/XRControllerMovement.ts +550 -550
- package/src/engine-components/webxr/index.ts +2 -2
- package/src/engine-components/webxr/types.ts +3 -3
- package/src/engine-components-experimental/Presentation.ts +12 -12
- package/src/engine-components-experimental/api.ts +4 -4
- package/src/engine-components-experimental/networking/PlayerSync.ts +401 -401
- package/src/engine-schemes/COMPILE_SCHEMES.bat +3 -3
- package/src/engine-schemes/COMPILE_TS.bat +11 -11
- package/src/engine-schemes/README.md +1 -1
- package/src/engine-schemes/api.ts +12 -12
- package/src/engine-schemes/dist/api.js +17 -0
- package/src/engine-schemes/dist/api.js.meta +7 -0
- package/src/engine-schemes/dist/schemes.js +25 -0
- package/src/engine-schemes/dist/schemes.js.meta +7 -0
- package/src/engine-schemes/dist/synced-camera-model.js +74 -0
- package/src/engine-schemes/dist/synced-camera-model.js.meta +7 -0
- package/src/engine-schemes/dist/synced-transform-model.js +73 -0
- package/src/engine-schemes/dist/synced-transform-model.js.meta +7 -0
- package/src/engine-schemes/dist/transform.js +46 -0
- package/src/engine-schemes/dist/transform.js.meta +7 -0
- package/src/engine-schemes/dist/vec2.js +32 -0
- package/src/engine-schemes/dist/vec2.js.meta +7 -0
- package/src/engine-schemes/dist/vec3.js +36 -0
- package/src/engine-schemes/dist/vec3.js.meta +7 -0
- package/src/engine-schemes/dist/vec4.js +40 -0
- package/src/engine-schemes/dist/vec4.js.meta +7 -0
- package/src/engine-schemes/dist/vr-user-state-buffer.js +110 -0
- package/src/engine-schemes/dist/vr-user-state-buffer.js.meta +7 -0
- package/src/engine-schemes/schemes.ts +28 -28
- package/src/engine-schemes/synced-camera-model.ts +92 -92
- package/src/engine-schemes/synced-transform-model.ts +90 -90
- package/src/engine-schemes/syncedCamera.fbs +10 -10
- package/src/engine-schemes/transform.ts +50 -50
- package/src/engine-schemes/transforms.fbs +25 -25
- package/src/engine-schemes/vec.fbs +19 -19
- package/src/engine-schemes/vec2.ts +33 -33
- package/src/engine-schemes/vec3.ts +38 -38
- package/src/engine-schemes/vec4.ts +43 -43
- package/src/engine-schemes/vr-user-state-buffer.ts +145 -145
- package/src/engine-schemes/vrUserStateBuffer.fbs +17 -17
- package/src/include/draco/draco_decoder.js +34 -34
- package/src/include/ktx2/basis_transcoder.js +21 -21
- package/src/include/needle/arial-msdf.json +1471 -1471
- package/src/include/three/DragControls.js +231 -231
- package/src/include/three/EXT_mesh_gpu_instancing_exporter.js +66 -66
- package/src/needle-engine.ts +70 -70
|
@@ -1,713 +1,713 @@
|
|
|
1
|
-
import Peer, { CallOption, MediaConnection } from "peerjs"
|
|
2
|
-
import { EventDispatcher } from "three";
|
|
3
|
-
|
|
4
|
-
import { RoomEvents } from "../engine/engine_networking.js";
|
|
5
|
-
import { UserJoinedOrLeftRoomModel } from "../engine/engine_networking.js";
|
|
6
|
-
import { getPeerjsInstance } from "../engine/engine_networking_peer.js";
|
|
7
|
-
import { showBalloonMessage } from "./debug/index.js";
|
|
8
|
-
import { Application } from "./engine_application.js";
|
|
9
|
-
import { Context } from "./engine_context.js";
|
|
10
|
-
import type { IModel } from "./engine_networking_types.js";
|
|
11
|
-
import { type IComponent,isComponent } from "./engine_types.js";
|
|
12
|
-
import { getParam } from "./engine_utils.js";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const debug = getParam("debugnetworkingstreams");
|
|
17
|
-
|
|
18
|
-
export enum NetworkedStreamEvents {
|
|
19
|
-
Connected = "peer-user-connected",
|
|
20
|
-
StreamReceived = "receive-stream",
|
|
21
|
-
StreamEnded = "call-ended",
|
|
22
|
-
Disconnected = "peer-user-disconnected",
|
|
23
|
-
UserJoined = "user-joined",
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class StreamEndedEvent {
|
|
27
|
-
readonly type = NetworkedStreamEvents.StreamEnded;
|
|
28
|
-
readonly userId: string;
|
|
29
|
-
readonly direction: CallDirection;
|
|
30
|
-
constructor(userId: string, direction: CallDirection) {
|
|
31
|
-
this.userId = userId;
|
|
32
|
-
this.direction = direction;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export class StreamReceivedEvent {
|
|
36
|
-
readonly type = NetworkedStreamEvents.StreamReceived;
|
|
37
|
-
readonly userId: string;
|
|
38
|
-
readonly stream: MediaStream;
|
|
39
|
-
readonly target: CallHandle;
|
|
40
|
-
|
|
41
|
-
constructor(userId: string, stream: MediaStream, target: CallHandle) {
|
|
42
|
-
this.userId = userId;
|
|
43
|
-
this.stream = stream
|
|
44
|
-
this.target = target;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
class PeerUserConnectedModel implements IModel {
|
|
49
|
-
/** the peer handle id */
|
|
50
|
-
readonly guid: string;
|
|
51
|
-
readonly peerId: string;
|
|
52
|
-
// internal so server doesnt save it to persistent storage
|
|
53
|
-
readonly dontSave: boolean = true;
|
|
54
|
-
constructor(handle: PeerHandle, peerId: string) {
|
|
55
|
-
this.guid = handle.id;
|
|
56
|
-
this.peerId = peerId;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export enum CallDirection {
|
|
61
|
-
Incoming = "incoming",
|
|
62
|
-
Outgoing = "outgoing",
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
class CallHandle extends EventDispatcher<any> {
|
|
66
|
-
readonly peerId: string;
|
|
67
|
-
readonly userId: string;
|
|
68
|
-
readonly direction: CallDirection;
|
|
69
|
-
readonly call: MediaConnection;
|
|
70
|
-
get stream() { return this._stream; };
|
|
71
|
-
|
|
72
|
-
private _stream: MediaStream | null = null;
|
|
73
|
-
private _isDisposed: boolean = false;
|
|
74
|
-
|
|
75
|
-
close() {
|
|
76
|
-
if (this._isDisposed) return;
|
|
77
|
-
this._isDisposed = true;
|
|
78
|
-
this.call.close();
|
|
79
|
-
disposeStream(this._stream);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
get isOpen() {
|
|
83
|
-
return this.call.peerConnection?.connectionState === "connected";// && this._stream?.active;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
get isOpening() {
|
|
87
|
-
return this.call.peerConnection?.connectionState === "connecting";
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
get isClosed() {
|
|
91
|
-
return !this.isOpen || this._isDisposed;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
constructor(userId: string, call: MediaConnection, direction: CallDirection, stream: MediaStream | null = null) {
|
|
95
|
-
super();
|
|
96
|
-
this.peerId = call.peer;
|
|
97
|
-
this.userId = userId;
|
|
98
|
-
this.call = call;
|
|
99
|
-
this.direction = direction;
|
|
100
|
-
this._stream = stream;
|
|
101
|
-
call.on("stream", stream => {
|
|
102
|
-
if (debug)
|
|
103
|
-
console.log("Receive stream", "\nAudio:", stream.getAudioTracks(), "\nVideo:", stream.getVideoTracks());
|
|
104
|
-
this._stream = stream;
|
|
105
|
-
if (direction === CallDirection.Incoming) {
|
|
106
|
-
const args: StreamReceivedEvent = new StreamReceivedEvent(userId, stream, this);
|
|
107
|
-
this.dispatchEvent(args);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
call.on("close", () => {
|
|
111
|
-
this.dispatchEvent(new StreamEndedEvent(userId, direction));
|
|
112
|
-
})
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function applySdpTransform(sdp){
|
|
117
|
-
sdp = sdp.replace("a=fmtp:111 minptime=10;useinbandfec=1","a=fmtp:111 ptime=5;useinbandfec=1;stereo=1;maxplaybackrate=48000;maxaveragebitrat=128000;sprop-stereo=1");
|
|
118
|
-
return sdp;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export class PeerHandle extends EventDispatcher<any> {
|
|
122
|
-
|
|
123
|
-
private static readonly instances: Map<string, PeerHandle> = new Map();
|
|
124
|
-
|
|
125
|
-
static getOrCreate(context: Context, guid: string): PeerHandle {
|
|
126
|
-
// if (id === undefined) {
|
|
127
|
-
// // randomId
|
|
128
|
-
// id = Math.random().toFixed(5);
|
|
129
|
-
// }
|
|
130
|
-
if (PeerHandle.instances.has(guid))
|
|
131
|
-
return PeerHandle.instances.get(guid)!;
|
|
132
|
-
const peer = new PeerHandle(context, guid);
|
|
133
|
-
PeerHandle.instances.set(guid, peer);
|
|
134
|
-
return peer;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
getMyPeerId(): string | undefined {
|
|
138
|
-
if (this.context.connection.connectionId)
|
|
139
|
-
return this.getPeerIdFromUserId(this.context.connection.connectionId);
|
|
140
|
-
return undefined;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
getPeerIdFromUserId(userConnectionId: string): string {
|
|
144
|
-
// we build the peer id ourselves so we dont need to wait for peer to report it
|
|
145
|
-
return this.id + "-" + userConnectionId;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
getUserIdFromPeerId(peerId: string): string {
|
|
149
|
-
return peerId.substring(this.id.length + 1);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
makeCall(peerId: string, stream: MediaStream): CallHandle | undefined {
|
|
153
|
-
if (!stream?.id) {
|
|
154
|
-
if (debug) console.warn("Can not make a call: mediastream has no id or is undefined");
|
|
155
|
-
else console.debug("Can not make a call: mediastream has no id or is undefined");
|
|
156
|
-
return undefined;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
const opts: CallOption = {
|
|
160
|
-
metadata: {
|
|
161
|
-
userId: this.context.connection.connectionId,
|
|
162
|
-
streamId: stream.id
|
|
163
|
-
},
|
|
164
|
-
sdpTransform: sdp => {
|
|
165
|
-
return applySdpTransform(sdp);
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
const call = this._peer?.call(peerId, stream, opts);
|
|
169
|
-
if (call) {
|
|
170
|
-
const res = this.registerCall(call, CallDirection.Outgoing, stream);
|
|
171
|
-
if (debug) console.warn(`📞 CALL ${peerId}`, "\nOutgoing:", this._outgoingCalls, "\nIncoming:", this._incomingCalls)
|
|
172
|
-
return res;
|
|
173
|
-
}
|
|
174
|
-
else if (debug) {
|
|
175
|
-
console.error("Failed to make call", peerId, stream, this._peer);
|
|
176
|
-
}
|
|
177
|
-
return undefined;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
closeAll() {
|
|
181
|
-
for (const call of this._incomingCalls) {
|
|
182
|
-
call.close();
|
|
183
|
-
}
|
|
184
|
-
for (const call of this._outgoingCalls) {
|
|
185
|
-
call.close();
|
|
186
|
-
}
|
|
187
|
-
this.updateCalls();
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
updateCalls = () => {
|
|
191
|
-
for (let i = this._incomingCalls.length - 1; i >= 0; i--) {
|
|
192
|
-
const call = this._incomingCalls[i];
|
|
193
|
-
if (call.isClosed && !call.isOpening) {
|
|
194
|
-
this._incomingCalls.splice(i, 1);
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
for (let i = this._outgoingCalls.length - 1; i >= 0; i--) {
|
|
198
|
-
const call = this._outgoingCalls[i];
|
|
199
|
-
let shouldRemove = false;
|
|
200
|
-
if (call.isClosed && !call.isOpening) {
|
|
201
|
-
if (call.stream?.active) {
|
|
202
|
-
// don't remove the call if the stream is still active
|
|
203
|
-
if (debug) console.warn("!!! Stream is still active, don't remove call", call.userId, "Your id: " + this.context.connection.connectionId);
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
if (debug) console.warn("!!! Remove closed call", call.userId);
|
|
207
|
-
shouldRemove = true;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// check if the user is still in the room
|
|
211
|
-
if (this.context.connection.userIsInRoom(call.userId) === false) {
|
|
212
|
-
if (debug) console.warn("!!! User is not in room anymore, remove call", call.userId);
|
|
213
|
-
shouldRemove = true;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
if (shouldRemove) {
|
|
217
|
-
call.close();
|
|
218
|
-
this._outgoingCalls.splice(i, 1);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
get peer(): Peer | undefined { return this._peer; }
|
|
224
|
-
|
|
225
|
-
get incomingCalls() {
|
|
226
|
-
return this._incomingCalls;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
readonly id: string;
|
|
230
|
-
readonly context: Context;
|
|
231
|
-
private readonly _incomingCalls: CallHandle[] = [];
|
|
232
|
-
private readonly _outgoingCalls: CallHandle[] = [];
|
|
233
|
-
private _peer: Peer | undefined;
|
|
234
|
-
|
|
235
|
-
private constructor(context: Context, id: string) {
|
|
236
|
-
super();
|
|
237
|
-
this.context = context;
|
|
238
|
-
this.id = id;
|
|
239
|
-
this.setupPeer();
|
|
240
|
-
navigator["getUserMedia"] = (
|
|
241
|
-
navigator["getUserMedia"] || navigator["webkitGetUserMedia"] ||
|
|
242
|
-
navigator["mozGetUserMedia"] || navigator["msGetUserMedia"]
|
|
243
|
-
);
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
private _enabled: boolean = false;
|
|
247
|
-
private _enabledPeer: boolean = false;
|
|
248
|
-
private onConnectRoomFn: Function = this.onConnectRoom.bind(this);
|
|
249
|
-
// private onUserJoinedOrLeftRoomFn: Function = this.onUserJoinedOrLeftRoom.bind(this);
|
|
250
|
-
// private onPeerConnectFn: (id) => void = this.onPeerConnect.bind(this);
|
|
251
|
-
// private onPeerReceiveCallFn: (call) => void = this.onPeerReceivingCall.bind(this);
|
|
252
|
-
// private _connectionPeerIdMap : Map<string, string> = new Map();
|
|
253
|
-
|
|
254
|
-
enable() {
|
|
255
|
-
if (this._enabled) return;
|
|
256
|
-
this._enabled = true;
|
|
257
|
-
this.context.connection.beginListen(RoomEvents.JoinedRoom, this.onConnectRoomFn);
|
|
258
|
-
// this.context.connection.beginListen(RoomEvents.UserJoinedRoom, this.onUserJoinedOrLeftRoomFn);
|
|
259
|
-
// this.context.connection.beginListen(RoomEvents.UserLeftRoom, this.onUserJoinedOrLeftRoomFn);
|
|
260
|
-
this.subscribePeerEvents();
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
disable() {
|
|
264
|
-
if (!this._enabled) return;
|
|
265
|
-
this._enabled = false;
|
|
266
|
-
this.context.connection.stopListen(RoomEvents.JoinedRoom, this.onConnectRoomFn);
|
|
267
|
-
// this.context.connection.stopListen(RoomEvents.UserJoinedRoom, this.onUserJoinedOrLeftRoomFn);
|
|
268
|
-
// this.context.connection.stopListen(RoomEvents.UserLeftRoom, this.onUserJoinedOrLeftRoomFn);
|
|
269
|
-
this.unsubscribePeerEvents();
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
private onConnectRoom(): void {
|
|
273
|
-
this.setupPeer();
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
// private onUserJoinedOrLeftRoom(_: UserJoinedOrLeftRoomModel): void {
|
|
277
|
-
// };
|
|
278
|
-
|
|
279
|
-
private setupPeer() {
|
|
280
|
-
if (!this.context.connection.connectionId) return;
|
|
281
|
-
if (this._enabledPeer) return;
|
|
282
|
-
this._enabledPeer = true;
|
|
283
|
-
if (!this._peer) {
|
|
284
|
-
const peerId = this.getMyPeerId();
|
|
285
|
-
if (peerId)
|
|
286
|
-
this._peer = getPeerjsInstance(peerId);
|
|
287
|
-
else console.error("Failed to setup peerjs because we dont have a connection id", this.context.connection.connectionId);
|
|
288
|
-
}
|
|
289
|
-
if (this._enabled)
|
|
290
|
-
this.subscribePeerEvents();
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
private subscribePeerEvents() {
|
|
294
|
-
if (!this._peer) return;
|
|
295
|
-
this._peer.on("open", this.onPeerConnect);
|
|
296
|
-
this._peer.on("close", this.onPeerClose);
|
|
297
|
-
this._peer.on("call", this.onPeerReceivingCall);
|
|
298
|
-
this._peer.on("disconnected", this.onPeerDisconnected);
|
|
299
|
-
this._peer.on("error", this.onPeerError);
|
|
300
|
-
// this.context.connection.beginListen(PeerEvent.Connected, this.onRemotePeerConnect.bind(this));
|
|
301
|
-
// TODO: make connection to all current active calls even if the user is not anymore in the needle room
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
private unsubscribePeerEvents() {
|
|
305
|
-
if (!this._peer) return;
|
|
306
|
-
this._peer.off("open", this.onPeerConnect);
|
|
307
|
-
this._peer.off("close", this.onPeerClose);
|
|
308
|
-
this._peer.off("call", this.onPeerReceivingCall);
|
|
309
|
-
this._peer.off("disconnected", this.onPeerDisconnected);
|
|
310
|
-
this._peer.off("error", this.onPeerError);
|
|
311
|
-
// this.context.connection.stopListen(PeerEvent.Connected, this.onRemotePeerConnect.bind(this));
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Emitted when a connection to the PeerServer is established. You may use the peer before this is emitted, but messages to the server will be queued. id is the brokering ID of the peer (which was either provided in the constructor or assigned by the server).
|
|
316
|
-
* @param id ID of the peer
|
|
317
|
-
*/
|
|
318
|
-
private onPeerConnect = (id) => {
|
|
319
|
-
if (debug) console.log("PEER opened as", id);
|
|
320
|
-
if (id === null) {
|
|
321
|
-
console.error("Peer connection failed", id);
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
this.context.connection.send(NetworkedStreamEvents.Connected, new PeerUserConnectedModel(this, id));
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
/** Emitted when the peer is destroyed and can no longer accept or create any new connections. At this time, the peer's connections will all be closed. */
|
|
328
|
-
private onPeerClose = () => {
|
|
329
|
-
if (debug) console.log("PEER closed");
|
|
330
|
-
this.updateCalls();
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/** Emitted when the peer is disconnected from the signalling server, either manually or because the connection to the signalling server was lost. */
|
|
334
|
-
private onPeerDisconnected = () => {
|
|
335
|
-
if (debug) console.log("PEER disconnected");
|
|
336
|
-
this.updateCalls();
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
/**
|
|
340
|
-
* Errors on the peer are almost always fatal and will destroy the peer. Errors from the underlying socket and PeerConnections are forwarded here.
|
|
341
|
-
*/
|
|
342
|
-
private onPeerError = (err: Error) => {
|
|
343
|
-
if (debug) console.error("PEER error", err);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
private onPeerReceivingCall = (call: MediaConnection) => {
|
|
347
|
-
|
|
348
|
-
call.answer(undefined, {
|
|
349
|
-
sdpTransform: sdp => {
|
|
350
|
-
return applySdpTransform(sdp);
|
|
351
|
-
},
|
|
352
|
-
});
|
|
353
|
-
this.registerCall(call, CallDirection.Incoming, null);
|
|
354
|
-
|
|
355
|
-
// if (call.type != "media") {
|
|
356
|
-
// call.answer();
|
|
357
|
-
// this.registerCall(call, CallDirection.Incoming, null);
|
|
358
|
-
// }
|
|
359
|
-
// else {
|
|
360
|
-
// if (!Application.userInteractionRegistered) {
|
|
361
|
-
// showBalloonMessage("You have an incoming call. Please click on the screen to answer it.");
|
|
362
|
-
// }
|
|
363
|
-
// Application.registerWaitForInteraction(() => {
|
|
364
|
-
// })
|
|
365
|
-
// }
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
private registerCall(call: MediaConnection, direction: CallDirection, stream: MediaStream | null): CallHandle {
|
|
369
|
-
|
|
370
|
-
const meta = call.metadata;
|
|
371
|
-
if (!meta || !meta.userId) {
|
|
372
|
-
console.error("Missing call metadata", call);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const userId = meta.userId;
|
|
376
|
-
|
|
377
|
-
if (direction === CallDirection.Incoming && debug) console.warn("← Receive call from", call.metadata, call.connectionId);
|
|
378
|
-
else if (debug) {
|
|
379
|
-
console.warn("→ Make call to", call.metadata);
|
|
380
|
-
}
|
|
381
|
-
const calls = direction === CallDirection.Incoming ? this._incomingCalls : this._outgoingCalls;
|
|
382
|
-
|
|
383
|
-
const handle = new CallHandle(userId, call, direction, stream);
|
|
384
|
-
calls.push(handle);
|
|
385
|
-
|
|
386
|
-
call.on("error", err => {
|
|
387
|
-
console.error("Call error", err);
|
|
388
|
-
});
|
|
389
|
-
call.on("close", () => {
|
|
390
|
-
if (debug) console.log("Call ended", call.metadata);
|
|
391
|
-
const index = calls.indexOf(handle);
|
|
392
|
-
if (index !== -1) calls.splice(index, 1);
|
|
393
|
-
handle.close();
|
|
394
|
-
this.dispatchEvent(new StreamEndedEvent(userId, direction));
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
handle.addEventListener(NetworkedStreamEvents.StreamEnded, e => {
|
|
398
|
-
this.dispatchEvent(e);
|
|
399
|
-
});
|
|
400
|
-
|
|
401
|
-
if (direction === CallDirection.Incoming) {
|
|
402
|
-
|
|
403
|
-
handle.addEventListener(NetworkedStreamEvents.StreamReceived, e => {
|
|
404
|
-
this.dispatchEvent(e);
|
|
405
|
-
});
|
|
406
|
-
|
|
407
|
-
call.on("stream", () => {
|
|
408
|
-
if (debug) console.log("Received stream for call", call.metadata);
|
|
409
|
-
// workaround for https://github.com/peers/peerjs/issues/636
|
|
410
|
-
let intervalCounter = 0;
|
|
411
|
-
const closeInterval = setInterval(() => {
|
|
412
|
-
const isFirstInterval = intervalCounter === 0;
|
|
413
|
-
if (!handle.isOpen && isFirstInterval) {
|
|
414
|
-
if (debug) console.warn("Close call because stream is not active", call.metadata);
|
|
415
|
-
intervalCounter += 1;
|
|
416
|
-
clearInterval(closeInterval);
|
|
417
|
-
handle.close();
|
|
418
|
-
}
|
|
419
|
-
}, 2000);
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
return handle;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// private onRemotePeerConnect(user: PeerUserConnectedModel) {
|
|
426
|
-
// console.log("other user connected", user);
|
|
427
|
-
// }
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
// type UserVideoCall = {
|
|
432
|
-
// call: Peer.MediaConnection;
|
|
433
|
-
// stream: MediaStream;
|
|
434
|
-
// userId: string;
|
|
435
|
-
// }
|
|
436
|
-
|
|
437
|
-
// type IncomingStreamArgs = {
|
|
438
|
-
// stream: MediaStream;
|
|
439
|
-
// userId: string;
|
|
440
|
-
// }
|
|
441
|
-
|
|
442
|
-
/**
|
|
443
|
-
* This class is responsible for managing the sending and receiving of streams between peers.
|
|
444
|
-
*/
|
|
445
|
-
export class NetworkedStreams extends EventDispatcher<any> {
|
|
446
|
-
|
|
447
|
-
/**
|
|
448
|
-
* Create a new NetworkedStreams instance
|
|
449
|
-
*/
|
|
450
|
-
static create(comp: IComponent, guid?: string) {
|
|
451
|
-
const peer = PeerHandle.getOrCreate(comp.context, guid || comp.context.connection.connectionId || comp.guid);
|
|
452
|
-
return new NetworkedStreams(comp.context, peer);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
private readonly context: Context;
|
|
456
|
-
private readonly peer: PeerHandle;
|
|
457
|
-
|
|
458
|
-
// private _receiveVideoStreamListeners: Array<(info: IncomingStreamArgs) => void> = [];
|
|
459
|
-
private _sendingStreams: Map<MediaStream, CallHandle[]> = new Map();
|
|
460
|
-
|
|
461
|
-
/**
|
|
462
|
-
* If true, will log debug information
|
|
463
|
-
*/
|
|
464
|
-
debug: boolean = false;
|
|
465
|
-
|
|
466
|
-
constructor(context: IComponent);
|
|
467
|
-
constructor(context: Context, guid: string);
|
|
468
|
-
constructor(context: Context, peer: PeerHandle);
|
|
469
|
-
constructor(context: Context | IComponent, peer?: PeerHandle | string) {
|
|
470
|
-
super();
|
|
471
|
-
|
|
472
|
-
if (isComponent(context)) {
|
|
473
|
-
const comp = context;
|
|
474
|
-
context = comp.context;
|
|
475
|
-
peer = PeerHandle.getOrCreate(comp.context, comp.guid);
|
|
476
|
-
}
|
|
477
|
-
else if (typeof peer === "string") {
|
|
478
|
-
peer = PeerHandle.getOrCreate(context, peer);
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
if (!context) throw new Error("Failed to create NetworkedStreams because context is undefined");
|
|
482
|
-
else if(!(context instanceof Context)) throw new Error("Failed to create NetworkedStreams because context is not an instance of Context");
|
|
483
|
-
if (!peer) throw new Error("Failed to create NetworkedStreams because peer is undefined");
|
|
484
|
-
|
|
485
|
-
this.context = context;
|
|
486
|
-
this.peer = peer;
|
|
487
|
-
if (debug) this.debug = true;
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
startSendingStream(stream: MediaStream) {
|
|
491
|
-
if (!this._sendingStreams.has(stream)) {
|
|
492
|
-
this._sendingStreams.set(stream, []);
|
|
493
|
-
this.updateSendingCalls();
|
|
494
|
-
}
|
|
495
|
-
else {
|
|
496
|
-
console.warn("Received start sending stream with stream that is already being sent");
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
stopSendingStream(_steam: MediaStream | undefined | null) {
|
|
501
|
-
if (_steam) {
|
|
502
|
-
const calls = this._sendingStreams.get(_steam);
|
|
503
|
-
if (calls) {
|
|
504
|
-
for (const call of calls) {
|
|
505
|
-
call.close();
|
|
506
|
-
}
|
|
507
|
-
calls.length = 0;
|
|
508
|
-
}
|
|
509
|
-
this._sendingStreams.delete(_steam);
|
|
510
|
-
if (calls && this.debug)
|
|
511
|
-
this.debugLogCurrentState();
|
|
512
|
-
}
|
|
513
|
-
this.updateSendingCalls();
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
// private onConnectRoomFn: Function = this.onConnectRoom.bind(this);
|
|
517
|
-
// private onUserConnectedFn: Function = this.onUserConnected.bind(this);
|
|
518
|
-
// private onUserLeftFn: Function = this.onUserLeft.bind(this);
|
|
519
|
-
|
|
520
|
-
private _enabled: boolean = false;
|
|
521
|
-
|
|
522
|
-
get enabled() { return this._enabled; }
|
|
523
|
-
|
|
524
|
-
enable() {
|
|
525
|
-
if (this._enabled) return;
|
|
526
|
-
this._enabled = true;
|
|
527
|
-
this.peer.enable();
|
|
528
|
-
this.peer.addEventListener(NetworkedStreamEvents.StreamReceived, this.onCallStreamReceived);
|
|
529
|
-
//@ts-ignore
|
|
530
|
-
this.peer.addEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
531
|
-
// this.peer.addEventListener(PeerEvent.UserJoined, this.onUserJoinedPeer);
|
|
532
|
-
this.context.connection.beginListen(NetworkedStreamEvents.Connected, this.onUserConnected);
|
|
533
|
-
this.context.connection.beginListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
534
|
-
this.context.connection.beginListen(RoomEvents.UserJoinedRoom, this.onJoinedRoom);
|
|
535
|
-
this.context.connection.beginListen(RoomEvents.UserLeftRoom, this.onUserLeft);
|
|
536
|
-
this.context.connection.beginListen(RoomEvents.LeftRoom, this.onLeftRoom);
|
|
537
|
-
this._tickIntervalId = setInterval(this.tick, 5_000);
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
disable() {
|
|
541
|
-
if (!this._enabled) return;
|
|
542
|
-
this._enabled = false;
|
|
543
|
-
this.peer.disable();
|
|
544
|
-
this.peer.removeEventListener(NetworkedStreamEvents.StreamReceived, this.onCallStreamReceived);
|
|
545
|
-
//@ts-ignore
|
|
546
|
-
this.peer.removeEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
547
|
-
// this.peer.removeEventListener(PeerEvent.UserJoined, this.onUserJoinedPeer);
|
|
548
|
-
this.context.connection.stopListen(NetworkedStreamEvents.Connected, this.onUserConnected);
|
|
549
|
-
this.context.connection.stopListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
550
|
-
this.context.connection.stopListen(RoomEvents.UserJoinedRoom, this.onJoinedRoom);
|
|
551
|
-
this.context.connection.stopListen(RoomEvents.UserLeftRoom, this.onUserLeft);
|
|
552
|
-
this.context.connection.stopListen(RoomEvents.LeftRoom, this.onLeftRoom);
|
|
553
|
-
if (this._tickIntervalId != undefined) {
|
|
554
|
-
clearInterval(this._tickIntervalId);
|
|
555
|
-
this._tickIntervalId = undefined;
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
private _tickIntervalId?: any; /* for webpack */
|
|
560
|
-
|
|
561
|
-
private tick = () => {
|
|
562
|
-
this.updateSendingCalls();
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
// private onUserJoinedPeer = (evt) => {
|
|
566
|
-
// if (!this.context.connection.isConnected && evt.userId) {
|
|
567
|
-
// this.startCallWithUserIfNotAlready(evt.userId);
|
|
568
|
-
// }
|
|
569
|
-
// }
|
|
570
|
-
|
|
571
|
-
// When either we ourselves OR someone else is joining the room we want to make sure to re-establish all calls
|
|
572
|
-
// and if the user that joined is not yet receiving our video stream we want to start a stream with them
|
|
573
|
-
// https://github.com/needle-tools/needle-tiny/issues/697#issuecomment-1510425539
|
|
574
|
-
private onJoinedRoom = (evt) => {
|
|
575
|
-
if (this._sendingStreams.size > 0) {
|
|
576
|
-
if (this.debug) console.warn(`${evt?.userId ? `User ${evt.userId}` : "You"} joined room`, evt, this._sendingStreams.size);
|
|
577
|
-
this.updateSendingCalls();
|
|
578
|
-
}
|
|
579
|
-
}
|
|
580
|
-
/** This is when the local user leaves the room */
|
|
581
|
-
private onLeftRoom = (evt) => {
|
|
582
|
-
if (this.debug) console.warn(`${evt?.userId || "You"} left room`, evt);
|
|
583
|
-
this.stopCallsToUsersThatAreNotInTheRoomAnymore();
|
|
584
|
-
this.peer.closeAll();
|
|
585
|
-
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
private onCallStreamReceived = (evt: StreamReceivedEvent) => {
|
|
589
|
-
if (this.debug) console.log("Call with " + evt.userId + " started");
|
|
590
|
-
this.dispatchEvent({ type: NetworkedStreamEvents.StreamReceived, target: this, stream: evt.stream, userId: evt.userId });
|
|
591
|
-
if (this.debug) {
|
|
592
|
-
this.debugLogCurrentState();
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
private onCallEnded = (evt: StreamEndedEvent) => {
|
|
597
|
-
if (this.debug) console.log("Call with " + evt.userId + " ended");
|
|
598
|
-
this.dispatchEvent(evt);
|
|
599
|
-
if (this.debug) {
|
|
600
|
-
this.debugLogCurrentState();
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
private onUserConnected = (user: PeerUserConnectedModel) => {
|
|
605
|
-
// console.log(this.peer.id, user.guid)
|
|
606
|
-
if (this.peer.id === user.guid) {
|
|
607
|
-
if (this.debug)
|
|
608
|
-
console.log("PEER USER CONNECTED", user.guid, user, this._sendingStreams.size);
|
|
609
|
-
const stream = this._sendingStreams.keys().next().value;
|
|
610
|
-
|
|
611
|
-
// check if we already have a call with this user
|
|
612
|
-
// const existing = this._outgoingCalls.find(c => c.call.peer === peerId && c.stream === stream);
|
|
613
|
-
// if (existing) {
|
|
614
|
-
// console.warn("Already have a call with this user", peerId, stream);
|
|
615
|
-
// return existing;
|
|
616
|
-
// }
|
|
617
|
-
this.peer.makeCall(user.peerId, stream);
|
|
618
|
-
}
|
|
619
|
-
else {
|
|
620
|
-
if (debug) console.log("Unknown user connected", user.guid, user.peerId)
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
private onUserLeft = (_: UserJoinedOrLeftRoomModel) => {
|
|
625
|
-
if (this.debug) console.log("User left room: " + _.userId);
|
|
626
|
-
this.stopCallsToUsersThatAreNotInTheRoomAnymore();
|
|
627
|
-
}
|
|
628
|
-
|
|
629
|
-
private updateSendingCalls() {
|
|
630
|
-
let startedNewCall = false;
|
|
631
|
-
const localUserId = this.context.connection.connectionId;
|
|
632
|
-
for (const stream of this._sendingStreams.keys()) {
|
|
633
|
-
const calls = this._sendingStreams.get(stream) || [];
|
|
634
|
-
for (const userId of this.context.connection.usersInRoom()) {
|
|
635
|
-
if (userId === localUserId) continue;
|
|
636
|
-
const peerId = this.peer.getPeerIdFromUserId(userId);
|
|
637
|
-
const existing = calls.find(c => c.peerId === peerId && c.direction === CallDirection.Outgoing && !c.isClosed && c.stream?.active);
|
|
638
|
-
if (!existing) {
|
|
639
|
-
const handle = this.peer.makeCall(peerId, stream);
|
|
640
|
-
if (handle) {
|
|
641
|
-
startedNewCall = true;
|
|
642
|
-
calls.push(handle);
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
else if (debug) {
|
|
646
|
-
console.debug("Already have a call with user " + userId + " / peer " + peerId);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
this._sendingStreams.set(stream, calls);
|
|
651
|
-
}
|
|
652
|
-
this.stopCallsToUsersThatAreNotInTheRoomAnymore();
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
// private startCallWithUserIfNotAlready(userId: string) {
|
|
656
|
-
// for (const stream of this._sendingVideoStreams.keys()) {
|
|
657
|
-
// const calls = this._sendingVideoStreams.get(stream) || [];
|
|
658
|
-
// const existing = calls.find(c => c.userId === userId);
|
|
659
|
-
// if (!existing || existing.stream?.active === false) {
|
|
660
|
-
// if (this.debug) console.log("Starting call to", userId)
|
|
661
|
-
// const handle = this.peer.makeCall(this.peer.getPeerIdFromUserId(userId), stream);
|
|
662
|
-
// if (handle) {
|
|
663
|
-
// calls.push(handle);
|
|
664
|
-
// return true;
|
|
665
|
-
// }
|
|
666
|
-
// }
|
|
667
|
-
// }
|
|
668
|
-
// return false;
|
|
669
|
-
// }
|
|
670
|
-
|
|
671
|
-
private stopCallsToUsersThatAreNotInTheRoomAnymore() {
|
|
672
|
-
|
|
673
|
-
for (const stream of this._sendingStreams.keys()) {
|
|
674
|
-
const calls = this._sendingStreams.get(stream);
|
|
675
|
-
if (!calls) continue;
|
|
676
|
-
for (let i = calls.length - 1; i >= 0; i--) {
|
|
677
|
-
const call = calls[i];
|
|
678
|
-
if (!this.context.connection.userIsInRoom(call.userId)) {
|
|
679
|
-
if (debug) console.log(`Remove call ${[i]} to user that is not in room anymore ${call.userId}`);
|
|
680
|
-
call.close();
|
|
681
|
-
calls.splice(i, 1);
|
|
682
|
-
}
|
|
683
|
-
else if (debug) {
|
|
684
|
-
if (this.context.connection.connectionId === call.userId)
|
|
685
|
-
console.warn(`You are still in the room [${i}] ${call.userId}`);
|
|
686
|
-
else {
|
|
687
|
-
console.log(`User is still in room [${i}] ${call.userId}`);
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
|
|
693
|
-
this.peer.updateCalls();
|
|
694
|
-
|
|
695
|
-
if (this.debug) {
|
|
696
|
-
this.debugLogCurrentState();
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
private debugLogCurrentState() {
|
|
701
|
-
console.warn(`You (${this.context.connection.connectionId}) are currently sending ${this._sendingStreams.size} and receiving ${this.peer.incomingCalls.length} calls (${this.peer.incomingCalls.map(c => c.userId).join(", ")})`, this.peer.incomingCalls);
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
// const call = peer.call(peerId, stream);
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
export function disposeStream(str: MediaStream | null | undefined) {
|
|
708
|
-
if (!str) return;
|
|
709
|
-
if (str instanceof MediaStream) {
|
|
710
|
-
for (const cap of str.getTracks())
|
|
711
|
-
cap.stop();
|
|
712
|
-
}
|
|
713
|
-
}
|
|
1
|
+
import Peer, { CallOption, MediaConnection } from "peerjs"
|
|
2
|
+
import { EventDispatcher } from "three";
|
|
3
|
+
|
|
4
|
+
import { RoomEvents } from "../engine/engine_networking.js";
|
|
5
|
+
import { UserJoinedOrLeftRoomModel } from "../engine/engine_networking.js";
|
|
6
|
+
import { getPeerjsInstance } from "../engine/engine_networking_peer.js";
|
|
7
|
+
import { showBalloonMessage } from "./debug/index.js";
|
|
8
|
+
import { Application } from "./engine_application.js";
|
|
9
|
+
import { Context } from "./engine_context.js";
|
|
10
|
+
import type { IModel } from "./engine_networking_types.js";
|
|
11
|
+
import { type IComponent,isComponent } from "./engine_types.js";
|
|
12
|
+
import { getParam } from "./engine_utils.js";
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
const debug = getParam("debugnetworkingstreams");
|
|
17
|
+
|
|
18
|
+
export enum NetworkedStreamEvents {
|
|
19
|
+
Connected = "peer-user-connected",
|
|
20
|
+
StreamReceived = "receive-stream",
|
|
21
|
+
StreamEnded = "call-ended",
|
|
22
|
+
Disconnected = "peer-user-disconnected",
|
|
23
|
+
UserJoined = "user-joined",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class StreamEndedEvent {
|
|
27
|
+
readonly type = NetworkedStreamEvents.StreamEnded;
|
|
28
|
+
readonly userId: string;
|
|
29
|
+
readonly direction: CallDirection;
|
|
30
|
+
constructor(userId: string, direction: CallDirection) {
|
|
31
|
+
this.userId = userId;
|
|
32
|
+
this.direction = direction;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class StreamReceivedEvent {
|
|
36
|
+
readonly type = NetworkedStreamEvents.StreamReceived;
|
|
37
|
+
readonly userId: string;
|
|
38
|
+
readonly stream: MediaStream;
|
|
39
|
+
readonly target: CallHandle;
|
|
40
|
+
|
|
41
|
+
constructor(userId: string, stream: MediaStream, target: CallHandle) {
|
|
42
|
+
this.userId = userId;
|
|
43
|
+
this.stream = stream
|
|
44
|
+
this.target = target;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
class PeerUserConnectedModel implements IModel {
|
|
49
|
+
/** the peer handle id */
|
|
50
|
+
readonly guid: string;
|
|
51
|
+
readonly peerId: string;
|
|
52
|
+
// internal so server doesnt save it to persistent storage
|
|
53
|
+
readonly dontSave: boolean = true;
|
|
54
|
+
constructor(handle: PeerHandle, peerId: string) {
|
|
55
|
+
this.guid = handle.id;
|
|
56
|
+
this.peerId = peerId;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export enum CallDirection {
|
|
61
|
+
Incoming = "incoming",
|
|
62
|
+
Outgoing = "outgoing",
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
class CallHandle extends EventDispatcher<any> {
|
|
66
|
+
readonly peerId: string;
|
|
67
|
+
readonly userId: string;
|
|
68
|
+
readonly direction: CallDirection;
|
|
69
|
+
readonly call: MediaConnection;
|
|
70
|
+
get stream() { return this._stream; };
|
|
71
|
+
|
|
72
|
+
private _stream: MediaStream | null = null;
|
|
73
|
+
private _isDisposed: boolean = false;
|
|
74
|
+
|
|
75
|
+
close() {
|
|
76
|
+
if (this._isDisposed) return;
|
|
77
|
+
this._isDisposed = true;
|
|
78
|
+
this.call.close();
|
|
79
|
+
disposeStream(this._stream);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
get isOpen() {
|
|
83
|
+
return this.call.peerConnection?.connectionState === "connected";// && this._stream?.active;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
get isOpening() {
|
|
87
|
+
return this.call.peerConnection?.connectionState === "connecting";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
get isClosed() {
|
|
91
|
+
return !this.isOpen || this._isDisposed;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
constructor(userId: string, call: MediaConnection, direction: CallDirection, stream: MediaStream | null = null) {
|
|
95
|
+
super();
|
|
96
|
+
this.peerId = call.peer;
|
|
97
|
+
this.userId = userId;
|
|
98
|
+
this.call = call;
|
|
99
|
+
this.direction = direction;
|
|
100
|
+
this._stream = stream;
|
|
101
|
+
call.on("stream", stream => {
|
|
102
|
+
if (debug)
|
|
103
|
+
console.log("Receive stream", "\nAudio:", stream.getAudioTracks(), "\nVideo:", stream.getVideoTracks());
|
|
104
|
+
this._stream = stream;
|
|
105
|
+
if (direction === CallDirection.Incoming) {
|
|
106
|
+
const args: StreamReceivedEvent = new StreamReceivedEvent(userId, stream, this);
|
|
107
|
+
this.dispatchEvent(args);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
call.on("close", () => {
|
|
111
|
+
this.dispatchEvent(new StreamEndedEvent(userId, direction));
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function applySdpTransform(sdp){
|
|
117
|
+
sdp = sdp.replace("a=fmtp:111 minptime=10;useinbandfec=1","a=fmtp:111 ptime=5;useinbandfec=1;stereo=1;maxplaybackrate=48000;maxaveragebitrat=128000;sprop-stereo=1");
|
|
118
|
+
return sdp;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export class PeerHandle extends EventDispatcher<any> {
|
|
122
|
+
|
|
123
|
+
private static readonly instances: Map<string, PeerHandle> = new Map();
|
|
124
|
+
|
|
125
|
+
static getOrCreate(context: Context, guid: string): PeerHandle {
|
|
126
|
+
// if (id === undefined) {
|
|
127
|
+
// // randomId
|
|
128
|
+
// id = Math.random().toFixed(5);
|
|
129
|
+
// }
|
|
130
|
+
if (PeerHandle.instances.has(guid))
|
|
131
|
+
return PeerHandle.instances.get(guid)!;
|
|
132
|
+
const peer = new PeerHandle(context, guid);
|
|
133
|
+
PeerHandle.instances.set(guid, peer);
|
|
134
|
+
return peer;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
getMyPeerId(): string | undefined {
|
|
138
|
+
if (this.context.connection.connectionId)
|
|
139
|
+
return this.getPeerIdFromUserId(this.context.connection.connectionId);
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
getPeerIdFromUserId(userConnectionId: string): string {
|
|
144
|
+
// we build the peer id ourselves so we dont need to wait for peer to report it
|
|
145
|
+
return this.id + "-" + userConnectionId;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
getUserIdFromPeerId(peerId: string): string {
|
|
149
|
+
return peerId.substring(this.id.length + 1);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
makeCall(peerId: string, stream: MediaStream): CallHandle | undefined {
|
|
153
|
+
if (!stream?.id) {
|
|
154
|
+
if (debug) console.warn("Can not make a call: mediastream has no id or is undefined");
|
|
155
|
+
else console.debug("Can not make a call: mediastream has no id or is undefined");
|
|
156
|
+
return undefined;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const opts: CallOption = {
|
|
160
|
+
metadata: {
|
|
161
|
+
userId: this.context.connection.connectionId,
|
|
162
|
+
streamId: stream.id
|
|
163
|
+
},
|
|
164
|
+
sdpTransform: sdp => {
|
|
165
|
+
return applySdpTransform(sdp);
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
const call = this._peer?.call(peerId, stream, opts);
|
|
169
|
+
if (call) {
|
|
170
|
+
const res = this.registerCall(call, CallDirection.Outgoing, stream);
|
|
171
|
+
if (debug) console.warn(`📞 CALL ${peerId}`, "\nOutgoing:", this._outgoingCalls, "\nIncoming:", this._incomingCalls)
|
|
172
|
+
return res;
|
|
173
|
+
}
|
|
174
|
+
else if (debug) {
|
|
175
|
+
console.error("Failed to make call", peerId, stream, this._peer);
|
|
176
|
+
}
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
closeAll() {
|
|
181
|
+
for (const call of this._incomingCalls) {
|
|
182
|
+
call.close();
|
|
183
|
+
}
|
|
184
|
+
for (const call of this._outgoingCalls) {
|
|
185
|
+
call.close();
|
|
186
|
+
}
|
|
187
|
+
this.updateCalls();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
updateCalls = () => {
|
|
191
|
+
for (let i = this._incomingCalls.length - 1; i >= 0; i--) {
|
|
192
|
+
const call = this._incomingCalls[i];
|
|
193
|
+
if (call.isClosed && !call.isOpening) {
|
|
194
|
+
this._incomingCalls.splice(i, 1);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
for (let i = this._outgoingCalls.length - 1; i >= 0; i--) {
|
|
198
|
+
const call = this._outgoingCalls[i];
|
|
199
|
+
let shouldRemove = false;
|
|
200
|
+
if (call.isClosed && !call.isOpening) {
|
|
201
|
+
if (call.stream?.active) {
|
|
202
|
+
// don't remove the call if the stream is still active
|
|
203
|
+
if (debug) console.warn("!!! Stream is still active, don't remove call", call.userId, "Your id: " + this.context.connection.connectionId);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
if (debug) console.warn("!!! Remove closed call", call.userId);
|
|
207
|
+
shouldRemove = true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// check if the user is still in the room
|
|
211
|
+
if (this.context.connection.userIsInRoom(call.userId) === false) {
|
|
212
|
+
if (debug) console.warn("!!! User is not in room anymore, remove call", call.userId);
|
|
213
|
+
shouldRemove = true;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (shouldRemove) {
|
|
217
|
+
call.close();
|
|
218
|
+
this._outgoingCalls.splice(i, 1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
get peer(): Peer | undefined { return this._peer; }
|
|
224
|
+
|
|
225
|
+
get incomingCalls() {
|
|
226
|
+
return this._incomingCalls;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
readonly id: string;
|
|
230
|
+
readonly context: Context;
|
|
231
|
+
private readonly _incomingCalls: CallHandle[] = [];
|
|
232
|
+
private readonly _outgoingCalls: CallHandle[] = [];
|
|
233
|
+
private _peer: Peer | undefined;
|
|
234
|
+
|
|
235
|
+
private constructor(context: Context, id: string) {
|
|
236
|
+
super();
|
|
237
|
+
this.context = context;
|
|
238
|
+
this.id = id;
|
|
239
|
+
this.setupPeer();
|
|
240
|
+
navigator["getUserMedia"] = (
|
|
241
|
+
navigator["getUserMedia"] || navigator["webkitGetUserMedia"] ||
|
|
242
|
+
navigator["mozGetUserMedia"] || navigator["msGetUserMedia"]
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
private _enabled: boolean = false;
|
|
247
|
+
private _enabledPeer: boolean = false;
|
|
248
|
+
private onConnectRoomFn: Function = this.onConnectRoom.bind(this);
|
|
249
|
+
// private onUserJoinedOrLeftRoomFn: Function = this.onUserJoinedOrLeftRoom.bind(this);
|
|
250
|
+
// private onPeerConnectFn: (id) => void = this.onPeerConnect.bind(this);
|
|
251
|
+
// private onPeerReceiveCallFn: (call) => void = this.onPeerReceivingCall.bind(this);
|
|
252
|
+
// private _connectionPeerIdMap : Map<string, string> = new Map();
|
|
253
|
+
|
|
254
|
+
enable() {
|
|
255
|
+
if (this._enabled) return;
|
|
256
|
+
this._enabled = true;
|
|
257
|
+
this.context.connection.beginListen(RoomEvents.JoinedRoom, this.onConnectRoomFn);
|
|
258
|
+
// this.context.connection.beginListen(RoomEvents.UserJoinedRoom, this.onUserJoinedOrLeftRoomFn);
|
|
259
|
+
// this.context.connection.beginListen(RoomEvents.UserLeftRoom, this.onUserJoinedOrLeftRoomFn);
|
|
260
|
+
this.subscribePeerEvents();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
disable() {
|
|
264
|
+
if (!this._enabled) return;
|
|
265
|
+
this._enabled = false;
|
|
266
|
+
this.context.connection.stopListen(RoomEvents.JoinedRoom, this.onConnectRoomFn);
|
|
267
|
+
// this.context.connection.stopListen(RoomEvents.UserJoinedRoom, this.onUserJoinedOrLeftRoomFn);
|
|
268
|
+
// this.context.connection.stopListen(RoomEvents.UserLeftRoom, this.onUserJoinedOrLeftRoomFn);
|
|
269
|
+
this.unsubscribePeerEvents();
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
private onConnectRoom(): void {
|
|
273
|
+
this.setupPeer();
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
// private onUserJoinedOrLeftRoom(_: UserJoinedOrLeftRoomModel): void {
|
|
277
|
+
// };
|
|
278
|
+
|
|
279
|
+
private setupPeer() {
|
|
280
|
+
if (!this.context.connection.connectionId) return;
|
|
281
|
+
if (this._enabledPeer) return;
|
|
282
|
+
this._enabledPeer = true;
|
|
283
|
+
if (!this._peer) {
|
|
284
|
+
const peerId = this.getMyPeerId();
|
|
285
|
+
if (peerId)
|
|
286
|
+
this._peer = getPeerjsInstance(peerId);
|
|
287
|
+
else console.error("Failed to setup peerjs because we dont have a connection id", this.context.connection.connectionId);
|
|
288
|
+
}
|
|
289
|
+
if (this._enabled)
|
|
290
|
+
this.subscribePeerEvents();
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
private subscribePeerEvents() {
|
|
294
|
+
if (!this._peer) return;
|
|
295
|
+
this._peer.on("open", this.onPeerConnect);
|
|
296
|
+
this._peer.on("close", this.onPeerClose);
|
|
297
|
+
this._peer.on("call", this.onPeerReceivingCall);
|
|
298
|
+
this._peer.on("disconnected", this.onPeerDisconnected);
|
|
299
|
+
this._peer.on("error", this.onPeerError);
|
|
300
|
+
// this.context.connection.beginListen(PeerEvent.Connected, this.onRemotePeerConnect.bind(this));
|
|
301
|
+
// TODO: make connection to all current active calls even if the user is not anymore in the needle room
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
private unsubscribePeerEvents() {
|
|
305
|
+
if (!this._peer) return;
|
|
306
|
+
this._peer.off("open", this.onPeerConnect);
|
|
307
|
+
this._peer.off("close", this.onPeerClose);
|
|
308
|
+
this._peer.off("call", this.onPeerReceivingCall);
|
|
309
|
+
this._peer.off("disconnected", this.onPeerDisconnected);
|
|
310
|
+
this._peer.off("error", this.onPeerError);
|
|
311
|
+
// this.context.connection.stopListen(PeerEvent.Connected, this.onRemotePeerConnect.bind(this));
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Emitted when a connection to the PeerServer is established. You may use the peer before this is emitted, but messages to the server will be queued. id is the brokering ID of the peer (which was either provided in the constructor or assigned by the server).
|
|
316
|
+
* @param id ID of the peer
|
|
317
|
+
*/
|
|
318
|
+
private onPeerConnect = (id) => {
|
|
319
|
+
if (debug) console.log("PEER opened as", id);
|
|
320
|
+
if (id === null) {
|
|
321
|
+
console.error("Peer connection failed", id);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
this.context.connection.send(NetworkedStreamEvents.Connected, new PeerUserConnectedModel(this, id));
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/** Emitted when the peer is destroyed and can no longer accept or create any new connections. At this time, the peer's connections will all be closed. */
|
|
328
|
+
private onPeerClose = () => {
|
|
329
|
+
if (debug) console.log("PEER closed");
|
|
330
|
+
this.updateCalls();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/** Emitted when the peer is disconnected from the signalling server, either manually or because the connection to the signalling server was lost. */
|
|
334
|
+
private onPeerDisconnected = () => {
|
|
335
|
+
if (debug) console.log("PEER disconnected");
|
|
336
|
+
this.updateCalls();
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Errors on the peer are almost always fatal and will destroy the peer. Errors from the underlying socket and PeerConnections are forwarded here.
|
|
341
|
+
*/
|
|
342
|
+
private onPeerError = (err: Error) => {
|
|
343
|
+
if (debug) console.error("PEER error", err);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
private onPeerReceivingCall = (call: MediaConnection) => {
|
|
347
|
+
|
|
348
|
+
call.answer(undefined, {
|
|
349
|
+
sdpTransform: sdp => {
|
|
350
|
+
return applySdpTransform(sdp);
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
this.registerCall(call, CallDirection.Incoming, null);
|
|
354
|
+
|
|
355
|
+
// if (call.type != "media") {
|
|
356
|
+
// call.answer();
|
|
357
|
+
// this.registerCall(call, CallDirection.Incoming, null);
|
|
358
|
+
// }
|
|
359
|
+
// else {
|
|
360
|
+
// if (!Application.userInteractionRegistered) {
|
|
361
|
+
// showBalloonMessage("You have an incoming call. Please click on the screen to answer it.");
|
|
362
|
+
// }
|
|
363
|
+
// Application.registerWaitForInteraction(() => {
|
|
364
|
+
// })
|
|
365
|
+
// }
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
private registerCall(call: MediaConnection, direction: CallDirection, stream: MediaStream | null): CallHandle {
|
|
369
|
+
|
|
370
|
+
const meta = call.metadata;
|
|
371
|
+
if (!meta || !meta.userId) {
|
|
372
|
+
console.error("Missing call metadata", call);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const userId = meta.userId;
|
|
376
|
+
|
|
377
|
+
if (direction === CallDirection.Incoming && debug) console.warn("← Receive call from", call.metadata, call.connectionId);
|
|
378
|
+
else if (debug) {
|
|
379
|
+
console.warn("→ Make call to", call.metadata);
|
|
380
|
+
}
|
|
381
|
+
const calls = direction === CallDirection.Incoming ? this._incomingCalls : this._outgoingCalls;
|
|
382
|
+
|
|
383
|
+
const handle = new CallHandle(userId, call, direction, stream);
|
|
384
|
+
calls.push(handle);
|
|
385
|
+
|
|
386
|
+
call.on("error", err => {
|
|
387
|
+
console.error("Call error", err);
|
|
388
|
+
});
|
|
389
|
+
call.on("close", () => {
|
|
390
|
+
if (debug) console.log("Call ended", call.metadata);
|
|
391
|
+
const index = calls.indexOf(handle);
|
|
392
|
+
if (index !== -1) calls.splice(index, 1);
|
|
393
|
+
handle.close();
|
|
394
|
+
this.dispatchEvent(new StreamEndedEvent(userId, direction));
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
handle.addEventListener(NetworkedStreamEvents.StreamEnded, e => {
|
|
398
|
+
this.dispatchEvent(e);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
if (direction === CallDirection.Incoming) {
|
|
402
|
+
|
|
403
|
+
handle.addEventListener(NetworkedStreamEvents.StreamReceived, e => {
|
|
404
|
+
this.dispatchEvent(e);
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
call.on("stream", () => {
|
|
408
|
+
if (debug) console.log("Received stream for call", call.metadata);
|
|
409
|
+
// workaround for https://github.com/peers/peerjs/issues/636
|
|
410
|
+
let intervalCounter = 0;
|
|
411
|
+
const closeInterval = setInterval(() => {
|
|
412
|
+
const isFirstInterval = intervalCounter === 0;
|
|
413
|
+
if (!handle.isOpen && isFirstInterval) {
|
|
414
|
+
if (debug) console.warn("Close call because stream is not active", call.metadata);
|
|
415
|
+
intervalCounter += 1;
|
|
416
|
+
clearInterval(closeInterval);
|
|
417
|
+
handle.close();
|
|
418
|
+
}
|
|
419
|
+
}, 2000);
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
return handle;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// private onRemotePeerConnect(user: PeerUserConnectedModel) {
|
|
426
|
+
// console.log("other user connected", user);
|
|
427
|
+
// }
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
// type UserVideoCall = {
|
|
432
|
+
// call: Peer.MediaConnection;
|
|
433
|
+
// stream: MediaStream;
|
|
434
|
+
// userId: string;
|
|
435
|
+
// }
|
|
436
|
+
|
|
437
|
+
// type IncomingStreamArgs = {
|
|
438
|
+
// stream: MediaStream;
|
|
439
|
+
// userId: string;
|
|
440
|
+
// }
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* This class is responsible for managing the sending and receiving of streams between peers.
|
|
444
|
+
*/
|
|
445
|
+
export class NetworkedStreams extends EventDispatcher<any> {
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Create a new NetworkedStreams instance
|
|
449
|
+
*/
|
|
450
|
+
static create(comp: IComponent, guid?: string) {
|
|
451
|
+
const peer = PeerHandle.getOrCreate(comp.context, guid || comp.context.connection.connectionId || comp.guid);
|
|
452
|
+
return new NetworkedStreams(comp.context, peer);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
private readonly context: Context;
|
|
456
|
+
private readonly peer: PeerHandle;
|
|
457
|
+
|
|
458
|
+
// private _receiveVideoStreamListeners: Array<(info: IncomingStreamArgs) => void> = [];
|
|
459
|
+
private _sendingStreams: Map<MediaStream, CallHandle[]> = new Map();
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* If true, will log debug information
|
|
463
|
+
*/
|
|
464
|
+
debug: boolean = false;
|
|
465
|
+
|
|
466
|
+
constructor(context: IComponent);
|
|
467
|
+
constructor(context: Context, guid: string);
|
|
468
|
+
constructor(context: Context, peer: PeerHandle);
|
|
469
|
+
constructor(context: Context | IComponent, peer?: PeerHandle | string) {
|
|
470
|
+
super();
|
|
471
|
+
|
|
472
|
+
if (isComponent(context)) {
|
|
473
|
+
const comp = context;
|
|
474
|
+
context = comp.context;
|
|
475
|
+
peer = PeerHandle.getOrCreate(comp.context, comp.guid);
|
|
476
|
+
}
|
|
477
|
+
else if (typeof peer === "string") {
|
|
478
|
+
peer = PeerHandle.getOrCreate(context, peer);
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
if (!context) throw new Error("Failed to create NetworkedStreams because context is undefined");
|
|
482
|
+
else if(!(context instanceof Context)) throw new Error("Failed to create NetworkedStreams because context is not an instance of Context");
|
|
483
|
+
if (!peer) throw new Error("Failed to create NetworkedStreams because peer is undefined");
|
|
484
|
+
|
|
485
|
+
this.context = context;
|
|
486
|
+
this.peer = peer;
|
|
487
|
+
if (debug) this.debug = true;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
startSendingStream(stream: MediaStream) {
|
|
491
|
+
if (!this._sendingStreams.has(stream)) {
|
|
492
|
+
this._sendingStreams.set(stream, []);
|
|
493
|
+
this.updateSendingCalls();
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
console.warn("Received start sending stream with stream that is already being sent");
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
stopSendingStream(_steam: MediaStream | undefined | null) {
|
|
501
|
+
if (_steam) {
|
|
502
|
+
const calls = this._sendingStreams.get(_steam);
|
|
503
|
+
if (calls) {
|
|
504
|
+
for (const call of calls) {
|
|
505
|
+
call.close();
|
|
506
|
+
}
|
|
507
|
+
calls.length = 0;
|
|
508
|
+
}
|
|
509
|
+
this._sendingStreams.delete(_steam);
|
|
510
|
+
if (calls && this.debug)
|
|
511
|
+
this.debugLogCurrentState();
|
|
512
|
+
}
|
|
513
|
+
this.updateSendingCalls();
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// private onConnectRoomFn: Function = this.onConnectRoom.bind(this);
|
|
517
|
+
// private onUserConnectedFn: Function = this.onUserConnected.bind(this);
|
|
518
|
+
// private onUserLeftFn: Function = this.onUserLeft.bind(this);
|
|
519
|
+
|
|
520
|
+
private _enabled: boolean = false;
|
|
521
|
+
|
|
522
|
+
get enabled() { return this._enabled; }
|
|
523
|
+
|
|
524
|
+
enable() {
|
|
525
|
+
if (this._enabled) return;
|
|
526
|
+
this._enabled = true;
|
|
527
|
+
this.peer.enable();
|
|
528
|
+
this.peer.addEventListener(NetworkedStreamEvents.StreamReceived, this.onCallStreamReceived);
|
|
529
|
+
//@ts-ignore
|
|
530
|
+
this.peer.addEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
531
|
+
// this.peer.addEventListener(PeerEvent.UserJoined, this.onUserJoinedPeer);
|
|
532
|
+
this.context.connection.beginListen(NetworkedStreamEvents.Connected, this.onUserConnected);
|
|
533
|
+
this.context.connection.beginListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
534
|
+
this.context.connection.beginListen(RoomEvents.UserJoinedRoom, this.onJoinedRoom);
|
|
535
|
+
this.context.connection.beginListen(RoomEvents.UserLeftRoom, this.onUserLeft);
|
|
536
|
+
this.context.connection.beginListen(RoomEvents.LeftRoom, this.onLeftRoom);
|
|
537
|
+
this._tickIntervalId = setInterval(this.tick, 5_000);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
disable() {
|
|
541
|
+
if (!this._enabled) return;
|
|
542
|
+
this._enabled = false;
|
|
543
|
+
this.peer.disable();
|
|
544
|
+
this.peer.removeEventListener(NetworkedStreamEvents.StreamReceived, this.onCallStreamReceived);
|
|
545
|
+
//@ts-ignore
|
|
546
|
+
this.peer.removeEventListener(NetworkedStreamEvents.StreamEnded, this.onCallEnded);
|
|
547
|
+
// this.peer.removeEventListener(PeerEvent.UserJoined, this.onUserJoinedPeer);
|
|
548
|
+
this.context.connection.stopListen(NetworkedStreamEvents.Connected, this.onUserConnected);
|
|
549
|
+
this.context.connection.stopListen(RoomEvents.JoinedRoom, this.onJoinedRoom);
|
|
550
|
+
this.context.connection.stopListen(RoomEvents.UserJoinedRoom, this.onJoinedRoom);
|
|
551
|
+
this.context.connection.stopListen(RoomEvents.UserLeftRoom, this.onUserLeft);
|
|
552
|
+
this.context.connection.stopListen(RoomEvents.LeftRoom, this.onLeftRoom);
|
|
553
|
+
if (this._tickIntervalId != undefined) {
|
|
554
|
+
clearInterval(this._tickIntervalId);
|
|
555
|
+
this._tickIntervalId = undefined;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
private _tickIntervalId?: any; /* for webpack */
|
|
560
|
+
|
|
561
|
+
private tick = () => {
|
|
562
|
+
this.updateSendingCalls();
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// private onUserJoinedPeer = (evt) => {
|
|
566
|
+
// if (!this.context.connection.isConnected && evt.userId) {
|
|
567
|
+
// this.startCallWithUserIfNotAlready(evt.userId);
|
|
568
|
+
// }
|
|
569
|
+
// }
|
|
570
|
+
|
|
571
|
+
// When either we ourselves OR someone else is joining the room we want to make sure to re-establish all calls
|
|
572
|
+
// and if the user that joined is not yet receiving our video stream we want to start a stream with them
|
|
573
|
+
// https://github.com/needle-tools/needle-tiny/issues/697#issuecomment-1510425539
|
|
574
|
+
private onJoinedRoom = (evt) => {
|
|
575
|
+
if (this._sendingStreams.size > 0) {
|
|
576
|
+
if (this.debug) console.warn(`${evt?.userId ? `User ${evt.userId}` : "You"} joined room`, evt, this._sendingStreams.size);
|
|
577
|
+
this.updateSendingCalls();
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
/** This is when the local user leaves the room */
|
|
581
|
+
private onLeftRoom = (evt) => {
|
|
582
|
+
if (this.debug) console.warn(`${evt?.userId || "You"} left room`, evt);
|
|
583
|
+
this.stopCallsToUsersThatAreNotInTheRoomAnymore();
|
|
584
|
+
this.peer.closeAll();
|
|
585
|
+
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
private onCallStreamReceived = (evt: StreamReceivedEvent) => {
|
|
589
|
+
if (this.debug) console.log("Call with " + evt.userId + " started");
|
|
590
|
+
this.dispatchEvent({ type: NetworkedStreamEvents.StreamReceived, target: this, stream: evt.stream, userId: evt.userId });
|
|
591
|
+
if (this.debug) {
|
|
592
|
+
this.debugLogCurrentState();
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
private onCallEnded = (evt: StreamEndedEvent) => {
|
|
597
|
+
if (this.debug) console.log("Call with " + evt.userId + " ended");
|
|
598
|
+
this.dispatchEvent(evt);
|
|
599
|
+
if (this.debug) {
|
|
600
|
+
this.debugLogCurrentState();
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
private onUserConnected = (user: PeerUserConnectedModel) => {
|
|
605
|
+
// console.log(this.peer.id, user.guid)
|
|
606
|
+
if (this.peer.id === user.guid) {
|
|
607
|
+
if (this.debug)
|
|
608
|
+
console.log("PEER USER CONNECTED", user.guid, user, this._sendingStreams.size);
|
|
609
|
+
const stream = this._sendingStreams.keys().next().value;
|
|
610
|
+
|
|
611
|
+
// check if we already have a call with this user
|
|
612
|
+
// const existing = this._outgoingCalls.find(c => c.call.peer === peerId && c.stream === stream);
|
|
613
|
+
// if (existing) {
|
|
614
|
+
// console.warn("Already have a call with this user", peerId, stream);
|
|
615
|
+
// return existing;
|
|
616
|
+
// }
|
|
617
|
+
this.peer.makeCall(user.peerId, stream);
|
|
618
|
+
}
|
|
619
|
+
else {
|
|
620
|
+
if (debug) console.log("Unknown user connected", user.guid, user.peerId)
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
private onUserLeft = (_: UserJoinedOrLeftRoomModel) => {
|
|
625
|
+
if (this.debug) console.log("User left room: " + _.userId);
|
|
626
|
+
this.stopCallsToUsersThatAreNotInTheRoomAnymore();
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
private updateSendingCalls() {
|
|
630
|
+
let startedNewCall = false;
|
|
631
|
+
const localUserId = this.context.connection.connectionId;
|
|
632
|
+
for (const stream of this._sendingStreams.keys()) {
|
|
633
|
+
const calls = this._sendingStreams.get(stream) || [];
|
|
634
|
+
for (const userId of this.context.connection.usersInRoom()) {
|
|
635
|
+
if (userId === localUserId) continue;
|
|
636
|
+
const peerId = this.peer.getPeerIdFromUserId(userId);
|
|
637
|
+
const existing = calls.find(c => c.peerId === peerId && c.direction === CallDirection.Outgoing && !c.isClosed && c.stream?.active);
|
|
638
|
+
if (!existing) {
|
|
639
|
+
const handle = this.peer.makeCall(peerId, stream);
|
|
640
|
+
if (handle) {
|
|
641
|
+
startedNewCall = true;
|
|
642
|
+
calls.push(handle);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
else if (debug) {
|
|
646
|
+
console.debug("Already have a call with user " + userId + " / peer " + peerId);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
this._sendingStreams.set(stream, calls);
|
|
651
|
+
}
|
|
652
|
+
this.stopCallsToUsersThatAreNotInTheRoomAnymore();
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
// private startCallWithUserIfNotAlready(userId: string) {
|
|
656
|
+
// for (const stream of this._sendingVideoStreams.keys()) {
|
|
657
|
+
// const calls = this._sendingVideoStreams.get(stream) || [];
|
|
658
|
+
// const existing = calls.find(c => c.userId === userId);
|
|
659
|
+
// if (!existing || existing.stream?.active === false) {
|
|
660
|
+
// if (this.debug) console.log("Starting call to", userId)
|
|
661
|
+
// const handle = this.peer.makeCall(this.peer.getPeerIdFromUserId(userId), stream);
|
|
662
|
+
// if (handle) {
|
|
663
|
+
// calls.push(handle);
|
|
664
|
+
// return true;
|
|
665
|
+
// }
|
|
666
|
+
// }
|
|
667
|
+
// }
|
|
668
|
+
// return false;
|
|
669
|
+
// }
|
|
670
|
+
|
|
671
|
+
private stopCallsToUsersThatAreNotInTheRoomAnymore() {
|
|
672
|
+
|
|
673
|
+
for (const stream of this._sendingStreams.keys()) {
|
|
674
|
+
const calls = this._sendingStreams.get(stream);
|
|
675
|
+
if (!calls) continue;
|
|
676
|
+
for (let i = calls.length - 1; i >= 0; i--) {
|
|
677
|
+
const call = calls[i];
|
|
678
|
+
if (!this.context.connection.userIsInRoom(call.userId)) {
|
|
679
|
+
if (debug) console.log(`Remove call ${[i]} to user that is not in room anymore ${call.userId}`);
|
|
680
|
+
call.close();
|
|
681
|
+
calls.splice(i, 1);
|
|
682
|
+
}
|
|
683
|
+
else if (debug) {
|
|
684
|
+
if (this.context.connection.connectionId === call.userId)
|
|
685
|
+
console.warn(`You are still in the room [${i}] ${call.userId}`);
|
|
686
|
+
else {
|
|
687
|
+
console.log(`User is still in room [${i}] ${call.userId}`);
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
this.peer.updateCalls();
|
|
694
|
+
|
|
695
|
+
if (this.debug) {
|
|
696
|
+
this.debugLogCurrentState();
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
private debugLogCurrentState() {
|
|
701
|
+
console.warn(`You (${this.context.connection.connectionId}) are currently sending ${this._sendingStreams.size} and receiving ${this.peer.incomingCalls.length} calls (${this.peer.incomingCalls.map(c => c.userId).join(", ")})`, this.peer.incomingCalls);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// const call = peer.call(peerId, stream);
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
export function disposeStream(str: MediaStream | null | undefined) {
|
|
708
|
+
if (!str) return;
|
|
709
|
+
if (str instanceof MediaStream) {
|
|
710
|
+
for (const cap of str.getTracks())
|
|
711
|
+
cap.stop();
|
|
712
|
+
}
|
|
713
|
+
}
|