@dronedeploy/rocos-js-sdk 1.0.0-alpha-2 → 2.6.1

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