@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.
Files changed (468) hide show
  1. package/IRocosSDK.d.ts +55 -0
  2. package/IRocosSDK.js +2 -0
  3. package/README.md +108 -0
  4. package/RocosSDK.d.ts +138 -0
  5. package/RocosSDK.js +292 -0
  6. package/api/StreamRegister.d.ts +13 -0
  7. package/api/StreamRegister.js +69 -0
  8. package/api/atoms/StreamHeartbeat.d.ts +27 -0
  9. package/api/atoms/StreamHeartbeat.js +111 -0
  10. package/api/streams/caller/CallerStream.d.ts +13 -0
  11. package/api/streams/caller/CallerStream.js +77 -0
  12. package/api/streams/caller/CallerStreamAbstract.d.ts +23 -0
  13. package/api/streams/caller/CallerStreamAbstract.js +87 -0
  14. package/api/streams/caller/CallerStreamNode.d.ts +13 -0
  15. package/api/streams/caller/CallerStreamNode.js +115 -0
  16. package/api/streams/command/CommandStream.d.ts +10 -0
  17. package/api/streams/command/CommandStream.js +66 -0
  18. package/api/streams/command/CommandStreamAbstract.d.ts +20 -0
  19. package/api/streams/command/CommandStreamAbstract.js +63 -0
  20. package/api/streams/command/CommandStreamNode.d.ts +10 -0
  21. package/api/streams/command/CommandStreamNode.js +69 -0
  22. package/api/streams/control/ControlStream.d.ts +12 -0
  23. package/api/streams/control/ControlStream.js +75 -0
  24. package/api/streams/control/ControlStreamAbstract.d.ts +25 -0
  25. package/api/streams/control/ControlStreamAbstract.js +111 -0
  26. package/api/streams/control/ControlStreamNode.d.ts +12 -0
  27. package/api/streams/control/ControlStreamNode.js +73 -0
  28. package/api/streams/fileAccessor/FileAccessorStream.d.ts +8 -0
  29. package/api/streams/fileAccessor/FileAccessorStream.js +59 -0
  30. package/api/streams/fileAccessor/FileAccessorStreamAbstract.d.ts +21 -0
  31. package/api/streams/fileAccessor/FileAccessorStreamAbstract.js +62 -0
  32. package/api/streams/fileAccessor/FileAccessorStreamNode.d.ts +8 -0
  33. package/api/streams/fileAccessor/FileAccessorStreamNode.js +66 -0
  34. package/api/streams/search/SearchStream.d.ts +13 -0
  35. package/api/streams/search/SearchStream.js +96 -0
  36. package/api/streams/search/SearchStreamAbstract.d.ts +25 -0
  37. package/api/streams/search/SearchStreamAbstract.js +72 -0
  38. package/api/streams/search/SearchStreamNode.d.ts +13 -0
  39. package/api/streams/search/SearchStreamNode.js +118 -0
  40. package/api/streams/telemetry/TelemetryStream.d.ts +17 -0
  41. package/api/streams/telemetry/TelemetryStream.js +97 -0
  42. package/api/streams/telemetry/TelemetryStreamAbstract.d.ts +59 -0
  43. package/api/streams/telemetry/TelemetryStreamAbstract.js +402 -0
  44. package/api/streams/telemetry/TelemetryStreamNode.d.ts +21 -0
  45. package/api/streams/telemetry/TelemetryStreamNode.js +175 -0
  46. package/api/streams/webRTCSignalling/WebRTCSignallingStream.d.ts +39 -0
  47. package/api/streams/webRTCSignalling/WebRTCSignallingStream.js +84 -0
  48. package/api/streams/webRTCSignalling/WebRTCSignallingStreamAbstract.d.ts +29 -0
  49. package/api/streams/webRTCSignalling/WebRTCSignallingStreamAbstract.js +65 -0
  50. package/constants/api.d.ts +126 -0
  51. package/constants/api.js +126 -0
  52. package/constants/auth.d.ts +2 -0
  53. package/constants/auth.js +2 -0
  54. package/constants/grpc.d.ts +5 -0
  55. package/constants/grpc.js +5 -0
  56. package/constants/identifier.d.ts +6 -0
  57. package/constants/identifier.js +6 -0
  58. package/constants/timezones.d.ts +2 -0
  59. package/constants/timezones.js +427 -0
  60. package/grpc/conker_pb.client.d.ts +78 -0
  61. package/grpc/conker_pb.client.js +55 -0
  62. package/grpc/conker_pb.d.ts +141 -0
  63. package/grpc/conker_pb.grpc-client.d.ts +81 -0
  64. package/grpc/conker_pb.grpc-client.js +58 -0
  65. package/grpc/conker_pb.js +104 -0
  66. package/grpc/filagree_pb.client.d.ts +68 -0
  67. package/grpc/filagree_pb.client.js +48 -0
  68. package/grpc/filagree_pb.d.ts +404 -0
  69. package/grpc/filagree_pb.grpc-client.d.ts +69 -0
  70. package/grpc/filagree_pb.grpc-client.js +51 -0
  71. package/grpc/filagree_pb.js +329 -0
  72. package/grpc/google/protobuf/descriptor_pb.d.ts +1798 -0
  73. package/grpc/google/protobuf/descriptor_pb.js +2378 -0
  74. package/grpc/google/protobuf/empty_pb.d.ts +23 -0
  75. package/grpc/google/protobuf/empty_pb.js +47 -0
  76. package/grpc/pigeon_pb.client.d.ts +96 -0
  77. package/grpc/pigeon_pb.client.js +72 -0
  78. package/grpc/pigeon_pb.d.ts +207 -0
  79. package/grpc/pigeon_pb.grpc-client.d.ts +98 -0
  80. package/grpc/pigeon_pb.grpc-client.js +68 -0
  81. package/grpc/pigeon_pb.js +144 -0
  82. package/grpc/rambo.uri.v1_pb.d.ts +73 -0
  83. package/grpc/rambo.uri.v1_pb.js +48 -0
  84. package/grpc/rambo.v1_pb.client.d.ts +66 -0
  85. package/grpc/rambo.v1_pb.client.js +48 -0
  86. package/grpc/rambo.v1_pb.d.ts +392 -0
  87. package/grpc/rambo.v1_pb.grpc-client.d.ts +56 -0
  88. package/grpc/rambo.v1_pb.grpc-client.js +44 -0
  89. package/grpc/rambo.v1_pb.js +272 -0
  90. package/grpc/serviette.uri.v1_pb.d.ts +89 -0
  91. package/grpc/serviette.uri.v1_pb.js +62 -0
  92. package/grpc/serviette.v1_pb.client.d.ts +225 -0
  93. package/grpc/serviette.v1_pb.client.js +174 -0
  94. package/grpc/serviette.v1_pb.d.ts +827 -0
  95. package/grpc/serviette.v1_pb.grpc-client.d.ts +215 -0
  96. package/grpc/serviette.v1_pb.grpc-client.js +162 -0
  97. package/grpc/serviette.v1_pb.js +553 -0
  98. package/grpc/slowlane_pb.client.d.ts +61 -0
  99. package/grpc/slowlane_pb.client.js +41 -0
  100. package/grpc/slowlane_pb.d.ts +303 -0
  101. package/grpc/slowlane_pb.grpc-client.d.ts +64 -0
  102. package/grpc/slowlane_pb.grpc-client.js +44 -0
  103. package/grpc/slowlane_pb.js +185 -0
  104. package/grpc/teletubby_pb.client.d.ts +145 -0
  105. package/grpc/teletubby_pb.client.js +104 -0
  106. package/grpc/teletubby_pb.d.ts +634 -0
  107. package/grpc/teletubby_pb.grpc-client.d.ts +152 -0
  108. package/grpc/teletubby_pb.grpc-client.js +100 -0
  109. package/grpc/teletubby_pb.js +1264 -0
  110. package/helpers/arrayRemove.d.ts +1 -0
  111. package/helpers/arrayRemove.js +3 -0
  112. package/helpers/arrayUnique.d.ts +1 -0
  113. package/helpers/arrayUnique.js +3 -0
  114. package/helpers/average.d.ts +1 -0
  115. package/helpers/average.js +6 -0
  116. package/helpers/cleanObject.d.ts +1 -0
  117. package/helpers/cleanObject.js +18 -0
  118. package/helpers/cleanObject.spec.d.ts +1 -0
  119. package/helpers/cleanObject.spec.js +53 -0
  120. package/helpers/enviroment.d.ts +8 -0
  121. package/helpers/enviroment.js +13 -0
  122. package/helpers/flattenCallsignsLookup.d.ts +2 -0
  123. package/helpers/flattenCallsignsLookup.js +6 -0
  124. package/helpers/flattenObject.d.ts +1 -0
  125. package/helpers/flattenObject.js +13 -0
  126. package/helpers/flattenObject.spec.d.ts +1 -0
  127. package/helpers/flattenObject.spec.js +29 -0
  128. package/helpers/flattenOneOf.d.ts +67 -0
  129. package/helpers/flattenOneOf.js +29 -0
  130. package/helpers/flattenOneOf.spec.d.ts +1 -0
  131. package/helpers/flattenOneOf.spec.js +157 -0
  132. package/helpers/formatServiceUrl.d.ts +1 -0
  133. package/helpers/formatServiceUrl.js +7 -0
  134. package/helpers/formatServiceUrl.spec.d.ts +1 -0
  135. package/helpers/formatServiceUrl.spec.js +16 -0
  136. package/helpers/generateUUID.d.ts +1 -0
  137. package/helpers/generateUUID.js +4 -0
  138. package/helpers/getSubscriptionsDifference.d.ts +10 -0
  139. package/helpers/getSubscriptionsDifference.js +35 -0
  140. package/helpers/getUniqueConfigKey.d.ts +7 -0
  141. package/helpers/getUniqueConfigKey.js +14 -0
  142. package/helpers/getUniqueId.d.ts +9 -0
  143. package/helpers/getUniqueId.js +11 -0
  144. package/helpers/getUnixTimeMs.d.ts +1 -0
  145. package/helpers/getUnixTimeMs.js +4 -0
  146. package/helpers/index.d.ts +3 -0
  147. package/helpers/index.js +3 -0
  148. package/helpers/nanosecondToMillisecond.d.ts +1 -0
  149. package/helpers/nanosecondToMillisecond.js +6 -0
  150. package/helpers/randomString.d.ts +1 -0
  151. package/helpers/randomString.js +3 -0
  152. package/helpers/standardDeviation.d.ts +1 -0
  153. package/helpers/standardDeviation.js +12 -0
  154. package/helpers/standardDeviation.spec.d.ts +1 -0
  155. package/helpers/standardDeviation.spec.js +11 -0
  156. package/helpers/stringToUint8Array.d.ts +1 -0
  157. package/helpers/stringToUint8Array.js +10 -0
  158. package/helpers/uint8ArrayToString.d.ts +1 -0
  159. package/helpers/uint8ArrayToString.js +10 -0
  160. package/index.d.ts +7 -0
  161. package/index.js +7 -0
  162. package/logger/RocosLogger.d.ts +7 -0
  163. package/logger/RocosLogger.js +37 -0
  164. package/models/CallsignStatus.d.ts +6 -0
  165. package/models/CallsignStatus.js +7 -0
  166. package/models/ExportDataQuery.d.ts +8 -0
  167. package/models/ExportDataQuery.js +13 -0
  168. package/models/ExternalProject.d.ts +6 -0
  169. package/models/ExternalProject.js +2 -0
  170. package/models/IBaseService.d.ts +4 -0
  171. package/models/IBaseService.js +1 -0
  172. package/models/IConfigGroup.d.ts +5 -0
  173. package/models/IConfigGroup.js +1 -0
  174. package/models/IDebugLevel.d.ts +2 -0
  175. package/models/IDebugLevel.js +1 -0
  176. package/models/IExportDataQuery.d.ts +9 -0
  177. package/models/IExportDataQuery.js +1 -0
  178. package/models/IFunctionConfig.d.ts +8 -0
  179. package/models/IFunctionConfig.js +1 -0
  180. package/models/IInvitation.d.ts +6 -0
  181. package/models/IInvitation.js +1 -0
  182. package/models/IInvitationExists.d.ts +4 -0
  183. package/models/IInvitationExists.js +1 -0
  184. package/models/IOperation.d.ts +6 -0
  185. package/models/IOperation.js +1 -0
  186. package/models/IPersonalAccessToken.d.ts +16 -0
  187. package/models/IPersonalAccessToken.js +1 -0
  188. package/models/IProject.d.ts +4 -0
  189. package/models/IProject.js +1 -0
  190. package/models/IProjectApplication.d.ts +6 -0
  191. package/models/IProjectApplication.js +1 -0
  192. package/models/IRobot.d.ts +18 -0
  193. package/models/IRobot.js +1 -0
  194. package/models/IRobotConfig.d.ts +8 -0
  195. package/models/IRobotConfig.js +1 -0
  196. package/models/IRobotPlugin.d.ts +3 -0
  197. package/models/IRobotPlugin.js +1 -0
  198. package/models/IRobotSettings.d.ts +28 -0
  199. package/models/IRobotSettings.js +1 -0
  200. package/models/IRobotTemplate.d.ts +10 -0
  201. package/models/IRobotTemplate.js +1 -0
  202. package/models/IRocosSDKConfig.d.ts +19 -0
  203. package/models/IRocosSDKConfig.js +1 -0
  204. package/models/ISource.d.ts +8 -0
  205. package/models/ISource.js +1 -0
  206. package/models/IStream.d.ts +9 -0
  207. package/models/IStream.js +1 -0
  208. package/models/IStreamConfig.d.ts +9 -0
  209. package/models/IStreamConfig.js +1 -0
  210. package/models/IStreamOptions.d.ts +7 -0
  211. package/models/IStreamOptions.js +1 -0
  212. package/models/IStreamSource.d.ts +8 -0
  213. package/models/IStreamSource.js +1 -0
  214. package/models/ISubscriberStatus.d.ts +5 -0
  215. package/models/ISubscriberStatus.js +1 -0
  216. package/models/ITelemetryStreamConfig.d.ts +7 -0
  217. package/models/ITelemetryStreamConfig.js +1 -0
  218. package/models/IToken.d.ts +9 -0
  219. package/models/IToken.js +1 -0
  220. package/models/IWidget.d.ts +25 -0
  221. package/models/IWidget.js +1 -0
  222. package/models/IWidgetLineGroup.d.ts +8 -0
  223. package/models/IWidgetLineGroup.js +1 -0
  224. package/models/ResponseLevelEnum.d.ts +10 -0
  225. package/models/ResponseLevelEnum.js +11 -0
  226. package/models/Robot.d.ts +20 -0
  227. package/models/Robot.js +8 -0
  228. package/models/RobotConfig.d.ts +10 -0
  229. package/models/RobotConfig.js +5 -0
  230. package/models/RobotPlugin.d.ts +5 -0
  231. package/models/RobotPlugin.js +5 -0
  232. package/models/RobotTemplate.d.ts +12 -0
  233. package/models/RobotTemplate.js +25 -0
  234. package/models/RocosError.d.ts +30 -0
  235. package/models/RocosError.js +39 -0
  236. package/models/ServiceEnum.d.ts +26 -0
  237. package/models/ServiceEnum.js +27 -0
  238. package/models/Stream.d.ts +10 -0
  239. package/models/Stream.js +11 -0
  240. package/models/StreamOptions.d.ts +9 -0
  241. package/models/StreamOptions.js +33 -0
  242. package/models/StreamSource.d.ts +10 -0
  243. package/models/StreamSource.js +11 -0
  244. package/models/SubscriberStatusEnum.d.ts +6 -0
  245. package/models/SubscriberStatusEnum.js +7 -0
  246. package/models/Token.d.ts +40 -0
  247. package/models/Token.js +78 -0
  248. package/models/Token.spec.d.ts +1 -0
  249. package/models/Token.spec.js +108 -0
  250. package/models/Widget.d.ts +27 -0
  251. package/models/Widget.js +12 -0
  252. package/models/WidgetLineGroup.d.ts +10 -0
  253. package/models/WidgetLineGroup.js +5 -0
  254. package/models/asset-storage/AssetModelItem.d.ts +29 -0
  255. package/models/asset-storage/AssetModelItem.js +1 -0
  256. package/models/caller/IRocosCallerMessageChunk.d.ts +10 -0
  257. package/models/caller/IRocosCallerMessageChunk.js +1 -0
  258. package/models/caller/IRocosCallerMessageChunks.d.ts +4 -0
  259. package/models/caller/IRocosCallerMessageChunks.js +1 -0
  260. package/models/caller/IRocosCallerMessageHeartbeat.d.ts +3 -0
  261. package/models/caller/IRocosCallerMessageHeartbeat.js +1 -0
  262. package/models/caller/IRocosCallerMessageResponse.d.ts +10 -0
  263. package/models/caller/IRocosCallerMessageResponse.js +1 -0
  264. package/models/caller/IRocosCallerMessageResponseAck.d.ts +16 -0
  265. package/models/caller/IRocosCallerMessageResponseAck.js +13 -0
  266. package/models/caller/IRocosCallerMessageResponseResult.d.ts +15 -0
  267. package/models/caller/IRocosCallerMessageResponseResult.js +12 -0
  268. package/models/caller/IRocosCallerMessageResponseReturn.d.ts +8 -0
  269. package/models/caller/IRocosCallerMessageResponseReturn.js +1 -0
  270. package/models/caller/IRocosCallerMessageResponseUid.d.ts +10 -0
  271. package/models/caller/IRocosCallerMessageResponseUid.js +7 -0
  272. package/models/caller/IRocosCallerMessageResponses.d.ts +4 -0
  273. package/models/caller/IRocosCallerMessageResponses.js +1 -0
  274. package/models/caller/RocosCallerResultStatus.d.ts +11 -0
  275. package/models/caller/RocosCallerResultStatus.js +12 -0
  276. package/models/caller/RocosResponseLevel.d.ts +6 -0
  277. package/models/caller/RocosResponseLevel.js +7 -0
  278. package/models/caller/index.d.ts +10 -0
  279. package/models/caller/index.js +10 -0
  280. package/models/callsigns/CallsignsEnums.d.ts +13 -0
  281. package/models/callsigns/CallsignsEnums.js +17 -0
  282. package/models/callsigns/CallsignsLookup.d.ts +8 -0
  283. package/models/callsigns/CallsignsLookup.js +28 -0
  284. package/models/callsigns/CallsignsQuery.d.ts +9 -0
  285. package/models/callsigns/CallsignsQuery.js +14 -0
  286. package/models/callsigns/CallsignsQueryPredicate.d.ts +9 -0
  287. package/models/callsigns/CallsignsQueryPredicate.js +15 -0
  288. package/models/command/IRocosCommandMessageHeartbeat.d.ts +1 -0
  289. package/models/command/IRocosCommandMessageHeartbeat.js +1 -0
  290. package/models/command/IRocosCommandMessageResponse.d.ts +55 -0
  291. package/models/command/IRocosCommandMessageResponse.js +29 -0
  292. package/models/command/RocosCommandResultStatus.d.ts +11 -0
  293. package/models/command/RocosCommandResultStatus.js +12 -0
  294. package/models/command/index.d.ts +4 -0
  295. package/models/command/index.js +4 -0
  296. package/models/file/FileEnums.d.ts +30 -0
  297. package/models/file/FileEnums.js +33 -0
  298. package/models/index.d.ts +75 -0
  299. package/models/index.js +75 -0
  300. package/models/integrations/Overlay.d.ts +49 -0
  301. package/models/integrations/Overlay.js +1 -0
  302. package/models/integrations/Plan.d.ts +324 -0
  303. package/models/integrations/Plan.js +1 -0
  304. package/models/maps/Map.d.ts +13 -0
  305. package/models/maps/Map.js +1 -0
  306. package/models/message/IRocosCallerMessage.d.ts +8 -0
  307. package/models/message/IRocosCallerMessage.js +1 -0
  308. package/models/message/IRocosChangeMessage.d.ts +6 -0
  309. package/models/message/IRocosChangeMessage.js +1 -0
  310. package/models/message/IRocosCommandMessage.d.ts +6 -0
  311. package/models/message/IRocosCommandMessage.js +1 -0
  312. package/models/message/IRocosControlMessage.d.ts +7 -0
  313. package/models/message/IRocosControlMessage.js +1 -0
  314. package/models/message/IRocosOpResultMessage.d.ts +6 -0
  315. package/models/message/IRocosOpResultMessage.js +1 -0
  316. package/models/message/IRocosSearchMessage.d.ts +5 -0
  317. package/models/message/IRocosSearchMessage.js +1 -0
  318. package/models/message/IRocosSearchRowMessage.d.ts +9 -0
  319. package/models/message/IRocosSearchRowMessage.js +1 -0
  320. package/models/message/IRocosSearchStatusMessage.d.ts +4 -0
  321. package/models/message/IRocosSearchStatusMessage.js +1 -0
  322. package/models/message/IRocosTelemetryMessage.d.ts +23 -0
  323. package/models/message/IRocosTelemetryMessage.js +1 -0
  324. package/models/message/IStreamStatusMessage.d.ts +5 -0
  325. package/models/message/IStreamStatusMessage.js +1 -0
  326. package/models/message/RocosCallerMessage.d.ts +10 -0
  327. package/models/message/RocosCallerMessage.js +32 -0
  328. package/models/message/RocosCommandMessage.d.ts +9 -0
  329. package/models/message/RocosCommandMessage.js +13 -0
  330. package/models/message/RocosControlMessage.d.ts +11 -0
  331. package/models/message/RocosControlMessage.js +14 -0
  332. package/models/message/RocosOpResultMessage.d.ts +10 -0
  333. package/models/message/RocosOpResultMessage.js +18 -0
  334. package/models/message/RocosSearchMessage.d.ts +9 -0
  335. package/models/message/RocosSearchMessage.js +24 -0
  336. package/models/message/RocosSearchRowMessage.d.ts +13 -0
  337. package/models/message/RocosSearchRowMessage.js +16 -0
  338. package/models/message/RocosTelemetryMessage.d.ts +10 -0
  339. package/models/message/RocosTelemetryMessage.js +63 -0
  340. package/models/message/index.d.ts +17 -0
  341. package/models/message/index.js +17 -0
  342. package/models/params/ICallerParams.d.ts +16 -0
  343. package/models/params/ICallerParams.js +1 -0
  344. package/models/params/ICommandParams.d.ts +9 -0
  345. package/models/params/ICommandParams.js +1 -0
  346. package/models/params/IControlParams.d.ts +8 -0
  347. package/models/params/IControlParams.js +1 -0
  348. package/models/params/IFileAccessorParams.d.ts +11 -0
  349. package/models/params/IFileAccessorParams.js +1 -0
  350. package/models/params/ISearchParams.d.ts +10 -0
  351. package/models/params/ISearchParams.js +1 -0
  352. package/models/params/ITelemetryParams.d.ts +18 -0
  353. package/models/params/ITelemetryParams.js +1 -0
  354. package/models/params/IWebRTCSignallingParams.d.ts +21 -0
  355. package/models/params/IWebRTCSignallingParams.js +1 -0
  356. package/models/projects/ProjectUser.d.ts +6 -0
  357. package/models/projects/ProjectUser.js +1 -0
  358. package/models/schedule/IScheduleAction.d.ts +13 -0
  359. package/models/schedule/IScheduleAction.js +6 -0
  360. package/models/schedule/IScheduleInfo.d.ts +11 -0
  361. package/models/schedule/IScheduleInfo.js +1 -0
  362. package/models/schedule/IScheduleJob.d.ts +12 -0
  363. package/models/schedule/IScheduleJob.js +1 -0
  364. package/models/search/SearchQueryFilter.d.ts +5 -0
  365. package/models/search/SearchQueryFilter.js +5 -0
  366. package/models/search/SearchStreamQuery.d.ts +15 -0
  367. package/models/search/SearchStreamQuery.js +6 -0
  368. package/models/stream/IBaseStream.d.ts +8 -0
  369. package/models/stream/IBaseStream.js +1 -0
  370. package/models/stream/ICallerStream.d.ts +8 -0
  371. package/models/stream/ICallerStream.js +1 -0
  372. package/models/stream/ICommandStream.d.ts +7 -0
  373. package/models/stream/ICommandStream.js +1 -0
  374. package/models/stream/IControlStream.d.ts +9 -0
  375. package/models/stream/IControlStream.js +1 -0
  376. package/models/stream/IFileAccessorStream.d.ts +9 -0
  377. package/models/stream/IFileAccessorStream.js +1 -0
  378. package/models/stream/ISearchStream.d.ts +11 -0
  379. package/models/stream/ISearchStream.js +1 -0
  380. package/models/stream/ITelemetryStream.d.ts +10 -0
  381. package/models/stream/ITelemetryStream.js +1 -0
  382. package/models/stream/IWebRTCSignallingStream.d.ts +76 -0
  383. package/models/stream/IWebRTCSignallingStream.js +1 -0
  384. package/models/types.d.ts +5 -0
  385. package/models/types.js +1 -0
  386. package/node/RocosSDKNode.d.ts +42 -0
  387. package/node/RocosSDKNode.js +143 -0
  388. package/node/index.d.ts +7 -0
  389. package/node/index.js +7 -0
  390. package/package.json +22 -6
  391. package/services/AssetStorageService.d.ts +99 -0
  392. package/services/AssetStorageService.js +158 -0
  393. package/services/AuthService.d.ts +93 -0
  394. package/services/AuthService.js +235 -0
  395. package/services/AuthService.spec.d.ts +1 -0
  396. package/services/AuthService.spec.js +163 -0
  397. package/services/BaseServiceAbstract.d.ts +36 -0
  398. package/services/BaseServiceAbstract.js +101 -0
  399. package/services/BaseStreamService.d.ts +18 -0
  400. package/services/BaseStreamService.js +47 -0
  401. package/services/CallerService.d.ts +10 -0
  402. package/services/CallerService.js +53 -0
  403. package/services/CallerServiceNode.d.ts +6 -0
  404. package/services/CallerServiceNode.js +7 -0
  405. package/services/CommandService.d.ts +9 -0
  406. package/services/CommandService.js +38 -0
  407. package/services/CommandServiceNode.d.ts +6 -0
  408. package/services/CommandServiceNode.js +7 -0
  409. package/services/ConfigGroupService.d.ts +89 -0
  410. package/services/ConfigGroupService.js +153 -0
  411. package/services/ControlService.d.ts +11 -0
  412. package/services/ControlService.js +57 -0
  413. package/services/ControlServiceNode.d.ts +6 -0
  414. package/services/ControlServiceNode.js +7 -0
  415. package/services/DashboardService.d.ts +97 -0
  416. package/services/DashboardService.js +142 -0
  417. package/services/EventService.d.ts +53 -0
  418. package/services/EventService.js +85 -0
  419. package/services/FileAccessorService.d.ts +11 -0
  420. package/services/FileAccessorService.js +37 -0
  421. package/services/FileAccessorServiceNode.d.ts +6 -0
  422. package/services/FileAccessorServiceNode.js +7 -0
  423. package/services/FunctionService.d.ts +68 -0
  424. package/services/FunctionService.js +99 -0
  425. package/services/IntegrationService.d.ts +48 -0
  426. package/services/IntegrationService.js +72 -0
  427. package/services/MapService.d.ts +109 -0
  428. package/services/MapService.js +149 -0
  429. package/services/PlatformTimeService.d.ts +35 -0
  430. package/services/PlatformTimeService.js +156 -0
  431. package/services/PlatformTimeService.spec.d.ts +1 -0
  432. package/services/PlatformTimeService.spec.js +180 -0
  433. package/services/ProfileService.d.ts +244 -0
  434. package/services/ProfileService.js +362 -0
  435. package/services/ProjectService.d.ts +110 -0
  436. package/services/ProjectService.js +160 -0
  437. package/services/RobotService.d.ts +278 -0
  438. package/services/RobotService.js +460 -0
  439. package/services/ScheduleService.d.ts +22 -0
  440. package/services/ScheduleService.js +36 -0
  441. package/services/SearchService.d.ts +12 -0
  442. package/services/SearchService.js +58 -0
  443. package/services/SearchServiceNode.d.ts +6 -0
  444. package/services/SearchServiceNode.js +7 -0
  445. package/services/SpotProvisioningService.d.ts +14 -0
  446. package/services/SpotProvisioningService.js +43 -0
  447. package/services/SpotProvisioningServiceNode.d.ts +15 -0
  448. package/services/SpotProvisioningServiceNode.js +43 -0
  449. package/services/StreamService.d.ts +98 -0
  450. package/services/StreamService.js +142 -0
  451. package/services/TelemetryService.d.ts +40 -0
  452. package/services/TelemetryService.js +142 -0
  453. package/services/TelemetryService.spec.d.ts +1 -0
  454. package/services/TelemetryService.spec.js +37 -0
  455. package/services/TelemetryServiceNode.d.ts +6 -0
  456. package/services/TelemetryServiceNode.js +7 -0
  457. package/services/TimeSyncerService.d.ts +13 -0
  458. package/services/TimeSyncerService.js +23 -0
  459. package/services/UserService.d.ts +200 -0
  460. package/services/UserService.js +315 -0
  461. package/services/WebRTCSignallingService.d.ts +22 -0
  462. package/services/WebRTCSignallingService.js +78 -0
  463. package/services/WorkflowService.d.ts +71 -0
  464. package/services/WorkflowService.js +118 -0
  465. package/services/index.d.ts +26 -0
  466. package/services/index.js +26 -0
  467. package/store/RocosStore.d.ts +31 -0
  468. 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
+ }