@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,235 @@
|
|
1
|
+
import { API_APPLICATION_AUTH_URL, API_OTP_AUTH_URL, API_OTP_URL, API_USER_TOKEN_URL } from '../constants/api';
|
2
|
+
import { RocosError, Token, errorCodes } from '../models';
|
3
|
+
import { BaseServiceAbstract } from './BaseServiceAbstract';
|
4
|
+
import { RocosLogger } from '../logger/RocosLogger';
|
5
|
+
import { RocosStore } from '../store/RocosStore';
|
6
|
+
import { formatServiceUrl } from '../helpers/formatServiceUrl';
|
7
|
+
import { issuer } from '../constants/auth';
|
8
|
+
export class AuthService extends BaseServiceAbstract {
|
9
|
+
constructor(config) {
|
10
|
+
super(config);
|
11
|
+
this.config = config;
|
12
|
+
this.config = config;
|
13
|
+
this.logger = RocosLogger.getInstance(`AuthService(${this.config.url})`);
|
14
|
+
if (this.config.token) {
|
15
|
+
this.setToken(this.config.token);
|
16
|
+
}
|
17
|
+
}
|
18
|
+
getStatus() {
|
19
|
+
return true;
|
20
|
+
}
|
21
|
+
teardown() {
|
22
|
+
if (this.isTokenRefreshCheckerRunning()) {
|
23
|
+
this.logger.debug('Stopping token refresh checker');
|
24
|
+
this.stopTokenRefreshChecker();
|
25
|
+
}
|
26
|
+
}
|
27
|
+
getError(e) {
|
28
|
+
return new RocosError(e, errorCodes.AUTH_ERROR, e?.statusCode);
|
29
|
+
}
|
30
|
+
setToken(value, expiresIn) {
|
31
|
+
if (expiresIn !== undefined) {
|
32
|
+
this.logger.warn('setToken(value, expiresIn) is deprecated. Use setToken(value) instead');
|
33
|
+
}
|
34
|
+
if (typeof value === 'string') {
|
35
|
+
this.token = new Token(value);
|
36
|
+
}
|
37
|
+
else {
|
38
|
+
this.token = value;
|
39
|
+
}
|
40
|
+
this.config.token = this.token.value;
|
41
|
+
// output a message for token change
|
42
|
+
RocosStore.getChangeSubject().next({ type: 'token', url: this.config.url, data: this.token.value });
|
43
|
+
}
|
44
|
+
/**
|
45
|
+
* Clear token
|
46
|
+
*/
|
47
|
+
clearToken() {
|
48
|
+
this.token = undefined;
|
49
|
+
this.config.token = undefined;
|
50
|
+
}
|
51
|
+
/**
|
52
|
+
* Get the authentication token for application Id and application Key.
|
53
|
+
*/
|
54
|
+
async getAppToken() {
|
55
|
+
if (!('appId' in this.config) || !this.config.appId || !('appKey' in this.config) || !this.config.appKey) {
|
56
|
+
throw new RocosError('Can not get app token, missing appId and appKey', errorCodes.AUTH_ERROR);
|
57
|
+
}
|
58
|
+
const res = await this.callPost(formatServiceUrl(API_APPLICATION_AUTH_URL, { url: this.config.url }, this.config.insecure), {
|
59
|
+
applicationId: this.config.appId,
|
60
|
+
secret: this.config.appKey,
|
61
|
+
}, 'Failed to get users auth token.', { public: true });
|
62
|
+
return new Token(res.token);
|
63
|
+
}
|
64
|
+
/**
|
65
|
+
* Get new auth token for a user
|
66
|
+
* @desc This only works for user auth tokens, not appId auth tokens
|
67
|
+
*/
|
68
|
+
async getNewUserToken() {
|
69
|
+
if (!('token' in this.config) || !this.config.token) {
|
70
|
+
throw new RocosError('Can not get new app token, missing token', errorCodes.AUTH_ERROR);
|
71
|
+
}
|
72
|
+
const token = new Token(this.config.token, this.config.refreshToken);
|
73
|
+
if (token?.isExpired()) {
|
74
|
+
throw new RocosError('Token expired', errorCodes.AUTH_ERROR);
|
75
|
+
}
|
76
|
+
if (!this.isTokenIssuedByApp(token)) {
|
77
|
+
this.logger.info('Token is not issued by app. Getting new token from DD token.');
|
78
|
+
return this.getNewUserTokenFromExternalToken();
|
79
|
+
}
|
80
|
+
return this.refreshToken(token);
|
81
|
+
}
|
82
|
+
/**
|
83
|
+
* Get new auth token for a user.
|
84
|
+
*
|
85
|
+
* Uses the OTP flow to exchange an external token for a user token.
|
86
|
+
*
|
87
|
+
* @desc This only works for user auth tokens, not appId auth tokens
|
88
|
+
*/
|
89
|
+
async getNewUserTokenFromExternalToken() {
|
90
|
+
if (!('token' in this.config) || !this.config.token) {
|
91
|
+
throw new RocosError('Can not get new token, missing token', errorCodes.AUTH_ERROR);
|
92
|
+
}
|
93
|
+
const ddToken = new Token(this.config.token);
|
94
|
+
const { otp } = await this.callPost(formatServiceUrl(API_OTP_URL, { url: this.config.url }, this.config.insecure), undefined, 'Failed to get one time password.', { public: true, headers: { Authorization: ddToken.bearer } });
|
95
|
+
const { token, refreshToken } = await this.callPost(formatServiceUrl(API_OTP_AUTH_URL, { url: this.config.url }, this.config.insecure), { otp }, 'Failed to get users auth token.', { public: true });
|
96
|
+
return new Token(token, refreshToken);
|
97
|
+
}
|
98
|
+
/**
|
99
|
+
* Get the authentication token
|
100
|
+
*
|
101
|
+
* This will return the current token if it is not expired, otherwise it will get a new token based on your config.
|
102
|
+
*/
|
103
|
+
async getToken() {
|
104
|
+
if (this.token && this.isTokenValid(this.token)) {
|
105
|
+
if (this.token.isExpiredIn(15, 'minutes')) {
|
106
|
+
this.logger.info('Token expires within 15 minutes. Refreshing.');
|
107
|
+
const newToken = await this.refreshToken();
|
108
|
+
this.setToken(newToken);
|
109
|
+
return newToken;
|
110
|
+
}
|
111
|
+
return this.token;
|
112
|
+
}
|
113
|
+
let token;
|
114
|
+
try {
|
115
|
+
if ('appId' in this.config && 'appKey' in this.config) {
|
116
|
+
token = await this.getAppToken();
|
117
|
+
}
|
118
|
+
else if ('token' in this.config) {
|
119
|
+
token = await this.getNewUserToken();
|
120
|
+
}
|
121
|
+
}
|
122
|
+
catch (e) {
|
123
|
+
const message = 'Failed to get auth token.';
|
124
|
+
this.logger.error(message, e);
|
125
|
+
if (e instanceof Error) {
|
126
|
+
e.message = message;
|
127
|
+
throw new RocosError(e, errorCodes.AUTH_ERROR);
|
128
|
+
}
|
129
|
+
else {
|
130
|
+
throw new RocosError(message, errorCodes.AUTH_ERROR);
|
131
|
+
}
|
132
|
+
}
|
133
|
+
if (!token) {
|
134
|
+
const message = 'Failed to get auth token. Config invalid.';
|
135
|
+
this.logger.error(message);
|
136
|
+
throw new RocosError(message, errorCodes.AUTH_ERROR);
|
137
|
+
}
|
138
|
+
this.setToken(token);
|
139
|
+
return token;
|
140
|
+
}
|
141
|
+
/**
|
142
|
+
* Refresh the authentication token
|
143
|
+
*
|
144
|
+
* This only works for user auth tokens, not appId auth tokens.
|
145
|
+
*
|
146
|
+
* The new token is not automatically set as the current token. Use `setToken` to set the new token.
|
147
|
+
*
|
148
|
+
* @see setToken
|
149
|
+
* @param token the token to refresh. If not provided, the current token will be used.
|
150
|
+
*/
|
151
|
+
async refreshToken(token) {
|
152
|
+
const tokenToRefresh = token ?? this.token;
|
153
|
+
if (!tokenToRefresh) {
|
154
|
+
throw new RocosError('No token to refresh', errorCodes.AUTH_ERROR);
|
155
|
+
}
|
156
|
+
const res = await this.callGet(formatServiceUrl(API_USER_TOKEN_URL, { url: this.config.url }, this.config.insecure), 'Failed to get users auth token.', undefined, { public: true, headers: { Authorization: tokenToRefresh.bearer } });
|
157
|
+
return new Token(res.token, res.refreshToken);
|
158
|
+
}
|
159
|
+
/** Refresh the token if it is expired or will expire in the next `minutes` minutes
|
160
|
+
*
|
161
|
+
* This only works for user auth tokens, not appId auth tokens.
|
162
|
+
*
|
163
|
+
* If you want to refresh the token regardless of the expiry time, use `refreshToken`.
|
164
|
+
*
|
165
|
+
* @param minutes the number of minutes before the token expires to refresh the token
|
166
|
+
* @see refreshToken
|
167
|
+
*/
|
168
|
+
async refreshTokenIfExpired(minutes) {
|
169
|
+
if (this.token?.isExpiredIn(minutes, 'minutes')) {
|
170
|
+
this.logger.info('Token expires in 15 minutes. Refreshing.');
|
171
|
+
const newToken = await this.refreshToken();
|
172
|
+
this.setToken(newToken);
|
173
|
+
}
|
174
|
+
}
|
175
|
+
/** Start a 5-minute loop to check if the token needs to be refreshed
|
176
|
+
*
|
177
|
+
* This is useful when you are using GRPC services (i.e. telemetry) which does not automatically refresh the token.
|
178
|
+
* It is not required when using REST services as the token is refreshed automatically.
|
179
|
+
*
|
180
|
+
* The loop will stop when `stopTokenRefreshChecker` is called.
|
181
|
+
*
|
182
|
+
* @see stopTokenRefreshChecker
|
183
|
+
*/
|
184
|
+
startTokenRefreshChecker() {
|
185
|
+
const maxInterval = 1000 * 60 * 10; // 10 minutes
|
186
|
+
const minInterval = 1000 * 60; // 1 minute
|
187
|
+
const threshold = 1000 * 60 * 15; // 15 minutes
|
188
|
+
if (this.isTokenRefreshCheckerRunning())
|
189
|
+
return;
|
190
|
+
if (!this.token)
|
191
|
+
throw new RocosError('No token to refresh', errorCodes.AUTH_ERROR);
|
192
|
+
if (!this.isTokenValid(this.token))
|
193
|
+
throw new RocosError('Token is not valid', errorCodes.AUTH_ERROR);
|
194
|
+
const loop = () => {
|
195
|
+
this.logger.debug('Checking scheduled token refresh');
|
196
|
+
this.refreshTokenIfExpired(15)
|
197
|
+
.catch((e) => {
|
198
|
+
this.logger.error('Failed to refresh token', e);
|
199
|
+
})
|
200
|
+
.finally(() => {
|
201
|
+
if (!this.token?.expires)
|
202
|
+
return;
|
203
|
+
// schedule next check
|
204
|
+
const timeTillThreshold = this.token.expires.getTime() - Date.now() - threshold;
|
205
|
+
const interval = Math.max(minInterval, Math.min(maxInterval, timeTillThreshold));
|
206
|
+
this.tokenRefreshTimeoutId = setTimeout(() => loop(), interval);
|
207
|
+
});
|
208
|
+
};
|
209
|
+
loop();
|
210
|
+
}
|
211
|
+
/**
|
212
|
+
* Stop the token refresh checker
|
213
|
+
* @see startTokenRefreshChecker
|
214
|
+
*/
|
215
|
+
stopTokenRefreshChecker() {
|
216
|
+
clearTimeout(this.tokenRefreshTimeoutId);
|
217
|
+
this.tokenRefreshTimeoutId = undefined;
|
218
|
+
}
|
219
|
+
/** Check if the token refresh checker is running
|
220
|
+
*
|
221
|
+
* @see startTokenRefreshChecker
|
222
|
+
* @see stopTokenRefreshChecker
|
223
|
+
* @returns true if the token refresh checker is running
|
224
|
+
*/
|
225
|
+
isTokenRefreshCheckerRunning() {
|
226
|
+
return this.tokenRefreshTimeoutId !== undefined;
|
227
|
+
}
|
228
|
+
/** Checks if the token is valid for use with the API */
|
229
|
+
isTokenValid(token) {
|
230
|
+
return !token.isExpired() && this.isTokenIssuedByApp(token);
|
231
|
+
}
|
232
|
+
isTokenIssuedByApp(token) {
|
233
|
+
return token.issuer === issuer;
|
234
|
+
}
|
235
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
export {};
|
@@ -0,0 +1,163 @@
|
|
1
|
+
import { issuer } from '../constants/auth';
|
2
|
+
import { AuthService } from './AuthService';
|
3
|
+
import { Token } from '../models';
|
4
|
+
describe('authService', () => {
|
5
|
+
const baseDate = new Date(2021, 0, 1, 0, 0, 0, 0);
|
6
|
+
beforeEach(() => {
|
7
|
+
jest.useFakeTimers();
|
8
|
+
jest.setSystemTime(baseDate);
|
9
|
+
});
|
10
|
+
const expiredDate = new Date(baseDate.getTime() - 1000 * 60 * 5); // 5 minutes ago
|
11
|
+
const almostExpiredDate = new Date(baseDate.getTime() + 1000 * 60 * 5); // 5 minutes from now
|
12
|
+
const almostAlmostExpiredDate = new Date(baseDate.getTime() + 1000 * 60 * 25); // 35 minutes from now
|
13
|
+
const notExpiredDate = new Date(baseDate.getTime() + 1000 * 60 * 60 * 24); // 1 day from now
|
14
|
+
const getToken = (config) => {
|
15
|
+
const header = {
|
16
|
+
alg: 'HS256',
|
17
|
+
typ: 'JWT',
|
18
|
+
};
|
19
|
+
const payload = {
|
20
|
+
iat: Math.floor((config.iat ?? expiredDate).getTime() / 1000),
|
21
|
+
exp: Math.floor((config.exp ?? notExpiredDate).getTime() / 1000),
|
22
|
+
iss: config.iss ?? issuer,
|
23
|
+
aud: config.aud ?? 'myaudience',
|
24
|
+
sub: config.sub ?? 'mysubject',
|
25
|
+
};
|
26
|
+
const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64');
|
27
|
+
const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64');
|
28
|
+
if (config.signature === false) {
|
29
|
+
return `${encodedHeader}.${encodedPayload}`;
|
30
|
+
}
|
31
|
+
return `${encodedHeader}.${encodedPayload}.signature`;
|
32
|
+
};
|
33
|
+
afterAll(() => jest.useRealTimers());
|
34
|
+
describe('getToken', () => {
|
35
|
+
it('should return the current token if it is not expired', async () => {
|
36
|
+
// Arrange
|
37
|
+
const token = getToken({ exp: notExpiredDate });
|
38
|
+
const service = new AuthService({
|
39
|
+
token,
|
40
|
+
url: 'http://localhost:0',
|
41
|
+
});
|
42
|
+
service.setToken(token);
|
43
|
+
// Act
|
44
|
+
const newToken = await service.getToken();
|
45
|
+
// Assert
|
46
|
+
expect(newToken.value).toEqual(token);
|
47
|
+
});
|
48
|
+
it('should refresh the token if it is about to expire', async () => {
|
49
|
+
// Arrange
|
50
|
+
const token = getToken({ exp: almostExpiredDate });
|
51
|
+
const service = new AuthService({
|
52
|
+
token,
|
53
|
+
url: 'http://localhost:0',
|
54
|
+
});
|
55
|
+
service.setToken(token);
|
56
|
+
const expected = getToken({ signature: false });
|
57
|
+
jest.spyOn(AuthService.prototype, 'refreshToken').mockResolvedValue(new Token(expected));
|
58
|
+
// Act
|
59
|
+
const newToken = await service.getToken();
|
60
|
+
// Assert
|
61
|
+
expect(newToken.value).not.toEqual(token);
|
62
|
+
expect(newToken.value).toEqual(expected);
|
63
|
+
expect(AuthService.prototype.refreshToken).toHaveBeenCalled();
|
64
|
+
});
|
65
|
+
it('should get a new token if there is no current token', async () => {
|
66
|
+
// Arrange
|
67
|
+
const token = getToken({ signature: false });
|
68
|
+
const service = new AuthService({
|
69
|
+
url: 'http://localhost:0',
|
70
|
+
token,
|
71
|
+
});
|
72
|
+
service.clearToken();
|
73
|
+
const expected = getToken({ signature: false });
|
74
|
+
jest.spyOn(AuthService.prototype, 'getNewUserToken').mockResolvedValue(new Token(expected));
|
75
|
+
// Act
|
76
|
+
const newToken = await service.getToken();
|
77
|
+
// Assert
|
78
|
+
expect(newToken.value).toEqual(expected);
|
79
|
+
expect(AuthService.prototype.getNewUserToken).toHaveBeenCalled();
|
80
|
+
});
|
81
|
+
});
|
82
|
+
describe('tokenRefreshLoop', () => {
|
83
|
+
jest.spyOn(AuthService.prototype, 'refreshTokenIfExpired').mockImplementation(() => {
|
84
|
+
// make sure the promise is resolved synchronously
|
85
|
+
return {
|
86
|
+
catch: () => {
|
87
|
+
return {
|
88
|
+
finally(onfinally) {
|
89
|
+
onfinally?.();
|
90
|
+
return Promise.resolve();
|
91
|
+
},
|
92
|
+
};
|
93
|
+
},
|
94
|
+
};
|
95
|
+
});
|
96
|
+
beforeEach(() => {
|
97
|
+
jest.clearAllTimers();
|
98
|
+
jest.clearAllMocks();
|
99
|
+
jest.useFakeTimers();
|
100
|
+
jest.setSystemTime(baseDate);
|
101
|
+
});
|
102
|
+
it('should check the token every 10 minutes', async () => {
|
103
|
+
// Arrange
|
104
|
+
const token = getToken({ exp: almostAlmostExpiredDate });
|
105
|
+
const service = new AuthService({
|
106
|
+
token,
|
107
|
+
url: 'http://localhost:0',
|
108
|
+
});
|
109
|
+
service.setToken(token);
|
110
|
+
// Act
|
111
|
+
service.startTokenRefreshChecker();
|
112
|
+
expect(AuthService.prototype.refreshTokenIfExpired).toHaveBeenCalledTimes(1);
|
113
|
+
jest.advanceTimersByTime(1000 * 60 * 10); // 10 minutes
|
114
|
+
expect(AuthService.prototype.refreshTokenIfExpired).toHaveBeenCalledTimes(2);
|
115
|
+
jest.advanceTimersByTime(1000 * 60); // 1 minutes - 24 minutes left
|
116
|
+
expect(AuthService.prototype.refreshTokenIfExpired).toHaveBeenCalledTimes(3);
|
117
|
+
jest.advanceTimersByTime(1000 * 60 * 10); // 10 minutes - 14 minutes left
|
118
|
+
jest.runOnlyPendingTimers(); // wait for the next timer to run
|
119
|
+
service.stopTokenRefreshChecker();
|
120
|
+
});
|
121
|
+
it('should not run again when cancelled', () => {
|
122
|
+
// Arrange
|
123
|
+
const token = getToken({ exp: notExpiredDate });
|
124
|
+
const service = new AuthService({
|
125
|
+
token,
|
126
|
+
url: 'http://localhost:0',
|
127
|
+
});
|
128
|
+
service.setToken(token);
|
129
|
+
// Act
|
130
|
+
service.startTokenRefreshChecker();
|
131
|
+
expect(AuthService.prototype.refreshTokenIfExpired).toHaveBeenCalledTimes(1);
|
132
|
+
service.stopTokenRefreshChecker();
|
133
|
+
jest.runOnlyPendingTimers();
|
134
|
+
expect(AuthService.prototype.refreshTokenIfExpired).toHaveBeenCalledTimes(1);
|
135
|
+
});
|
136
|
+
it('should correctly report running status', () => {
|
137
|
+
const token = getToken({ exp: notExpiredDate });
|
138
|
+
const service = new AuthService({
|
139
|
+
token,
|
140
|
+
url: 'http://localhost:0',
|
141
|
+
});
|
142
|
+
service.setToken(token);
|
143
|
+
expect(service.isTokenRefreshCheckerRunning()).toBe(false);
|
144
|
+
service.startTokenRefreshChecker();
|
145
|
+
expect(service.isTokenRefreshCheckerRunning()).toBe(true);
|
146
|
+
service.stopTokenRefreshChecker();
|
147
|
+
expect(service.isTokenRefreshCheckerRunning()).toBe(false);
|
148
|
+
});
|
149
|
+
it('should correctly report running status', () => {
|
150
|
+
const token = getToken({ exp: notExpiredDate });
|
151
|
+
const service = new AuthService({
|
152
|
+
token,
|
153
|
+
url: 'http://localhost:0',
|
154
|
+
});
|
155
|
+
service.setToken(token);
|
156
|
+
expect(service.isTokenRefreshCheckerRunning()).toBe(false);
|
157
|
+
service.startTokenRefreshChecker();
|
158
|
+
expect(service.isTokenRefreshCheckerRunning()).toBe(true);
|
159
|
+
service.stopTokenRefreshChecker();
|
160
|
+
expect(service.isTokenRefreshCheckerRunning()).toBe(false);
|
161
|
+
});
|
162
|
+
});
|
163
|
+
});
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { IRocosSDKConfig, RocosError } from '../models';
|
2
|
+
import { Logger } from 'loglevel';
|
3
|
+
type QueryParams = Record<string, string | number | boolean> | URLSearchParams;
|
4
|
+
type ResponseType = 'json' | 'blob' | 'stream' | 'text' | 'raw';
|
5
|
+
interface RequestConfig {
|
6
|
+
/**
|
7
|
+
* Additional headers to send with the request.
|
8
|
+
*/
|
9
|
+
headers?: Record<string, string>;
|
10
|
+
/**
|
11
|
+
* If true, the request will be sent without authentication.
|
12
|
+
*/
|
13
|
+
public?: boolean;
|
14
|
+
/**
|
15
|
+
* The response type to use for the request.
|
16
|
+
*/
|
17
|
+
responseType?: ResponseType;
|
18
|
+
}
|
19
|
+
export declare abstract class BaseServiceAbstract {
|
20
|
+
protected config: IRocosSDKConfig;
|
21
|
+
protected logger: Logger;
|
22
|
+
protected constructor(config: IRocosSDKConfig);
|
23
|
+
protected abstract getError(e: Error): RocosError;
|
24
|
+
protected callPost<Response = unknown, Payload = unknown>(url: string, payload: Payload, errorMessage: string, config?: RequestConfig): Promise<Response>;
|
25
|
+
protected callPut<Response = unknown, Payload = unknown>(url: string, payload: Payload, errorMessage: string, config?: RequestConfig): Promise<Response>;
|
26
|
+
protected callDelete<Response = unknown, Payload = unknown>(url: string, errorMessage: string, payload?: Payload): Promise<Response>;
|
27
|
+
protected callGet<Response = unknown>(url: string, errorMessage: string, params?: QueryParams, config?: RequestConfig): Promise<Response>;
|
28
|
+
protected call<Response = unknown, Payload = unknown>(url: string, method: 'GET' | 'POST' | 'PUT' | 'DELETE', options: {
|
29
|
+
errorMessage: string;
|
30
|
+
config?: RequestConfig;
|
31
|
+
payload?: Payload;
|
32
|
+
params?: QueryParams;
|
33
|
+
}): Promise<Response>;
|
34
|
+
private fetchOrThrow;
|
35
|
+
}
|
36
|
+
export {};
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import { RocosError } from '../models';
|
2
|
+
import { RocosStore } from '../store/RocosStore';
|
3
|
+
class HttpError extends Error {
|
4
|
+
constructor(response) {
|
5
|
+
super(response.statusText);
|
6
|
+
this.response = response;
|
7
|
+
this.name = 'HttpError';
|
8
|
+
}
|
9
|
+
}
|
10
|
+
export class BaseServiceAbstract {
|
11
|
+
constructor(config) {
|
12
|
+
this.config = config;
|
13
|
+
}
|
14
|
+
async callPost(url, payload, errorMessage, config) {
|
15
|
+
return this.call(url, 'POST', { errorMessage, payload, config });
|
16
|
+
}
|
17
|
+
async callPut(url, payload, errorMessage, config) {
|
18
|
+
return this.call(url, 'PUT', { errorMessage, payload, config });
|
19
|
+
}
|
20
|
+
async callDelete(url, errorMessage, payload) {
|
21
|
+
return this.call(url, 'DELETE', { errorMessage, payload });
|
22
|
+
}
|
23
|
+
async callGet(url, errorMessage, params, config) {
|
24
|
+
return this.call(url, 'GET', { errorMessage, params, config });
|
25
|
+
}
|
26
|
+
async call(url, method, options) {
|
27
|
+
const { errorMessage, config, payload, params } = options;
|
28
|
+
try {
|
29
|
+
// change all params to string
|
30
|
+
const stringParams = Object.entries(params ?? {}).reduce((acc, [key, value]) => {
|
31
|
+
acc[key] = value.toString();
|
32
|
+
return acc;
|
33
|
+
}, {});
|
34
|
+
const formattedUrl = params ? `${url}?${new URLSearchParams(stringParams)}` : url;
|
35
|
+
const defaultHeaders = {};
|
36
|
+
if (!config?.public) {
|
37
|
+
const token = await RocosStore.getSDKInstance(this.config).getAuthService().getToken();
|
38
|
+
defaultHeaders.Authorization = token.bearer;
|
39
|
+
}
|
40
|
+
const requestConfig = {
|
41
|
+
method,
|
42
|
+
headers: {
|
43
|
+
...defaultHeaders,
|
44
|
+
...config?.headers,
|
45
|
+
},
|
46
|
+
};
|
47
|
+
// must check if FormData exists for node support
|
48
|
+
if (typeof FormData !== 'undefined' && payload instanceof FormData) {
|
49
|
+
requestConfig.body = payload;
|
50
|
+
}
|
51
|
+
else if (payload) {
|
52
|
+
requestConfig.body = JSON.stringify(payload);
|
53
|
+
requestConfig.headers = { ...requestConfig.headers, 'Content-Type': 'application/json' };
|
54
|
+
}
|
55
|
+
return this.fetchOrThrow(formattedUrl, requestConfig, config?.responseType);
|
56
|
+
}
|
57
|
+
catch (e) {
|
58
|
+
const message = errorMessage;
|
59
|
+
this.logger.error(message, e);
|
60
|
+
let httpError = new RocosError(message);
|
61
|
+
if (e instanceof HttpError) {
|
62
|
+
httpError = this.getError(e);
|
63
|
+
httpError.statusCode = e?.response?.status;
|
64
|
+
}
|
65
|
+
RocosStore.getChangeSubject().next({ type: 'http-error', url: this.config.url, data: httpError });
|
66
|
+
throw httpError;
|
67
|
+
}
|
68
|
+
}
|
69
|
+
async fetchOrThrow(url, config, responseType) {
|
70
|
+
this.logger.debug('Fetching', { url, config });
|
71
|
+
const res = await fetch(url, config);
|
72
|
+
if (!res.ok) {
|
73
|
+
const payload = await res.text();
|
74
|
+
this.logger.warn('Failed HTTP Response', { status: res.statusText, payload, response: res });
|
75
|
+
throw new HttpError(res);
|
76
|
+
}
|
77
|
+
switch (responseType) {
|
78
|
+
case 'raw':
|
79
|
+
return res;
|
80
|
+
case 'stream':
|
81
|
+
return res.body;
|
82
|
+
case 'blob':
|
83
|
+
return res.blob();
|
84
|
+
case 'text':
|
85
|
+
return res.text();
|
86
|
+
case 'json':
|
87
|
+
default: {
|
88
|
+
const textRes = await res.text();
|
89
|
+
if (!textRes?.trim())
|
90
|
+
return undefined;
|
91
|
+
try {
|
92
|
+
return JSON.parse(textRes);
|
93
|
+
}
|
94
|
+
catch (e) {
|
95
|
+
this.logger.error('Failed to parse JSON from response', { textRes });
|
96
|
+
return textRes;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import { IBaseService, IBaseStream, IRocosSDKConfig, IStreamConfig, SubscriberStatusEnum } from '../models';
|
2
|
+
import { ISubscriberStatus } from '../models/ISubscriberStatus';
|
3
|
+
import { Logger } from 'loglevel';
|
4
|
+
import { Subject } from 'rxjs';
|
5
|
+
export declare abstract class BaseStreamService<T extends IBaseStream, C extends IStreamConfig = IStreamConfig> implements IBaseService, ISubscriberStatus {
|
6
|
+
protected config: IRocosSDKConfig;
|
7
|
+
protected logger: Logger;
|
8
|
+
protected status: boolean;
|
9
|
+
status$: Subject<SubscriberStatusEnum>;
|
10
|
+
protected constructor(name: string, config: IRocosSDKConfig);
|
11
|
+
getStatus(): boolean;
|
12
|
+
protected initStream(stream: T): Promise<void>;
|
13
|
+
protected createStreamFromConfig(identifier: string, config: C): Promise<{
|
14
|
+
stream: T;
|
15
|
+
isNew: boolean;
|
16
|
+
}>;
|
17
|
+
protected abstract getStream(config: C): T;
|
18
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import { SubscriberStatusEnum, Token } from '../models';
|
2
|
+
import { RocosLogger } from '../logger/RocosLogger';
|
3
|
+
import { RocosStore } from '../store/RocosStore';
|
4
|
+
import { StreamRegister } from '../api/StreamRegister';
|
5
|
+
import { Subject } from 'rxjs';
|
6
|
+
export class BaseStreamService {
|
7
|
+
constructor(name, config) {
|
8
|
+
this.status = false;
|
9
|
+
this.status$ = new Subject();
|
10
|
+
this.config = config;
|
11
|
+
this.logger = RocosLogger.getInstance(`${name}(${this.config.url})`);
|
12
|
+
}
|
13
|
+
getStatus() {
|
14
|
+
return this.status;
|
15
|
+
}
|
16
|
+
async initStream(stream) {
|
17
|
+
const authService = RocosStore.getSDKInstance(this.config).getAuthService();
|
18
|
+
if (!this.config.token || !authService.isTokenValid(new Token(this.config.token))) {
|
19
|
+
try {
|
20
|
+
const token = await authService.getToken();
|
21
|
+
stream.setToken(token.value);
|
22
|
+
}
|
23
|
+
catch (e) {
|
24
|
+
this.logger.error('Can not retrieve auth token', e);
|
25
|
+
throw new Error('Can not retrieve auth token');
|
26
|
+
}
|
27
|
+
}
|
28
|
+
authService.startTokenRefreshChecker();
|
29
|
+
}
|
30
|
+
async createStreamFromConfig(identifier, config) {
|
31
|
+
const identifierWithScope = StreamRegister.getIdentifier(identifier);
|
32
|
+
const streamRegister = StreamRegister.getInstance();
|
33
|
+
let stream = streamRegister.getStream(identifierWithScope);
|
34
|
+
let isNew = false;
|
35
|
+
if (!stream) {
|
36
|
+
isNew = true;
|
37
|
+
stream = this.getStream(config);
|
38
|
+
stream.statusStream$.subscribe((msg) => {
|
39
|
+
this.status = msg === SubscriberStatusEnum.STOPPED || msg === SubscriberStatusEnum.ALIVE;
|
40
|
+
this.status$.next(msg);
|
41
|
+
});
|
42
|
+
await streamRegister.addStream(stream);
|
43
|
+
await this.initStream(stream);
|
44
|
+
}
|
45
|
+
return { stream, isNew };
|
46
|
+
}
|
47
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { ICallerInvokeParams, ICallerParams, ICallerStream, IRocosCallerMessage, IRocosSDKConfig, IStreamConfig } from '../models';
|
2
|
+
import { Observable } from 'rxjs';
|
3
|
+
import { BaseStreamService } from './BaseStreamService';
|
4
|
+
export declare class CallerService extends BaseStreamService<ICallerStream> {
|
5
|
+
constructor(config: IRocosSDKConfig);
|
6
|
+
invokeRequest(params: ICallerInvokeParams): Observable<IRocosCallerMessage>;
|
7
|
+
cancelRequest(params: ICallerParams): Observable<IRocosCallerMessage>;
|
8
|
+
protected createStream(): Promise<ICallerStream>;
|
9
|
+
protected getStream(config: IStreamConfig): ICallerStream;
|
10
|
+
}
|
@@ -0,0 +1,53 @@
|
|
1
|
+
import { Subject } from 'rxjs';
|
2
|
+
import { BaseStreamService } from './BaseStreamService';
|
3
|
+
import { CallerStream } from '../api/streams/caller/CallerStream';
|
4
|
+
import { IDENTIFIER_NAME_CALLER } from '../constants/identifier';
|
5
|
+
import { finalize } from 'rxjs/operators';
|
6
|
+
export class CallerService extends BaseStreamService {
|
7
|
+
constructor(config) {
|
8
|
+
super('CallerService', config);
|
9
|
+
}
|
10
|
+
invokeRequest(params) {
|
11
|
+
const subject = new Subject();
|
12
|
+
let subscription;
|
13
|
+
this.createStream()
|
14
|
+
.then((stream) => {
|
15
|
+
subscription = stream.invokeRequest(params).subscribe(subject);
|
16
|
+
})
|
17
|
+
.catch((e) => {
|
18
|
+
this.logger.info('invokeRequest error', e);
|
19
|
+
subject.error(e);
|
20
|
+
});
|
21
|
+
return subject.asObservable().pipe(finalize(() => {
|
22
|
+
subscription?.unsubscribe();
|
23
|
+
}));
|
24
|
+
}
|
25
|
+
cancelRequest(params) {
|
26
|
+
const subject = new Subject();
|
27
|
+
let subscription;
|
28
|
+
this.createStream()
|
29
|
+
.then((stream) => {
|
30
|
+
subscription = stream.cancelRequest(params).subscribe(subject);
|
31
|
+
})
|
32
|
+
.catch((e) => {
|
33
|
+
this.logger.info('invokeRequest error', e);
|
34
|
+
subject.error(e);
|
35
|
+
});
|
36
|
+
return subject.asObservable().pipe(finalize(() => {
|
37
|
+
subscription?.unsubscribe();
|
38
|
+
}));
|
39
|
+
}
|
40
|
+
async createStream() {
|
41
|
+
return (await this.createStreamFromConfig(IDENTIFIER_NAME_CALLER, {
|
42
|
+
url: this.config.url,
|
43
|
+
token: this.config.token,
|
44
|
+
scope: 'default',
|
45
|
+
options: this.config.options,
|
46
|
+
port: this.config.port,
|
47
|
+
insecure: this.config.insecure,
|
48
|
+
})).stream;
|
49
|
+
}
|
50
|
+
getStream(config) {
|
51
|
+
return new CallerStream(config);
|
52
|
+
}
|
53
|
+
}
|
@@ -0,0 +1,6 @@
|
|
1
|
+
import { CallerService } from './CallerService';
|
2
|
+
import { ICallerStream } from '../models/stream/ICallerStream';
|
3
|
+
import { IStreamConfig } from '../models/IStreamConfig';
|
4
|
+
export declare class CallerServiceNode extends CallerService {
|
5
|
+
protected getStream(config: IStreamConfig): ICallerStream;
|
6
|
+
}
|