doover-js 0.11.0 → 0.13.0

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 (389) hide show
  1. package/README.md +106 -0
  2. package/dist/apis/_args.js +5 -5
  3. package/dist/apis/agents-api.d.ts +4 -4
  4. package/dist/apis/agents-api.js +2 -2
  5. package/dist/apis/aggregates-api.d.ts +4 -4
  6. package/dist/apis/aggregates-api.js +5 -5
  7. package/dist/apis/alarms-api.d.ts +2 -2
  8. package/dist/apis/alarms-api.js +3 -3
  9. package/dist/apis/channels-api.d.ts +3 -3
  10. package/dist/apis/channels-api.js +6 -6
  11. package/dist/apis/connections-api.d.ts +2 -2
  12. package/dist/apis/connections-api.js +6 -6
  13. package/dist/apis/messages-api.d.ts +4 -4
  14. package/dist/apis/messages-api.js +11 -11
  15. package/dist/apis/notifications-api.d.ts +2 -2
  16. package/dist/apis/notifications-api.js +4 -4
  17. package/dist/apis/organisations-api.d.ts +2 -2
  18. package/dist/apis/permissions-api.d.ts +2 -2
  19. package/dist/apis/permissions-api.js +3 -3
  20. package/dist/apis/processors-api.d.ts +2 -2
  21. package/dist/apis/turn-api.d.ts +2 -2
  22. package/dist/apis/users-api.d.ts +2 -2
  23. package/dist/auth/auth-store.d.ts +1 -1
  24. package/dist/auth/build-auth.d.ts +3 -3
  25. package/dist/auth/build-auth.js +8 -8
  26. package/dist/auth/cookie-auth.d.ts +1 -1
  27. package/dist/auth/cookie-auth.js +2 -2
  28. package/dist/auth/doover-auth.d.ts +2 -2
  29. package/dist/auth/doover-token-auth.d.ts +3 -3
  30. package/dist/auth/doover-token-auth.js +13 -13
  31. package/dist/auth/index.d.ts +10 -0
  32. package/dist/auth/index.js +15 -0
  33. package/dist/client/data-client.d.ts +17 -14
  34. package/dist/client/doover-client.d.ts +9 -7
  35. package/dist/client/doover-client.js +44 -42
  36. package/dist/client/errors.d.ts +2 -2
  37. package/dist/client/errors.js +4 -4
  38. package/dist/client/index.d.ts +6 -0
  39. package/dist/client/index.js +12 -0
  40. package/dist/client/local-agent-client.d.ts +3 -3
  41. package/dist/client/local-agent-client.js +19 -19
  42. package/dist/client/multiplex-client.d.ts +5 -5
  43. package/dist/client/multiplex-client.js +25 -25
  44. package/dist/client/multiplex-gateway.d.ts +3 -3
  45. package/dist/client/multiplex-merge.d.ts +1 -1
  46. package/dist/client/network-status.d.ts +17 -0
  47. package/dist/client/network-status.js +70 -0
  48. package/dist/client/offline-cache.d.ts +9 -4
  49. package/dist/client/offline-cache.js +34 -22
  50. package/dist/client/provenance.d.ts +1 -1
  51. package/dist/client/request-options.d.ts +1 -1
  52. package/dist/client/singleton.d.ts +2 -2
  53. package/dist/client/singleton.js +2 -2
  54. package/dist/client/status-tracker.d.ts +1 -1
  55. package/dist/esm/apis/_args.d.ts +16 -0
  56. package/dist/esm/apis/_args.js +27 -0
  57. package/dist/esm/apis/agents-api.d.ts +196 -0
  58. package/dist/esm/apis/agents-api.js +327 -0
  59. package/dist/esm/apis/aggregates-api.d.ts +67 -0
  60. package/dist/esm/apis/aggregates-api.js +64 -0
  61. package/dist/esm/apis/alarms-api.d.ts +48 -0
  62. package/dist/esm/apis/alarms-api.js +75 -0
  63. package/dist/esm/apis/channels-api.d.ts +83 -0
  64. package/dist/esm/apis/channels-api.js +65 -0
  65. package/dist/esm/apis/connections-api.d.ts +45 -0
  66. package/dist/esm/apis/connections-api.js +44 -0
  67. package/dist/esm/apis/messages-api.d.ts +128 -0
  68. package/dist/esm/apis/messages-api.js +179 -0
  69. package/dist/esm/apis/notifications-api.d.ts +94 -0
  70. package/dist/esm/apis/notifications-api.js +153 -0
  71. package/dist/esm/apis/organisations-api.d.ts +26 -0
  72. package/dist/esm/apis/organisations-api.js +41 -0
  73. package/dist/esm/apis/permissions-api.d.ts +17 -0
  74. package/dist/esm/apis/permissions-api.js +23 -0
  75. package/dist/esm/apis/processors-api.d.ts +56 -0
  76. package/dist/esm/apis/processors-api.js +97 -0
  77. package/dist/esm/apis/turn-api.d.ts +7 -0
  78. package/dist/esm/apis/turn-api.js +8 -0
  79. package/dist/esm/apis/users-api.d.ts +8 -0
  80. package/dist/esm/apis/users-api.js +9 -0
  81. package/dist/esm/auth/auth-profile.d.ts +45 -0
  82. package/dist/esm/auth/auth-profile.js +68 -0
  83. package/dist/esm/auth/auth-store.d.ts +14 -0
  84. package/dist/esm/auth/build-auth.d.ts +38 -0
  85. package/dist/esm/auth/build-auth.js +92 -0
  86. package/dist/esm/auth/cookie-auth.d.ts +91 -0
  87. package/dist/esm/auth/cookie-auth.js +196 -0
  88. package/dist/esm/auth/doover-auth.d.ts +52 -0
  89. package/dist/esm/auth/doover-auth.js +28 -0
  90. package/dist/esm/auth/doover-token-auth.d.ts +39 -0
  91. package/dist/esm/auth/doover-token-auth.js +217 -0
  92. package/dist/esm/auth/errors.d.ts +3 -0
  93. package/dist/esm/auth/errors.js +6 -0
  94. package/dist/esm/auth/index.d.ts +10 -0
  95. package/dist/esm/auth/index.js +6 -0
  96. package/dist/esm/auth/jwt.d.ts +6 -0
  97. package/dist/esm/auth/jwt.js +26 -0
  98. package/dist/esm/client/capabilities.d.ts +10 -0
  99. package/dist/esm/client/capabilities.js +42 -0
  100. package/dist/esm/client/data-client.d.ts +107 -0
  101. package/dist/esm/client/doover-client.d.ts +48 -0
  102. package/dist/esm/client/doover-client.js +96 -0
  103. package/dist/esm/client/errors.d.ts +32 -0
  104. package/dist/esm/client/errors.js +64 -0
  105. package/dist/esm/client/index.d.ts +6 -0
  106. package/dist/esm/client/index.js +3 -0
  107. package/dist/esm/client/local-agent-client.d.ts +65 -0
  108. package/dist/esm/client/local-agent-client.js +225 -0
  109. package/dist/esm/client/multiplex-client.d.ts +165 -0
  110. package/dist/esm/client/multiplex-client.js +842 -0
  111. package/dist/esm/client/multiplex-gateway.d.ts +49 -0
  112. package/dist/esm/client/multiplex-gateway.js +110 -0
  113. package/dist/esm/client/multiplex-merge.d.ts +12 -0
  114. package/dist/esm/client/multiplex-merge.js +38 -0
  115. package/dist/esm/client/network-status.d.ts +17 -0
  116. package/dist/esm/client/network-status.js +66 -0
  117. package/dist/esm/client/offline-cache.d.ts +167 -0
  118. package/dist/esm/client/offline-cache.js +769 -0
  119. package/dist/esm/client/provenance.d.ts +60 -0
  120. package/dist/esm/client/provenance.js +108 -0
  121. package/dist/esm/client/request-options.d.ts +23 -0
  122. package/dist/esm/client/request-options.js +23 -0
  123. package/dist/esm/client/singleton.d.ts +26 -0
  124. package/dist/esm/client/singleton.js +54 -0
  125. package/dist/esm/client/stats.d.ts +79 -0
  126. package/dist/esm/client/stats.js +155 -0
  127. package/dist/esm/client/status-tracker.d.ts +24 -0
  128. package/dist/esm/client/status-tracker.js +86 -0
  129. package/dist/esm/gateway/gateway-client.d.ts +86 -0
  130. package/dist/esm/gateway/gateway-client.js +463 -0
  131. package/dist/esm/gateway/index.d.ts +3 -0
  132. package/dist/esm/gateway/index.js +1 -0
  133. package/dist/esm/gateway/types.d.ts +142 -0
  134. package/dist/esm/http/errors.d.ts +19 -0
  135. package/dist/esm/http/errors.js +22 -0
  136. package/dist/esm/http/index.d.ts +3 -0
  137. package/dist/esm/http/index.js +2 -0
  138. package/dist/esm/http/rest-client.d.ts +64 -0
  139. package/dist/esm/http/rest-client.js +181 -0
  140. package/dist/esm/index.d.ts +64 -0
  141. package/dist/esm/index.js +38 -0
  142. package/dist/esm/node/config-manager.d.ts +34 -0
  143. package/dist/esm/node/config-manager.js +140 -0
  144. package/dist/esm/node/index.d.ts +1 -0
  145. package/dist/esm/node/index.js +1 -0
  146. package/dist/esm/package.json +1 -0
  147. package/dist/esm/react/context.d.ts +23 -0
  148. package/dist/esm/react/context.js +28 -0
  149. package/dist/esm/react/index.d.ts +38 -0
  150. package/dist/esm/react/index.js +21 -0
  151. package/dist/esm/react/messageRangeStore.d.ts +93 -0
  152. package/dist/esm/react/messageRangeStore.js +140 -0
  153. package/dist/esm/react/sharedQueryClient.d.ts +21 -0
  154. package/dist/esm/react/sharedQueryClient.js +35 -0
  155. package/dist/esm/react/useAgentChannel.d.ts +8 -0
  156. package/dist/esm/react/useAgentChannel.js +9 -0
  157. package/dist/esm/react/useAgentConnections.d.ts +8 -0
  158. package/dist/esm/react/useAgentConnections.js +20 -0
  159. package/dist/esm/react/useAgentTokenState.d.ts +70 -0
  160. package/dist/esm/react/useAgentTokenState.js +127 -0
  161. package/dist/esm/react/useChannelAggregate.d.ts +64 -0
  162. package/dist/esm/react/useChannelAggregate.js +77 -0
  163. package/dist/esm/react/useChannelMessage.d.ts +45 -0
  164. package/dist/esm/react/useChannelMessage.js +79 -0
  165. package/dist/esm/react/useChannelMessages.d.ts +83 -0
  166. package/dist/esm/react/useChannelMessages.js +214 -0
  167. package/dist/esm/react/useChannelSubscription.d.ts +27 -0
  168. package/dist/esm/react/useChannelSubscription.js +30 -0
  169. package/dist/esm/react/useClientStatus.d.ts +10 -0
  170. package/dist/esm/react/useClientStatus.js +19 -0
  171. package/dist/esm/react/useConnectionState.d.ts +26 -0
  172. package/dist/esm/react/useConnectionState.js +45 -0
  173. package/dist/esm/react/useDeviceMap.d.ts +109 -0
  174. package/dist/esm/react/useDeviceMap.js +59 -0
  175. package/dist/esm/react/useInvocationLogs.d.ts +23 -0
  176. package/dist/esm/react/useInvocationLogs.js +37 -0
  177. package/dist/esm/react/useMultiAgentAggregates.d.ts +38 -0
  178. package/dist/esm/react/useMultiAgentAggregates.js +104 -0
  179. package/dist/esm/react/useMultiAgentChannelMessages.d.ts +79 -0
  180. package/dist/esm/react/useMultiAgentChannelMessages.js +169 -0
  181. package/dist/esm/react/useOfflineStatus.d.ts +8 -0
  182. package/dist/esm/react/useOfflineStatus.js +37 -0
  183. package/dist/esm/react/useSendMessage.d.ts +16 -0
  184. package/dist/esm/react/useSendMessage.js +26 -0
  185. package/dist/esm/react/useSendRpc.d.ts +68 -0
  186. package/dist/esm/react/useSendRpc.js +164 -0
  187. package/dist/esm/react/useTurnCredentials.d.ts +12 -0
  188. package/dist/esm/react/useTurnCredentials.js +22 -0
  189. package/dist/esm/react/useUpdateAggregate.d.ts +27 -0
  190. package/dist/esm/react/useUpdateAggregate.js +39 -0
  191. package/dist/esm/react/useUpdateMessage.d.ts +38 -0
  192. package/dist/esm/react/useUpdateMessage.js +36 -0
  193. package/dist/esm/refine/index.d.ts +72 -0
  194. package/dist/esm/refine/index.js +215 -0
  195. package/dist/esm/rpc/errors.d.ts +10 -0
  196. package/dist/esm/rpc/errors.js +19 -0
  197. package/dist/esm/rpc/index.d.ts +3 -0
  198. package/dist/esm/rpc/index.js +2 -0
  199. package/dist/esm/rpc/rpc-dispatcher.d.ts +41 -0
  200. package/dist/esm/rpc/rpc-dispatcher.js +141 -0
  201. package/dist/esm/types/audit.d.ts +53 -0
  202. package/dist/esm/types/audit.js +11 -0
  203. package/dist/esm/types/batch.d.ts +85 -0
  204. package/dist/esm/types/batch.js +42 -0
  205. package/dist/esm/types/common.d.ts +250 -0
  206. package/dist/esm/types/connection.d.ts +72 -0
  207. package/dist/esm/types/connection.js +7 -0
  208. package/dist/esm/types/index.d.ts +9 -0
  209. package/dist/esm/types/openapi.d.ts +195 -0
  210. package/dist/esm/types/provenance.d.ts +45 -0
  211. package/dist/esm/types/viewer.d.ts +122 -0
  212. package/dist/esm/utils/snowflake.d.ts +21 -0
  213. package/dist/esm/utils/snowflake.js +33 -0
  214. package/dist/esm/viewer/doover-data-provider.d.ts +90 -0
  215. package/dist/esm/viewer/doover-data-provider.js +189 -0
  216. package/dist/esm/viewer/path-parsing.d.ts +5 -0
  217. package/dist/esm/viewer/path-parsing.js +35 -0
  218. package/dist/gateway/gateway-client.d.ts +5 -5
  219. package/dist/gateway/gateway-client.js +5 -5
  220. package/dist/gateway/index.d.ts +3 -0
  221. package/dist/gateway/index.js +5 -0
  222. package/dist/gateway/types.d.ts +1 -1
  223. package/dist/http/index.d.ts +3 -0
  224. package/dist/http/index.js +9 -0
  225. package/dist/http/rest-client.d.ts +5 -3
  226. package/dist/http/rest-client.js +2 -2
  227. package/dist/index.d.ts +64 -62
  228. package/dist/index.js +92 -89
  229. package/dist/node/config-manager.d.ts +2 -2
  230. package/dist/node/config-manager.js +5 -5
  231. package/dist/node/index.d.ts +1 -1
  232. package/dist/node/index.js +2 -2
  233. package/dist/react/context.d.ts +1 -1
  234. package/dist/react/index.d.ts +38 -38
  235. package/dist/react/index.js +59 -59
  236. package/dist/react/messageRangeStore.d.ts +1 -1
  237. package/dist/react/useAgentChannel.d.ts +3 -3
  238. package/dist/react/useAgentChannel.js +2 -2
  239. package/dist/react/useAgentConnections.d.ts +1 -1
  240. package/dist/react/useAgentConnections.js +2 -2
  241. package/dist/react/useAgentTokenState.d.ts +3 -3
  242. package/dist/react/useAgentTokenState.js +8 -8
  243. package/dist/react/useChannelAggregate.d.ts +3 -3
  244. package/dist/react/useChannelAggregate.js +8 -8
  245. package/dist/react/useChannelMessage.d.ts +2 -2
  246. package/dist/react/useChannelMessage.js +4 -4
  247. package/dist/react/useChannelMessages.d.ts +3 -3
  248. package/dist/react/useChannelMessages.js +10 -10
  249. package/dist/react/useChannelSubscription.d.ts +2 -2
  250. package/dist/react/useChannelSubscription.js +2 -2
  251. package/dist/react/useClientStatus.d.ts +1 -1
  252. package/dist/react/useClientStatus.js +2 -2
  253. package/dist/react/useConnectionState.js +2 -2
  254. package/dist/react/useDeviceMap.js +2 -2
  255. package/dist/react/useInvocationLogs.d.ts +1 -1
  256. package/dist/react/useInvocationLogs.js +2 -2
  257. package/dist/react/useMultiAgentAggregates.d.ts +1 -1
  258. package/dist/react/useMultiAgentAggregates.js +5 -5
  259. package/dist/react/useMultiAgentChannelMessages.d.ts +1 -1
  260. package/dist/react/useMultiAgentChannelMessages.js +2 -2
  261. package/dist/react/useOfflineStatus.d.ts +2 -2
  262. package/dist/react/useOfflineStatus.js +31 -17
  263. package/dist/react/useSendMessage.d.ts +2 -2
  264. package/dist/react/useSendMessage.js +2 -2
  265. package/dist/react/useSendRpc.d.ts +2 -2
  266. package/dist/react/useSendRpc.js +2 -2
  267. package/dist/react/useTurnCredentials.d.ts +2 -2
  268. package/dist/react/useTurnCredentials.js +2 -2
  269. package/dist/react/useUpdateAggregate.d.ts +3 -3
  270. package/dist/react/useUpdateAggregate.js +4 -4
  271. package/dist/react/useUpdateMessage.d.ts +2 -2
  272. package/dist/react/useUpdateMessage.js +2 -2
  273. package/dist/refine/index.d.ts +1 -1
  274. package/dist/rpc/errors.d.ts +1 -1
  275. package/dist/rpc/index.d.ts +3 -0
  276. package/dist/rpc/index.js +7 -0
  277. package/dist/rpc/rpc-dispatcher.d.ts +4 -4
  278. package/dist/rpc/rpc-dispatcher.js +2 -2
  279. package/dist/types/common.d.ts +1 -1
  280. package/dist/types/index.d.ts +9 -0
  281. package/dist/types/index.js +2 -0
  282. package/dist/types/openapi.d.ts +1 -1
  283. package/dist/types/viewer.d.ts +2 -2
  284. package/dist/viewer/doover-data-provider.d.ts +10 -10
  285. package/dist/viewer/doover-data-provider.js +25 -25
  286. package/dist/viewer/path-parsing.d.ts +1 -1
  287. package/package.json +795 -8
  288. package/dist/test/api-args.test.js +0 -48
  289. package/dist/test/api-overloads.test.d.ts +0 -9
  290. package/dist/test/api-overloads.test.js +0 -330
  291. package/dist/test/apis.test.js +0 -408
  292. package/dist/test/auth.test.js +0 -708
  293. package/dist/test/batch-apis.test.js +0 -183
  294. package/dist/test/capabilities.test.js +0 -27
  295. package/dist/test/config-manager.test.js +0 -160
  296. package/dist/test/data-client-errors.test.js +0 -24
  297. package/dist/test/data-client-shape.test.js +0 -28
  298. package/dist/test/doover-client-dataclient.test.d.ts +0 -1
  299. package/dist/test/doover-client-dataclient.test.js +0 -58
  300. package/dist/test/doover-client-provenance.test.d.ts +0 -1
  301. package/dist/test/doover-client-provenance.test.js +0 -32
  302. package/dist/test/doover-client.test.d.ts +0 -1
  303. package/dist/test/doover-client.test.js +0 -42
  304. package/dist/test/doover-data-provider.test.d.ts +0 -1
  305. package/dist/test/doover-data-provider.test.js +0 -657
  306. package/dist/test/exports.test.d.ts +0 -1
  307. package/dist/test/exports.test.js +0 -80
  308. package/dist/test/gateway-client.test.d.ts +0 -1
  309. package/dist/test/gateway-client.test.js +0 -474
  310. package/dist/test/gateway-provenance.test.d.ts +0 -1
  311. package/dist/test/gateway-provenance.test.js +0 -29
  312. package/dist/test/gateway-subscriptions.test.d.ts +0 -1
  313. package/dist/test/gateway-subscriptions.test.js +0 -95
  314. package/dist/test/helpers.d.ts +0 -32
  315. package/dist/test/helpers.js +0 -115
  316. package/dist/test/local-agent-client.test.d.ts +0 -1
  317. package/dist/test/local-agent-client.test.js +0 -202
  318. package/dist/test/message-range-store.test.d.ts +0 -1
  319. package/dist/test/message-range-store.test.js +0 -183
  320. package/dist/test/multiplex-capabilities.test.d.ts +0 -1
  321. package/dist/test/multiplex-capabilities.test.js +0 -37
  322. package/dist/test/multiplex-conflicts.test.d.ts +0 -1
  323. package/dist/test/multiplex-conflicts.test.js +0 -35
  324. package/dist/test/multiplex-gateway.test.d.ts +0 -1
  325. package/dist/test/multiplex-gateway.test.js +0 -103
  326. package/dist/test/multiplex-merge.test.d.ts +0 -1
  327. package/dist/test/multiplex-merge.test.js +0 -19
  328. package/dist/test/multiplex-noncore.test.d.ts +0 -1
  329. package/dist/test/multiplex-noncore.test.js +0 -82
  330. package/dist/test/multiplex-passthrough.test.d.ts +0 -1
  331. package/dist/test/multiplex-passthrough.test.js +0 -35
  332. package/dist/test/multiplex-reads.test.d.ts +0 -1
  333. package/dist/test/multiplex-reads.test.js +0 -87
  334. package/dist/test/multiplex-registry.test.d.ts +0 -1
  335. package/dist/test/multiplex-registry.test.js +0 -81
  336. package/dist/test/multiplex-routing.test.d.ts +0 -1
  337. package/dist/test/multiplex-routing.test.js +0 -45
  338. package/dist/test/multiplex-status.test.d.ts +0 -1
  339. package/dist/test/multiplex-status.test.js +0 -63
  340. package/dist/test/multiplex-writes.test.d.ts +0 -1
  341. package/dist/test/multiplex-writes.test.js +0 -93
  342. package/dist/test/offline-cache.test.d.ts +0 -1
  343. package/dist/test/offline-cache.test.js +0 -289
  344. package/dist/test/provenance-regression.test.d.ts +0 -1
  345. package/dist/test/provenance-regression.test.js +0 -45
  346. package/dist/test/provenance-stamper.test.d.ts +0 -1
  347. package/dist/test/provenance-stamper.test.js +0 -41
  348. package/dist/test/provenance-type.test.d.ts +0 -1
  349. package/dist/test/provenance-type.test.js +0 -15
  350. package/dist/test/react-channel-messages-forward.test.d.ts +0 -1
  351. package/dist/test/react-channel-messages-forward.test.js +0 -139
  352. package/dist/test/react-channel-messages-range.test.d.ts +0 -1
  353. package/dist/test/react-channel-messages-range.test.js +0 -109
  354. package/dist/test/react-client-status.test.d.ts +0 -1
  355. package/dist/test/react-client-status.test.js +0 -35
  356. package/dist/test/react-dataclient.test.d.ts +0 -1
  357. package/dist/test/react-dataclient.test.js +0 -28
  358. package/dist/test/react-exports.test.d.ts +0 -1
  359. package/dist/test/react-exports.test.js +0 -46
  360. package/dist/test/react-multiagent-messages.test.d.ts +0 -1
  361. package/dist/test/react-multiagent-messages.test.js +0 -113
  362. package/dist/test/react-sources-option.test.d.ts +0 -1
  363. package/dist/test/react-sources-option.test.js +0 -41
  364. package/dist/test/react.test.d.ts +0 -1
  365. package/dist/test/react.test.js +0 -482
  366. package/dist/test/refine.test.d.ts +0 -1
  367. package/dist/test/refine.test.js +0 -71
  368. package/dist/test/rest-client.test.d.ts +0 -1
  369. package/dist/test/rest-client.test.js +0 -197
  370. package/dist/test/rpc-dispatcher.test.d.ts +0 -1
  371. package/dist/test/rpc-dispatcher.test.js +0 -251
  372. package/dist/test/singleton.test.d.ts +0 -1
  373. package/dist/test/singleton.test.js +0 -62
  374. package/dist/test/stats-rpc.test.d.ts +0 -1
  375. package/dist/test/stats-rpc.test.js +0 -69
  376. package/dist/test/status-tracker.test.d.ts +0 -1
  377. package/dist/test/status-tracker.test.js +0 -85
  378. package/dist/test/users-api.test.d.ts +0 -1
  379. package/dist/test/users-api.test.js +0 -19
  380. package/dist/test/utils.test.d.ts +0 -1
  381. package/dist/test/utils.test.js +0 -64
  382. /package/dist/{test/api-args.test.d.ts → esm/auth/auth-store.js} +0 -0
  383. /package/dist/{test/apis.test.d.ts → esm/client/data-client.js} +0 -0
  384. /package/dist/{test/auth.test.d.ts → esm/gateway/types.js} +0 -0
  385. /package/dist/{test/batch-apis.test.d.ts → esm/types/common.js} +0 -0
  386. /package/dist/{test/capabilities.test.d.ts → esm/types/index.js} +0 -0
  387. /package/dist/{test/config-manager.test.d.ts → esm/types/openapi.js} +0 -0
  388. /package/dist/{test/data-client-errors.test.d.ts → esm/types/provenance.js} +0 -0
  389. /package/dist/{test/data-client-shape.test.d.ts → esm/types/viewer.js} +0 -0
