@synnaxlabs/client 0.56.2 → 0.57.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (741) hide show
  1. package/dist/client-DDACDVZ-.js +14505 -0
  2. package/dist/client-DDACDVZ-.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +91 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +57 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +39 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +39 -16
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +340 -0
  398. package/src/framer/cache/reader.ts +231 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +108 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +19 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -1,871 +0,0 @@
1
- // Copyright 2026 Synnax Labs, Inc.
2
- //
3
- // Use of this software is governed by the Business Source License included in the file
4
- // licenses/BSL.txt.
5
- //
6
- // As of the Change Date specified in that file, in accordance with the Business Source
7
- // License, use of this software will be governed by the Apache License, Version 2.0,
8
- // included in the file licenses/APL.txt.
9
-
10
- import { EOF, Unreachable } from "@synnaxlabs/freighter";
11
- import {
12
- DataType,
13
- errors,
14
- id,
15
- Rate,
16
- Series,
17
- sleep,
18
- TimeSpan,
19
- TimeStamp,
20
- } from "@synnaxlabs/x";
21
- import { describe, expect, it, test, vi } from "vitest";
22
-
23
- import { type channel } from "@/channel";
24
- import { Frame } from "@/framer/frame";
25
- import {
26
- HardenedStreamer,
27
- ObservableStreamer,
28
- type Streamer,
29
- streamerConfigZ,
30
- } from "@/framer/streamer";
31
- import { newVirtualChannel } from "@/testutil/channels";
32
- import { createTestClient } from "@/testutil/client";
33
-
34
- const client = createTestClient();
35
-
36
- describe("Streamer", () => {
37
- describe("standard", () => {
38
- test("happy path", async () => {
39
- const ch = await newVirtualChannel(client);
40
- const streamer = await client.openStreamer(ch.key);
41
- const writer = await client.openWriter({
42
- start: TimeStamp.now(),
43
- channels: ch.key,
44
- });
45
- try {
46
- await writer.write(ch.key, new Float64Array([1, 2, 3]));
47
- } finally {
48
- await writer.close();
49
- }
50
- const d = await streamer.read();
51
- expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
52
- });
53
- test("should preserve non-zero time ranges through codec round-trip", async () => {
54
- const ch = await newVirtualChannel(client);
55
- const streamer = await client.openStreamer(ch.key);
56
- const writer = await client.openWriter({
57
- start: TimeStamp.now(),
58
- channels: ch.key,
59
- });
60
- const start = new TimeStamp(1000000000n);
61
- const end = new TimeStamp(6000000000n);
62
- try {
63
- const fr = new Frame(
64
- [ch.key],
65
- [
66
- new Series({
67
- data: new Float64Array([1, 2, 3]),
68
- dataType: DataType.FLOAT64,
69
- timeRange: start.spanRange(TimeSpan.seconds(5)),
70
- }),
71
- ],
72
- );
73
- await writer.write(fr);
74
- } finally {
75
- await writer.close();
76
- }
77
- const d = await streamer.read();
78
- const series = d.series[0];
79
- expect(series.timeRange).toBeDefined();
80
- expect(series.timeRange?.start.valueOf()).toEqual(start.valueOf());
81
- expect(series.timeRange?.end.valueOf()).toEqual(end.valueOf());
82
- });
83
- test("open with config", async () => {
84
- const ch = await newVirtualChannel(client);
85
- await expect(client.openStreamer({ channels: ch.key })).resolves.not.toThrow();
86
- });
87
- it("should not throw an error when the streamer is opened with zero channels", async () => {
88
- await expect(
89
- (async () => {
90
- const s = await client.openStreamer([]);
91
- s.close();
92
- })(),
93
- ).resolves.not.toThrow();
94
- });
95
- it("should throw an error when the streamer is opened with a channel that does not exist", async () => {
96
- await expect(client.openStreamer([5678])).rejects.toThrow("not found");
97
- });
98
- describe("excludeGroups", () => {
99
- test("should filter out frames from a writer whose group matches", async () => {
100
- const ch = await newVirtualChannel(client);
101
- const streamer = await client.openStreamer({
102
- channels: ch.key,
103
- excludeGroups: [42],
104
- });
105
- const writer = await client.openWriter({
106
- start: TimeStamp.now(),
107
- channels: ch.key,
108
- controlSubject: { name: "grouped", key: id.create(), group: 42 },
109
- });
110
- try {
111
- await writer.write(ch.key, new Float64Array([1, 2, 3]));
112
- const result = await Promise.race([
113
- streamer.read().then((f) => f),
114
- sleep.sleep(TimeSpan.milliseconds(500)).then(() => null),
115
- ]);
116
- expect(result).toBeNull();
117
- } finally {
118
- await writer.close();
119
- streamer.close();
120
- }
121
- });
122
-
123
- test("should deliver frames from a writer whose group does not match", async () => {
124
- const ch = await newVirtualChannel(client);
125
- const streamer = await client.openStreamer({
126
- channels: ch.key,
127
- excludeGroups: [99],
128
- });
129
- const writer = await client.openWriter({
130
- start: TimeStamp.now(),
131
- channels: ch.key,
132
- controlSubject: { name: "grouped", key: id.create(), group: 42 },
133
- });
134
- try {
135
- await writer.write(ch.key, new Float64Array([1, 2, 3]));
136
- const d = await streamer.read();
137
- expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
138
- } finally {
139
- await writer.close();
140
- streamer.close();
141
- }
142
- });
143
-
144
- test("should deliver frames from a writer with group 0 even if 0 is excluded", async () => {
145
- const ch = await newVirtualChannel(client);
146
- const streamer = await client.openStreamer({
147
- channels: ch.key,
148
- excludeGroups: [0],
149
- });
150
- const writer = await client.openWriter({
151
- start: TimeStamp.now(),
152
- channels: ch.key,
153
- });
154
- try {
155
- await writer.write(ch.key, new Float64Array([1, 2, 3]));
156
- const d = await streamer.read();
157
- expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
158
- } finally {
159
- await writer.close();
160
- streamer.close();
161
- }
162
- });
163
- });
164
-
165
- describe("downsampling", () => {
166
- test("downsample factor of 1", async () => {
167
- const ch = await newVirtualChannel(client);
168
- const streamer = await client.openStreamer({
169
- channels: ch.key,
170
- downsampleFactor: 1,
171
- });
172
- const writer = await client.openWriter({
173
- start: TimeStamp.now(),
174
- channels: ch.key,
175
- });
176
- try {
177
- await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5]));
178
- } finally {
179
- await writer.close();
180
- }
181
- const d = await streamer.read();
182
- expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3, 4, 5]);
183
- });
184
- test("downsample factor of 2", async () => {
185
- const ch = await newVirtualChannel(client);
186
- const streamer = await client.openStreamer({
187
- channels: ch.key,
188
- downsampleFactor: 2,
189
- });
190
- const writer = await client.openWriter({
191
- start: TimeStamp.now(),
192
- channels: ch.key,
193
- });
194
- try {
195
- await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
196
- } finally {
197
- await writer.close();
198
- }
199
- const d = await streamer.read();
200
- expect(Array.from(d.get(ch.key))).toEqual([1, 3, 5, 7, 9]);
201
- });
202
- test("downsample factor of 10", async () => {
203
- const ch = await newVirtualChannel(client);
204
- const streamer = await client.openStreamer({
205
- channels: ch.key,
206
- downsampleFactor: 10,
207
- });
208
- const writer = await client.openWriter({
209
- start: TimeStamp.now(),
210
- channels: ch.key,
211
- });
212
- try {
213
- await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
214
- } finally {
215
- await writer.close();
216
- }
217
- const d = await streamer.read();
218
- expect(Array.from(d.get(ch.key))).toEqual([1]);
219
- });
220
- });
221
-
222
- describe("throttling", () => {
223
- test("throttle at 60Hz", async () => {
224
- const ch = await newVirtualChannel(client);
225
- const streamer = await client.openStreamer({
226
- channels: ch.key,
227
- throttleRate: 60,
228
- });
229
- const writer = await client.openWriter({
230
- start: TimeStamp.now(),
231
- channels: ch.key,
232
- });
233
- try {
234
- const startTime = Date.now();
235
- // Write data rapidly
236
- for (let i = 0; i < 10; i++) {
237
- await writer.write(ch.key, new Float64Array([i]));
238
- await sleep.sleep(TimeSpan.milliseconds(5));
239
- }
240
-
241
- // Read frames - should be throttled
242
- const receivedFrames: Frame[] = [];
243
- const timeout = Date.now() + 500;
244
- while (Date.now() < timeout)
245
- try {
246
- const frame = await Promise.race([
247
- streamer.read(),
248
- sleep.sleep(TimeSpan.milliseconds(100)).then(() => null),
249
- ]);
250
- if (frame) receivedFrames.push(frame);
251
- else break;
252
- } catch {
253
- break;
254
- }
255
-
256
- expect(receivedFrames.length).toBeGreaterThan(0);
257
- const elapsed = Date.now() - startTime;
258
- // Should take at least the throttle period
259
- expect(elapsed).toBeGreaterThanOrEqual(16); // ~1/60Hz
260
- } finally {
261
- await writer.close();
262
- streamer.close();
263
- }
264
- });
265
-
266
- test("no throttling with rate of 0", async () => {
267
- const ch = await newVirtualChannel(client);
268
- const streamer = await client.openStreamer({
269
- channels: ch.key,
270
- throttleRate: 0,
271
- });
272
- const writer = await client.openWriter({
273
- start: TimeStamp.now(),
274
- channels: ch.key,
275
- });
276
- try {
277
- await writer.write(ch.key, new Float64Array([1, 2, 3]));
278
- const d = await streamer.read();
279
- expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
280
- } finally {
281
- await writer.close();
282
- streamer.close();
283
- }
284
- });
285
-
286
- test("combine throttling and downsampling", async () => {
287
- const ch = await newVirtualChannel(client);
288
- const streamer = await client.openStreamer({
289
- channels: ch.key,
290
- downsampleFactor: 2,
291
- throttleRate: 10,
292
- });
293
- const writer = await client.openWriter({
294
- start: TimeStamp.now(),
295
- channels: ch.key,
296
- });
297
- try {
298
- await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5, 6]));
299
- const d = await streamer.read();
300
- // Should be downsampled to [1, 3, 5] and throttled
301
- expect(Array.from(d.get(ch.key))).toEqual([1, 3, 5]);
302
- } finally {
303
- await writer.close();
304
- streamer.close();
305
- }
306
- });
307
- });
308
-
309
- describe("calculations", () => {
310
- test("basic calculated channel streaming", async () => {
311
- // Create a timestamp index channel
312
- const timeChannel = await client.channels.create({
313
- name: id.create(),
314
- isIndex: true,
315
- dataType: DataType.TIMESTAMP,
316
- });
317
-
318
- // Create source channels with the timestamp index
319
- const [channelA, channelB] = await client.channels.create([
320
- {
321
- name: id.create(),
322
- dataType: DataType.FLOAT64,
323
- index: timeChannel.key,
324
- },
325
- {
326
- name: id.create(),
327
- dataType: DataType.FLOAT64,
328
- index: timeChannel.key,
329
- },
330
- ]);
331
-
332
- // Create calculated channel that adds the two source channels
333
- const calcChannel = await client.channels.create({
334
- name: id.create(),
335
- dataType: DataType.FLOAT64,
336
- virtual: true,
337
- expression: `return ${channelA.name} + ${channelB.name}`,
338
- });
339
-
340
- // Set up streamer to listen for calculated results
341
- const streamer = await client.openStreamer(calcChannel.key);
342
- await sleep.sleep(TimeSpan.milliseconds(10));
343
-
344
- // Write test data
345
- const startTime = TimeStamp.now();
346
- const writer = await client.openWriter({
347
- start: startTime,
348
- channels: [timeChannel.key, channelA.key, channelB.key],
349
- });
350
-
351
- try {
352
- // Write test values - each source gets 2.5 so sum should be 5.0
353
- await writer.write({
354
- [timeChannel.key]: [startTime],
355
- [channelA.key]: new Float64Array([2.5]),
356
- [channelB.key]: new Float64Array([2.5]),
357
- });
358
-
359
- // Read from streamer
360
- const frame = await streamer.read();
361
-
362
- // Verify calculated results
363
- const calcData = Array.from(frame.get(calcChannel.key));
364
- expect(calcData).toEqual([5.0]);
365
- } finally {
366
- await writer.close();
367
- streamer.close();
368
- }
369
- });
370
-
371
- test("calculated channel with constant", async () => {
372
- // Create an index channel for timestamps
373
- const timeChannel = await client.channels.create({
374
- name: id.create(),
375
- isIndex: true,
376
- dataType: DataType.TIMESTAMP,
377
- });
378
-
379
- // Create base channel with index
380
- const baseChannel = await client.channels.create({
381
- name: id.create(),
382
- dataType: DataType.FLOAT64,
383
- index: timeChannel.key,
384
- });
385
-
386
- // Create calculated channel that adds 5
387
- const calcChannel = await client.channels.create({
388
- name: id.create(),
389
- dataType: DataType.FLOAT64,
390
- virtual: true,
391
- expression: `return ${baseChannel.name} + 5`,
392
- });
393
-
394
- const streamer = await client.openStreamer(calcChannel.key);
395
- await sleep.sleep(TimeSpan.milliseconds(20));
396
-
397
- const startTime = TimeStamp.now();
398
- const writer = await client.openWriter({
399
- start: startTime,
400
- channels: [timeChannel.key, baseChannel.key],
401
- });
402
-
403
- try {
404
- const timestamps = [
405
- startTime,
406
- new TimeStamp(startTime.valueOf() + BigInt(1000000000)),
407
- new TimeStamp(startTime.valueOf() + BigInt(2000000000)),
408
- ];
409
-
410
- await writer.write({
411
- [timeChannel.key]: timestamps,
412
- [baseChannel.key]: new Float64Array([1, 2, 3]),
413
- });
414
-
415
- const frame = await streamer.read();
416
- const calcData = Array.from(frame.get(calcChannel.key));
417
- expect(calcData).toEqual([6, 7, 8]); // Original values + 5
418
- } finally {
419
- await writer.close();
420
- streamer.close();
421
- }
422
- });
423
-
424
- test("calculated channel with multiple operations", async () => {
425
- // Create timestamp channel
426
- const timeChannel = await client.channels.create({
427
- name: id.create(),
428
- isIndex: true,
429
- dataType: DataType.TIMESTAMP,
430
- });
431
-
432
- // Create source channels
433
- const names = [id.create(), id.create()];
434
- const [channelA, channelB] = await client.channels.create([
435
- { name: names[0], dataType: DataType.FLOAT64, index: timeChannel.key },
436
- { name: names[1], dataType: DataType.FLOAT64, index: timeChannel.key },
437
- ]);
438
-
439
- // Create calculated channel with multiple operations
440
- const calcChannel = await client.channels.create({
441
- name: id.create(),
442
- dataType: DataType.FLOAT64,
443
- virtual: true,
444
- expression: `return (${names[0]} * 2) + (${names[1]} / 2)`,
445
- });
446
-
447
- const streamer = await client.openStreamer(calcChannel.key);
448
- await sleep.sleep(TimeSpan.milliseconds(5));
449
-
450
- const startTime = TimeStamp.now();
451
- const writer = await client.openWriter({
452
- start: startTime,
453
- channels: [timeChannel.key, channelA.key, channelB.key],
454
- });
455
-
456
- try {
457
- await writer.write({
458
- [timeChannel.key]: [startTime],
459
- [channelA.key]: new Float64Array([2.0]), // Will be multiplied by 2 = 4.0
460
- [channelB.key]: new Float64Array([4.0]), // Will be divided by 2 = 2.0
461
- });
462
-
463
- const frame = await streamer.read();
464
- const calcData = Array.from(frame.get(calcChannel.key));
465
- expect(calcData).toEqual([6.0]); // (2.0 * 2) + (4.0 / 2) = 4.0 + 2.0 = 6.0
466
- } finally {
467
- await writer.close();
468
- streamer.close();
469
- }
470
- });
471
-
472
- describe("legacy calculations", async () => {
473
- it("should correctly execute a calculation with a requires field", async () => {
474
- const timeChannel = await client.channels.create({
475
- name: id.create(),
476
- isIndex: true,
477
- dataType: DataType.TIMESTAMP,
478
- });
479
-
480
- const [channelA, channelB] = await client.channels.create([
481
- {
482
- name: id.create(),
483
- dataType: DataType.FLOAT64,
484
- index: timeChannel.key,
485
- },
486
- {
487
- name: id.create(),
488
- dataType: DataType.FLOAT64,
489
- index: timeChannel.key,
490
- },
491
- ]);
492
-
493
- const calcChannel = await client.channels.create({
494
- name: id.create(),
495
- dataType: DataType.FLOAT64,
496
- virtual: true,
497
- expression: `return ${channelA.name} + ${channelB.name}`,
498
- });
499
-
500
- const streamer = await client.openStreamer(calcChannel.key);
501
- await sleep.sleep(TimeSpan.milliseconds(10));
502
-
503
- const startTime = TimeStamp.now();
504
- const writer = await client.openWriter({
505
- start: startTime,
506
- channels: [timeChannel.key, channelA.key, channelB.key],
507
- });
508
-
509
- try {
510
- await writer.write({
511
- [timeChannel.key]: [startTime],
512
- [channelA.key]: new Float64Array([2.5]),
513
- [channelB.key]: new Float64Array([2.5]),
514
- });
515
-
516
- const frame = await streamer.read();
517
-
518
- const calcData = Array.from(frame.get(calcChannel.key));
519
- expect(calcData).toEqual([5.0]);
520
- } finally {
521
- await writer.close();
522
- streamer.close();
523
- }
524
- });
525
- });
526
- });
527
- });
528
-
529
- class MockStreamer implements Streamer {
530
- keys: channel.Key[] = [];
531
- updateMock = vi.fn();
532
- readMock = vi.fn();
533
- closeMock = vi.fn();
534
- responses: [Frame, Error | null][] = [];
535
- updateErrors: (Error | null)[] = [];
536
-
537
- update(channels: channel.Params): Promise<void> {
538
- if (this.updateErrors.length > 0) {
539
- const err = this.updateErrors.shift()!;
540
- if (err) throw err;
541
- }
542
- this.updateMock(channels);
543
- return Promise.resolve();
544
- }
545
-
546
- close(): void {
547
- this.closeMock();
548
- }
549
-
550
- async read(): Promise<Frame> {
551
- this.readMock();
552
- if (this.responses.length === 0) throw new EOF();
553
- const [frame, err] = this.responses.shift()!;
554
- if (err) throw err;
555
- return frame;
556
- }
557
-
558
- async next(): Promise<IteratorResult<Frame, any>> {
559
- try {
560
- const fr = await this.read();
561
- return { done: false, value: fr };
562
- } catch (err) {
563
- if (EOF.matches(err)) return { done: true, value: undefined };
564
- throw errors.fromUnknown(err);
565
- }
566
- }
567
-
568
- [Symbol.asyncIterator](): AsyncIterator<Frame, any, undefined> {
569
- return this;
570
- }
571
- }
572
-
573
- describe("hardened", () => {
574
- it("should correctly call the underlying streamer methods", async () => {
575
- const streamer = new MockStreamer();
576
- const openMock = vi.fn();
577
- const config = { channels: [1, 2, 3] };
578
- const fr = new Frame({ 1: new Series([1]) });
579
- const hardened = await HardenedStreamer.open(
580
- async (cfg) => {
581
- openMock(cfg);
582
- const cfg_ = streamerConfigZ.parse(cfg);
583
- streamer.responses = [[fr, null]];
584
- streamer.keys = cfg_.channels as channel.Key[];
585
- return streamer;
586
- },
587
- { channels: [1, 2, 3] },
588
- );
589
- expect(hardened.keys).toEqual([1, 2, 3]);
590
- expect(openMock).toHaveBeenCalledWith({
591
- ...config,
592
- downsampleFactor: 1,
593
- excludeGroups: [],
594
- throttleRate: new Rate(0),
595
- });
596
- await hardened.update([1, 2, 3]);
597
- expect(streamer.updateMock).toHaveBeenCalledWith([1, 2, 3]);
598
- const fr2 = await hardened.read();
599
- expect(streamer.readMock).toHaveBeenCalled();
600
- expect(fr2).toEqual(fr);
601
- hardened.close();
602
- expect(streamer.closeMock).toHaveBeenCalled();
603
- });
604
-
605
- it("should correctly iterate over the streamer", async () => {
606
- const streamer = new MockStreamer();
607
- const fr = new Frame({ 1: new Series([1]) });
608
- const fr2 = new Frame({ 1: new Series([2]) });
609
- streamer.responses = [
610
- [fr, null],
611
- [fr2, null],
612
- ];
613
- const hardened = await HardenedStreamer.open(async () => streamer, {
614
- channels: [1],
615
- });
616
- const first = await hardened.next();
617
- expect(first.value).toEqual(fr);
618
- const second = await hardened.next();
619
- expect(second.value).toEqual(fr2);
620
- const third = await hardened.next();
621
- expect(third.done).toBe(true);
622
- expect(streamer.readMock).toHaveBeenCalledTimes(3);
623
- });
624
-
625
- it("should try to re-open the streamer when read fails", async () => {
626
- const streamer1 = new MockStreamer();
627
- const streamer2 = new MockStreamer();
628
- const fr1 = new Frame({ 1: new Series([1]) });
629
- const fr2 = new Frame({ 1: new Series([2]) });
630
- streamer1.responses = [
631
- [fr1, null],
632
- [fr2, new Unreachable({ message: "cat" })],
633
- ];
634
- streamer2.responses = [[fr2, null]];
635
- let count = 0;
636
- const openerMock = vi.fn();
637
- const hardened = await HardenedStreamer.open(
638
- async () => {
639
- count++;
640
- openerMock();
641
- if (count === 1) return streamer1;
642
- return streamer2;
643
- },
644
- {
645
- channels: [1],
646
- },
647
- );
648
- const fr = await hardened.read();
649
- expect(streamer1.readMock).toHaveBeenCalledTimes(1);
650
- expect(fr).toEqual(fr1);
651
- const fr3 = await hardened.read();
652
- expect(fr3).toEqual(fr2);
653
- expect(streamer2.readMock).toHaveBeenCalledTimes(1);
654
- expect(openerMock).toHaveBeenCalledTimes(2);
655
- });
656
-
657
- it("should repeatedly try re-opening the streamer when read fails", async () => {
658
- const streamer1 = new MockStreamer();
659
- const streamer5 = new MockStreamer();
660
- const fr1 = new Frame({ 1: new Series([1]) });
661
- const fr5 = new Frame({ 1: new Series([4]) });
662
- streamer1.responses = [
663
- [fr1, null],
664
- [fr5, new Unreachable({ message: "cat" })],
665
- ];
666
- streamer5.responses = [[fr5, null]];
667
- const openerMock = vi.fn();
668
- let count = 0;
669
- const hardened = await HardenedStreamer.open(
670
- async () => {
671
- count++;
672
- openerMock();
673
- if (count === 1) return streamer1;
674
- if (count < 5) throw new Unreachable({ message: "very unreachable" });
675
- return streamer5;
676
- },
677
- { channels: [1] },
678
- { baseInterval: TimeSpan.milliseconds(1) },
679
- );
680
- const fr = await hardened.read();
681
- expect(fr).toEqual(fr1);
682
- const fr2 = await hardened.read();
683
- expect(fr2).toEqual(fr5);
684
- expect(openerMock).toHaveBeenCalledTimes(5);
685
- });
686
-
687
- it("should rethrow the error when the breaker exceeds the max retries", async () => {
688
- const streamer = new MockStreamer();
689
- const fr = new Frame({ 1: new Series([1]) });
690
- streamer.responses = [[fr, null]];
691
- const openerMock = vi.fn();
692
- await expect(
693
- HardenedStreamer.open(
694
- async () => {
695
- openerMock();
696
- throw new Unreachable({ message: "very unreachable" });
697
- },
698
- { channels: [1] },
699
- { maxRetries: 3, baseInterval: TimeSpan.milliseconds(1) },
700
- ),
701
- ).rejects.toThrow("very unreachable");
702
- });
703
-
704
- it("should retry update when the underlying streamer fails", async () => {
705
- const streamer1 = new MockStreamer();
706
- streamer1.updateErrors = [null, new Unreachable({ message: "cat" })];
707
- const streamer2 = new MockStreamer();
708
- const fr1 = new Frame({ 1: new Series([1]) });
709
- const fr2 = new Frame({ 1: new Series([2]) });
710
- streamer1.responses = [[fr1, null]];
711
- streamer2.responses = [[fr2, null]];
712
- let count = 0;
713
- const openerMock = vi.fn();
714
- const hardened = await HardenedStreamer.open(
715
- async () => {
716
- count++;
717
- openerMock();
718
- if (count === 1) return streamer1;
719
- return streamer2;
720
- },
721
- { channels: [1] },
722
- );
723
-
724
- await hardened.update([1, 2]);
725
- expect(streamer1.updateMock).toHaveBeenCalledWith([1, 2]);
726
-
727
- await hardened.update([2, 3]);
728
- expect(openerMock).toHaveBeenCalledTimes(2);
729
- });
730
- });
731
-
732
- describe("observable", () => {
733
- it("should notify observers when frames are received", async () => {
734
- const mockStreamer = new MockStreamer();
735
- const frame1 = new Frame({ 1: new Series([1, 2, 3]) });
736
- const frame2 = new Frame({ 1: new Series([4, 5, 6]) });
737
-
738
- mockStreamer.responses = [
739
- [frame1, null],
740
- [frame2, null],
741
- ];
742
- mockStreamer.keys = [1];
743
-
744
- const observable = new ObservableStreamer(mockStreamer);
745
-
746
- const receivedFrames: Frame[] = [];
747
- observable.onChange((frame) => {
748
- receivedFrames.push(frame);
749
- });
750
-
751
- await expect.poll(() => receivedFrames.length).toBe(2);
752
- expect(receivedFrames[0]).toEqual(frame1);
753
- expect(receivedFrames[1]).toEqual(frame2);
754
-
755
- await observable.close();
756
- expect(mockStreamer.closeMock).toHaveBeenCalled();
757
- });
758
-
759
- test("should apply transform function to frames", async () => {
760
- const mockStreamer = new MockStreamer();
761
- const frame1 = new Frame({ 1: new Series([1, 2, 3]) });
762
- const frame2 = new Frame({ 1: new Series([4, 5, 6]) });
763
-
764
- mockStreamer.responses = [
765
- [frame1, null],
766
- [frame2, null],
767
- ];
768
- mockStreamer.keys = [1];
769
-
770
- const transform = (frame: Frame): [number, true] | [null, false] => {
771
- try {
772
- const data = Array.from(frame.get(1));
773
- const firstValue = data[0] as number;
774
- return [firstValue, true];
775
- } catch {
776
- return [null, false];
777
- }
778
- };
779
-
780
- const observable = new ObservableStreamer(mockStreamer, transform);
781
-
782
- const receivedValues: number[] = [];
783
- observable.onChange((value) => {
784
- if (value !== null) receivedValues.push(value);
785
- });
786
-
787
- await expect.poll(() => receivedValues.length).toBe(2);
788
- expect(receivedValues[0]).toBe(1);
789
- expect(receivedValues[1]).toBe(4);
790
-
791
- await observable.close();
792
- });
793
-
794
- test("should handle multiple observers", async () => {
795
- const mockStreamer = new MockStreamer();
796
- const frame1 = new Frame({ 1: new Series([10, 20]) });
797
-
798
- mockStreamer.responses = [[frame1, null]];
799
- mockStreamer.keys = [1];
800
-
801
- const observable = new ObservableStreamer(mockStreamer);
802
-
803
- const observer1Results: Frame[] = [];
804
- const observer2Results: Frame[] = [];
805
-
806
- observable.onChange((frame) => {
807
- observer1Results.push(frame);
808
- });
809
-
810
- observable.onChange((frame) => {
811
- observer2Results.push(frame);
812
- });
813
-
814
- await expect.poll(() => observer1Results.length).toBe(1);
815
- expect(observer2Results).toHaveLength(1);
816
- expect(observer1Results[0]).toEqual(frame1);
817
- expect(observer2Results[0]).toEqual(frame1);
818
-
819
- await observable.close();
820
- });
821
-
822
- test("should update channels on underlying streamer", async () => {
823
- const mockStreamer = new MockStreamer();
824
- mockStreamer.keys = [1, 2];
825
-
826
- const observable = new ObservableStreamer(mockStreamer);
827
-
828
- await observable.update([3, 4, 5]);
829
-
830
- expect(mockStreamer.updateMock).toHaveBeenCalledWith([3, 4, 5]);
831
-
832
- await observable.close();
833
- });
834
-
835
- test("should handle empty frame stream gracefully", async () => {
836
- const mockStreamer = new MockStreamer();
837
- mockStreamer.keys = [1];
838
-
839
- const observable = new ObservableStreamer(mockStreamer);
840
-
841
- const receivedFrames: Frame[] = [];
842
- observable.onChange((frame) => {
843
- receivedFrames.push(frame);
844
- });
845
-
846
- await expect.poll(() => receivedFrames.length).toBe(0);
847
- expect(receivedFrames).toHaveLength(0);
848
-
849
- await observable.close();
850
- });
851
-
852
- test("should properly close and cleanup resources", async () => {
853
- const mockStreamer = new MockStreamer();
854
- const frame1 = new Frame({ 1: new Series([1]) });
855
-
856
- mockStreamer.responses = [[frame1, null]];
857
- mockStreamer.keys = [1];
858
-
859
- const observable = new ObservableStreamer(mockStreamer);
860
-
861
- const receivedFrames: Frame[] = [];
862
- observable.onChange((frame) => {
863
- receivedFrames.push(frame);
864
- });
865
-
866
- await observable.close();
867
-
868
- expect(mockStreamer.closeMock).toHaveBeenCalled();
869
- });
870
- });
871
- });