@dronedeploy/rocos-js-sdk 0.0.1 → 1.0.0-alpha-2
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.d.ts +55 -0
- package/IRocosSDK.js +2 -0
- package/README.md +108 -0
- package/RocosSDK.d.ts +138 -0
- package/RocosSDK.js +292 -0
- package/api/StreamRegister.d.ts +13 -0
- package/api/StreamRegister.js +69 -0
- package/api/atoms/StreamHeartbeat.d.ts +27 -0
- package/api/atoms/StreamHeartbeat.js +111 -0
- package/api/streams/caller/CallerStream.d.ts +13 -0
- package/api/streams/caller/CallerStream.js +77 -0
- package/api/streams/caller/CallerStreamAbstract.d.ts +23 -0
- package/api/streams/caller/CallerStreamAbstract.js +87 -0
- package/api/streams/caller/CallerStreamNode.d.ts +13 -0
- package/api/streams/caller/CallerStreamNode.js +115 -0
- package/api/streams/command/CommandStream.d.ts +10 -0
- package/api/streams/command/CommandStream.js +66 -0
- package/api/streams/command/CommandStreamAbstract.d.ts +20 -0
- package/api/streams/command/CommandStreamAbstract.js +63 -0
- package/api/streams/command/CommandStreamNode.d.ts +10 -0
- package/api/streams/command/CommandStreamNode.js +69 -0
- package/api/streams/control/ControlStream.d.ts +12 -0
- package/api/streams/control/ControlStream.js +75 -0
- package/api/streams/control/ControlStreamAbstract.d.ts +25 -0
- package/api/streams/control/ControlStreamAbstract.js +111 -0
- package/api/streams/control/ControlStreamNode.d.ts +12 -0
- package/api/streams/control/ControlStreamNode.js +73 -0
- package/api/streams/fileAccessor/FileAccessorStream.d.ts +8 -0
- package/api/streams/fileAccessor/FileAccessorStream.js +59 -0
- package/api/streams/fileAccessor/FileAccessorStreamAbstract.d.ts +21 -0
- package/api/streams/fileAccessor/FileAccessorStreamAbstract.js +62 -0
- package/api/streams/fileAccessor/FileAccessorStreamNode.d.ts +8 -0
- package/api/streams/fileAccessor/FileAccessorStreamNode.js +66 -0
- package/api/streams/search/SearchStream.d.ts +13 -0
- package/api/streams/search/SearchStream.js +96 -0
- package/api/streams/search/SearchStreamAbstract.d.ts +25 -0
- package/api/streams/search/SearchStreamAbstract.js +72 -0
- package/api/streams/search/SearchStreamNode.d.ts +13 -0
- package/api/streams/search/SearchStreamNode.js +118 -0
- package/api/streams/telemetry/TelemetryStream.d.ts +17 -0
- package/api/streams/telemetry/TelemetryStream.js +97 -0
- package/api/streams/telemetry/TelemetryStreamAbstract.d.ts +59 -0
- package/api/streams/telemetry/TelemetryStreamAbstract.js +402 -0
- package/api/streams/telemetry/TelemetryStreamNode.d.ts +21 -0
- package/api/streams/telemetry/TelemetryStreamNode.js +175 -0
- package/api/streams/webRTCSignalling/WebRTCSignallingStream.d.ts +39 -0
- package/api/streams/webRTCSignalling/WebRTCSignallingStream.js +84 -0
- package/api/streams/webRTCSignalling/WebRTCSignallingStreamAbstract.d.ts +29 -0
- package/api/streams/webRTCSignalling/WebRTCSignallingStreamAbstract.js +65 -0
- package/constants/api.d.ts +126 -0
- package/constants/api.js +126 -0
- package/constants/auth.d.ts +2 -0
- package/constants/auth.js +2 -0
- package/constants/grpc.d.ts +5 -0
- package/constants/grpc.js +5 -0
- package/constants/identifier.d.ts +6 -0
- package/constants/identifier.js +6 -0
- package/constants/timezones.d.ts +2 -0
- package/constants/timezones.js +427 -0
- package/grpc/conker_pb.client.d.ts +78 -0
- package/grpc/conker_pb.client.js +55 -0
- package/grpc/conker_pb.d.ts +141 -0
- package/grpc/conker_pb.grpc-client.d.ts +81 -0
- package/grpc/conker_pb.grpc-client.js +58 -0
- package/grpc/conker_pb.js +104 -0
- package/grpc/filagree_pb.client.d.ts +68 -0
- package/grpc/filagree_pb.client.js +48 -0
- package/grpc/filagree_pb.d.ts +404 -0
- package/grpc/filagree_pb.grpc-client.d.ts +69 -0
- package/grpc/filagree_pb.grpc-client.js +51 -0
- package/grpc/filagree_pb.js +329 -0
- package/grpc/google/protobuf/descriptor_pb.d.ts +1798 -0
- package/grpc/google/protobuf/descriptor_pb.js +2378 -0
- package/grpc/google/protobuf/empty_pb.d.ts +23 -0
- package/grpc/google/protobuf/empty_pb.js +47 -0
- package/grpc/pigeon_pb.client.d.ts +96 -0
- package/grpc/pigeon_pb.client.js +72 -0
- package/grpc/pigeon_pb.d.ts +207 -0
- package/grpc/pigeon_pb.grpc-client.d.ts +98 -0
- package/grpc/pigeon_pb.grpc-client.js +68 -0
- package/grpc/pigeon_pb.js +144 -0
- package/grpc/rambo.uri.v1_pb.d.ts +73 -0
- package/grpc/rambo.uri.v1_pb.js +48 -0
- package/grpc/rambo.v1_pb.client.d.ts +66 -0
- package/grpc/rambo.v1_pb.client.js +48 -0
- package/grpc/rambo.v1_pb.d.ts +392 -0
- package/grpc/rambo.v1_pb.grpc-client.d.ts +56 -0
- package/grpc/rambo.v1_pb.grpc-client.js +44 -0
- package/grpc/rambo.v1_pb.js +272 -0
- package/grpc/serviette.uri.v1_pb.d.ts +89 -0
- package/grpc/serviette.uri.v1_pb.js +62 -0
- package/grpc/serviette.v1_pb.client.d.ts +225 -0
- package/grpc/serviette.v1_pb.client.js +174 -0
- package/grpc/serviette.v1_pb.d.ts +827 -0
- package/grpc/serviette.v1_pb.grpc-client.d.ts +215 -0
- package/grpc/serviette.v1_pb.grpc-client.js +162 -0
- package/grpc/serviette.v1_pb.js +553 -0
- package/grpc/slowlane_pb.client.d.ts +61 -0
- package/grpc/slowlane_pb.client.js +41 -0
- package/grpc/slowlane_pb.d.ts +303 -0
- package/grpc/slowlane_pb.grpc-client.d.ts +64 -0
- package/grpc/slowlane_pb.grpc-client.js +44 -0
- package/grpc/slowlane_pb.js +185 -0
- package/grpc/teletubby_pb.client.d.ts +145 -0
- package/grpc/teletubby_pb.client.js +104 -0
- package/grpc/teletubby_pb.d.ts +634 -0
- package/grpc/teletubby_pb.grpc-client.d.ts +152 -0
- package/grpc/teletubby_pb.grpc-client.js +100 -0
- package/grpc/teletubby_pb.js +1264 -0
- package/helpers/arrayRemove.d.ts +1 -0
- package/helpers/arrayRemove.js +3 -0
- package/helpers/arrayUnique.d.ts +1 -0
- package/helpers/arrayUnique.js +3 -0
- package/helpers/average.d.ts +1 -0
- package/helpers/average.js +6 -0
- package/helpers/cleanObject.d.ts +1 -0
- package/helpers/cleanObject.js +18 -0
- package/helpers/cleanObject.spec.d.ts +1 -0
- package/helpers/cleanObject.spec.js +53 -0
- package/helpers/enviroment.d.ts +8 -0
- package/helpers/enviroment.js +13 -0
- package/helpers/flattenCallsignsLookup.d.ts +2 -0
- package/helpers/flattenCallsignsLookup.js +6 -0
- package/helpers/flattenObject.d.ts +1 -0
- package/helpers/flattenObject.js +13 -0
- package/helpers/flattenObject.spec.d.ts +1 -0
- package/helpers/flattenObject.spec.js +29 -0
- package/helpers/flattenOneOf.d.ts +67 -0
- package/helpers/flattenOneOf.js +29 -0
- package/helpers/flattenOneOf.spec.d.ts +1 -0
- package/helpers/flattenOneOf.spec.js +157 -0
- package/helpers/formatServiceUrl.d.ts +1 -0
- package/helpers/formatServiceUrl.js +7 -0
- package/helpers/formatServiceUrl.spec.d.ts +1 -0
- package/helpers/formatServiceUrl.spec.js +16 -0
- package/helpers/generateUUID.d.ts +1 -0
- package/helpers/generateUUID.js +4 -0
- package/helpers/getSubscriptionsDifference.d.ts +10 -0
- package/helpers/getSubscriptionsDifference.js +35 -0
- package/helpers/getUniqueConfigKey.d.ts +7 -0
- package/helpers/getUniqueConfigKey.js +14 -0
- package/helpers/getUniqueId.d.ts +9 -0
- package/helpers/getUniqueId.js +11 -0
- package/helpers/getUnixTimeMs.d.ts +1 -0
- package/helpers/getUnixTimeMs.js +4 -0
- package/helpers/index.d.ts +3 -0
- package/helpers/index.js +3 -0
- package/helpers/nanosecondToMillisecond.d.ts +1 -0
- package/helpers/nanosecondToMillisecond.js +6 -0
- package/helpers/randomString.d.ts +1 -0
- package/helpers/randomString.js +3 -0
- package/helpers/standardDeviation.d.ts +1 -0
- package/helpers/standardDeviation.js +12 -0
- package/helpers/standardDeviation.spec.d.ts +1 -0
- package/helpers/standardDeviation.spec.js +11 -0
- package/helpers/stringToUint8Array.d.ts +1 -0
- package/helpers/stringToUint8Array.js +10 -0
- package/helpers/uint8ArrayToString.d.ts +1 -0
- package/helpers/uint8ArrayToString.js +10 -0
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/logger/RocosLogger.d.ts +7 -0
- package/logger/RocosLogger.js +37 -0
- package/models/CallsignStatus.d.ts +6 -0
- package/models/CallsignStatus.js +7 -0
- package/models/ExportDataQuery.d.ts +8 -0
- package/models/ExportDataQuery.js +13 -0
- package/models/ExternalProject.d.ts +6 -0
- package/models/ExternalProject.js +2 -0
- package/models/IBaseService.d.ts +4 -0
- package/models/IBaseService.js +1 -0
- package/models/IConfigGroup.d.ts +5 -0
- package/models/IConfigGroup.js +1 -0
- package/models/IDebugLevel.d.ts +2 -0
- package/models/IDebugLevel.js +1 -0
- package/models/IExportDataQuery.d.ts +9 -0
- package/models/IExportDataQuery.js +1 -0
- package/models/IFunctionConfig.d.ts +8 -0
- package/models/IFunctionConfig.js +1 -0
- package/models/IInvitation.d.ts +6 -0
- package/models/IInvitation.js +1 -0
- package/models/IInvitationExists.d.ts +4 -0
- package/models/IInvitationExists.js +1 -0
- package/models/IOperation.d.ts +6 -0
- package/models/IOperation.js +1 -0
- package/models/IPersonalAccessToken.d.ts +16 -0
- package/models/IPersonalAccessToken.js +1 -0
- package/models/IProject.d.ts +4 -0
- package/models/IProject.js +1 -0
- package/models/IProjectApplication.d.ts +6 -0
- package/models/IProjectApplication.js +1 -0
- package/models/IRobot.d.ts +18 -0
- package/models/IRobot.js +1 -0
- package/models/IRobotConfig.d.ts +8 -0
- package/models/IRobotConfig.js +1 -0
- package/models/IRobotPlugin.d.ts +3 -0
- package/models/IRobotPlugin.js +1 -0
- package/models/IRobotSettings.d.ts +28 -0
- package/models/IRobotSettings.js +1 -0
- package/models/IRobotTemplate.d.ts +10 -0
- package/models/IRobotTemplate.js +1 -0
- package/models/IRocosSDKConfig.d.ts +19 -0
- package/models/IRocosSDKConfig.js +1 -0
- package/models/ISource.d.ts +8 -0
- package/models/ISource.js +1 -0
- package/models/IStream.d.ts +9 -0
- package/models/IStream.js +1 -0
- package/models/IStreamConfig.d.ts +9 -0
- package/models/IStreamConfig.js +1 -0
- package/models/IStreamOptions.d.ts +7 -0
- package/models/IStreamOptions.js +1 -0
- package/models/IStreamSource.d.ts +8 -0
- package/models/IStreamSource.js +1 -0
- package/models/ISubscriberStatus.d.ts +5 -0
- package/models/ISubscriberStatus.js +1 -0
- package/models/ITelemetryStreamConfig.d.ts +7 -0
- package/models/ITelemetryStreamConfig.js +1 -0
- package/models/IToken.d.ts +9 -0
- package/models/IToken.js +1 -0
- package/models/IWidget.d.ts +25 -0
- package/models/IWidget.js +1 -0
- package/models/IWidgetLineGroup.d.ts +8 -0
- package/models/IWidgetLineGroup.js +1 -0
- package/models/ResponseLevelEnum.d.ts +10 -0
- package/models/ResponseLevelEnum.js +11 -0
- package/models/Robot.d.ts +20 -0
- package/models/Robot.js +8 -0
- package/models/RobotConfig.d.ts +10 -0
- package/models/RobotConfig.js +5 -0
- package/models/RobotPlugin.d.ts +5 -0
- package/models/RobotPlugin.js +5 -0
- package/models/RobotTemplate.d.ts +12 -0
- package/models/RobotTemplate.js +25 -0
- package/models/RocosError.d.ts +30 -0
- package/models/RocosError.js +39 -0
- package/models/ServiceEnum.d.ts +26 -0
- package/models/ServiceEnum.js +27 -0
- package/models/Stream.d.ts +10 -0
- package/models/Stream.js +11 -0
- package/models/StreamOptions.d.ts +9 -0
- package/models/StreamOptions.js +33 -0
- package/models/StreamSource.d.ts +10 -0
- package/models/StreamSource.js +11 -0
- package/models/SubscriberStatusEnum.d.ts +6 -0
- package/models/SubscriberStatusEnum.js +7 -0
- package/models/Token.d.ts +40 -0
- package/models/Token.js +78 -0
- package/models/Token.spec.d.ts +1 -0
- package/models/Token.spec.js +108 -0
- package/models/Widget.d.ts +27 -0
- package/models/Widget.js +12 -0
- package/models/WidgetLineGroup.d.ts +10 -0
- package/models/WidgetLineGroup.js +5 -0
- package/models/asset-storage/AssetModelItem.d.ts +29 -0
- package/models/asset-storage/AssetModelItem.js +1 -0
- package/models/caller/IRocosCallerMessageChunk.d.ts +10 -0
- package/models/caller/IRocosCallerMessageChunk.js +1 -0
- package/models/caller/IRocosCallerMessageChunks.d.ts +4 -0
- package/models/caller/IRocosCallerMessageChunks.js +1 -0
- package/models/caller/IRocosCallerMessageHeartbeat.d.ts +3 -0
- package/models/caller/IRocosCallerMessageHeartbeat.js +1 -0
- package/models/caller/IRocosCallerMessageResponse.d.ts +10 -0
- package/models/caller/IRocosCallerMessageResponse.js +1 -0
- package/models/caller/IRocosCallerMessageResponseAck.d.ts +16 -0
- package/models/caller/IRocosCallerMessageResponseAck.js +13 -0
- package/models/caller/IRocosCallerMessageResponseResult.d.ts +15 -0
- package/models/caller/IRocosCallerMessageResponseResult.js +12 -0
- package/models/caller/IRocosCallerMessageResponseReturn.d.ts +8 -0
- package/models/caller/IRocosCallerMessageResponseReturn.js +1 -0
- package/models/caller/IRocosCallerMessageResponseUid.d.ts +10 -0
- package/models/caller/IRocosCallerMessageResponseUid.js +7 -0
- package/models/caller/IRocosCallerMessageResponses.d.ts +4 -0
- package/models/caller/IRocosCallerMessageResponses.js +1 -0
- package/models/caller/RocosCallerResultStatus.d.ts +11 -0
- package/models/caller/RocosCallerResultStatus.js +12 -0
- package/models/caller/RocosResponseLevel.d.ts +6 -0
- package/models/caller/RocosResponseLevel.js +7 -0
- package/models/caller/index.d.ts +10 -0
- package/models/caller/index.js +10 -0
- package/models/callsigns/CallsignsEnums.d.ts +13 -0
- package/models/callsigns/CallsignsEnums.js +17 -0
- package/models/callsigns/CallsignsLookup.d.ts +8 -0
- package/models/callsigns/CallsignsLookup.js +28 -0
- package/models/callsigns/CallsignsQuery.d.ts +9 -0
- package/models/callsigns/CallsignsQuery.js +14 -0
- package/models/callsigns/CallsignsQueryPredicate.d.ts +9 -0
- package/models/callsigns/CallsignsQueryPredicate.js +15 -0
- package/models/command/IRocosCommandMessageHeartbeat.d.ts +1 -0
- package/models/command/IRocosCommandMessageHeartbeat.js +1 -0
- package/models/command/IRocosCommandMessageResponse.d.ts +55 -0
- package/models/command/IRocosCommandMessageResponse.js +29 -0
- package/models/command/RocosCommandResultStatus.d.ts +11 -0
- package/models/command/RocosCommandResultStatus.js +12 -0
- package/models/command/index.d.ts +4 -0
- package/models/command/index.js +4 -0
- package/models/file/FileEnums.d.ts +30 -0
- package/models/file/FileEnums.js +33 -0
- package/models/index.d.ts +75 -0
- package/models/index.js +75 -0
- package/models/integrations/Overlay.d.ts +49 -0
- package/models/integrations/Overlay.js +1 -0
- package/models/integrations/Plan.d.ts +324 -0
- package/models/integrations/Plan.js +1 -0
- package/models/maps/Map.d.ts +13 -0
- package/models/maps/Map.js +1 -0
- package/models/message/IRocosCallerMessage.d.ts +8 -0
- package/models/message/IRocosCallerMessage.js +1 -0
- package/models/message/IRocosChangeMessage.d.ts +6 -0
- package/models/message/IRocosChangeMessage.js +1 -0
- package/models/message/IRocosCommandMessage.d.ts +6 -0
- package/models/message/IRocosCommandMessage.js +1 -0
- package/models/message/IRocosControlMessage.d.ts +7 -0
- package/models/message/IRocosControlMessage.js +1 -0
- package/models/message/IRocosOpResultMessage.d.ts +6 -0
- package/models/message/IRocosOpResultMessage.js +1 -0
- package/models/message/IRocosSearchMessage.d.ts +5 -0
- package/models/message/IRocosSearchMessage.js +1 -0
- package/models/message/IRocosSearchRowMessage.d.ts +9 -0
- package/models/message/IRocosSearchRowMessage.js +1 -0
- package/models/message/IRocosSearchStatusMessage.d.ts +4 -0
- package/models/message/IRocosSearchStatusMessage.js +1 -0
- package/models/message/IRocosTelemetryMessage.d.ts +23 -0
- package/models/message/IRocosTelemetryMessage.js +1 -0
- package/models/message/IStreamStatusMessage.d.ts +5 -0
- package/models/message/IStreamStatusMessage.js +1 -0
- package/models/message/RocosCallerMessage.d.ts +10 -0
- package/models/message/RocosCallerMessage.js +32 -0
- package/models/message/RocosCommandMessage.d.ts +9 -0
- package/models/message/RocosCommandMessage.js +13 -0
- package/models/message/RocosControlMessage.d.ts +11 -0
- package/models/message/RocosControlMessage.js +14 -0
- package/models/message/RocosOpResultMessage.d.ts +10 -0
- package/models/message/RocosOpResultMessage.js +18 -0
- package/models/message/RocosSearchMessage.d.ts +9 -0
- package/models/message/RocosSearchMessage.js +24 -0
- package/models/message/RocosSearchRowMessage.d.ts +13 -0
- package/models/message/RocosSearchRowMessage.js +16 -0
- package/models/message/RocosTelemetryMessage.d.ts +10 -0
- package/models/message/RocosTelemetryMessage.js +63 -0
- package/models/message/index.d.ts +17 -0
- package/models/message/index.js +17 -0
- package/models/params/ICallerParams.d.ts +16 -0
- package/models/params/ICallerParams.js +1 -0
- package/models/params/ICommandParams.d.ts +9 -0
- package/models/params/ICommandParams.js +1 -0
- package/models/params/IControlParams.d.ts +8 -0
- package/models/params/IControlParams.js +1 -0
- package/models/params/IFileAccessorParams.d.ts +11 -0
- package/models/params/IFileAccessorParams.js +1 -0
- package/models/params/ISearchParams.d.ts +10 -0
- package/models/params/ISearchParams.js +1 -0
- package/models/params/ITelemetryParams.d.ts +18 -0
- package/models/params/ITelemetryParams.js +1 -0
- package/models/params/IWebRTCSignallingParams.d.ts +21 -0
- package/models/params/IWebRTCSignallingParams.js +1 -0
- package/models/projects/ProjectUser.d.ts +6 -0
- package/models/projects/ProjectUser.js +1 -0
- package/models/schedule/IScheduleAction.d.ts +13 -0
- package/models/schedule/IScheduleAction.js +6 -0
- package/models/schedule/IScheduleInfo.d.ts +11 -0
- package/models/schedule/IScheduleInfo.js +1 -0
- package/models/schedule/IScheduleJob.d.ts +12 -0
- package/models/schedule/IScheduleJob.js +1 -0
- package/models/search/SearchQueryFilter.d.ts +5 -0
- package/models/search/SearchQueryFilter.js +5 -0
- package/models/search/SearchStreamQuery.d.ts +15 -0
- package/models/search/SearchStreamQuery.js +6 -0
- package/models/stream/IBaseStream.d.ts +8 -0
- package/models/stream/IBaseStream.js +1 -0
- package/models/stream/ICallerStream.d.ts +8 -0
- package/models/stream/ICallerStream.js +1 -0
- package/models/stream/ICommandStream.d.ts +7 -0
- package/models/stream/ICommandStream.js +1 -0
- package/models/stream/IControlStream.d.ts +9 -0
- package/models/stream/IControlStream.js +1 -0
- package/models/stream/IFileAccessorStream.d.ts +9 -0
- package/models/stream/IFileAccessorStream.js +1 -0
- package/models/stream/ISearchStream.d.ts +11 -0
- package/models/stream/ISearchStream.js +1 -0
- package/models/stream/ITelemetryStream.d.ts +10 -0
- package/models/stream/ITelemetryStream.js +1 -0
- package/models/stream/IWebRTCSignallingStream.d.ts +76 -0
- package/models/stream/IWebRTCSignallingStream.js +1 -0
- package/models/types.d.ts +5 -0
- package/models/types.js +1 -0
- package/node/RocosSDKNode.d.ts +42 -0
- package/node/RocosSDKNode.js +143 -0
- package/node/index.d.ts +7 -0
- package/node/index.js +7 -0
- package/package.json +22 -6
- package/services/AssetStorageService.d.ts +99 -0
- package/services/AssetStorageService.js +158 -0
- package/services/AuthService.d.ts +93 -0
- package/services/AuthService.js +235 -0
- package/services/AuthService.spec.d.ts +1 -0
- package/services/AuthService.spec.js +163 -0
- package/services/BaseServiceAbstract.d.ts +36 -0
- package/services/BaseServiceAbstract.js +101 -0
- package/services/BaseStreamService.d.ts +18 -0
- package/services/BaseStreamService.js +47 -0
- package/services/CallerService.d.ts +10 -0
- package/services/CallerService.js +53 -0
- package/services/CallerServiceNode.d.ts +6 -0
- package/services/CallerServiceNode.js +7 -0
- package/services/CommandService.d.ts +9 -0
- package/services/CommandService.js +38 -0
- package/services/CommandServiceNode.d.ts +6 -0
- package/services/CommandServiceNode.js +7 -0
- package/services/ConfigGroupService.d.ts +89 -0
- package/services/ConfigGroupService.js +153 -0
- package/services/ControlService.d.ts +11 -0
- package/services/ControlService.js +57 -0
- package/services/ControlServiceNode.d.ts +6 -0
- package/services/ControlServiceNode.js +7 -0
- package/services/DashboardService.d.ts +97 -0
- package/services/DashboardService.js +142 -0
- package/services/EventService.d.ts +53 -0
- package/services/EventService.js +85 -0
- package/services/FileAccessorService.d.ts +11 -0
- package/services/FileAccessorService.js +37 -0
- package/services/FileAccessorServiceNode.d.ts +6 -0
- package/services/FileAccessorServiceNode.js +7 -0
- package/services/FunctionService.d.ts +68 -0
- package/services/FunctionService.js +99 -0
- package/services/IntegrationService.d.ts +48 -0
- package/services/IntegrationService.js +72 -0
- package/services/MapService.d.ts +109 -0
- package/services/MapService.js +149 -0
- package/services/PlatformTimeService.d.ts +35 -0
- package/services/PlatformTimeService.js +156 -0
- package/services/PlatformTimeService.spec.d.ts +1 -0
- package/services/PlatformTimeService.spec.js +180 -0
- package/services/ProfileService.d.ts +244 -0
- package/services/ProfileService.js +362 -0
- package/services/ProjectService.d.ts +110 -0
- package/services/ProjectService.js +160 -0
- package/services/RobotService.d.ts +278 -0
- package/services/RobotService.js +460 -0
- package/services/ScheduleService.d.ts +22 -0
- package/services/ScheduleService.js +36 -0
- package/services/SearchService.d.ts +12 -0
- package/services/SearchService.js +58 -0
- package/services/SearchServiceNode.d.ts +6 -0
- package/services/SearchServiceNode.js +7 -0
- package/services/SpotProvisioningService.d.ts +14 -0
- package/services/SpotProvisioningService.js +43 -0
- package/services/SpotProvisioningServiceNode.d.ts +15 -0
- package/services/SpotProvisioningServiceNode.js +43 -0
- package/services/StreamService.d.ts +98 -0
- package/services/StreamService.js +142 -0
- package/services/TelemetryService.d.ts +40 -0
- package/services/TelemetryService.js +142 -0
- package/services/TelemetryService.spec.d.ts +1 -0
- package/services/TelemetryService.spec.js +37 -0
- package/services/TelemetryServiceNode.d.ts +6 -0
- package/services/TelemetryServiceNode.js +7 -0
- package/services/TimeSyncerService.d.ts +13 -0
- package/services/TimeSyncerService.js +23 -0
- package/services/UserService.d.ts +200 -0
- package/services/UserService.js +315 -0
- package/services/WebRTCSignallingService.d.ts +22 -0
- package/services/WebRTCSignallingService.js +78 -0
- package/services/WorkflowService.d.ts +71 -0
- package/services/WorkflowService.js +118 -0
- package/services/index.d.ts +26 -0
- package/services/index.js +26 -0
- package/store/RocosStore.d.ts +31 -0
- package/store/RocosStore.js +47 -0
@@ -0,0 +1,402 @@
|
|
1
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
2
|
+
import { CallsignsLookup, CallsignsLookupType, RocosTelemetryMessage, StreamOptions, SubscriberStatusEnum, } from '../../../models';
|
3
|
+
import { GRPC_SOURCE_NOOP, GRPC_SOURCE_SUBSCRIBED } from '../../../constants/grpc';
|
4
|
+
import { QueryOrPredicate, TelemetryAckStatus, TelemetryQueryRequest, TelemetryRequest, UnsubscribeOperation, } from '../../../grpc/teletubby_pb';
|
5
|
+
import { IDENTIFIER_NAME_TELEMETRY } from '../../../constants/identifier';
|
6
|
+
import { RocosStore } from '../../../store/RocosStore';
|
7
|
+
import { StreamHeartbeat } from '../../atoms/StreamHeartbeat';
|
8
|
+
import { StreamRegister } from '../../StreamRegister';
|
9
|
+
import { arrayUnique } from '../../../helpers/arrayUnique';
|
10
|
+
import { filter } from 'rxjs/operators';
|
11
|
+
import { getSubscriptionsDifference } from '../../../helpers/getSubscriptionsDifference';
|
12
|
+
export class TelemetryStreamAbstract {
|
13
|
+
constructor(config) {
|
14
|
+
// /////////////////
|
15
|
+
// Subscriber Check
|
16
|
+
this.timerIntervalInSec = 1;
|
17
|
+
this.subscriberStatus = SubscriberStatusEnum.STOPPED;
|
18
|
+
this.retryTimes = 0;
|
19
|
+
this.receivedMessagesCount = 0;
|
20
|
+
// send heartbeat timeout is set to 5 seconds 5000
|
21
|
+
this.sendHeartbeatTime = 5000;
|
22
|
+
this.receivedDataStats = {};
|
23
|
+
this.subscriptions = new Map();
|
24
|
+
this.identifier = StreamRegister.getIdentifier(IDENTIFIER_NAME_TELEMETRY, config.scope);
|
25
|
+
this.projectId = config.projectId;
|
26
|
+
this.callsignsLookup = config.callsignsLookup;
|
27
|
+
this.token = config.token;
|
28
|
+
this.scope = config.scope;
|
29
|
+
this.url = config.url;
|
30
|
+
// make sure sources are unique for later comparison
|
31
|
+
this.sources = arrayUnique(config.sources);
|
32
|
+
this.options = StreamOptions.fromModel(config.options);
|
33
|
+
this.messageStream$ = new Subject();
|
34
|
+
this.statusStream$ = new BehaviorSubject(SubscriberStatusEnum.STOPPED);
|
35
|
+
this.heartbeat = new StreamHeartbeat(this.identifier);
|
36
|
+
RocosStore.getChangeSubject()
|
37
|
+
.pipe(filter((message) => {
|
38
|
+
return message.type === 'token' && message.url === this.url;
|
39
|
+
}))
|
40
|
+
.subscribe((msg) => {
|
41
|
+
this.token = msg.data;
|
42
|
+
});
|
43
|
+
}
|
44
|
+
setToken(token) {
|
45
|
+
this.token = token;
|
46
|
+
}
|
47
|
+
init() {
|
48
|
+
this.logger.info('Creating new stream instance');
|
49
|
+
// Register Receiver
|
50
|
+
this.registerReceiver();
|
51
|
+
}
|
52
|
+
stopStream() {
|
53
|
+
this.heartbeat?.stop();
|
54
|
+
this.stopInternal();
|
55
|
+
if (this.messagesTimer) {
|
56
|
+
clearInterval(this.messagesTimer);
|
57
|
+
}
|
58
|
+
this.subscriberStatus = SubscriberStatusEnum.STOPPED;
|
59
|
+
this.statusStream$.next(this.subscriberStatus);
|
60
|
+
}
|
61
|
+
addSubscription(params) {
|
62
|
+
this.logger.info('Adding subscriptions from stream', params.uniqueId);
|
63
|
+
if (!this.subscriptions.has(params.uniqueId)) {
|
64
|
+
// get subscriptions before change
|
65
|
+
const before = this.getSubscriptions();
|
66
|
+
this.subscriptions.set(params.uniqueId, {
|
67
|
+
...params,
|
68
|
+
count: 1, // set the count to one just in case it's set in param
|
69
|
+
});
|
70
|
+
// get subscriptions after change
|
71
|
+
const after = this.getSubscriptions();
|
72
|
+
// assign the current values from state after change
|
73
|
+
this.callsignsLookup = new CallsignsLookup(Object.keys(after));
|
74
|
+
this.sources = arrayUnique(Object.values(after).reduce((a, v) => a.concat(v), []));
|
75
|
+
// compare before and after subscriptions and only add the difference
|
76
|
+
const { toAdd } = getSubscriptionsDifference(before, after);
|
77
|
+
// only subscribe if the subscriberId exists, otherwise the messages will be subscribed on lazy load
|
78
|
+
if (toAdd.callsigns.length && toAdd.sources.length) {
|
79
|
+
this.logger.debug('New subscriptions added, we need to refresh sources', { toAdd });
|
80
|
+
void this.takeTelemetryAction('subscribe', new CallsignsLookup(toAdd.callsigns), toAdd.sources);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
else {
|
84
|
+
const subs = this.subscriptions.get(params.uniqueId);
|
85
|
+
subs.count++;
|
86
|
+
this.subscriptions.set(params.uniqueId, subs);
|
87
|
+
this.logger.info('Stream subscriptions already exists, increasing count', params.uniqueId, subs.count);
|
88
|
+
}
|
89
|
+
RocosStore.getChangeSubject().next({ type: 'telemetry-subscription', url: this.url, data: this.subscriptions });
|
90
|
+
}
|
91
|
+
async removeSubscription(params, terminateReceiverGroup = false) {
|
92
|
+
this.logger.info('Removing subscriptions from stream', params.uniqueId);
|
93
|
+
if (!this.subscriptions.has(params.uniqueId))
|
94
|
+
return;
|
95
|
+
const subs = this.subscriptions.get(params.uniqueId);
|
96
|
+
subs.count--;
|
97
|
+
if (subs.count)
|
98
|
+
return;
|
99
|
+
this.logger.info('Removing subscriptions from stream registry', params.uniqueId);
|
100
|
+
const before = this.getSubscriptions();
|
101
|
+
this.subscriptions.delete(params.uniqueId);
|
102
|
+
const after = this.getSubscriptions();
|
103
|
+
// assign the current values from state after change
|
104
|
+
this.callsignsLookup = new CallsignsLookup(Object.keys(after));
|
105
|
+
this.sources = arrayUnique(Object.values(after).reduce((a, v) => a.concat(v), []));
|
106
|
+
const { toRemove } = getSubscriptionsDifference(before, after);
|
107
|
+
if (toRemove.callsigns.length && toRemove.sources.length) {
|
108
|
+
this.logger.debug('Subscriptions removed, we need to refresh sources', { toRemove });
|
109
|
+
try {
|
110
|
+
await this.takeTelemetryAction('unsubscribe', new CallsignsLookup(toRemove.callsigns), toRemove.sources, terminateReceiverGroup);
|
111
|
+
}
|
112
|
+
catch (err) {
|
113
|
+
this.logger.error(`Failed to unsubscribe: ${err}`);
|
114
|
+
}
|
115
|
+
}
|
116
|
+
if (!this.subscriptions.size) {
|
117
|
+
this.logger.info('No subscriptions remaining closing stream', params.uniqueId);
|
118
|
+
this.stopStream();
|
119
|
+
// self remove when no subscriptions a re left
|
120
|
+
void StreamRegister.getInstance().removeStream(this);
|
121
|
+
this.logger.info('Stream closed');
|
122
|
+
}
|
123
|
+
}
|
124
|
+
sendAcknowledgment(uid, status, noRetry) {
|
125
|
+
return this.sendAcknowledgmentInternal(uid, status, noRetry);
|
126
|
+
}
|
127
|
+
getSubscriptions() {
|
128
|
+
const subs = {};
|
129
|
+
this.subscriptions.forEach((data) => {
|
130
|
+
if (data.callsigns) {
|
131
|
+
data.callsigns.forEach((item) => {
|
132
|
+
if (!subs[item]) {
|
133
|
+
subs[item] = arrayUnique([...data.sources]);
|
134
|
+
}
|
135
|
+
else {
|
136
|
+
subs[item] = arrayUnique([...subs[item], ...data.sources]);
|
137
|
+
}
|
138
|
+
});
|
139
|
+
}
|
140
|
+
});
|
141
|
+
return subs;
|
142
|
+
}
|
143
|
+
onData(message, isStream) {
|
144
|
+
this.receivedMessagesCount++;
|
145
|
+
let rocosMessage;
|
146
|
+
const data = {
|
147
|
+
subscriberId: this.subscriberId,
|
148
|
+
subId: this.scope,
|
149
|
+
projectId: this.projectId,
|
150
|
+
};
|
151
|
+
if (isStream) {
|
152
|
+
rocosMessage = RocosTelemetryMessage.fromTelemetryStreamMessage(message, data, 'json');
|
153
|
+
}
|
154
|
+
else {
|
155
|
+
rocosMessage = RocosTelemetryMessage.fromTelemetryMessage(message, data, 'json');
|
156
|
+
}
|
157
|
+
const { source, callsign } = rocosMessage;
|
158
|
+
let isRobotMessage = true;
|
159
|
+
const now = new Date();
|
160
|
+
// Update last message received time
|
161
|
+
this.lastMessageReceived = now;
|
162
|
+
switch (source) {
|
163
|
+
// Subscribe message
|
164
|
+
case GRPC_SOURCE_SUBSCRIBED: {
|
165
|
+
const { subscriberId } = rocosMessage.payload;
|
166
|
+
if (this.subscriberId && subscriberId) {
|
167
|
+
this.logger.warn(`Replacing old subscriberId (${this.subscriberId}) with a new one (${subscriberId})`);
|
168
|
+
}
|
169
|
+
// Update the subscriberId
|
170
|
+
this.subscriberId = subscriberId;
|
171
|
+
rocosMessage.subscriberId = this.subscriberId;
|
172
|
+
this.logger.info('onData', `subscriberId has been updated - ${subscriberId}`, { subscriberId });
|
173
|
+
void this.takeTelemetryAction('subscribe');
|
174
|
+
this.heartbeat.start(this.sendHeartbeat, this.sendHeartbeatTime);
|
175
|
+
isRobotMessage = false;
|
176
|
+
break;
|
177
|
+
}
|
178
|
+
// Server heartbeat message
|
179
|
+
case GRPC_SOURCE_NOOP:
|
180
|
+
isRobotMessage = false;
|
181
|
+
break;
|
182
|
+
}
|
183
|
+
// Update robot last message timestamp
|
184
|
+
if (isRobotMessage) {
|
185
|
+
this.lastRobotMessageReceived = now;
|
186
|
+
}
|
187
|
+
// Update stats
|
188
|
+
this.updateReceivedDataStatsWithMessage(rocosMessage);
|
189
|
+
// Send message to subscribers
|
190
|
+
if (this.isRegisteredMessage(callsign, source) && this.messageStream$) {
|
191
|
+
this.messageStream$.next(rocosMessage);
|
192
|
+
if (rocosMessage.isackable && this.options.autoAcknowledgmentEnabled) {
|
193
|
+
this.sendAcknowledgment(rocosMessage.uid, TelemetryAckStatus.OK, false);
|
194
|
+
}
|
195
|
+
}
|
196
|
+
else if (isRobotMessage) {
|
197
|
+
// acknowledge any way, as the user never receives this message
|
198
|
+
if (rocosMessage.isackable) {
|
199
|
+
this.sendAcknowledgment(rocosMessage.uid, TelemetryAckStatus.REJECT, true);
|
200
|
+
}
|
201
|
+
// All messages received should be subscribed.
|
202
|
+
this.logger.debug('onData', 'received unsubscribed message', {
|
203
|
+
callsign,
|
204
|
+
source,
|
205
|
+
callsigns: this.callsignsLookup,
|
206
|
+
sources: this.sources,
|
207
|
+
});
|
208
|
+
}
|
209
|
+
}
|
210
|
+
async takeTelemetryAction(actionType, callsignsLookup, sources, terminate) {
|
211
|
+
this.logger.debug('takeTelemetryAction', actionType);
|
212
|
+
if (!this.subscriberId || !this.projectId) {
|
213
|
+
this.logger.debug('takeTelemetryAction', actionType, `${actionType} without subscriberId or projectId - message will not send out`, {
|
214
|
+
subscriberId: this.subscriberId,
|
215
|
+
projectId: this.projectId,
|
216
|
+
});
|
217
|
+
return Promise.resolve();
|
218
|
+
}
|
219
|
+
const actionSources = sources ?? this.sources;
|
220
|
+
const actionCallsigns = callsignsLookup ?? this.callsignsLookup;
|
221
|
+
if (this.callsignsLookup.lookupType === CallsignsLookupType.List) {
|
222
|
+
// Compose the request message
|
223
|
+
const req = TelemetryRequest.create({
|
224
|
+
subscriberId: this.subscriberId,
|
225
|
+
requestedActions: [
|
226
|
+
{
|
227
|
+
operation: actionType,
|
228
|
+
callsigns: actionCallsigns.lookupValue,
|
229
|
+
sources: actionSources,
|
230
|
+
},
|
231
|
+
],
|
232
|
+
});
|
233
|
+
if (actionType === 'unsubscribe' && terminate) {
|
234
|
+
this.addTerminateToAction(req.requestedActions[0]);
|
235
|
+
}
|
236
|
+
this.logger.debug('takeTelemetryAction', actionType, 'client.requestTelemetry', this.subscriberId);
|
237
|
+
// Send the message to back-end.
|
238
|
+
return this.requestTelemetry(req);
|
239
|
+
}
|
240
|
+
else if (actionCallsigns.lookupType === CallsignsLookupType.Query) {
|
241
|
+
const lookupValue = actionCallsigns.lookupValue;
|
242
|
+
// We don't support nested query at the moment
|
243
|
+
const queryOrPredicatesList = [];
|
244
|
+
// Loop through user provided predicates to construct a telemetry query request
|
245
|
+
lookupValue.predicates.forEach((callsignsPredicate) => {
|
246
|
+
const queryOrPredicate = QueryOrPredicate.create({
|
247
|
+
content: {
|
248
|
+
oneofKind: 'predicate',
|
249
|
+
predicate: {
|
250
|
+
attribute: callsignsPredicate.attribute.valueOf(),
|
251
|
+
operation: callsignsPredicate.operation.valueOf(),
|
252
|
+
value: callsignsPredicate.value,
|
253
|
+
},
|
254
|
+
},
|
255
|
+
});
|
256
|
+
queryOrPredicatesList.push(queryOrPredicate);
|
257
|
+
});
|
258
|
+
// Compose the request message
|
259
|
+
const req = TelemetryQueryRequest.create({
|
260
|
+
subscriberId: this.subscriberId,
|
261
|
+
sources: actionSources,
|
262
|
+
operation: actionType,
|
263
|
+
callsignQuery: {
|
264
|
+
operation: lookupValue.operation.valueOf(),
|
265
|
+
queryOrPredicates: queryOrPredicatesList,
|
266
|
+
},
|
267
|
+
});
|
268
|
+
this.logger.debug('takeTelemetryAction', actionType, 'client.requestTelemetry', this.subscriberId);
|
269
|
+
// Send the telemetry query request to back-end.
|
270
|
+
return this.requestTelemetryQuery(req);
|
271
|
+
}
|
272
|
+
return Promise.reject('Unsupported lookupType');
|
273
|
+
}
|
274
|
+
listenMessagesAndRenew() {
|
275
|
+
const timer = this.messagesTimer;
|
276
|
+
this.checkerStartedAt = new Date();
|
277
|
+
// Clear the previous timer first.
|
278
|
+
if (timer) {
|
279
|
+
clearInterval(timer);
|
280
|
+
}
|
281
|
+
this.messagesTimer = setInterval(() => {
|
282
|
+
const now = new Date();
|
283
|
+
const latest = this.lastMessageReceived;
|
284
|
+
const latestRobot = this.lastRobotMessageReceived;
|
285
|
+
const startedAt = this.checkerStartedAt ?? new Date();
|
286
|
+
const timeout = this.options.messageTimeoutInSec;
|
287
|
+
let shouldRetry = false;
|
288
|
+
let shouldAutoResubscribe = false;
|
289
|
+
const hasExceededTimeoutSinceLastMessage = latest && (now.getTime() - latest.getTime()) / 1000 > timeout;
|
290
|
+
const hasExceededTimeoutBeforeMessages = !latest && startedAt && (now.getTime() - startedAt.getTime()) / 1000 > timeout;
|
291
|
+
if (hasExceededTimeoutSinceLastMessage || hasExceededTimeoutBeforeMessages) {
|
292
|
+
shouldRetry = true;
|
293
|
+
}
|
294
|
+
if (latestRobot) {
|
295
|
+
// If we get robot messages at least once.
|
296
|
+
if ((now.getTime() - latestRobot.getTime()) / 1000 > timeout) {
|
297
|
+
// Offline
|
298
|
+
this.subscriberStatus = SubscriberStatusEnum.DEAD;
|
299
|
+
}
|
300
|
+
else {
|
301
|
+
// Online
|
302
|
+
this.subscriberStatus = SubscriberStatusEnum.ALIVE;
|
303
|
+
}
|
304
|
+
}
|
305
|
+
else if ((now.getTime() - startedAt.getTime()) / 1000 > timeout) {
|
306
|
+
// If there is no robot messages received, then we compare with startedAt time.
|
307
|
+
// Timeout
|
308
|
+
this.subscriberStatus = SubscriberStatusEnum.DEAD;
|
309
|
+
}
|
310
|
+
else if (this.retryTimes <= 0) {
|
311
|
+
// Still trying, status unknown.
|
312
|
+
this.subscriberStatus = SubscriberStatusEnum.STOPPED;
|
313
|
+
}
|
314
|
+
else {
|
315
|
+
// Tried multiple times. dead already.
|
316
|
+
this.subscriberStatus = SubscriberStatusEnum.DEAD;
|
317
|
+
}
|
318
|
+
if (this.options.autoResubscribeEnabled &&
|
319
|
+
this.receivedMessagesCount > this.options.autoResubscribeMessageLimit &&
|
320
|
+
(now.getTime() - startedAt.getTime()) / 1000 > this.options.autoResubscribeMinimumTime) {
|
321
|
+
// If received messages above the limit of resubscribing, we need to resubscribe.
|
322
|
+
shouldAutoResubscribe = true;
|
323
|
+
}
|
324
|
+
if (shouldRetry) {
|
325
|
+
this.logger.debug('listenMessagesAndRenew', { shouldRetry: true });
|
326
|
+
// Retry
|
327
|
+
this.messageTimeoutTryAgain();
|
328
|
+
}
|
329
|
+
else if (shouldAutoResubscribe) {
|
330
|
+
this.logger.debug('listenMessagesAndRenew', {
|
331
|
+
shouldAutoResubscribe: true,
|
332
|
+
});
|
333
|
+
// Resubscribe
|
334
|
+
this.autoResubscribe();
|
335
|
+
}
|
336
|
+
// Update subscriber status.
|
337
|
+
this.statusStream$.next(this.subscriberStatus);
|
338
|
+
// Debug stats
|
339
|
+
this.logger.debug('listenMessagesAndRenew', 'Message stats', this.receivedDataStats);
|
340
|
+
}, this.timerIntervalInSec * 1000);
|
341
|
+
}
|
342
|
+
addTerminateToAction(telemetryAction) {
|
343
|
+
const unsubscribeOperation = UnsubscribeOperation.create({
|
344
|
+
options: [
|
345
|
+
{
|
346
|
+
content: {
|
347
|
+
receivergroupUnsubscribeOption: {
|
348
|
+
terminate: true,
|
349
|
+
},
|
350
|
+
oneofKind: 'receivergroupUnsubscribeOption',
|
351
|
+
},
|
352
|
+
},
|
353
|
+
],
|
354
|
+
});
|
355
|
+
telemetryAction.content = {
|
356
|
+
oneofKind: 'unsubscribeOperation',
|
357
|
+
unsubscribeOperation,
|
358
|
+
};
|
359
|
+
}
|
360
|
+
messageTimeoutTryAgain() {
|
361
|
+
// Increase retry times.
|
362
|
+
this.retryTimes++;
|
363
|
+
// Remove the received call anyway.
|
364
|
+
this.stopInternal();
|
365
|
+
this.lastMessageReceived = undefined;
|
366
|
+
this.lastRobotMessageReceived = undefined;
|
367
|
+
this.registerReceiver();
|
368
|
+
}
|
369
|
+
/**
|
370
|
+
* Auto resubscribe to reduce CPU usage.
|
371
|
+
*/
|
372
|
+
autoResubscribe() {
|
373
|
+
// Reset
|
374
|
+
this.retryTimes = 0;
|
375
|
+
// Remove the received call anyway.
|
376
|
+
this.stopInternal();
|
377
|
+
this.lastMessageReceived = undefined;
|
378
|
+
this.lastRobotMessageReceived = undefined;
|
379
|
+
this.registerReceiver();
|
380
|
+
}
|
381
|
+
isFoundCallsign(callsign) {
|
382
|
+
return this.callsignsLookup.lookupType === CallsignsLookupType.List
|
383
|
+
? this.callsignsLookup.lookupValue.indexOf(callsign) !== -1
|
384
|
+
: true; // If callsigns lookup option is query, we always return true
|
385
|
+
}
|
386
|
+
isFoundSource(source) {
|
387
|
+
return this.sources.indexOf(source) !== -1;
|
388
|
+
}
|
389
|
+
isRegisteredMessage(callsign, source) {
|
390
|
+
return this.isFoundCallsign(callsign) && this.isFoundSource(source);
|
391
|
+
}
|
392
|
+
updateReceivedDataStatsWithMessage(msg) {
|
393
|
+
const { source } = msg;
|
394
|
+
const { callsign } = msg;
|
395
|
+
const id = `${callsign}-${source}`;
|
396
|
+
if (!this.receivedDataStats) {
|
397
|
+
this.receivedDataStats = {};
|
398
|
+
}
|
399
|
+
const count = this.receivedDataStats[id] ? this.receivedDataStats[id] : 0;
|
400
|
+
this.receivedDataStats[id] = count + 1;
|
401
|
+
}
|
402
|
+
}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import { ITelemetryStreamConfig } from '../../../models';
|
2
|
+
import { TelemetryAckStatus, TelemetryQueryRequest, TelemetryRequest } from '../../../grpc/teletubby_pb';
|
3
|
+
import { TelemetryStreamAbstract } from './TelemetryStreamAbstract';
|
4
|
+
export declare class TelemetryStreamNode extends TelemetryStreamAbstract {
|
5
|
+
private client?;
|
6
|
+
private stream?;
|
7
|
+
private readonly port;
|
8
|
+
private readonly credentials;
|
9
|
+
constructor(config: ITelemetryStreamConfig);
|
10
|
+
protected stopInternal(): void;
|
11
|
+
protected registerReceiver(): () => void;
|
12
|
+
private getCredentials;
|
13
|
+
private registerStream;
|
14
|
+
private onError;
|
15
|
+
private onEnd;
|
16
|
+
private getMetaData;
|
17
|
+
protected requestTelemetry(req: TelemetryRequest): Promise<void>;
|
18
|
+
protected requestTelemetryQuery(req: TelemetryQueryRequest): Promise<void>;
|
19
|
+
protected sendAcknowledgmentInternal(uid: string, status: TelemetryAckStatus, noRetry: boolean): boolean;
|
20
|
+
protected sendHeartbeat(): void;
|
21
|
+
}
|
@@ -0,0 +1,175 @@
|
|
1
|
+
import * as grpc from '@grpc/grpc-js';
|
2
|
+
import { SubscriberStatusEnum } from '../../../models';
|
3
|
+
import { ReceiverStreamMessage, } from '../../../grpc/teletubby_pb';
|
4
|
+
import { RocosLogger } from '../../../logger/RocosLogger';
|
5
|
+
import { TelemetryReceiverClient } from '../../../grpc/teletubby_pb.grpc-client';
|
6
|
+
import { TelemetryStreamAbstract } from './TelemetryStreamAbstract';
|
7
|
+
import { v4 as uuid4 } from 'uuid';
|
8
|
+
export class TelemetryStreamNode extends TelemetryStreamAbstract {
|
9
|
+
constructor(config) {
|
10
|
+
super(config);
|
11
|
+
this.logger = RocosLogger.getInstance(`TelemetryStream(${this.identifier})`);
|
12
|
+
this.port = config.port ?? 443;
|
13
|
+
this.credentials = config.insecure ? grpc.credentials.createInsecure() : grpc.credentials.createSsl();
|
14
|
+
}
|
15
|
+
stopInternal() {
|
16
|
+
try {
|
17
|
+
this.logger.info('Starting stop stream process');
|
18
|
+
this.logger.info('Stopping stream');
|
19
|
+
this.stream?.end();
|
20
|
+
this.stream = undefined;
|
21
|
+
this.logger.info('Stopping client');
|
22
|
+
this.client?.close();
|
23
|
+
this.client = undefined;
|
24
|
+
this.logger.info('Finished stop stream process');
|
25
|
+
}
|
26
|
+
catch (e) {
|
27
|
+
this.logger.error('Error stopping stream.', e);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
registerReceiver() {
|
31
|
+
this.logger.info('registerReceiver');
|
32
|
+
// Reset counter
|
33
|
+
this.receivedMessagesCount = 0;
|
34
|
+
try {
|
35
|
+
const receiver = new TelemetryReceiverClient(`${this.url}:${this.port}`, this.getCredentials(), {
|
36
|
+
'grpc.min_reconnect_backoff_ms': 1000,
|
37
|
+
'grpc.max_reconnect_backoff_ms': 10000,
|
38
|
+
});
|
39
|
+
const waitForClientReady = async (error) => {
|
40
|
+
let err = error;
|
41
|
+
if (!err) {
|
42
|
+
try {
|
43
|
+
this.logger.info('registering stream receiver');
|
44
|
+
this.stream = this.registerStream();
|
45
|
+
this.logger.info('registered stream receiver');
|
46
|
+
}
|
47
|
+
catch (e) {
|
48
|
+
err = e;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
if (err) {
|
52
|
+
this.logger.warn(`failed to create telemetry client, error: ${err}`);
|
53
|
+
// await this.stopandReRegisterStream()
|
54
|
+
}
|
55
|
+
};
|
56
|
+
const deadline = new Date();
|
57
|
+
deadline.setSeconds(deadline.getSeconds() + 2);
|
58
|
+
receiver.waitForReady(deadline, () => void waitForClientReady());
|
59
|
+
this.client = receiver;
|
60
|
+
this.logger.info(`Tele receiver client: ${JSON.stringify(this.client)}`);
|
61
|
+
}
|
62
|
+
catch (e) {
|
63
|
+
this.logger.error('Error initializing receiver client', e);
|
64
|
+
}
|
65
|
+
this.listenMessagesAndRenew();
|
66
|
+
return () => {
|
67
|
+
this.client?.close();
|
68
|
+
};
|
69
|
+
}
|
70
|
+
getCredentials() {
|
71
|
+
const mdCb = (_params, callback) => {
|
72
|
+
const meta = this.getMetaData();
|
73
|
+
callback(null, meta);
|
74
|
+
};
|
75
|
+
return grpc.credentials.combineChannelCredentials(this.credentials, grpc.credentials.createFromMetadataGenerator(mdCb));
|
76
|
+
}
|
77
|
+
registerStream() {
|
78
|
+
try {
|
79
|
+
this.logger.info('registering stream');
|
80
|
+
const stream = this.client.registerStreamReceiver();
|
81
|
+
this.logger.info('stream registered');
|
82
|
+
stream.on('data', (msg) => {
|
83
|
+
if (msg.content.oneofKind === 'message') {
|
84
|
+
this.onData(msg, true);
|
85
|
+
}
|
86
|
+
});
|
87
|
+
stream.on('error', (e) => this.onError(e));
|
88
|
+
stream.on('end', () => this.onEnd());
|
89
|
+
return stream;
|
90
|
+
}
|
91
|
+
catch (e) {
|
92
|
+
this.logger.error(`Telemetry Stream registerStream error" SubscriberId: ${this.subscriberId}`, e);
|
93
|
+
throw e;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
onError(e) {
|
97
|
+
this.logger.error(`Telemetry Stream Error: ${e}, SubscriberId: ${this.subscriberId}`);
|
98
|
+
this.subscriberStatus = SubscriberStatusEnum.ERROR;
|
99
|
+
this.statusStream$.next(this.subscriberStatus);
|
100
|
+
}
|
101
|
+
onEnd() {
|
102
|
+
this.logger.debug('registerReceiver', 'end');
|
103
|
+
}
|
104
|
+
getMetaData() {
|
105
|
+
const meta = new grpc.Metadata();
|
106
|
+
meta.add('authorization', this.token);
|
107
|
+
meta.add('r-p', this.projectId);
|
108
|
+
meta.add('r-tid', uuid4());
|
109
|
+
meta.add('r-cs', 'rocos-js-sdk-agent');
|
110
|
+
return meta;
|
111
|
+
}
|
112
|
+
requestTelemetry(req) {
|
113
|
+
this.logger.debug('Sending telemetry request');
|
114
|
+
return new Promise((resolve, reject) => {
|
115
|
+
this.client.requestTelemetry(req, (err, ack) => {
|
116
|
+
this.logger.debug('subscribeSources with callsigns callback', err, ack);
|
117
|
+
if (err) {
|
118
|
+
this.logger.error('error requestTelemetry ', err);
|
119
|
+
return reject(err);
|
120
|
+
}
|
121
|
+
resolve();
|
122
|
+
});
|
123
|
+
});
|
124
|
+
}
|
125
|
+
requestTelemetryQuery(req) {
|
126
|
+
this.logger.debug('Requesting telemetry with query');
|
127
|
+
return new Promise((resolve, reject) => {
|
128
|
+
this.client.requestTelemetryQuery(req, (err, ack) => {
|
129
|
+
this.logger.debug('subscribeSources with query callback', err, ack);
|
130
|
+
if (err) {
|
131
|
+
this.logger.error('error requestTelemetryQuery ', err);
|
132
|
+
return reject(err);
|
133
|
+
}
|
134
|
+
resolve();
|
135
|
+
});
|
136
|
+
});
|
137
|
+
}
|
138
|
+
sendAcknowledgmentInternal(uid, status, noRetry) {
|
139
|
+
this.logger.info('Sending acknowledgment', { uid, status, noRetry });
|
140
|
+
const request = ReceiverStreamMessage.create({
|
141
|
+
content: {
|
142
|
+
oneofKind: 'ack',
|
143
|
+
ack: {
|
144
|
+
uid,
|
145
|
+
status,
|
146
|
+
noRetry,
|
147
|
+
},
|
148
|
+
},
|
149
|
+
});
|
150
|
+
const response = this.stream?.write(request);
|
151
|
+
this.logger.info('Sent acknowledgment response', { uid, status, noRetry });
|
152
|
+
return response ?? false;
|
153
|
+
}
|
154
|
+
sendHeartbeat() {
|
155
|
+
try {
|
156
|
+
if (this.client && this.stream) {
|
157
|
+
this.logger.info('sending heartbeat');
|
158
|
+
const request = ReceiverStreamMessage.create({
|
159
|
+
content: {
|
160
|
+
oneofKind: 'heartbeat',
|
161
|
+
heartbeat: {},
|
162
|
+
},
|
163
|
+
});
|
164
|
+
this.stream?.write(request);
|
165
|
+
}
|
166
|
+
else {
|
167
|
+
this.logger.warn('Can not send heartbeat, stream does not exist.');
|
168
|
+
}
|
169
|
+
}
|
170
|
+
catch (e) {
|
171
|
+
this.logger?.warn('Error for heartbeat');
|
172
|
+
this.stream?.emit('error', e);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
import { AddIceCandidateRequest, GetDetailsRequest, OfferRequest, OperatorConnectRequest } from '../../../grpc/pigeon_pb';
|
2
|
+
import { IStreamConfig, IWebRTCSignallingGetDetailsResponse, IWebRTCSignallingMessage, IWebRTCSignallingOutcome, IWebRTCSignallingResponseStream } from '../../../models';
|
3
|
+
import { WebRTCSignallingStreamAbstract } from './WebRTCSignallingStreamAbstract';
|
4
|
+
/**
|
5
|
+
* Web implementation for the WebRTC signalling stream
|
6
|
+
*/
|
7
|
+
export declare class WebRTCSignallingStream extends WebRTCSignallingStreamAbstract {
|
8
|
+
private webRTCOperatorclient;
|
9
|
+
constructor(config: IStreamConfig);
|
10
|
+
/**
|
11
|
+
* Connect operator stream
|
12
|
+
* @param projectId
|
13
|
+
* @param request
|
14
|
+
* @returns
|
15
|
+
*/
|
16
|
+
protected connectOperatorStream(projectId: string, request: OperatorConnectRequest): IWebRTCSignallingResponseStream<IWebRTCSignallingMessage>;
|
17
|
+
/**
|
18
|
+
* Get details for the peer
|
19
|
+
* @param projectId
|
20
|
+
* @param request
|
21
|
+
* @returns
|
22
|
+
*/
|
23
|
+
protected getPeerDetails(projectId: string, request: GetDetailsRequest): Promise<IWebRTCSignallingGetDetailsResponse>;
|
24
|
+
/**
|
25
|
+
* Send offer connecction to peer
|
26
|
+
* @param projectId
|
27
|
+
* @param request
|
28
|
+
* @returns
|
29
|
+
*/
|
30
|
+
protected offerPeerConnection(projectId: string, request: OfferRequest): Promise<IWebRTCSignallingOutcome>;
|
31
|
+
/**
|
32
|
+
* Add ice candidate for peer
|
33
|
+
* @param projectId
|
34
|
+
* @param request
|
35
|
+
* @returns
|
36
|
+
*/
|
37
|
+
protected addPeerIceCandidate(projectId: string, request: AddIceCandidateRequest): Promise<IWebRTCSignallingOutcome>;
|
38
|
+
private getMetadata;
|
39
|
+
}
|