@@ -1,197 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const chai_1 = require("chai");
7
- const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
8
- const mocha_1 = require("mocha");
9
- const doover_auth_1 = require("../auth/doover-auth");
10
- const rest_client_1 = require("../http/rest-client");
11
- const helpers_1 = require("./helpers");
12
- (0, chai_1.use)(chai_as_promised_1.default);
13
- class RefreshableAuth extends doover_auth_1.DooverAuth {
14
- constructor() {
15
- super(...arguments);
16
- this.refreshCount = 0;
17
- }
18
- async getHttpHeaders() {
19
- return { Authorization: `Bearer token-${this.refreshCount}` };
20
- }
21
- getFetchCredentials() {
22
- return "omit";
23
- }
24
- async prepareWebSocket(url) {
25
- return { url };
26
- }
27
- setToken() {
28
- // no-op for test
29
- }
30
- setRefreshToken() {
31
- // no-op for test
32
- }
33
- async ensureReady() {
34
- // no-op for test
35
- }
36
- async handleUnauthorized() {
37
- this.refreshCount += 1;
38
- return true;
39
- }
40
- }
41
- (0, mocha_1.describe)("RestClient", () => {
42
- (0, mocha_1.beforeEach)(() => {
43
- (0, helpers_1.installSessionStorageMock)();
44
- });
45
- (0, mocha_1.it)("adds query params and compatibility headers", async () => {
46
- sessionStorage.setItem("impersonate_user_id", "user-2");
47
- const fetchMock = (0, helpers_1.createFetchMock)();
48
- const client = new rest_client_1.RestClient({
49
- dataRestUrl: "https://api.example.com",
50
- controlApiUrl: "https://control.example.com",
51
- dataWssUrl: "wss://ws.example.com",
52
- organisationId: "org-1",
53
- fetchImpl: fetchMock,
54
- });
55
- await client.get("/items", { tag: ["a", "b"], enabled: true });
56
- (0, chai_1.expect)(fetchMock.callCount).to.equal(1);
57
- const [url, init] = fetchMock.getCall(0).args;
58
- (0, chai_1.expect)(url).to.equal("https://api.example.com/items?tag=a&tag=b&enabled=true");
59
- (0, chai_1.expect)(init?.credentials).to.equal("include");
60
- const headers = init?.headers;
61
- (0, chai_1.expect)(headers.get("X-Doover-Sharing")).to.equal("internal");
62
- (0, chai_1.expect)(headers.get("X-Doover-Organisation")).to.equal("org-1");
63
- (0, chai_1.expect)(headers.get("X-Doover-Assume")).to.equal("user-2");
64
- });
65
- (0, mocha_1.it)("can omit the sharing header for specific requests", async () => {
66
- const fetchMock = (0, helpers_1.createFetchMock)();
67
- const client = new rest_client_1.RestClient({
68
- dataRestUrl: "https://api.example.com",
69
- controlApiUrl: "https://control.example.com",
70
- dataWssUrl: "wss://ws.example.com",
71
- fetchImpl: fetchMock,
72
- });
73
- await client.request({
74
- path: "/agents",
75
- baseUrl: "https://control.example.com",
76
- omitSharingHeader: true,
77
- });
78
- const [, init] = fetchMock.getCall(0).args;
79
- const headers = init?.headers;
80
- (0, chai_1.expect)(headers.get("X-Doover-Sharing")).to.equal(null);
81
- });
82
- (0, mocha_1.it)("serializes JSON request bodies", async () => {
83
- const fetchMock = (0, helpers_1.createFetchMock)();
84
- const client = new rest_client_1.RestClient({
85
- dataRestUrl: "https://api.example.com",
86
- controlApiUrl: "https://control.example.com",
87
- dataWssUrl: "wss://ws.example.com",
88
- fetchImpl: fetchMock,
89
- });
90
- await client.post("/items", { name: "alpha" });
91
- const [, init] = fetchMock.getCall(0).args;
92
- (0, chai_1.expect)(init?.method).to.equal("POST");
93
- (0, chai_1.expect)(init?.body).to.equal(JSON.stringify({ name: "alpha" }));
94
- const headers = init?.headers;
95
- (0, chai_1.expect)(headers.get("Content-Type")).to.equal("application/json");
96
- });
97
- (0, mocha_1.it)("passes through FormData bodies without forcing JSON content type", async () => {
98
- const fetchMock = (0, helpers_1.createFetchMock)();
99
- const client = new rest_client_1.RestClient({
100
- dataRestUrl: "https://api.example.com",
101
- controlApiUrl: "https://control.example.com",
102
- dataWssUrl: "wss://ws.example.com",
103
- fetchImpl: fetchMock,
104
- });
105
- const formData = new FormData();
106
- formData.set("a", "1");
107
- await client.post("/upload", formData);
108
- const [, init] = fetchMock.getCall(0).args;
109
- (0, chai_1.expect)(init?.body).to.equal(formData);
110
- const headers = init?.headers;
111
- (0, chai_1.expect)(headers.get("Content-Type")).to.equal(null);
112
- });
113
- (0, mocha_1.it)("parses blob responses for attachments", async () => {
114
- const fetchMock = (0, helpers_1.createFetchMock)(() => (0, helpers_1.createBlobResponse)("hello"));
115
- const client = new rest_client_1.RestClient({
116
- dataRestUrl: "https://api.example.com",
117
- controlApiUrl: "https://control.example.com",
118
- dataWssUrl: "wss://ws.example.com",
119
- fetchImpl: fetchMock,
120
- });
121
- const blob = await client.get("/blob");
122
- (0, chai_1.expect)(blob).to.be.instanceOf(Blob);
123
- (0, chai_1.expect)(await blob.text()).to.equal("hello");
124
- });
125
- (0, mocha_1.it)("returns undefined for empty 204 responses", async () => {
126
- const fetchMock = (0, helpers_1.createFetchMock)(() => new Response(null, { status: 204 }));
127
- const client = new rest_client_1.RestClient({
128
- dataRestUrl: "https://api.example.com",
129
- controlApiUrl: "https://control.example.com",
130
- dataWssUrl: "wss://ws.example.com",
131
- fetchImpl: fetchMock,
132
- });
133
- await (0, chai_1.expect)(client.delete("/items/1")).to.eventually.equal(undefined);
134
- });
135
- (0, mocha_1.it)("throws a DooverApiError on non-2xx responses", async () => {
136
- const fetchMock = (0, helpers_1.createFetchMock)(() => (0, helpers_1.createJsonResponse)({ message: "bad request" }, { status: 400 }));
137
- const client = new rest_client_1.RestClient({
138
- dataRestUrl: "https://api.example.com",
139
- controlApiUrl: "https://control.example.com",
140
- dataWssUrl: "wss://ws.example.com",
141
- fetchImpl: fetchMock,
142
- });
143
- await (0, chai_1.expect)(client.get("/broken")).to.be.rejected.then((error) => {
144
- (0, chai_1.expect)(error.name).to.equal("DooverApiError");
145
- (0, chai_1.expect)(error.status).to.equal(400);
146
- (0, chai_1.expect)(error.message).to.equal("bad request");
147
- (0, chai_1.expect)(error.url).to.equal("https://api.example.com/broken");
148
- (0, chai_1.expect)(error.method).to.equal("GET");
149
- });
150
- });
151
- (0, mocha_1.it)("refreshes auth once and retries after a 401 response", async () => {
152
- const auth = new RefreshableAuth();
153
- const fetchMock = (0, helpers_1.createFetchMock)(() => {
154
- if (fetchMock.callCount === 1) {
155
- return (0, helpers_1.createJsonResponse)({ message: "expired" }, { status: 401 });
156
- }
157
- return (0, helpers_1.createJsonResponse)({ ok: true });
158
- });
159
- const client = new rest_client_1.RestClient({
160
- dataRestUrl: "https://api.example.com",
161
- controlApiUrl: "https://control.example.com",
162
- dataWssUrl: "wss://ws.example.com",
163
- fetchImpl: fetchMock,
164
- }, auth);
165
- await (0, chai_1.expect)(client.get("/needs-auth")).to.eventually.deep.equal({ ok: true });
166
- (0, chai_1.expect)(auth.refreshCount).to.equal(1);
167
- (0, chai_1.expect)(fetchMock.callCount).to.equal(2);
168
- (0, chai_1.expect)((fetchMock.getCall(0).args[1]?.headers).get("Authorization")).to.equal("Bearer token-0");
169
- (0, chai_1.expect)((fetchMock.getCall(1).args[1]?.headers).get("Authorization")).to.equal("Bearer token-1");
170
- });
171
- (0, mocha_1.it)("does not retry a 401 response when auth refresh cannot recover", async () => {
172
- const auth = new RefreshableAuth();
173
- auth.handleUnauthorized = async () => false;
174
- const fetchMock = (0, helpers_1.createFetchMock)(() => (0, helpers_1.createJsonResponse)({ message: "expired" }, { status: 401 }));
175
- const client = new rest_client_1.RestClient({
176
- dataRestUrl: "https://api.example.com",
177
- controlApiUrl: "https://control.example.com",
178
- dataWssUrl: "wss://ws.example.com",
179
- fetchImpl: fetchMock,
180
- }, auth);
181
- await (0, chai_1.expect)(client.get("/needs-auth")).to.be.rejected.then((error) => {
182
- (0, chai_1.expect)(error.status).to.equal(401);
183
- (0, chai_1.expect)(error.message).to.equal("expired");
184
- });
185
- (0, chai_1.expect)(fetchMock.callCount).to.equal(1);
186
- });
187
- (0, mocha_1.it)("returns text bodies when the response is not JSON", async () => {
188
- const fetchMock = (0, helpers_1.createFetchMock)(() => (0, helpers_1.createTextResponse)("plain text"));
189
- const client = new rest_client_1.RestClient({
190
- dataRestUrl: "https://api.example.com",
191
- controlApiUrl: "https://control.example.com",
192
- dataWssUrl: "wss://ws.example.com",
193
- fetchImpl: fetchMock,
194
- });
195
- await (0, chai_1.expect)(client.get("/text")).to.eventually.equal("plain text");
196
- });
197
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,251 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chai_1 = require("chai");
4
- const node_events_1 = require("node:events");
5
- const rpc_dispatcher_1 = require("../rpc/rpc-dispatcher");
6
- const errors_1 = require("../rpc/errors");
7
- const stats_1 = require("../client/stats");
8
- function makeFakeGateway() {
9
- const ee = new node_events_1.EventEmitter();
10
- let subscribeCalls = 0;
11
- let unsubscribeCalls = 0;
12
- const channels = new Map();
13
- const key = (c) => `${c.agent_id}/${c.name}`;
14
- const subscribeToChannel = (channel, handlers) => {
15
- const k = key(channel);
16
- let set = channels.get(k);
17
- if (!set) {
18
- set = new Set();
19
- channels.set(k, set);
20
- subscribeCalls += 1;
21
- }
22
- set.add(handlers);
23
- ee.on("messageUpdate", (msg, requestData) => {
24
- if (msg.channel.agent_id !== channel.agent_id || msg.channel.name !== channel.name)
25
- return;
26
- handlers.onMessageUpdate?.(msg, requestData);
27
- });
28
- let off = false;
29
- return () => {
30
- if (off)
31
- return;
32
- off = true;
33
- set.delete(handlers);
34
- if (set.size === 0) {
35
- channels.delete(k);
36
- unsubscribeCalls += 1;
37
- }
38
- };
39
- };
40
- return {
41
- subscribeToChannel: subscribeToChannel,
42
- emitMessageUpdate: (msg, rd) => ee.emit("messageUpdate", msg, rd),
43
- get subscribeCalls() { return subscribeCalls; },
44
- get unsubscribeCalls() { return unsubscribeCalls; },
45
- };
46
- }
47
- function makeFakeMessagesApi() {
48
- let nextId = "msg-1";
49
- const posts = [];
50
- const postMessage = (async (a, b, c) => {
51
- const isPositional = typeof a === "string";
52
- const agentId = isPositional ? a : a.agentId;
53
- const channelName = isPositional ? b : a.channelName;
54
- const body = isPositional ? c : b;
55
- posts.push({ agentId, channelName, body });
56
- const message = {
57
- id: nextId,
58
- data: body,
59
- attachments: [],
60
- author_id: "auth",
61
- channel: { agent_id: agentId, name: channelName },
62
- timestamp: 1,
63
- };
64
- return message;
65
- });
66
- return {
67
- postMessage,
68
- posts,
69
- setNextId: (id) => { nextId = id; },
70
- };
71
- }
72
- function rpcMessage(id, channel, status, request, response) {
73
- return {
74
- id,
75
- data: { method: "do", request, status, response: response },
76
- attachments: [],
77
- author_id: "auth",
78
- channel,
79
- timestamp: 1,
80
- };
81
- }
82
- describe("RpcDispatcher", () => {
83
- it("send resolves on terminal success status", async () => {
84
- const gw = makeFakeGateway();
85
- const messages = makeFakeMessagesApi();
86
- messages.setNextId("rpc-1");
87
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
88
- const channel = { agent_id: "a1", name: "c1" };
89
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: { x: 1 } });
90
- // wait one microtask so postMessage settles and pending is registered
91
- await new Promise((r) => setImmediate(r));
92
- gw.emitMessageUpdate(rpcMessage("rpc-1", channel, { code: "success" }, { x: 1 }, { ok: true }));
93
- const result = await promise;
94
- (0, chai_1.expect)(result).to.deep.equal({ ok: true });
95
- (0, chai_1.expect)(gw.subscribeCalls).to.equal(1);
96
- (0, chai_1.expect)(gw.unsubscribeCalls).to.equal(1);
97
- });
98
- });
99
- describe("RpcDispatcher additional outcomes", () => {
100
- it("rejects with DooverRpcError on terminal error status", async () => {
101
- const gw = makeFakeGateway();
102
- const messages = makeFakeMessagesApi();
103
- messages.setNextId("rpc-2");
104
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
105
- const channel = { agent_id: "a1", name: "c1" };
106
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} });
107
- await new Promise((r) => setImmediate(r));
108
- gw.emitMessageUpdate(rpcMessage("rpc-2", channel, { code: "error", message: "nope" }, {}));
109
- let caught;
110
- try {
111
- await promise;
112
- }
113
- catch (e) {
114
- caught = e;
115
- }
116
- (0, chai_1.expect)(caught).to.be.instanceOf(errors_1.DooverRpcError);
117
- (0, chai_1.expect)(caught.message).to.equal("nope");
118
- });
119
- it("rejects on timeoutMs with no terminal status", async () => {
120
- const gw = makeFakeGateway();
121
- const messages = makeFakeMessagesApi();
122
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
123
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} }, { timeoutMs: 5 });
124
- let caught;
125
- try {
126
- await promise;
127
- }
128
- catch (e) {
129
- caught = e;
130
- }
131
- (0, chai_1.expect)(caught?.message).to.equal("RPC timed out");
132
- });
133
- it("rejects on AbortSignal.abort()", async () => {
134
- const gw = makeFakeGateway();
135
- const messages = makeFakeMessagesApi();
136
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
137
- const ac = new AbortController();
138
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} }, { signal: ac.signal });
139
- await new Promise((r) => setImmediate(r));
140
- ac.abort(new Error("user cancelled"));
141
- let caught;
142
- try {
143
- await promise;
144
- }
145
- catch (e) {
146
- caught = e;
147
- }
148
- (0, chai_1.expect)(caught?.message).to.equal("user cancelled");
149
- });
150
- it("two concurrent RPCs on the same channel share one gateway subscription", async () => {
151
- const gw = makeFakeGateway();
152
- const messages = makeFakeMessagesApi();
153
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
154
- messages.setNextId("rpc-A");
155
- const pA = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: { n: 1 } });
156
- await new Promise((r) => setImmediate(r));
157
- messages.setNextId("rpc-B");
158
- const pB = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: { n: 2 } });
159
- await new Promise((r) => setImmediate(r));
160
- (0, chai_1.expect)(gw.subscribeCalls).to.equal(1);
161
- const channel = { agent_id: "a1", name: "c1" };
162
- gw.emitMessageUpdate(rpcMessage("rpc-A", channel, { code: "success" }, { n: 1 }, { a: true }));
163
- gw.emitMessageUpdate(rpcMessage("rpc-B", channel, { code: "success" }, { n: 2 }, { b: true }));
164
- (0, chai_1.expect)(await pA).to.deep.equal({ a: true });
165
- (0, chai_1.expect)(await pB).to.deep.equal({ b: true });
166
- (0, chai_1.expect)(gw.unsubscribeCalls).to.equal(1);
167
- });
168
- });
169
- describe("RpcDispatcher stats integration", () => {
170
- it("records start and end via collector when enabled", async () => {
171
- const gw = makeFakeGateway();
172
- const messages = makeFakeMessagesApi();
173
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
174
- const stats = new stats_1.DooverStatsCollector();
175
- stats.setEnabled(true);
176
- dispatcher.setStats(stats);
177
- messages.setNextId("rpc-stats");
178
- const channel = { agent_id: "a1", name: "c1" };
179
- const p = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} });
180
- await new Promise((r) => setImmediate(r));
181
- (0, chai_1.expect)(stats.snapshot().rpc.pendingRpcs).to.equal(1);
182
- gw.emitMessageUpdate(rpcMessage("rpc-stats", channel, { code: "success" }, {}, { ok: true }));
183
- await p;
184
- const snap = stats.snapshot();
185
- (0, chai_1.expect)(snap.rpc.totalRpcs).to.equal(1);
186
- (0, chai_1.expect)(snap.rpc.completedRpcs).to.equal(1);
187
- (0, chai_1.expect)(snap.rpc.pendingRpcs).to.equal(0);
188
- (0, chai_1.expect)(snap.rpc.peakPendingRpcs).to.equal(1);
189
- });
190
- });
191
- describe("RpcDispatcher pending timeout", () => {
192
- const setup = (id) => {
193
- const gw = makeFakeGateway();
194
- const messages = makeFakeMessagesApi();
195
- messages.setNextId(id);
196
- const dispatcher = new rpc_dispatcher_1.RpcDispatcher(gw, messages);
197
- return { gw, dispatcher, channel: { agent_id: "a1", name: "c1" } };
198
- };
199
- it("replaces the initial timeout once the device answers", async () => {
200
- const { gw, dispatcher, channel } = setup("rpc-p1");
201
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} }, { timeoutMs: 10, pendingTimeoutMs: 200 });
202
- await new Promise((r) => setImmediate(r));
203
- // Acknowledged before the 10ms deadline: the command must survive well past
204
- // it, because the device has proven it is working.
205
- gw.emitMessageUpdate(rpcMessage("rpc-p1", channel, { code: "acknowledged", message: { timestamp: 1 } }, {}));
206
- await new Promise((r) => setTimeout(r, 60));
207
- gw.emitMessageUpdate(rpcMessage("rpc-p1", channel, { code: "success" }, {}, { ok: true }));
208
- (0, chai_1.expect)(await promise).to.deep.equal({ ok: true });
209
- });
210
- it("re-arms the pending budget on every progress report", async () => {
211
- const { gw, dispatcher, channel } = setup("rpc-p2");
212
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} }, { timeoutMs: 10, pendingTimeoutMs: 50 });
213
- await new Promise((r) => setImmediate(r));
214
- // Four reports, each well inside the 50ms budget but cumulatively past it.
215
- for (let i = 0; i < 4; i += 1) {
216
- gw.emitMessageUpdate(rpcMessage("rpc-p2", channel, { code: "pending", message: { text: `step ${i}` } }, {}));
217
- await new Promise((r) => setTimeout(r, 30));
218
- }
219
- gw.emitMessageUpdate(rpcMessage("rpc-p2", channel, { code: "success" }, {}, { ok: 1 }));
220
- (0, chai_1.expect)(await promise).to.deep.equal({ ok: 1 });
221
- });
222
- it("fails a device that answers and then goes quiet", async () => {
223
- const { gw, dispatcher, channel } = setup("rpc-p3");
224
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} }, { timeoutMs: 1000, pendingTimeoutMs: 20 });
225
- await new Promise((r) => setImmediate(r));
226
- gw.emitMessageUpdate(rpcMessage("rpc-p3", channel, { code: "acknowledged", message: { timestamp: 1 } }, {}));
227
- let caught;
228
- try {
229
- await promise;
230
- }
231
- catch (e) {
232
- caught = e;
233
- }
234
- // Distinct from "RPC timed out": it answered, then stopped.
235
- (0, chai_1.expect)(caught?.message).to.equal("Device stopped reporting progress");
236
- });
237
- it("keeps the flat deadline when no pending budget is given", async () => {
238
- const { gw, dispatcher, channel } = setup("rpc-p4");
239
- const promise = dispatcher.send({ agentId: "a1", channelName: "c1" }, { method: "do", request: {} }, { timeoutMs: 20 });
240
- await new Promise((r) => setImmediate(r));
241
- gw.emitMessageUpdate(rpcMessage("rpc-p4", channel, { code: "acknowledged", message: { timestamp: 1 } }, {}));
242
- let caught;
243
- try {
244
- await promise;
245
- }
246
- catch (e) {
247
- caught = e;
248
- }
249
- (0, chai_1.expect)(caught?.message).to.equal("RPC timed out");
250
- });
251
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const chai_1 = require("chai");
7
- const mocha_1 = require("mocha");
8
- const sinon_1 = __importDefault(require("sinon"));
9
- const doover_client_1 = require("../client/doover-client");
10
- const singleton_1 = require("../client/singleton");
11
- const helpers_1 = require("./helpers");
12
- (0, mocha_1.describe)("getDooverClient", () => {
13
- (0, mocha_1.beforeEach)(() => {
14
- (0, helpers_1.installSessionStorageMock)();
15
- helpers_1.MockWebSocket.reset();
16
- Object.defineProperty(globalThis, "WebSocket", {
17
- value: helpers_1.MockWebSocket,
18
- configurable: true,
19
- writable: true,
20
- });
21
- (0, singleton_1.resetDooverClient)();
22
- });
23
- (0, mocha_1.afterEach)(() => {
24
- sinon_1.default.restore();
25
- (0, singleton_1.resetDooverClient)();
26
- });
27
- const config = {
28
- dataRestUrl: "https://api.example.com",
29
- controlApiUrl: "https://control.example.com",
30
- dataWssUrl: "wss://ws.example.com",
31
- webSocketImpl: helpers_1.MockWebSocket,
32
- disableBrowserLifecycleHooks: true,
33
- };
34
- (0, mocha_1.it)("creates a client on first call and returns the same instance after", () => {
35
- const a = (0, singleton_1.getDooverClient)(config);
36
- const b = (0, singleton_1.getDooverClient)(config);
37
- (0, chai_1.expect)(a).to.be.instanceOf(doover_client_1.DooverClient);
38
- (0, chai_1.expect)(a).to.equal(b);
39
- });
40
- (0, mocha_1.it)("peekDooverClient returns null until the first call, then the instance", () => {
41
- (0, chai_1.expect)((0, singleton_1.peekDooverClient)()).to.equal(null);
42
- const a = (0, singleton_1.getDooverClient)(config);
43
- (0, chai_1.expect)((0, singleton_1.peekDooverClient)()).to.equal(a);
44
- });
45
- (0, mocha_1.it)("resetDooverClient clears the singleton so the next call creates a new one", () => {
46
- const a = (0, singleton_1.getDooverClient)(config);
47
- (0, singleton_1.resetDooverClient)();
48
- const b = (0, singleton_1.getDooverClient)(config);
49
- (0, chai_1.expect)(a).to.not.equal(b);
50
- });
51
- (0, mocha_1.it)("warns and reuses the existing client when a later caller differs in config", () => {
52
- const warn = sinon_1.default.stub(console, "warn");
53
- const a = (0, singleton_1.getDooverClient)(config);
54
- const b = (0, singleton_1.getDooverClient)({
55
- ...config,
56
- dataRestUrl: "https://other.example.com",
57
- });
58
- (0, chai_1.expect)(b).to.equal(a);
59
- (0, chai_1.expect)(warn.calledOnce).to.equal(true);
60
- (0, chai_1.expect)(warn.getCall(0).args[0]).to.match(/differs from the already-initialised singleton/);
61
- });
62
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,69 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chai_1 = require("chai");
4
- const stats_1 = require("../client/stats");
5
- describe("DooverStatsCollector RPC counters", () => {
6
- it("returns zeroed rpc snapshot when disabled", () => {
7
- const c = new stats_1.DooverStatsCollector();
8
- const snap = c.snapshot();
9
- (0, chai_1.expect)(snap.rpc).to.deep.equal({
10
- enabled: false,
11
- totalRpcs: 0,
12
- pendingRpcs: 0,
13
- completedRpcs: 0,
14
- failedRpcs: 0,
15
- timedOutRpcs: 0,
16
- abortedRpcs: 0,
17
- averageLatencyMs: null,
18
- lastLatencyMs: null,
19
- peakPendingRpcs: 0,
20
- });
21
- });
22
- it("tracks success/error/timeout/abort separately", () => {
23
- const c = new stats_1.DooverStatsCollector();
24
- c.setEnabled(true);
25
- const a = c.recordRpcStart();
26
- const b = c.recordRpcStart();
27
- const cc = c.recordRpcStart();
28
- const d = c.recordRpcStart();
29
- c.recordRpcEnd(a, "success");
30
- c.recordRpcEnd(b, "error");
31
- c.recordRpcEnd(cc, "timeout");
32
- c.recordRpcEnd(d, "abort");
33
- const snap = c.snapshot();
34
- (0, chai_1.expect)(snap.rpc.totalRpcs).to.equal(4);
35
- (0, chai_1.expect)(snap.rpc.pendingRpcs).to.equal(0);
36
- (0, chai_1.expect)(snap.rpc.completedRpcs).to.equal(1);
37
- (0, chai_1.expect)(snap.rpc.failedRpcs).to.equal(1);
38
- (0, chai_1.expect)(snap.rpc.timedOutRpcs).to.equal(1);
39
- (0, chai_1.expect)(snap.rpc.abortedRpcs).to.equal(1);
40
- (0, chai_1.expect)(snap.rpc.averageLatencyMs).to.be.a("number");
41
- (0, chai_1.expect)(snap.rpc.lastLatencyMs).to.be.a("number");
42
- });
43
- it("tracks peakPendingRpcs as a high-water mark", () => {
44
- const c = new stats_1.DooverStatsCollector();
45
- c.setEnabled(true);
46
- const a = c.recordRpcStart();
47
- const b = c.recordRpcStart();
48
- const cc = c.recordRpcStart();
49
- c.recordRpcEnd(a, "success");
50
- c.recordRpcEnd(b, "success");
51
- c.recordRpcEnd(cc, "success");
52
- const d = c.recordRpcStart();
53
- c.recordRpcEnd(d, "success");
54
- (0, chai_1.expect)(c.snapshot().rpc.peakPendingRpcs).to.equal(3);
55
- });
56
- it("disabled collector short-circuits start (returns null)", () => {
57
- const c = new stats_1.DooverStatsCollector();
58
- (0, chai_1.expect)(c.recordRpcStart()).to.equal(null);
59
- });
60
- it("reset() clears RPC counters", () => {
61
- const c = new stats_1.DooverStatsCollector();
62
- c.setEnabled(true);
63
- const a = c.recordRpcStart();
64
- c.recordRpcEnd(a, "success");
65
- c.reset();
66
- (0, chai_1.expect)(c.snapshot().rpc.totalRpcs).to.equal(0);
67
- (0, chai_1.expect)(c.snapshot().rpc.peakPendingRpcs).to.equal(0);
68
- });
69
- });
@@ -1 +0,0 @@
1
- export {};