@dronedeploy/rocos-js-sdk 1.0.0-alpha-2 → 2.6.1
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/IRocosSDK.js +5 -1
- package/README.md +0 -18
- package/RocosSDK.js +95 -93
- package/api/StreamRegister.d.ts +1 -1
- package/api/StreamRegister.js +12 -23
- package/api/atoms/StreamHeartbeat.js +7 -3
- package/api/streams/caller/CallerStream.d.ts +6 -6
- package/api/streams/caller/CallerStream.js +49 -41
- package/api/streams/caller/CallerStreamAbstract.d.ts +11 -6
- package/api/streams/caller/CallerStreamAbstract.js +67 -55
- package/api/streams/caller/CallerStreamNode.d.ts +6 -6
- package/api/streams/caller/CallerStreamNode.js +61 -48
- package/api/streams/command/CommandStream.d.ts +4 -2
- package/api/streams/command/CommandStream.js +30 -28
- package/api/streams/command/CommandStreamAbstract.d.ts +8 -4
- package/api/streams/command/CommandStreamAbstract.js +42 -33
- package/api/streams/command/CommandStreamNode.d.ts +4 -2
- package/api/streams/command/CommandStreamNode.js +40 -16
- package/api/streams/control/ControlStream.d.ts +6 -4
- package/api/streams/control/ControlStream.js +36 -30
- package/api/streams/control/ControlStreamAbstract.d.ts +9 -6
- package/api/streams/control/ControlStreamAbstract.js +54 -57
- package/api/streams/control/ControlStreamNode.d.ts +5 -3
- package/api/streams/control/ControlStreamNode.js +44 -19
- package/api/streams/fileAccessor/FileAccessorStream.d.ts +4 -2
- package/api/streams/fileAccessor/FileAccessorStream.js +57 -42
- package/api/streams/fileAccessor/FileAccessorStreamAbstract.d.ts +9 -4
- package/api/streams/fileAccessor/FileAccessorStreamAbstract.js +48 -28
- package/api/streams/fileAccessor/FileAccessorStreamNode.d.ts +3 -1
- package/api/streams/fileAccessor/FileAccessorStreamNode.js +53 -23
- package/api/streams/search/SearchStream.d.ts +5 -2
- package/api/streams/search/SearchStream.js +74 -50
- package/api/streams/search/SearchStreamAbstract.d.ts +9 -4
- package/api/streams/search/SearchStreamAbstract.js +35 -33
- package/api/streams/search/SearchStreamNode.d.ts +5 -2
- package/api/streams/search/SearchStreamNode.js +48 -23
- package/api/streams/telemetry/TelemetryStream.d.ts +4 -4
- package/api/streams/telemetry/TelemetryStream.js +78 -49
- package/api/streams/telemetry/TelemetryStreamAbstract.d.ts +11 -8
- package/api/streams/telemetry/TelemetryStreamAbstract.js +145 -126
- package/api/streams/telemetry/TelemetryStreamNode.d.ts +5 -5
- package/api/streams/telemetry/TelemetryStreamNode.js +64 -44
- package/api/streams/webRTCSignalling/WebRTCSignallingStream.d.ts +10 -5
- package/api/streams/webRTCSignalling/WebRTCSignallingStream.js +20 -37
- package/api/streams/webRTCSignalling/WebRTCSignallingStreamAbstract.d.ts +13 -10
- package/api/streams/webRTCSignalling/WebRTCSignallingStreamAbstract.js +37 -37
- package/constants/api.d.ts +1 -6
- package/constants/api.js +126 -126
- package/constants/grpc.js +8 -5
- package/constants/identifier.js +9 -6
- package/constants/timezones.d.ts +1 -1
- package/constants/timezones.js +4 -1
- package/demo/angular/.editorconfig +16 -0
- package/demo/angular/.eslintignore +4 -0
- package/demo/angular/.eslintrc.json +50 -0
- package/demo/angular/README.md +36 -0
- package/demo/angular/angular.json +132 -0
- package/demo/angular/karma.conf.js +44 -0
- package/demo/angular/package.json +41 -0
- package/demo/angular/src/app/app.component.css +0 -0
- package/demo/angular/src/app/app.component.html +9 -0
- package/demo/angular/src/app/app.component.ts +10 -0
- package/demo/angular/src/app/app.module.ts +38 -0
- package/demo/angular/src/app/components/assets/assets.component.css +0 -0
- package/demo/angular/src/app/components/assets/assets.component.html +29 -0
- package/demo/angular/src/app/components/assets/assets.component.ts +107 -0
- package/demo/angular/src/app/components/auth/auth.component.css +0 -0
- package/demo/angular/src/app/components/auth/auth.component.html +27 -0
- package/demo/angular/src/app/components/auth/auth.component.ts +33 -0
- package/demo/angular/src/app/components/caller/caller.component.css +0 -0
- package/demo/angular/src/app/components/caller/caller.component.html +22 -0
- package/demo/angular/src/app/components/caller/caller.component.ts +61 -0
- package/demo/angular/src/app/components/command/command.component.css +0 -0
- package/demo/angular/src/app/components/command/command.component.html +22 -0
- package/demo/angular/src/app/components/command/command.component.ts +60 -0
- package/demo/angular/src/app/components/integrations/integrations.component.ts +43 -0
- package/demo/angular/src/app/components/robots/robots.component.css +0 -0
- package/demo/angular/src/app/components/robots/robots.component.html +13 -0
- package/demo/angular/src/app/components/robots/robots.component.ts +26 -0
- package/demo/angular/src/app/components/sdk/sdk.component.css +0 -0
- package/demo/angular/src/app/components/sdk/sdk.component.html +43 -0
- package/demo/angular/src/app/components/sdk/sdk.component.ts +50 -0
- package/demo/angular/src/app/components/subscription/subscription.component.css +0 -0
- package/demo/angular/src/app/components/subscription/subscription.component.html +6 -0
- package/demo/angular/src/app/components/subscription/subscription.component.ts +40 -0
- package/demo/angular/src/app/components/telemetry/telemetry.component.css +0 -0
- package/demo/angular/src/app/components/telemetry/telemetry.component.html +19 -0
- package/demo/angular/src/app/components/telemetry/telemetry.component.ts +61 -0
- package/demo/angular/src/app/components/token/token.component.css +0 -0
- package/demo/angular/src/app/components/token/token.component.html +10 -0
- package/demo/angular/src/app/components/token/token.component.ts +18 -0
- package/demo/angular/src/app/components/video/p2pvideo/index.ts +646 -0
- package/demo/angular/src/app/components/video/video-source.ts +315 -0
- package/demo/angular/src/app/components/video/video.component.css +6 -0
- package/demo/angular/src/app/components/video/video.component.html +54 -0
- package/demo/angular/src/app/components/video/video.component.ts +151 -0
- package/demo/angular/src/app/services/sdk.service.ts +193 -0
- package/demo/angular/src/assets/.gitkeep +0 -0
- package/demo/angular/src/assets/HKGrotesk-Bold.otf +0 -0
- package/demo/angular/src/assets/HKGrotesk-Regular.otf +0 -0
- package/demo/angular/src/assets/logo.svg +16 -0
- package/demo/angular/src/environments/environment.prod.ts +3 -0
- package/demo/angular/src/environments/environment.ts +16 -0
- package/demo/angular/src/favicon.ico +0 -0
- package/demo/angular/src/index.html +15 -0
- package/demo/angular/src/main.ts +7 -0
- package/demo/angular/src/polyfills.ts +53 -0
- package/demo/angular/src/styles.css +198 -0
- package/demo/angular/tsconfig.app.json +15 -0
- package/demo/angular/tsconfig.json +39 -0
- package/demo/html/README.md +8 -0
- package/demo/html/assets/HKGrotesk-Bold.otf +0 -0
- package/demo/html/assets/HKGrotesk-Regular.otf +0 -0
- package/demo/html/assets/logo.svg +16 -0
- package/demo/html/favicon.ico +0 -0
- package/demo/html/index.html +416 -0
- package/demo/html/rocos-js-sdk.js +3 -0
- package/demo/html/rocos-js-sdk.js.LICENSE.txt +8 -0
- package/demo/html/rocos-js-sdk.js.map +1 -0
- package/demo/html/styles.css +190 -0
- package/demo/node/README.md +17 -0
- package/demo/node/index.js +134 -0
- package/demo/node/package.json +8 -0
- package/demo/react/.env +1 -0
- package/demo/react/.env.dist +1 -0
- package/demo/react/.eslintrc.json +46 -0
- package/demo/react/README.md +65 -0
- package/demo/react/package.json +60 -0
- package/demo/react/public/favicon.ico +0 -0
- package/demo/react/public/index.html +43 -0
- package/demo/react/public/logo192.png +0 -0
- package/demo/react/public/logo512.png +0 -0
- package/demo/react/public/manifest.json +25 -0
- package/demo/react/public/robots.txt +3 -0
- package/demo/react/src/App.css +190 -0
- package/demo/react/src/App.tsx +31 -0
- package/demo/react/src/actions/index.ts +8 -0
- package/demo/react/src/actions/sdkActions.ts +62 -0
- package/demo/react/src/assets/HKGrotesk-Bold.otf +0 -0
- package/demo/react/src/assets/HKGrotesk-Regular.otf +0 -0
- package/demo/react/src/assets/logo.svg +16 -0
- package/demo/react/src/components/AuthForm.tsx +76 -0
- package/demo/react/src/components/CallerBox.tsx +53 -0
- package/demo/react/src/components/CallerForm.tsx +98 -0
- package/demo/react/src/components/CommandBox.tsx +47 -0
- package/demo/react/src/components/CommandForm.tsx +98 -0
- package/demo/react/src/components/RobotsForm.tsx +51 -0
- package/demo/react/src/components/SubscriptionBox.tsx +55 -0
- package/demo/react/src/components/TelemetryForm.tsx +98 -0
- package/demo/react/src/components/TokenForm.tsx +39 -0
- package/demo/react/src/config.json +14 -0
- package/demo/react/src/controllers/RocosSDKController.ts +48 -0
- package/demo/react/src/helpers/deepEqual.ts +27 -0
- package/demo/react/src/hooks/useInput.ts +29 -0
- package/demo/react/src/index.css +11 -0
- package/demo/react/src/index.tsx +26 -0
- package/demo/react/src/react-app-env.d.ts +1 -0
- package/demo/react/src/reducers/sdkReducer.ts +133 -0
- package/demo/react/src/reportWebVitals.ts +15 -0
- package/demo/react/src/selectors/sdkSelector.ts +11 -0
- package/demo/react/src/setupTests.ts +5 -0
- package/demo/react/src/store.ts +14 -0
- package/demo/react/tsconfig.json +26 -0
- package/demo/sdk-sizer/dist/sdk-sizer/3rdpartylicenses.txt +975 -0
- package/demo/sdk-sizer/dist/sdk-sizer/favicon.ico +0 -0
- package/demo/sdk-sizer/dist/sdk-sizer/index.html +12 -0
- package/demo/sdk-sizer/dist/sdk-sizer/main.c9183649ce1856ef.js +2 -0
- package/demo/sdk-sizer/dist/sdk-sizer/main.c9183649ce1856ef.js.map +1 -0
- package/demo/sdk-sizer/dist/sdk-sizer/polyfills.701c8e5d007909aa.js +2 -0
- package/demo/sdk-sizer/dist/sdk-sizer/polyfills.701c8e5d007909aa.js.map +1 -0
- package/demo/sdk-sizer/dist/sdk-sizer/runtime.00e20e689f5284a8.js +2 -0
- package/demo/sdk-sizer/dist/sdk-sizer/runtime.00e20e689f5284a8.js.map +1 -0
- package/demo/sdk-sizer/dist/sdk-sizer/stats.json +1 -0
- package/demo/sdk-sizer/dist/sdk-sizer/styles.b45f7e627ac8cbce.css +2 -0
- package/demo/sdk-sizer/dist/sdk-sizer/styles.b45f7e627ac8cbce.css.map +1 -0
- package/grpc/file-accessor/filagree_grpc_pb.d.ts +41 -0
- package/grpc/file-accessor/filagree_grpc_pb.js +121 -0
- package/grpc/file-accessor/filagree_pb.d.ts +339 -0
- package/grpc/file-accessor/filagree_pb.js +2261 -0
- package/grpc/file-accessor/filagree_pb_service.d.ts +115 -0
- package/grpc/file-accessor/filagree_pb_service.js +257 -0
- package/grpc/rambo/rambo.v1_grpc_pb.d.ts +39 -0
- package/grpc/rambo/rambo.v1_grpc_pb.js +73 -0
- package/grpc/rambo/rambo.v1_pb.d.ts +365 -0
- package/grpc/rambo/rambo.v1_pb.js +2469 -0
- package/grpc/rambo/rambo.v1_pb_service.d.ts +76 -0
- package/grpc/rambo/rambo.v1_pb_service.js +138 -0
- package/grpc/rambo/uri.v1_grpc_pb.d.ts +1 -0
- package/grpc/rambo/uri.v1_grpc_pb.js +1 -0
- package/grpc/rambo/uri.v1_pb.d.ts +80 -0
- package/grpc/rambo/uri.v1_pb.js +563 -0
- package/grpc/rambo/uri.v1_pb_service.d.ts +3 -0
- package/grpc/rambo/uri.v1_pb_service.js +3 -0
- package/grpc/robot-control/conker_grpc_pb.d.ts +46 -0
- package/grpc/robot-control/conker_grpc_pb.js +143 -0
- package/grpc/robot-control/conker_pb.d.ts +168 -0
- package/grpc/robot-control/conker_pb.js +1287 -0
- package/grpc/robot-control/conker_pb_service.d.ts +126 -0
- package/grpc/robot-control/conker_pb_service.js +301 -0
- package/grpc/serviette/common.v1_grpc_pb.d.ts +1 -0
- package/grpc/serviette/common.v1_grpc_pb.js +1 -0
- package/grpc/serviette/common.v1_pb.d.ts +8 -0
- package/grpc/serviette/common.v1_pb.js +45 -0
- package/grpc/serviette/common.v1_pb_service.d.ts +3 -0
- package/grpc/serviette/common.v1_pb_service.js +3 -0
- package/grpc/serviette/serviette.v1_grpc_pb.d.ts +137 -0
- package/grpc/serviette/serviette.v1_grpc_pb.js +331 -0
- package/grpc/serviette/serviette.v1_pb.d.ts +884 -0
- package/grpc/serviette/serviette.v1_pb.js +6363 -0
- package/grpc/serviette/serviette.v1_pb_service.d.ts +278 -0
- package/grpc/serviette/serviette.v1_pb_service.js +699 -0
- package/grpc/serviette/uri.v1_grpc_pb.d.ts +1 -0
- package/grpc/serviette/uri.v1_grpc_pb.js +1 -0
- package/grpc/serviette/uri.v1_pb.d.ts +102 -0
- package/grpc/serviette/uri.v1_pb.js +741 -0
- package/grpc/serviette/uri.v1_pb_service.d.ts +3 -0
- package/grpc/serviette/uri.v1_pb_service.js +3 -0
- package/grpc/slowlane/slowlane_grpc_pb.d.ts +38 -0
- package/grpc/slowlane/slowlane_grpc_pb.js +132 -0
- package/grpc/slowlane/slowlane_pb.d.ts +373 -0
- package/grpc/slowlane/slowlane_pb.js +2908 -0
- package/grpc/slowlane/slowlane_pb_service.d.ts +112 -0
- package/grpc/slowlane/slowlane_pb_service.js +189 -0
- package/grpc/teletubby/teletubby_grpc_pb.d.ts +73 -0
- package/grpc/teletubby/teletubby_grpc_pb.js +231 -0
- package/grpc/teletubby/teletubby_pb.d.ts +647 -0
- package/grpc/teletubby/teletubby_pb.js +4786 -0
- package/grpc/teletubby/teletubby_pb_service.d.ts +193 -0
- package/grpc/teletubby/teletubby_pb_service.js +436 -0
- package/grpc/video/pigeon_grpc_pb.d.ts +59 -0
- package/grpc/video/pigeon_grpc_pb.js +180 -0
- package/grpc/video/pigeon_pb.d.ts +237 -0
- package/grpc/video/pigeon_pb.js +1775 -0
- package/grpc/video/pigeon_pb_service.d.ts +152 -0
- package/grpc/video/pigeon_pb_service.js +292 -0
- package/helpers/arrayRemove.js +6 -2
- package/helpers/arrayUnique.js +6 -2
- package/helpers/average.js +7 -2
- package/helpers/cleanObject.js +19 -17
- package/helpers/enviroment.js +11 -4
- package/helpers/flattenCallsignsLookup.d.ts +1 -1
- package/helpers/flattenCallsignsLookup.js +5 -1
- package/helpers/flattenObject.js +5 -1
- package/helpers/formatServiceUrl.js +5 -1
- package/helpers/generateUUID.js +7 -3
- package/helpers/getSubscriptionsDifference.d.ts +3 -3
- package/helpers/getSubscriptionsDifference.js +10 -6
- package/helpers/getUniqueConfigKey.js +6 -1
- package/helpers/getUniqueId.js +7 -3
- package/helpers/getUnixTimeMs.js +5 -1
- package/helpers/index.d.ts +1 -1
- package/helpers/index.js +15 -3
- package/helpers/nanosecondToMillisecond.d.ts +1 -1
- package/helpers/nanosecondToMillisecond.js +6 -5
- package/helpers/randomString.js +5 -1
- package/helpers/standardDeviation.js +8 -4
- package/helpers/stringToUint8Array.js +7 -3
- package/helpers/uint8ArrayToString.js +8 -3
- package/index.js +19 -7
- package/logger/RocosLogger.js +44 -18
- package/models/ExportDataQuery.js +5 -1
- package/models/ExternalProject.js +5 -1
- package/models/IBaseService.d.ts +0 -1
- package/models/IBaseService.js +2 -1
- package/models/IConfigGroup.js +2 -1
- package/models/IDebugLevel.d.ts +1 -1
- package/models/IDebugLevel.js +2 -1
- package/models/IExportDataQuery.js +2 -1
- package/models/IFunctionConfig.js +2 -1
- package/models/IInvitation.d.ts +1 -1
- package/models/IInvitation.js +2 -1
- package/models/IInvitationExists.js +2 -1
- package/models/IOperation.js +2 -1
- package/models/IPersonalAccessToken.js +2 -1
- package/models/IProject.js +2 -1
- package/models/IProjectApplication.js +2 -1
- package/models/IRobot.d.ts +0 -1
- package/models/IRobot.js +2 -1
- package/models/IRobotConfig.js +2 -1
- package/models/IRobotPlugin.js +2 -1
- package/models/IRobotTemplate.js +2 -1
- package/models/IRocosSDKConfig.d.ts +9 -3
- package/models/IRocosSDKConfig.js +2 -1
- package/models/ISignupParams.d.ts +8 -0
- package/models/ISignupParams.js +2 -0
- package/models/ISource.js +2 -1
- package/models/IStream.js +2 -1
- package/models/IStreamConfig.js +2 -1
- package/models/IStreamOptions.js +2 -1
- package/models/IStreamSource.js +2 -1
- package/models/ISubscriberStatus.js +2 -1
- package/models/ITelemetryStreamConfig.js +2 -1
- package/models/IToken.d.ts +3 -7
- package/models/IToken.js +2 -1
- package/models/IWidget.js +2 -1
- package/models/IWidgetLineGroup.js +2 -1
- package/models/ResponseLevelEnum.d.ts +0 -4
- package/models/ResponseLevelEnum.js +5 -6
- package/models/Robot.d.ts +0 -1
- package/models/Robot.js +5 -1
- package/models/RobotConfig.js +5 -1
- package/models/RobotPlugin.js +5 -1
- package/models/RobotTemplate.js +14 -9
- package/models/RocosError.js +6 -2
- package/models/ServiceEnum.js +5 -2
- package/models/Stream.js +8 -4
- package/models/StreamOptions.js +5 -1
- package/models/StreamSource.js +7 -3
- package/models/SubscriberStatusEnum.js +5 -2
- package/models/Token.d.ts +4 -36
- package/models/Token.js +11 -74
- package/models/Widget.js +8 -4
- package/models/WidgetLineGroup.js +5 -1
- package/models/asset-storage/AssetModelItem.js +2 -1
- package/models/caller/IRocosCallerMessageChunk.d.ts +2 -3
- package/models/caller/IRocosCallerMessageChunk.js +2 -1
- package/models/caller/IRocosCallerMessageChunks.d.ts +3 -2
- package/models/caller/IRocosCallerMessageChunks.js +2 -1
- package/models/caller/IRocosCallerMessageHeartbeat.d.ts +2 -3
- package/models/caller/IRocosCallerMessageHeartbeat.js +2 -1
- package/models/caller/IRocosCallerMessageResponse.d.ts +2 -3
- package/models/caller/IRocosCallerMessageResponse.js +2 -1
- package/models/caller/IRocosCallerMessageResponseAck.d.ts +2 -16
- package/models/caller/IRocosCallerMessageResponseAck.js +2 -13
- package/models/caller/IRocosCallerMessageResponseResult.d.ts +2 -15
- package/models/caller/IRocosCallerMessageResponseResult.js +2 -12
- package/models/caller/IRocosCallerMessageResponseUid.d.ts +2 -10
- package/models/caller/IRocosCallerMessageResponseUid.js +2 -7
- package/models/caller/IRocosCallerMessageResponses.d.ts +3 -2
- package/models/caller/IRocosCallerMessageResponses.js +2 -1
- package/models/caller/RocosCallerResultStatus.d.ts +1 -11
- package/models/caller/RocosCallerResultStatus.js +5 -12
- package/models/callsigns/CallsignsEnums.d.ts +3 -3
- package/models/callsigns/CallsignsEnums.js +14 -11
- package/models/callsigns/CallsignsLookup.js +15 -10
- package/models/callsigns/CallsignsQuery.js +5 -1
- package/models/callsigns/CallsignsQueryPredicate.js +5 -1
- package/models/command/IRocosCommandMessageHeartbeat.d.ts +2 -1
- package/models/command/IRocosCommandMessageHeartbeat.js +2 -1
- package/models/command/IRocosCommandMessageResponse.d.ts +2 -55
- package/models/command/IRocosCommandMessageResponse.js +2 -29
- package/models/command/RocosCommandResultStatus.d.ts +1 -11
- package/models/command/RocosCommandResultStatus.js +5 -12
- package/models/file/FileEnums.d.ts +4 -4
- package/models/file/FileEnums.js +12 -9
- package/models/index.d.ts +31 -5
- package/models/index.js +113 -75
- package/models/integrations/Overlay.js +2 -1
- package/models/integrations/Plan.js +2 -1
- package/models/maps/Map.d.ts +0 -1
- package/models/maps/Map.js +2 -1
- package/models/message/IRocosCallerMessage.js +2 -1
- package/models/message/IRocosChangeMessage.js +2 -1
- package/models/message/IRocosCommandMessage.js +2 -1
- package/models/message/IRocosControlMessage.js +2 -1
- package/models/message/IRocosOpResultMessage.d.ts +2 -2
- package/models/message/IRocosOpResultMessage.js +2 -1
- package/models/message/IRocosSearchMessage.js +2 -1
- package/models/message/IRocosSearchRowMessage.js +2 -1
- package/models/message/IRocosSearchStatusMessage.js +2 -1
- package/models/message/IRocosTelemetryMessage.d.ts +7 -12
- package/models/message/IRocosTelemetryMessage.js +2 -1
- package/models/message/IStreamStatusMessage.js +2 -1
- package/models/message/RocosCallerMessage.d.ts +4 -2
- package/models/message/RocosCallerMessage.js +15 -24
- package/models/message/RocosCommandMessage.d.ts +3 -2
- package/models/message/RocosCommandMessage.js +8 -5
- package/models/message/RocosControlMessage.d.ts +1 -1
- package/models/message/RocosControlMessage.js +10 -6
- package/models/message/RocosOpResultMessage.d.ts +2 -3
- package/models/message/RocosOpResultMessage.js +10 -6
- package/models/message/RocosSearchMessage.d.ts +1 -1
- package/models/message/RocosSearchMessage.js +9 -5
- package/models/message/RocosSearchRowMessage.d.ts +1 -1
- package/models/message/RocosSearchRowMessage.js +12 -8
- package/models/message/RocosTelemetryMessage.d.ts +23 -9
- package/models/message/RocosTelemetryMessage.js +93 -51
- package/models/params/ICallerParams.d.ts +1 -2
- package/models/params/ICallerParams.js +2 -1
- package/models/params/ICommandParams.js +2 -1
- package/models/params/IControlParams.d.ts +1 -1
- package/models/params/IControlParams.js +2 -1
- package/models/params/IFileAccessorParams.js +2 -1
- package/models/params/ISearchParams.js +2 -1
- package/models/params/ITelemetryParams.d.ts +1 -1
- package/models/params/ITelemetryParams.js +2 -1
- package/models/params/IWebRTCSignallingParams.js +2 -1
- package/models/projects/ProjectUser.js +2 -1
- package/models/schedule/IScheduleAction.d.ts +1 -1
- package/models/schedule/IScheduleAction.js +5 -2
- package/models/schedule/IScheduleInfo.js +2 -1
- package/models/schedule/IScheduleJob.js +2 -1
- package/models/search/SearchQueryFilter.js +5 -1
- package/models/search/SearchStreamQuery.js +5 -1
- package/models/stream/IBaseStream.js +2 -1
- package/models/stream/ICallerStream.js +2 -1
- package/models/stream/ICommandStream.js +2 -1
- package/models/stream/IControlStream.js +2 -1
- package/models/stream/IFileAccessorStream.d.ts +2 -1
- package/models/stream/IFileAccessorStream.js +2 -1
- package/models/stream/ISearchStream.js +2 -1
- package/models/stream/ITelemetryStream.js +2 -1
- package/models/stream/IWebRTCSignallingStream.d.ts +16 -51
- package/models/stream/IWebRTCSignallingStream.js +7 -1
- package/models/types.d.ts +5 -5
- package/models/types.js +2 -1
- package/node/RocosSDKNode.js +80 -75
- package/node/index.js +19 -7
- package/package.json +9 -6
- package/services/AssetStorageService.d.ts +0 -7
- package/services/AssetStorageService.js +24 -29
- package/services/AuthService.d.ts +27 -59
- package/services/AuthService.js +86 -167
- package/services/BaseServiceAbstract.d.ts +13 -11
- package/services/BaseServiceAbstract.js +19 -17
- package/services/CallerService.d.ts +17 -5
- package/services/CallerService.js +65 -22
- package/services/CallerServiceNode.js +8 -4
- package/services/CommandService.d.ts +17 -5
- package/services/CommandService.js +62 -19
- package/services/CommandServiceNode.js +8 -4
- package/services/ConfigGroupService.js +21 -17
- package/services/ControlService.d.ts +17 -5
- package/services/ControlService.js +65 -22
- package/services/ControlServiceNode.js +8 -4
- package/services/DashboardService.js +24 -20
- package/services/EventService.js +17 -13
- package/services/FileAccessorService.d.ts +18 -4
- package/services/FileAccessorService.js +62 -14
- package/services/FileAccessorServiceNode.js +8 -4
- package/services/FunctionService.js +21 -17
- package/services/IntegrationService.js +19 -14
- package/services/MapService.d.ts +23 -36
- package/services/MapService.js +40 -70
- package/services/PlatformTimeService.js +12 -8
- package/services/ProfileService.js +40 -36
- package/services/ProjectService.js +27 -23
- package/services/RobotService.d.ts +6 -2
- package/services/RobotService.js +55 -48
- package/services/ScheduleService.js +14 -10
- package/services/SearchService.d.ts +17 -4
- package/services/SearchService.js +59 -24
- package/services/SearchServiceNode.js +8 -4
- package/services/SpotProvisioningService.d.ts +1 -1
- package/services/SpotProvisioningService.js +16 -16
- package/services/SpotProvisioningServiceNode.d.ts +1 -1
- package/services/SpotProvisioningServiceNode.js +16 -16
- package/services/StreamService.js +30 -26
- package/services/TelemetryService.d.ts +17 -14
- package/services/TelemetryService.js +93 -91
- package/services/TelemetryServiceNode.js +8 -4
- package/services/TimeSyncerService.js +13 -9
- package/services/UserService.js +41 -37
- package/services/WebRTCSignallingService.d.ts +4 -4
- package/services/WebRTCSignallingService.js +27 -24
- package/services/WorkflowService.js +20 -16
- package/services/index.js +38 -26
- package/store/RocosStore.js +15 -9
- package/utils/axisangle.d.ts +18 -0
- package/utils/axisangle.js +48 -0
- package/utils/eulerangles.d.ts +22 -0
- package/utils/eulerangles.js +133 -0
- package/utils/helperfunctions.d.ts +5 -0
- package/utils/helperfunctions.js +50 -0
- package/utils/localtransform.d.ts +17 -0
- package/utils/localtransform.js +50 -0
- package/utils/localtransformtree.d.ts +17 -0
- package/utils/localtransformtree.js +88 -0
- package/utils/misc.d.ts +17 -0
- package/utils/misc.js +23 -0
- package/utils/positionvector.d.ts +13 -0
- package/utils/positionvector.js +79 -0
- package/utils/quaternion.d.ts +20 -0
- package/utils/quaternion.js +62 -0
- package/utils/rotationmatrix.d.ts +23 -0
- package/utils/rotationmatrix.js +262 -0
- package/utils/transformationmatrix.d.ts +12 -0
- package/utils/transformationmatrix.js +123 -0
- package/utils/vector3.d.ts +11 -0
- package/utils/vector3.js +61 -0
- package/constants/auth.d.ts +0 -2
- package/constants/auth.js +0 -2
- package/grpc/conker_pb.client.d.ts +0 -78
- package/grpc/conker_pb.client.js +0 -55
- package/grpc/conker_pb.d.ts +0 -141
- package/grpc/conker_pb.grpc-client.d.ts +0 -81
- package/grpc/conker_pb.grpc-client.js +0 -58
- package/grpc/conker_pb.js +0 -104
- package/grpc/filagree_pb.client.d.ts +0 -68
- package/grpc/filagree_pb.client.js +0 -48
- package/grpc/filagree_pb.d.ts +0 -404
- package/grpc/filagree_pb.grpc-client.d.ts +0 -69
- package/grpc/filagree_pb.grpc-client.js +0 -51
- package/grpc/filagree_pb.js +0 -329
- package/grpc/google/protobuf/descriptor_pb.d.ts +0 -1798
- package/grpc/google/protobuf/descriptor_pb.js +0 -2378
- package/grpc/google/protobuf/empty_pb.d.ts +0 -23
- package/grpc/google/protobuf/empty_pb.js +0 -47
- package/grpc/pigeon_pb.client.d.ts +0 -96
- package/grpc/pigeon_pb.client.js +0 -72
- package/grpc/pigeon_pb.d.ts +0 -207
- package/grpc/pigeon_pb.grpc-client.d.ts +0 -98
- package/grpc/pigeon_pb.grpc-client.js +0 -68
- package/grpc/pigeon_pb.js +0 -144
- package/grpc/rambo.uri.v1_pb.d.ts +0 -73
- package/grpc/rambo.uri.v1_pb.js +0 -48
- package/grpc/rambo.v1_pb.client.d.ts +0 -66
- package/grpc/rambo.v1_pb.client.js +0 -48
- package/grpc/rambo.v1_pb.d.ts +0 -392
- package/grpc/rambo.v1_pb.grpc-client.d.ts +0 -56
- package/grpc/rambo.v1_pb.grpc-client.js +0 -44
- package/grpc/rambo.v1_pb.js +0 -272
- package/grpc/serviette.uri.v1_pb.d.ts +0 -89
- package/grpc/serviette.uri.v1_pb.js +0 -62
- package/grpc/serviette.v1_pb.client.d.ts +0 -225
- package/grpc/serviette.v1_pb.client.js +0 -174
- package/grpc/serviette.v1_pb.d.ts +0 -827
- package/grpc/serviette.v1_pb.grpc-client.d.ts +0 -215
- package/grpc/serviette.v1_pb.grpc-client.js +0 -162
- package/grpc/serviette.v1_pb.js +0 -553
- package/grpc/slowlane_pb.client.d.ts +0 -61
- package/grpc/slowlane_pb.client.js +0 -41
- package/grpc/slowlane_pb.d.ts +0 -303
- package/grpc/slowlane_pb.grpc-client.d.ts +0 -64
- package/grpc/slowlane_pb.grpc-client.js +0 -44
- package/grpc/slowlane_pb.js +0 -185
- package/grpc/teletubby_pb.client.d.ts +0 -145
- package/grpc/teletubby_pb.client.js +0 -104
- package/grpc/teletubby_pb.d.ts +0 -634
- package/grpc/teletubby_pb.grpc-client.d.ts +0 -152
- package/grpc/teletubby_pb.grpc-client.js +0 -100
- package/grpc/teletubby_pb.js +0 -1264
- package/helpers/cleanObject.spec.d.ts +0 -1
- package/helpers/cleanObject.spec.js +0 -53
- package/helpers/flattenObject.spec.d.ts +0 -1
- package/helpers/flattenObject.spec.js +0 -29
- package/helpers/flattenOneOf.d.ts +0 -67
- package/helpers/flattenOneOf.js +0 -29
- package/helpers/flattenOneOf.spec.d.ts +0 -1
- package/helpers/flattenOneOf.spec.js +0 -157
- package/helpers/formatServiceUrl.spec.d.ts +0 -1
- package/helpers/formatServiceUrl.spec.js +0 -16
- package/helpers/standardDeviation.spec.d.ts +0 -1
- package/helpers/standardDeviation.spec.js +0 -11
- package/models/CallsignStatus.d.ts +0 -6
- package/models/CallsignStatus.js +0 -7
- package/models/IRobotSettings.d.ts +0 -28
- package/models/IRobotSettings.js +0 -1
- package/models/Token.spec.d.ts +0 -1
- package/models/Token.spec.js +0 -108
- package/models/caller/IRocosCallerMessageResponseReturn.d.ts +0 -8
- package/models/caller/IRocosCallerMessageResponseReturn.js +0 -1
- package/models/caller/RocosResponseLevel.d.ts +0 -6
- package/models/caller/RocosResponseLevel.js +0 -7
- package/models/caller/index.d.ts +0 -10
- package/models/caller/index.js +0 -10
- package/models/command/index.d.ts +0 -4
- package/models/command/index.js +0 -4
- package/models/message/index.d.ts +0 -17
- package/models/message/index.js +0 -17
- package/services/AuthService.spec.d.ts +0 -1
- package/services/AuthService.spec.js +0 -163
- package/services/BaseStreamService.d.ts +0 -18
- package/services/BaseStreamService.js +0 -47
- package/services/PlatformTimeService.spec.d.ts +0 -1
- package/services/PlatformTimeService.spec.js +0 -180
- package/services/TelemetryService.spec.d.ts +0 -1
- package/services/TelemetryService.spec.js +0 -37
@@ -0,0 +1,646 @@
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
2
|
+
/* eslint-disable @typescript-eslint/explicit-member-accessibility */
|
3
|
+
|
4
|
+
import { Subject } from 'rxjs'
|
5
|
+
import {
|
6
|
+
WebRTCSignallingService,
|
7
|
+
IOperatorConnectRequest,
|
8
|
+
IStatus,
|
9
|
+
IWebRTCSignallingMessage,
|
10
|
+
IGetDetailsRequest,
|
11
|
+
IOfferRequest,
|
12
|
+
IServiceError,
|
13
|
+
IWebRTCSignallingOutcome,
|
14
|
+
IAddIceCandidateRequest,
|
15
|
+
IWebRTCSignallingResponseStream,
|
16
|
+
} from '@team-rocos/rocos-js-sdk'
|
17
|
+
import { SdkService } from '../../../services/sdk.service'
|
18
|
+
import { grpc } from '@improbable-eng/grpc-web'
|
19
|
+
import { parseStats, IStatsResult, IVideoSourceStatus, VideoSourceStatusEnum } from '../video-source'
|
20
|
+
|
21
|
+
/**
|
22
|
+
* P2P video service connection service
|
23
|
+
*/
|
24
|
+
export class P2PVideoService {
|
25
|
+
// The detailed status for the video source
|
26
|
+
public videoSourceStatus: Subject<IVideoSourceStatus> = new Subject<IVideoSourceStatus>()
|
27
|
+
|
28
|
+
// Status to indicate the streaming and connecting
|
29
|
+
public isVideoStreaming: Subject<boolean> = new Subject<boolean>()
|
30
|
+
public isVideoConnecting: Subject<boolean> = new Subject<boolean>()
|
31
|
+
|
32
|
+
// The Obersable subject that used to stream the the actual WebRTC video stream once available
|
33
|
+
public mediaStream = new Subject<MediaStream | undefined>()
|
34
|
+
|
35
|
+
public connectingMessage?: string
|
36
|
+
|
37
|
+
//#region Private fields
|
38
|
+
|
39
|
+
private _webRTCSignallingService: WebRTCSignallingService
|
40
|
+
|
41
|
+
// The video operator stream that connects to rocos Pigeon gRPC service
|
42
|
+
private _videoOperatorStream?: IWebRTCSignallingResponseStream<IWebRTCSignallingMessage>
|
43
|
+
|
44
|
+
// Internal indicator for checking if the stop stream has been called
|
45
|
+
private _isStopped: boolean = false
|
46
|
+
|
47
|
+
// The RTC peer connection object provided by the browser to coordinate the WebRTC video stream
|
48
|
+
private _peerConnection?: RTCPeerConnection
|
49
|
+
|
50
|
+
// The detailed WebRTC stats that collected by application
|
51
|
+
private _webRTCStats?: IStatsResult
|
52
|
+
private _lastBitrateRecordTime?: number
|
53
|
+
private _bitrateKbps: number = 0
|
54
|
+
|
55
|
+
private _lastJitterBufferDelay: number = 0
|
56
|
+
private _lastJitterBufferEmittedCount: number = 0
|
57
|
+
|
58
|
+
private _videoSourceStatus: IVideoSourceStatus = {}
|
59
|
+
|
60
|
+
private _videoStreaming: boolean = false
|
61
|
+
private _videoConnecting: boolean = false
|
62
|
+
private _awaitAnswerTimeout?: number
|
63
|
+
private _awaitPeerConnectionTimeout?: number
|
64
|
+
private _retryWatchTimeout?: number
|
65
|
+
private _updateStatsTimerInterval?: number
|
66
|
+
private _retryTimerInterval?: number
|
67
|
+
|
68
|
+
constructor(
|
69
|
+
private sdkService: SdkService,
|
70
|
+
private projectId: string,
|
71
|
+
private videoId: string,
|
72
|
+
private videoCommand: string,
|
73
|
+
private playoutDelayHint: string,
|
74
|
+
private iceServers: any,
|
75
|
+
) {
|
76
|
+
this._webRTCSignallingService = this.sdkService.getWebRTCSignallingService()
|
77
|
+
}
|
78
|
+
|
79
|
+
/**
|
80
|
+
* Function to start the video stream
|
81
|
+
* @returns
|
82
|
+
*/
|
83
|
+
public startStream(): void {
|
84
|
+
if (!this.videoId || !this.projectId || !this.videoCommand) {
|
85
|
+
console.error('Required parameters are missing, cannot start video stream')
|
86
|
+
this.stopStream(false, 'Required parameters are missing')
|
87
|
+
return
|
88
|
+
}
|
89
|
+
|
90
|
+
// this.webRTCSignallingService.getDetails()
|
91
|
+
const cameraStatusRequest: IGetDetailsRequest = {
|
92
|
+
videoId: this.videoId,
|
93
|
+
projectId: this.projectId,
|
94
|
+
}
|
95
|
+
|
96
|
+
// Get the connections details to check if the current connection can be performed
|
97
|
+
this._webRTCSignallingService.getDetails(cameraStatusRequest, async (_, response) => {
|
98
|
+
const operators = response ? response.getOperators() : 0
|
99
|
+
|
100
|
+
// There is other operator already connected to the video, either force the other operator to disconnect or cancel current request
|
101
|
+
if (operators > 0) {
|
102
|
+
const title = 'Existing Connection Detected'
|
103
|
+
|
104
|
+
// eslint-disable-next-line max-len
|
105
|
+
const message = `There is someone already connected to this camera. If you continue to connect, they will be disconnected.`
|
106
|
+
|
107
|
+
const confirmResult = window.confirm(message)
|
108
|
+
|
109
|
+
if (confirmResult) {
|
110
|
+
await this._startWatching()
|
111
|
+
}
|
112
|
+
} else {
|
113
|
+
await this._startWatching()
|
114
|
+
}
|
115
|
+
})
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* Stop the vide stream
|
120
|
+
* @param restartHasScheduled
|
121
|
+
* @param msg
|
122
|
+
*/
|
123
|
+
public stopStream(restartHasScheduled: boolean = false, msg?: string): void {
|
124
|
+
console.log('Stopping stream')
|
125
|
+
|
126
|
+
this._isStopped = true
|
127
|
+
|
128
|
+
if (this._videoOperatorStream) {
|
129
|
+
try {
|
130
|
+
this._videoOperatorStream.cancel()
|
131
|
+
} catch (ex) {
|
132
|
+
console.warn('Failed to cancel the operator stream, the stream might already cancelled', { ex })
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
this.connectingMessage = msg
|
137
|
+
this._stopInternal(restartHasScheduled)
|
138
|
+
}
|
139
|
+
|
140
|
+
/**
|
141
|
+
* Start establishing the required WebRTC signalling service and video stream
|
142
|
+
* @returns
|
143
|
+
*/
|
144
|
+
private async _startWatching(): Promise<void> {
|
145
|
+
if (this._isStopped) {
|
146
|
+
return
|
147
|
+
}
|
148
|
+
|
149
|
+
this._clearInternalTimers()
|
150
|
+
|
151
|
+
this.updateVideoStreaming(false)
|
152
|
+
this.updateVideoConnecting(true)
|
153
|
+
|
154
|
+
this.connectingMessage = 'Initiating...'
|
155
|
+
|
156
|
+
const request: IOperatorConnectRequest = { videoId: this.videoId, projectId: this.projectId }
|
157
|
+
|
158
|
+
// connect as an operator (disconnects others)...
|
159
|
+
this._videoOperatorStream = await this._webRTCSignallingService.connectOperator(request)
|
160
|
+
|
161
|
+
// Once the operator connected, it will wait for the camera to be connected.
|
162
|
+
// The camera could already connected to Pigeon through agent or not online yet. (Agent automatcially connect the cameras to Pigeon service as soon as it's online)
|
163
|
+
console.log('Connected to Pigeon Operator Service. Waiting for camera...')
|
164
|
+
console.log(`Waiting for camera...`)
|
165
|
+
|
166
|
+
this.connectingMessage = 'Waiting for camera...'
|
167
|
+
|
168
|
+
this._videoOperatorStream.on('status', (status: IStatus) => {
|
169
|
+
if (status.code === grpc.Code.OK) {
|
170
|
+
console.log('Video operator stream status changed to ok')
|
171
|
+
return
|
172
|
+
}
|
173
|
+
|
174
|
+
if (this._awaitAnswerTimeout) {
|
175
|
+
clearTimeout(this._awaitAnswerTimeout)
|
176
|
+
}
|
177
|
+
if (this._awaitPeerConnectionTimeout) {
|
178
|
+
clearTimeout(this._awaitPeerConnectionTimeout)
|
179
|
+
}
|
180
|
+
|
181
|
+
console.log(`Signaling operator in error status`, { status })
|
182
|
+
|
183
|
+
if (status.code === grpc.Code.ResourceExhausted) {
|
184
|
+
// The disconnection might be interapted by another operator watchning.
|
185
|
+
// We only want to stop stream but not restarting watching again.
|
186
|
+
this._bootHandler()
|
187
|
+
} else {
|
188
|
+
this._restartWatching(`Netowrk error with code ${status.code}`)
|
189
|
+
}
|
190
|
+
})
|
191
|
+
|
192
|
+
// WebRTC signalling service sent data to the operator
|
193
|
+
this._videoOperatorStream.on('data', (message: IWebRTCSignallingMessage) => {
|
194
|
+
const messageType = message.getMessagetype()
|
195
|
+
console.log(`Received '${messageType}' message`)
|
196
|
+
|
197
|
+
switch (messageType) {
|
198
|
+
case 'camera-connected': {
|
199
|
+
console.log('Camera connected')
|
200
|
+
this.connectingMessage = 'Camera online. Waiting for video stream...'
|
201
|
+
|
202
|
+
this._setupPeerConnection()
|
203
|
+
|
204
|
+
// Setup peer connection requires a timout watcher to deal with error if the agent doesn't reply the initial offering request in time
|
205
|
+
this._awaitAnswerTimeout = window.setTimeout(
|
206
|
+
(msg: string) => {
|
207
|
+
this._restartWatching(msg)
|
208
|
+
},
|
209
|
+
10000,
|
210
|
+
'Timeout waiting for answer from signaling server',
|
211
|
+
)
|
212
|
+
break
|
213
|
+
}
|
214
|
+
// WebRTC signalling service replied the connection request after received the response from agent
|
215
|
+
case 'answer': {
|
216
|
+
clearTimeout(this._awaitAnswerTimeout)
|
217
|
+
const payload = message.getPayload()
|
218
|
+
const answer = JSON.parse(payload)
|
219
|
+
|
220
|
+
// Process the answer
|
221
|
+
this._answerHandler(answer)
|
222
|
+
|
223
|
+
// Watch if the agent failed to establish the video stream with the operation
|
224
|
+
this._awaitPeerConnectionTimeout = setTimeout(
|
225
|
+
(msg: string) => {
|
226
|
+
this._restartWatching(msg)
|
227
|
+
},
|
228
|
+
10000,
|
229
|
+
'Timeout waiting for peer connection',
|
230
|
+
)
|
231
|
+
break
|
232
|
+
}
|
233
|
+
}
|
234
|
+
})
|
235
|
+
}
|
236
|
+
|
237
|
+
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
238
|
+
private _answerHandler(answerRequest: any): void {
|
239
|
+
if (this._isStopped) {
|
240
|
+
return
|
241
|
+
}
|
242
|
+
|
243
|
+
const remoteDescription = JSON.parse(atob(answerRequest.sdp))
|
244
|
+
|
245
|
+
if (this._peerConnection) {
|
246
|
+
this._peerConnection
|
247
|
+
.setRemoteDescription(new RTCSessionDescription(remoteDescription))
|
248
|
+
.then(() => {
|
249
|
+
// will not be called immediately if a connection is already underway
|
250
|
+
// log('Finished setRemoteDescription()');
|
251
|
+
})
|
252
|
+
.catch((err) => {
|
253
|
+
console.log(err)
|
254
|
+
})
|
255
|
+
}
|
256
|
+
}
|
257
|
+
|
258
|
+
/**
|
259
|
+
* Handle the event that the current connection has been disconnected by other operator
|
260
|
+
* @returns
|
261
|
+
*/
|
262
|
+
private _bootHandler(): void {
|
263
|
+
if (this._isStopped) {
|
264
|
+
return
|
265
|
+
}
|
266
|
+
this.connectingMessage = 'Another operator has taken over the connection.'
|
267
|
+
this._stopInternal(false)
|
268
|
+
}
|
269
|
+
|
270
|
+
/**
|
271
|
+
* Restart watching if the video was disconnected due to temp error
|
272
|
+
* @param message
|
273
|
+
*/
|
274
|
+
private _restartWatching(message: string): void {
|
275
|
+
console.log(`restart watching: projectId: ${this.projectId}`)
|
276
|
+
this.stopStream(true, message + ': Restarting connection...')
|
277
|
+
|
278
|
+
this._retryWatchTimeout = window.setTimeout(() => this._startWatching(), 3000)
|
279
|
+
}
|
280
|
+
|
281
|
+
/**
|
282
|
+
* Set the peer connection between operator on agent
|
283
|
+
*/
|
284
|
+
private _setupPeerConnection(): void {
|
285
|
+
this._peerConnection = new RTCPeerConnection({
|
286
|
+
iceServers: this.iceServers,
|
287
|
+
})
|
288
|
+
|
289
|
+
// Video stream track is available
|
290
|
+
this._peerConnection.ontrack = (ev: RTCTrackEvent) => {
|
291
|
+
// eslint-disable-next-line max-len
|
292
|
+
console.log(
|
293
|
+
`PeerConnection received a streams containing ${ev.streams[0].getAudioTracks().length} audio tracks(s) and ${
|
294
|
+
ev.streams[0].getVideoTracks().length
|
295
|
+
} video tracks(s)`,
|
296
|
+
)
|
297
|
+
|
298
|
+
// Forward the media stream to the consumer
|
299
|
+
this.mediaStream.next(ev.streams[0])
|
300
|
+
|
301
|
+
if (this.playoutDelayHint) {
|
302
|
+
if (/^\d+$/.test(this.playoutDelayHint)) {
|
303
|
+
// playoutDelayHint value is in second, convert from mili second to second
|
304
|
+
const playoutDelayHint = parseInt(this.playoutDelayHint, 10) / 1000
|
305
|
+
if (playoutDelayHint !== 0) {
|
306
|
+
const receivers = (this._peerConnection as any).getReceivers()
|
307
|
+
// Set the playoutDelayHint
|
308
|
+
if (receivers.length > 0 && !receivers[0].playoutDelayHint) {
|
309
|
+
receivers[0].playoutDelayHint = playoutDelayHint
|
310
|
+
}
|
311
|
+
}
|
312
|
+
}
|
313
|
+
}
|
314
|
+
}
|
315
|
+
|
316
|
+
// Debugging function to track the state change event
|
317
|
+
this._peerConnection.onsignalingstatechange = () => {
|
318
|
+
if (this._peerConnection) {
|
319
|
+
console.log(`PeerConnection signaling state changed to '${this._peerConnection.signalingState}'`)
|
320
|
+
}
|
321
|
+
}
|
322
|
+
|
323
|
+
// ICE connection state tracking function
|
324
|
+
this._peerConnection.oniceconnectionstatechange = () => {
|
325
|
+
if (this._peerConnection) {
|
326
|
+
console.log(`PeerConnection ice connection state changed to '${this._peerConnection.iceConnectionState}'`)
|
327
|
+
}
|
328
|
+
|
329
|
+
if (
|
330
|
+
this._peerConnection &&
|
331
|
+
(this._peerConnection.iceConnectionState === 'failed' ||
|
332
|
+
this._peerConnection.iceConnectionState === 'disconnected' ||
|
333
|
+
this._peerConnection.iceConnectionState === 'closed')
|
334
|
+
) {
|
335
|
+
console.log('****************************************************')
|
336
|
+
console.log('the peer connection failed and we need to handle it')
|
337
|
+
console.log('****************************************************')
|
338
|
+
|
339
|
+
// Print out error log, the acutally error state handler is at a different event track function
|
340
|
+
}
|
341
|
+
|
342
|
+
if (this._peerConnection && this._peerConnection.iceConnectionState === 'connected') {
|
343
|
+
// Clear the time out watcher once the state become connected
|
344
|
+
if (this._awaitAnswerTimeout) {
|
345
|
+
clearTimeout(this._awaitAnswerTimeout)
|
346
|
+
}
|
347
|
+
if (this._awaitPeerConnectionTimeout) {
|
348
|
+
clearTimeout(this._awaitPeerConnectionTimeout)
|
349
|
+
}
|
350
|
+
}
|
351
|
+
}
|
352
|
+
|
353
|
+
// ICE gathering state tracking function
|
354
|
+
this._peerConnection.onicegatheringstatechange = () => {
|
355
|
+
if (this._peerConnection) {
|
356
|
+
console.log(`PeerConnection ice gathering state changed to '${this._peerConnection.iceGatheringState}'`)
|
357
|
+
}
|
358
|
+
}
|
359
|
+
|
360
|
+
// ICE candidate error tracking function
|
361
|
+
this._peerConnection.onicecandidateerror = (event: any) => {
|
362
|
+
console.log(`PeerConnection error occurred during ICE candidate gathering: Code: '${event.errorCode}'`)
|
363
|
+
}
|
364
|
+
|
365
|
+
// Create the actual camera connection offer once the peer connection requiring negotiation
|
366
|
+
this._peerConnection.onnegotiationneeded = () => {
|
367
|
+
this._createAndSendOffer(null)
|
368
|
+
}
|
369
|
+
|
370
|
+
// When ICE Candidate alailable, sende the ICE Candidates to agent through signalling service
|
371
|
+
this._peerConnection.onicecandidate = (event) => {
|
372
|
+
if (event.candidate && event.candidate.candidate) {
|
373
|
+
const request: IAddIceCandidateRequest = {
|
374
|
+
videoId: this.videoId,
|
375
|
+
candidate: event.candidate.candidate,
|
376
|
+
projectId: this.projectId,
|
377
|
+
}
|
378
|
+
|
379
|
+
// Send the ICE candidate to agent through signalling service
|
380
|
+
this._webRTCSignallingService.addIceCandidate(request, (err, response) => {
|
381
|
+
if (err) {
|
382
|
+
console.log('this.operatorService.addIceCandidate ERROR:')
|
383
|
+
console.log(err)
|
384
|
+
}
|
385
|
+
})
|
386
|
+
} else {
|
387
|
+
// All candidates received
|
388
|
+
console.log('All candidates received!')
|
389
|
+
}
|
390
|
+
}
|
391
|
+
|
392
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
393
|
+
// Track the connection stats change events and apply logic accordingly
|
394
|
+
this._peerConnection.onconnectionstatechange = (_) => {
|
395
|
+
// "new" | "connecting" | "connected" | "disconnected" | "failed" | "closed";
|
396
|
+
|
397
|
+
const connectionState = this._peerConnection?.connectionState
|
398
|
+
|
399
|
+
console.log(`PeerConnection connection state changed to '${connectionState}'`)
|
400
|
+
|
401
|
+
switch (connectionState) {
|
402
|
+
case 'failed':
|
403
|
+
case 'disconnected':
|
404
|
+
this.connectingMessage = `${connectionState}: retrying...`
|
405
|
+
|
406
|
+
this._restartWatching(`Stream ${connectionState}`)
|
407
|
+
break
|
408
|
+
case 'connected':
|
409
|
+
this.connectingMessage = undefined
|
410
|
+
this.updateVideoStreaming(true)
|
411
|
+
this.updateVideoConnecting(false)
|
412
|
+
break
|
413
|
+
default:
|
414
|
+
this.connectingMessage = connectionState
|
415
|
+
}
|
416
|
+
}
|
417
|
+
|
418
|
+
this._peerConnection.addTransceiver('video', { 'direction': 'recvonly' })
|
419
|
+
|
420
|
+
if (this._updateStatsTimerInterval) {
|
421
|
+
clearInterval(this._updateStatsTimerInterval)
|
422
|
+
}
|
423
|
+
|
424
|
+
// Start updating the state every 1 sec
|
425
|
+
this._updateStatsTimerInterval = window.setInterval(() => this._updateStats(), 1000)
|
426
|
+
}
|
427
|
+
|
428
|
+
/**
|
429
|
+
* Create and send the inital connection offer
|
430
|
+
* @param offerOptions
|
431
|
+
* @returns
|
432
|
+
*/
|
433
|
+
private async _createAndSendOffer(offerOptions: RTCOfferOptions | null): Promise<void> {
|
434
|
+
offerOptions = offerOptions || { iceRestart: false }
|
435
|
+
|
436
|
+
if (!this._peerConnection) {
|
437
|
+
console.error('Peer connection cannot be null when creating the offer')
|
438
|
+
this._restartWatching('Peer connection cannot be null when creating the offer')
|
439
|
+
return
|
440
|
+
}
|
441
|
+
|
442
|
+
// Create and send offer based on the PeerConnection info
|
443
|
+
try {
|
444
|
+
const offer = await this._peerConnection.createOffer(offerOptions)
|
445
|
+
|
446
|
+
await this._peerConnection.setLocalDescription(offer)
|
447
|
+
|
448
|
+
this._sendOffer(this._peerConnection.localDescription as RTCSessionDescription)
|
449
|
+
} catch (err) {
|
450
|
+
console.error('Failed to create or send offer', { err })
|
451
|
+
}
|
452
|
+
}
|
453
|
+
|
454
|
+
/**
|
455
|
+
* Send offer to agent through WebRTC signalling service
|
456
|
+
* @param offer
|
457
|
+
* @returns
|
458
|
+
*/
|
459
|
+
private _sendOffer(offer?: RTCSessionDescription): void {
|
460
|
+
if (offer == null) {
|
461
|
+
this._restartWatching('Connection off cannot be null')
|
462
|
+
return
|
463
|
+
}
|
464
|
+
|
465
|
+
const request: IOfferRequest = {
|
466
|
+
projectId: this.projectId as string,
|
467
|
+
rtcSessionDescription: offer,
|
468
|
+
videoCommand: this.videoCommand,
|
469
|
+
videoId: this.videoId,
|
470
|
+
clientId: '',
|
471
|
+
videoFormat: 'H264',
|
472
|
+
}
|
473
|
+
|
474
|
+
console.log('Offer request', { request })
|
475
|
+
|
476
|
+
this._webRTCSignallingService.offerConnection(
|
477
|
+
request,
|
478
|
+
(err: IServiceError | null, response: IWebRTCSignallingOutcome | null) => {
|
479
|
+
if (err) {
|
480
|
+
console.error('Send offer connection failed', { err })
|
481
|
+
}
|
482
|
+
|
483
|
+
if (response) {
|
484
|
+
console.log('Send offer connection succeeded', { response })
|
485
|
+
}
|
486
|
+
},
|
487
|
+
)
|
488
|
+
}
|
489
|
+
|
490
|
+
/**
|
491
|
+
* Update stats with the info from peer connection
|
492
|
+
*/
|
493
|
+
private async _updateStats(): Promise<void> {
|
494
|
+
let diff = 1000
|
495
|
+
|
496
|
+
if (this._lastBitrateRecordTime) {
|
497
|
+
const now = window.performance.now()
|
498
|
+
diff = now - this._lastBitrateRecordTime
|
499
|
+
}
|
500
|
+
|
501
|
+
this._videoSourceStatus.realInterval = diff
|
502
|
+
|
503
|
+
this._lastBitrateRecordTime = window.performance.now()
|
504
|
+
if (this._peerConnection) {
|
505
|
+
const stats = await this._peerConnection.getStats(null)
|
506
|
+
|
507
|
+
const statsResult: IStatsResult = parseStats(stats)
|
508
|
+
|
509
|
+
this._videoSourceStatus.webrtcRoundTripTimeMs = statsResult.bandwidth.currentRoundTripTime * 1000
|
510
|
+
|
511
|
+
this._videoSourceStatus.webrtcPeerConnectionStatus = this._peerConnection.connectionState === 'connected'
|
512
|
+
this._videoSourceStatus.webrtcIceStateConnected =
|
513
|
+
['connected', 'completed'].indexOf(this._peerConnection.iceConnectionState) > 0
|
514
|
+
this._videoSourceStatus.webrtcIceConnectionState =
|
515
|
+
this._peerConnection.iceConnectionState[0].toUpperCase() + this._peerConnection.iceConnectionState.substr(1)
|
516
|
+
|
517
|
+
if (statsResult.video.packetsReceived > 0) {
|
518
|
+
this._videoSourceStatus.webrtcPacketLossPercent = +(
|
519
|
+
(statsResult.video.packetsLost / statsResult.video.packetsReceived) *
|
520
|
+
100
|
521
|
+
).toFixed(2)
|
522
|
+
}
|
523
|
+
|
524
|
+
if (this._peerConnection.getTransceivers().length > 0) {
|
525
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
526
|
+
const transceiver = (<any>this._peerConnection).getTransceivers()[0]
|
527
|
+
this._videoSourceStatus.webrtcStreamStarted = !transceiver.stopped
|
528
|
+
} else {
|
529
|
+
this._videoSourceStatus.webrtcStreamStarted = false
|
530
|
+
}
|
531
|
+
|
532
|
+
this._videoSourceStatus.webrtcVideoIn = statsResult.video.recv.tracks.length > 0
|
533
|
+
|
534
|
+
if (this._webRTCStats && statsResult.video.bytesReceived && this._webRTCStats.video.bytesReceived) {
|
535
|
+
if (this._webRTCStats.video.bytesReceived > statsResult.video.bytesReceived) {
|
536
|
+
this._webRTCStats.video.bytesReceived = statsResult.video.bytesReceived
|
537
|
+
}
|
538
|
+
// multiply to turbo because we may changed the update rate
|
539
|
+
const extraBytesReceived = statsResult.video.bytesReceived - this._webRTCStats.video.bytesReceived
|
540
|
+
const bytesPerSecond = (extraBytesReceived / this._videoSourceStatus.realInterval) * 1000
|
541
|
+
const kbitsPerSecond = bytesPerSecond / 128
|
542
|
+
this._bitrateKbps = kbitsPerSecond
|
543
|
+
this._videoSourceStatus.webrtcBitrate = `${Math.floor(this._bitrateKbps)}`
|
544
|
+
} else {
|
545
|
+
this._videoSourceStatus.webrtcBitrate = '0'
|
546
|
+
}
|
547
|
+
|
548
|
+
if (statsResult.video && statsResult.video.recv) {
|
549
|
+
if (statsResult.video.recv.framesDropped || statsResult.video.recv.framesDropped === 0) {
|
550
|
+
this._videoSourceStatus.webrtcFramesDropped = statsResult.video.recv.framesDropped
|
551
|
+
}
|
552
|
+
if (statsResult.video.recv.framesDecoded || statsResult.video.recv.framesDecoded === 0) {
|
553
|
+
this._videoSourceStatus.webrtcFramesDecoded = statsResult.video.recv.framesDecoded
|
554
|
+
}
|
555
|
+
if (statsResult.video.recv.framesReceived || statsResult.video.recv.framesReceived === 0) {
|
556
|
+
this._videoSourceStatus.webrtcFramesReceived = statsResult.video.recv.framesReceived
|
557
|
+
}
|
558
|
+
if (statsResult.video.recv.jitterBufferDelay) {
|
559
|
+
this._videoSourceStatus.jitterBufferDelay = statsResult.video.recv.jitterBufferDelay
|
560
|
+
}
|
561
|
+
if (statsResult.video.recv.jitterBufferEmittedCount) {
|
562
|
+
this._videoSourceStatus.jitterBufferEmittedCount = statsResult.video.recv.jitterBufferEmittedCount
|
563
|
+
}
|
564
|
+
|
565
|
+
if (statsResult.video.recv.jitterBufferDelay && statsResult.video.recv.jitterBufferEmittedCount) {
|
566
|
+
this._videoSourceStatus.jitterBufferEmittedCount = statsResult.video.recv.jitterBufferEmittedCount
|
567
|
+
|
568
|
+
const currentJitterBufferDelay = statsResult.video.recv.jitterBufferDelay
|
569
|
+
const delayThisPeriod = currentJitterBufferDelay - this._lastJitterBufferDelay
|
570
|
+
this._lastJitterBufferDelay = currentJitterBufferDelay
|
571
|
+
|
572
|
+
const currentJitterBufferEmittedCount = statsResult.video.recv.jitterBufferEmittedCount
|
573
|
+
const countThisPeriod = currentJitterBufferEmittedCount - this._lastJitterBufferEmittedCount
|
574
|
+
this._lastJitterBufferEmittedCount = currentJitterBufferEmittedCount
|
575
|
+
|
576
|
+
const avgDelayThisPeriod = delayThisPeriod / countThisPeriod
|
577
|
+
this._videoSourceStatus.avgFramePlayout = avgDelayThisPeriod
|
578
|
+
} else {
|
579
|
+
this._videoSourceStatus.avgFramePlayout = undefined
|
580
|
+
}
|
581
|
+
}
|
582
|
+
|
583
|
+
this._webRTCStats = statsResult
|
584
|
+
this.updateVideoSourceStatus()
|
585
|
+
}
|
586
|
+
}
|
587
|
+
|
588
|
+
// Clear all timers
|
589
|
+
private _clearInternalTimers(): void {
|
590
|
+
if (this._awaitAnswerTimeout) {
|
591
|
+
clearTimeout(this._awaitAnswerTimeout)
|
592
|
+
}
|
593
|
+
if (this._awaitPeerConnectionTimeout) {
|
594
|
+
clearTimeout(this._awaitPeerConnectionTimeout)
|
595
|
+
}
|
596
|
+
if (this._updateStatsTimerInterval) {
|
597
|
+
clearInterval(this._updateStatsTimerInterval)
|
598
|
+
}
|
599
|
+
if (this._retryWatchTimeout) {
|
600
|
+
clearTimeout(this._retryWatchTimeout)
|
601
|
+
}
|
602
|
+
if (this._retryTimerInterval) {
|
603
|
+
clearInterval(this._retryTimerInterval)
|
604
|
+
}
|
605
|
+
}
|
606
|
+
|
607
|
+
private _stopInternal(restartHasScheduled?: boolean): void {
|
608
|
+
// this is called when booted
|
609
|
+
// don't send stop command to server - it will disconnect the other viewer
|
610
|
+
this.updateVideoStreaming(false)
|
611
|
+
this.updateVideoConnecting(restartHasScheduled)
|
612
|
+
|
613
|
+
this.mediaStream.next(undefined)
|
614
|
+
|
615
|
+
if (this._peerConnection) {
|
616
|
+
this._peerConnection.close()
|
617
|
+
this._peerConnection = undefined
|
618
|
+
}
|
619
|
+
|
620
|
+
this._clearInternalTimers()
|
621
|
+
}
|
622
|
+
|
623
|
+
private updateVideoSourceStatus(key?: VideoSourceStatusEnum, value?: any) {
|
624
|
+
if (key !== undefined && value !== undefined) {
|
625
|
+
this._videoSourceStatus[key] = value
|
626
|
+
}
|
627
|
+
|
628
|
+
this.videoSourceStatus.next(this._videoSourceStatus)
|
629
|
+
}
|
630
|
+
|
631
|
+
private updateVideoStreaming(streaming?: boolean) {
|
632
|
+
if (streaming !== undefined) {
|
633
|
+
this._videoStreaming = streaming
|
634
|
+
}
|
635
|
+
|
636
|
+
this.isVideoStreaming.next(this._videoStreaming)
|
637
|
+
}
|
638
|
+
|
639
|
+
private updateVideoConnecting(connecting?: boolean) {
|
640
|
+
if (connecting !== undefined) {
|
641
|
+
this._videoConnecting = connecting
|
642
|
+
}
|
643
|
+
|
644
|
+
this.isVideoConnecting.next(this._videoConnecting)
|
645
|
+
}
|
646
|
+
}
|