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,95 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chai_1 = require("chai");
4
- const gateway_client_1 = require("../gateway/gateway-client");
5
- function makeConfig() {
6
- return {
7
- dataRestUrl: "https://example.com/api",
8
- controlApiUrl: "https://example.com/control",
9
- dataWssUrl: "wss://example.com/gateway",
10
- disableBrowserLifecycleHooks: true,
11
- };
12
- }
13
- function fakeMessage(channel = { agent_id: "a1", name: "c1" }, id = "m1") {
14
- return {
15
- id,
16
- data: {},
17
- attachments: [],
18
- author_id: "auth",
19
- channel,
20
- timestamp: 1,
21
- };
22
- }
23
- describe("GatewayClient.subscribeToChannel", () => {
24
- it("first handler triggers wire-level subscribe", () => {
25
- const gw = new gateway_client_1.GatewayClient(makeConfig());
26
- let subscribeCalls = 0;
27
- gw.subscribe = () => {
28
- subscribeCalls += 1;
29
- };
30
- gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
31
- (0, chai_1.expect)(subscribeCalls).to.equal(1);
32
- });
33
- it("second handler does not trigger another wire-level subscribe", () => {
34
- const gw = new gateway_client_1.GatewayClient(makeConfig());
35
- let subscribeCalls = 0;
36
- gw.subscribe = () => {
37
- subscribeCalls += 1;
38
- };
39
- gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
40
- gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
41
- (0, chai_1.expect)(subscribeCalls).to.equal(1);
42
- });
43
- it("returned unsubscribe drops the handler; last drop unsubscribes", () => {
44
- const gw = new gateway_client_1.GatewayClient(makeConfig());
45
- let unsubCalls = 0;
46
- gw.subscribe = () => { };
47
- gw.unsubscribe = () => {
48
- unsubCalls += 1;
49
- };
50
- const off1 = gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
51
- const off2 = gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
52
- off1();
53
- (0, chai_1.expect)(unsubCalls).to.equal(0);
54
- off2();
55
- (0, chai_1.expect)(unsubCalls).to.equal(1);
56
- });
57
- it("returned unsubscribe is idempotent", () => {
58
- const gw = new gateway_client_1.GatewayClient(makeConfig());
59
- let unsubCalls = 0;
60
- gw.subscribe = () => { };
61
- gw.unsubscribe = () => {
62
- unsubCalls += 1;
63
- };
64
- const off = gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { } });
65
- off();
66
- off();
67
- off();
68
- (0, chai_1.expect)(unsubCalls).to.equal(1);
69
- });
70
- it("messageCreate event fans out to onMessage handlers for the matching channel", () => {
71
- const gw = new gateway_client_1.GatewayClient(makeConfig());
72
- gw.subscribe = () => { };
73
- let received;
74
- gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: (m) => { received = m; } });
75
- gw.emit("messageCreate", fakeMessage());
76
- (0, chai_1.expect)(received?.id).to.equal("m1");
77
- });
78
- it("messageCreate for a different channel does not fire the handler", () => {
79
- const gw = new gateway_client_1.GatewayClient(makeConfig());
80
- gw.subscribe = () => { };
81
- let received = false;
82
- gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onMessage: () => { received = true; } });
83
- gw.emit("messageCreate", fakeMessage({ agent_id: "a1", name: "c2" }, "m2"));
84
- (0, chai_1.expect)(received).to.equal(false);
85
- });
86
- it("aggregateUpdate fans out to onAggregate handlers", () => {
87
- const gw = new gateway_client_1.GatewayClient(makeConfig());
88
- gw.subscribe = () => { };
89
- let received;
90
- gw.subscribeToChannel({ agent_id: "a1", name: "c1" }, { onAggregate: (a) => { received = a; } });
91
- const aggregate = { data: { x: 1 }, attachments: [] };
92
- gw.emit("aggregateUpdate", { channel: { agent_id: "a1", name: "c1" }, aggregate });
93
- (0, chai_1.expect)(received?.data).to.deep.equal({ x: 1 });
94
- });
95
- });
@@ -1,32 +0,0 @@
1
- import sinon from "sinon";
2
- export declare function createJsonResponse(body: unknown, init?: ResponseInit): Response;
3
- export declare function createTextResponse(body: string, init?: ResponseInit): Response;
4
- export declare function createBlobResponse(body: string, init?: ResponseInit): Response;
5
- export declare function createFetchMock(responseFactory?: (url: string, init?: RequestInit) => Response | Promise<Response>): sinon.SinonStub<any[], any>;
6
- export declare function installSessionStorageMock(): void;
7
- type MessageHandler = ((event: MessageEvent<string>) => void) | null;
8
- type CloseHandler = ((event: CloseEvent) => void) | null;
9
- type OpenHandler = (() => void) | null;
10
- type ErrorHandler = ((event: Event) => void) | null;
11
- export declare class MockWebSocket {
12
- static instances: MockWebSocket[];
13
- static CONNECTING: number;
14
- static OPEN: number;
15
- static CLOSING: number;
16
- static CLOSED: number;
17
- readonly url: string;
18
- readyState: number;
19
- sent: string[];
20
- onmessage: MessageHandler;
21
- onclose: CloseHandler;
22
- onopen: OpenHandler;
23
- onerror: ErrorHandler;
24
- constructor(url: string);
25
- send(data: string): void;
26
- close(code?: number, reason?: string): void;
27
- open(): void;
28
- receive(payload: unknown): void;
29
- error(): void;
30
- static reset(): void;
31
- }
32
- export {};
@@ -1,115 +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
- exports.MockWebSocket = void 0;
7
- exports.createJsonResponse = createJsonResponse;
8
- exports.createTextResponse = createTextResponse;
9
- exports.createBlobResponse = createBlobResponse;
10
- exports.createFetchMock = createFetchMock;
11
- exports.installSessionStorageMock = installSessionStorageMock;
12
- const sinon_1 = __importDefault(require("sinon"));
13
- function createJsonResponse(body, init) {
14
- return new Response(JSON.stringify(body), {
15
- status: init?.status ?? 200,
16
- headers: {
17
- "content-type": "application/json",
18
- ...(init?.headers ?? {}),
19
- },
20
- });
21
- }
22
- function createTextResponse(body, init) {
23
- return new Response(body, {
24
- status: init?.status ?? 200,
25
- headers: init?.headers,
26
- });
27
- }
28
- function createBlobResponse(body, init) {
29
- return new Response(new Blob([body]), {
30
- status: init?.status ?? 200,
31
- headers: {
32
- "content-type": "application/octet-stream",
33
- ...(init?.headers ?? {}),
34
- },
35
- });
36
- }
37
- function createFetchMock(responseFactory) {
38
- return sinon_1.default.stub().callsFake(async (input, init) => {
39
- const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
40
- if (responseFactory) {
41
- return responseFactory(url, init);
42
- }
43
- return createJsonResponse({ ok: true });
44
- });
45
- }
46
- class StorageMock {
47
- constructor() {
48
- this.store = new Map();
49
- }
50
- get length() {
51
- return this.store.size;
52
- }
53
- clear() {
54
- this.store.clear();
55
- }
56
- getItem(key) {
57
- return this.store.get(key) ?? null;
58
- }
59
- key(index) {
60
- return Array.from(this.store.keys())[index] ?? null;
61
- }
62
- removeItem(key) {
63
- this.store.delete(key);
64
- }
65
- setItem(key, value) {
66
- this.store.set(key, value);
67
- }
68
- }
69
- function installSessionStorageMock() {
70
- Object.defineProperty(globalThis, "sessionStorage", {
71
- value: new StorageMock(),
72
- configurable: true,
73
- writable: true,
74
- });
75
- }
76
- class MockWebSocket {
77
- constructor(url) {
78
- this.readyState = MockWebSocket.CONNECTING;
79
- this.sent = [];
80
- this.onmessage = null;
81
- this.onclose = null;
82
- this.onopen = null;
83
- this.onerror = null;
84
- this.url = url;
85
- MockWebSocket.instances.push(this);
86
- }
87
- send(data) {
88
- this.sent.push(data);
89
- }
90
- close(code, reason) {
91
- this.readyState = MockWebSocket.CLOSED;
92
- this.onclose?.({ code: code ?? 1000, reason: reason ?? "" });
93
- }
94
- open() {
95
- this.readyState = MockWebSocket.OPEN;
96
- this.onopen?.();
97
- }
98
- receive(payload) {
99
- this.onmessage?.(new MessageEvent("message", {
100
- data: JSON.stringify(payload),
101
- }));
102
- }
103
- error() {
104
- this.onerror?.(new Event("error"));
105
- }
106
- static reset() {
107
- MockWebSocket.instances = [];
108
- }
109
- }
110
- exports.MockWebSocket = MockWebSocket;
111
- MockWebSocket.instances = [];
112
- MockWebSocket.CONNECTING = 0;
113
- MockWebSocket.OPEN = 1;
114
- MockWebSocket.CLOSING = 2;
115
- MockWebSocket.CLOSED = 3;
@@ -1 +0,0 @@
1
- export {};
@@ -1,202 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const chai_1 = require("chai");
40
- const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
41
- const chai = __importStar(require("chai"));
42
- const mocha_1 = require("mocha");
43
- const local_agent_client_1 = require("../client/local-agent-client");
44
- const errors_1 = require("../client/errors");
45
- const helpers_1 = require("./helpers");
46
- // Valid snowflake IDs for use in mock payloads (id must be a numeric string for BigInt conversion).
47
- const SNOWFLAKE_1 = "179418309739937792";
48
- const SNOWFLAKE_2 = "179418309744132096";
49
- chai.use(chai_as_promised_1.default);
50
- const { expect: xpect } = chai;
51
- function makeLocal(extra = {}) {
52
- return new local_agent_client_1.LocalAgentClient({
53
- baseUrl: "http://192.168.0.7:49100",
54
- fetchImpl: (0, helpers_1.createFetchMock)(),
55
- webSocketImpl: helpers_1.MockWebSocket,
56
- disableBrowserLifecycleHooks: true,
57
- sourceId: "local:192.168.0.7:49100",
58
- ...extra,
59
- });
60
- }
61
- (0, mocha_1.describe)("LocalAgentClient", () => {
62
- (0, mocha_1.it)("advertises the v1 capability set and not the others", () => {
63
- const caps = makeLocal().getCapabilities();
64
- for (const c of ["agents.list", "channels.list", "channels.get", "aggregates.get",
65
- "aggregates.put", "aggregates.patch", "messages.list", "messages.post", "messages.put",
66
- "gateway.subscribe", "gateway.realtime", "gateway.oneShot"]) {
67
- (0, chai_1.expect)(caps.has(c)).to.equal(true);
68
- }
69
- for (const c of ["messages.listHistorical", "messages.get", "channels.create",
70
- "channels.archive", "rpc.send", "users.me", "alarms.read"]) {
71
- (0, chai_1.expect)(caps.has(c)).to.equal(false);
72
- }
73
- });
74
- (0, mocha_1.it)("throw-stubs every unadvertised method with UnsupportedCapabilityError", async () => {
75
- const c = makeLocal();
76
- await xpect(c.messages.getMessage("a", "ch", "m")).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
77
- await xpect(c.channels.createChannel("a", "ch", {})).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
78
- await xpect(c.users.getMe()).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
79
- await xpect(c.rpc.send({ agentId: "a", channelName: "ch" }, { method: "x", request: {} })).to.be.rejectedWith(errors_1.UnsupportedCapabilityError);
80
- try {
81
- await c.alarms.listAlarms("a", "ch");
82
- chai_1.expect.fail("should throw");
83
- }
84
- catch (e) {
85
- (0, chai_1.expect)(e).to.be.instanceOf(errors_1.UnsupportedCapabilityError);
86
- (0, chai_1.expect)(e.capability).to.equal("alarms.read");
87
- (0, chai_1.expect)(e.clientId).to.equal("local:192.168.0.7:49100");
88
- }
89
- });
90
- (0, mocha_1.it)("listChannels / getChannel / getAggregate / listMessages hit the local REST base and carry __source kind 'local'", async () => {
91
- const fetchMock = (0, helpers_1.createFetchMock)((url) => {
92
- if (url.endsWith("/channels"))
93
- return (0, helpers_1.createJsonResponse)([{ name: "c1", is_private: false, owner_id: "o" }]);
94
- if (url.includes("/channels/c1/aggregate"))
95
- return (0, helpers_1.createJsonResponse)({ data: { v: 1 }, attachments: [] });
96
- if (url.includes("/channels/c1/messages"))
97
- return (0, helpers_1.createJsonResponse)([{ id: SNOWFLAKE_1, data: {}, attachments: [], author_id: "a", channel: { agent_id: "dev7", name: "c1" } }]);
98
- if (url.includes("/channels/c1"))
99
- return (0, helpers_1.createJsonResponse)({ name: "c1", is_private: false, owner_id: "o" });
100
- return (0, helpers_1.createJsonResponse)({});
101
- });
102
- const c = makeLocal({ fetchImpl: fetchMock });
103
- const list = await c.channels.listChannels("dev7");
104
- (0, chai_1.expect)(list[0].__source?.client.kind).to.equal("local");
105
- (0, chai_1.expect)(list[0].__source?.via).to.include({ transport: "rest", method: "channels.listChannels" });
106
- const agg = await c.aggregates.getAggregate("dev7", "c1");
107
- (0, chai_1.expect)(agg.__source?.client.id).to.equal("local:192.168.0.7:49100");
108
- const msgs = await c.messages.listMessages("dev7", "c1");
109
- (0, chai_1.expect)(msgs[0].__source?.via).to.include({ transport: "rest" });
110
- });
111
- (0, mocha_1.it)("postMessage / putMessage / putAggregate / patchAggregate go through to the local REST base", async () => {
112
- const seen = [];
113
- const fetchMock = (0, helpers_1.createFetchMock)((url, init) => {
114
- seen.push({ method: init?.method, url });
115
- if (url.includes("/messages"))
116
- return (0, helpers_1.createJsonResponse)({ id: SNOWFLAKE_2, data: {}, attachments: [], author_id: "a", channel: { agent_id: "dev7", name: "c1" } });
117
- return (0, helpers_1.createJsonResponse)({ data: {}, attachments: [] });
118
- });
119
- const c = makeLocal({ fetchImpl: fetchMock });
120
- const m = await c.messages.postMessage("dev7", "c1", { hello: 1 });
121
- (0, chai_1.expect)(m.__source?.client.kind).to.equal("local");
122
- await c.aggregates.putAggregate("dev7", "c1", { v: 2 });
123
- await c.aggregates.patchAggregate("dev7", "c1", { v: 3 });
124
- await c.messages.putMessage("dev7", "c1", SNOWFLAKE_2, { v: 4 });
125
- (0, chai_1.expect)(seen.some((s) => s.method === "POST" && s.url.includes("/messages"))).to.equal(true);
126
- (0, chai_1.expect)(seen.some((s) => s.method === "PUT" && s.url.includes("/aggregate"))).to.equal(true);
127
- (0, chai_1.expect)(seen.some((s) => s.method === "PATCH" && s.url.includes("/aggregate"))).to.equal(true);
128
- });
129
- (0, mocha_1.it)("status reflects the local gateway: disconnected before connect, connected after Ready", async () => {
130
- const c = makeLocal();
131
- (0, chai_1.expect)(c.isConnected()).to.equal(false);
132
- (0, chai_1.expect)(c.getStatus().state).to.equal("disconnected");
133
- await c.gateway.connect();
134
- const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
135
- ws.open();
136
- ws.receive({ op: 0, t: "Hello", d: {} });
137
- ws.receive({ op: 0, t: "Ready", d: { session_id: "s1", session_token: "t", subscriptions: [] } });
138
- (0, chai_1.expect)(c.isConnected()).to.equal(true);
139
- (0, chai_1.expect)(c.getStatus().state).to.equal("connected");
140
- (0, chai_1.expect)(c.getStatus().clientId).to.equal("local:192.168.0.7:49100");
141
- });
142
- (0, mocha_1.it)("realtime: subscribeToChannel handlers receive stamped MessageCreate", async () => {
143
- const c = makeLocal();
144
- await c.gateway.connect();
145
- const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
146
- ws.open();
147
- ws.receive({ op: 0, t: "Ready", d: { session_id: "s1", session_token: "t", subscriptions: [] } });
148
- let got;
149
- c.gateway.subscribeToChannel({ agent_id: "dev7", name: "c1" }, { onMessage: (m) => { got = m; } });
150
- ws.receive({ op: 0, t: "MessageCreate", d: { id: SNOWFLAKE_1, data: {}, attachments: [], author_id: "a", channel: { agent_id: "dev7", name: "c1" } } });
151
- (0, chai_1.expect)(got.__source?.client.kind).to.equal("local");
152
- });
153
- (0, mocha_1.it)("getAgentScope resolves to { mode: 'list', agentIds: [deviceId] } via listAgents, caches it, and getKnownAgentScope is 'unknown' first", async () => {
154
- let agentCalls = 0;
155
- const fetchMock = (0, helpers_1.createFetchMock)((url) => {
156
- if (url.includes("/agents")) {
157
- agentCalls += 1;
158
- return (0, helpers_1.createJsonResponse)({ agents: [{ id: "dev7", name: "Device 7" }] });
159
- }
160
- return (0, helpers_1.createJsonResponse)({});
161
- });
162
- const c = makeLocal({ fetchImpl: fetchMock });
163
- (0, chai_1.expect)(c.getKnownAgentScope()).to.equal("unknown");
164
- const scope = await c.getAgentScope();
165
- (0, chai_1.expect)(scope).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
166
- (0, chai_1.expect)(c.getKnownAgentScope()).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
167
- await c.getAgentScope(); // cached
168
- (0, chai_1.expect)(agentCalls).to.equal(1);
169
- });
170
- (0, mocha_1.it)("reconnect (Ready frame) invalidates the scope cache and re-fetches the agent id", async () => {
171
- let agentCalls = 0;
172
- const fetchMock = (0, helpers_1.createFetchMock)((url) => {
173
- if (url.includes("/agents")) {
174
- agentCalls += 1;
175
- return (0, helpers_1.createJsonResponse)({ agents: [{ id: "dev7", name: "Device 7" }] });
176
- }
177
- return (0, helpers_1.createJsonResponse)({});
178
- });
179
- const c = makeLocal({ fetchImpl: fetchMock });
180
- // 1. Initial resolve — agentCalls becomes 1, scope is cached.
181
- const scope1 = await c.getAgentScope();
182
- (0, chai_1.expect)(scope1).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
183
- (0, chai_1.expect)(agentCalls).to.equal(1);
184
- // 2. Connect the gateway, open the socket, and send a Ready frame — this
185
- // should null the cache and kick off a background re-fetch.
186
- await c.gateway.connect();
187
- const ws = helpers_1.MockWebSocket.instances[helpers_1.MockWebSocket.instances.length - 1];
188
- ws.open();
189
- ws.receive({ op: 0, t: "Hello", d: {} });
190
- ws.receive({ op: 0, t: "Ready", d: { session_id: "s2", session_token: "t2", subscriptions: [] } });
191
- // 3. The "ready" handler fires synchronously, nulling resolvedScope and
192
- // firing off an async re-fetch. Flush the microtask queue so the async
193
- // listAgents() call has time to complete before we assert.
194
- await new Promise((r) => setImmediate(r));
195
- await new Promise((r) => setImmediate(r));
196
- // 4. Re-fetch should have run: agentCalls === 2 and scope is still [dev7].
197
- (0, chai_1.expect)(agentCalls).to.equal(2);
198
- const scope2 = await c.getAgentScope(); // now served from refreshed cache
199
- (0, chai_1.expect)(scope2).to.deep.equal({ mode: "list", agentIds: ["dev7"] });
200
- (0, chai_1.expect)(agentCalls).to.equal(2); // no third fetch — cache hit
201
- });
202
- });
@@ -1 +0,0 @@
1
- export {};
@@ -1,183 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const chai_1 = require("chai");
4
- const mocha_1 = require("mocha");
5
- const messageRangeStore_1 = require("../react/messageRangeStore");
6
- const snowflake_1 = require("../utils/snowflake");
7
- /** Frozen so a cursor built twice is the same cursor — real clocks make these flaky. */
8
- const NOW = Date.now();
9
- /** Messages at 1-minute spacing, oldest first, ending `minutesAgo` before NOW. */
10
- function makeMessages(count, startMinutesAgo) {
11
- return Array.from({ length: count }, (_, i) => {
12
- const at = new Date(NOW - (startMinutesAgo - i) * 60000);
13
- return {
14
- id: (0, snowflake_1.generateSnowflakeIdAtTime)(at),
15
- data: { i },
16
- attachments: [],
17
- author_id: "a",
18
- channel: { agentId: "agent", channelName: "chan" },
19
- timestamp: at.getTime(),
20
- };
21
- });
22
- }
23
- const idAt = (minutesAgo) => BigInt((0, snowflake_1.generateSnowflakeIdAtTime)(new Date(NOW - minutesAgo * 60000)));
24
- const ids = (messages) => (messages ?? []).map((m) => m.id);
25
- (0, mocha_1.describe)("ChannelRangeStore", () => {
26
- let store;
27
- (0, mocha_1.beforeEach)(() => {
28
- store = new messageRangeStore_1.ChannelRangeStore();
29
- });
30
- (0, mocha_1.it)("returns undefined for a range it has never seen", () => {
31
- (0, chai_1.expect)(store.read(idAt(0), 10)).to.equal(undefined);
32
- });
33
- (0, mocha_1.it)("serves a full page back from cache", () => {
34
- const page = makeMessages(10, 20);
35
- store.record({ before: idAt(0), limit: 10, page });
36
- const read = store.read(idAt(0), 10);
37
- (0, chai_1.expect)(ids(read)).to.deep.equal(ids(page));
38
- });
39
- (0, mocha_1.it)("returns messages ascending, matching order:asc", () => {
40
- const page = makeMessages(5, 20);
41
- store.record({ before: idAt(0), limit: 5, page });
42
- const read = store.read(idAt(0), 5);
43
- for (let i = 1; i < read.length; i++) {
44
- (0, chai_1.expect)(BigInt(read[i].id) > BigInt(read[i - 1].id)).to.equal(true);
45
- }
46
- });
47
- (0, mocha_1.it)("serves the NEWEST `limit` older than the cursor, not the first", () => {
48
- const page = makeMessages(10, 20); // 20..11 minutes ago
49
- store.record({ before: idAt(0), limit: 10, page });
50
- const read = store.read(idAt(0), 3);
51
- (0, chai_1.expect)(ids(read)).to.deep.equal(ids(page.slice(7)));
52
- });
53
- (0, mocha_1.it)("excludes the cursor message itself (`before` is exclusive)", () => {
54
- const page = makeMessages(5, 20);
55
- store.record({ before: idAt(0), limit: 5, page });
56
- // Only 2 messages sit below page[2], so asking for more would (rightly) be
57
- // unanswerable — nothing proves what lies below the segment's `lo`.
58
- const cursor = BigInt(page[2].id);
59
- const read = store.read(cursor, 2);
60
- (0, chai_1.expect)(read.every((m) => BigInt(m.id) < cursor)).to.equal(true);
61
- (0, chai_1.expect)(ids(read)).to.deep.equal(ids(page.slice(0, 2)));
62
- });
63
- (0, mocha_1.it)("will not answer beyond what it has proven", () => {
64
- const page = makeMessages(10, 20);
65
- store.record({ before: idAt(0), limit: 10, page });
66
- // Holds 10, asked for 20, and nothing says the range bottoms out here
67
- (0, chai_1.expect)(store.read(idAt(0), 20)).to.equal(undefined);
68
- });
69
- (0, mocha_1.it)("answers short when a short page proved the range bottoms out", () => {
70
- const page = makeMessages(3, 20);
71
- store.record({ before: idAt(0), limit: 10, page }); // 3 < 10 => atStart
72
- const read = store.read(idAt(0), 10);
73
- (0, chai_1.expect)(ids(read)).to.deep.equal(ids(page));
74
- });
75
- (0, mocha_1.it)("will not answer a cursor above its proven upper bound", () => {
76
- const page = makeMessages(10, 20);
77
- store.record({ before: idAt(10), limit: 10, page });
78
- // Nothing proves what sits between 10 minutes ago and now
79
- (0, chai_1.expect)(store.read(idAt(0), 5)).to.equal(undefined);
80
- });
81
- (0, mocha_1.it)("merges touching ranges so a later read spans both", () => {
82
- const older = makeMessages(10, 40); // 40..31
83
- const newer = makeMessages(10, 20); // 20..11
84
- store.record({ before: idAt(0), limit: 10, page: newer });
85
- // Paging older: cursor is the oldest we held
86
- store.record({ before: BigInt(newer[0].id), limit: 10, page: older, at: NOW });
87
- (0, chai_1.expect)(store.snapshot()).to.have.length(1);
88
- const read = store.read(idAt(0), 20);
89
- (0, chai_1.expect)(ids(read)).to.deep.equal([...ids(older), ...ids(newer)]);
90
- });
91
- (0, mocha_1.it)("merges overlapping ranges without duplicating", () => {
92
- const page = makeMessages(10, 20);
93
- store.record({ before: idAt(0), limit: 10, page });
94
- store.record({ before: idAt(0), limit: 10, page }); // same window again
95
- (0, chai_1.expect)(store.snapshot()).to.have.length(1);
96
- (0, chai_1.expect)(ids(store.read(idAt(0), 10))).to.deep.equal(ids(page));
97
- });
98
- (0, mocha_1.it)("replaces an updated message without changing range coverage", () => {
99
- const page = makeMessages(5, 20);
100
- store.record({ before: idAt(0), limit: 5, page });
101
- const before = store.snapshot();
102
- const updated = {
103
- ...page[2],
104
- data: { i: 2, analysed_by: "detector" },
105
- attachments: [{ id: "updated-image" }],
106
- };
107
- store.recordUpdate(updated);
108
- const read = store.read(idAt(0), 5);
109
- (0, chai_1.expect)(read[2]).to.equal(updated);
110
- (0, chai_1.expect)(ids(read)).to.deep.equal(ids(page));
111
- (0, chai_1.expect)(store.snapshot().map(({ lo, hi, atStart }) => ({ lo, hi, atStart })))
112
- .to.deep.equal(before.map(({ lo, hi, atStart }) => ({ lo, hi, atStart })));
113
- });
114
- (0, mocha_1.it)("keeps disjoint ranges apart rather than claiming the gap", () => {
115
- const ancient = makeMessages(5, 500);
116
- const recent = makeMessages(5, 20);
117
- store.record({ before: idAt(0), limit: 5, page: recent });
118
- store.record({ before: idAt(400), limit: 5, page: ancient });
119
- (0, chai_1.expect)(store.snapshot()).to.have.length(2);
120
- // The hole between them is not covered, so a span across it must refetch
121
- (0, chai_1.expect)(store.read(idAt(0), 10)).to.equal(undefined);
122
- });
123
- (0, mocha_1.it)("serves an anchored read from a range fetched for a different anchor", () => {
124
- const page = makeMessages(30, 60);
125
- store.record({ before: idAt(0), limit: 30, page });
126
- // Jumping to 30 minutes ago costs nothing: already proven
127
- const read = store.read(idAt(30), 5);
128
- (0, chai_1.expect)(read).to.not.equal(undefined);
129
- (0, chai_1.expect)(read.every((m) => m.timestamp < Date.now() - 30 * 60000)).to.equal(true);
130
- });
131
- (0, mocha_1.it)("orders by numeric id, not string (500 sorts before 4000)", () => {
132
- const short = { id: "500", timestamp: 1 };
133
- const long = { id: "4000", timestamp: 2 };
134
- store.record({ before: 5000n, limit: 10, page: [long, short], at: NOW });
135
- (0, chai_1.expect)(ids(store.read(5000n, 10))).to.deep.equal(["500", "4000"]);
136
- });
137
- (0, mocha_1.it)("records an empty page as a proven-empty range", () => {
138
- store.record({ before: idAt(0), limit: 10, page: [] });
139
- (0, chai_1.expect)(store.read(idAt(0), 10)).to.deep.equal([]);
140
- });
141
- (0, mocha_1.describe)("live tip", () => {
142
- (0, mocha_1.it)("extends coverage with pushes when proven up to now", () => {
143
- const page = makeMessages(5, 20);
144
- store.record({ before: idAt(0), limit: 5, page });
145
- const [live] = makeMessages(1, -1); // one minute into the future
146
- store.recordLive(live);
147
- const read = store.read(BigInt(live.id) + 1n, 6);
148
- (0, chai_1.expect)(ids(read)).to.deep.equal([...ids(page), live.id]);
149
- });
150
- (0, mocha_1.it)("ignores pushes for a stale window, which may not be contiguous", () => {
151
- const page = makeMessages(5, 500);
152
- // Proven only up to ~8 hours ago, so a push now leaves a hole
153
- store.record({ before: idAt(480), limit: 5, page });
154
- const [live] = makeMessages(1, 0);
155
- store.recordLive(live);
156
- (0, chai_1.expect)(store.read(BigInt(live.id) + 1n, 6)).to.equal(undefined);
157
- });
158
- (0, mocha_1.it)("stops extending once the socket drops", () => {
159
- const page = makeMessages(5, 20);
160
- store.record({ before: idAt(0), limit: 5, page });
161
- store.sealTips(); // gateway "close"
162
- const [live] = makeMessages(1, -1);
163
- store.recordLive(live);
164
- // The push is not trusted to prove the range, so the gap must be refetched
165
- (0, chai_1.expect)(store.read(BigInt(live.id) + 1n, 6)).to.equal(undefined);
166
- });
167
- (0, mocha_1.it)("does not duplicate a push already fetched", () => {
168
- const page = makeMessages(5, 20);
169
- store.record({ before: idAt(0), limit: 5, page });
170
- store.recordLive(page[4]);
171
- (0, chai_1.expect)(ids(store.read(idAt(0), 5))).to.deep.equal(ids(page));
172
- });
173
- });
174
- });
175
- (0, mocha_1.describe)("getChannelRangeStore", () => {
176
- (0, mocha_1.beforeEach)(() => (0, messageRangeStore_1.resetChannelRangeStores)());
177
- (0, mocha_1.it)("shares one store per stream key", () => {
178
- (0, chai_1.expect)((0, messageRangeStore_1.getChannelRangeStore)("a|c")).to.equal((0, messageRangeStore_1.getChannelRangeStore)("a|c"));
179
- });
180
- (0, mocha_1.it)("keeps different streams apart", () => {
181
- (0, chai_1.expect)((0, messageRangeStore_1.getChannelRangeStore)("a|c")).to.not.equal((0, messageRangeStore_1.getChannelRangeStore)("a|d"));
182
- });
183
- });
@@ -1 +0,0 @@
1
- export {};