@synnaxlabs/client 0.56.1 → 0.57.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 (741) hide show
  1. package/dist/client-B08VDLSA.js +14463 -0
  2. package/dist/client-B08VDLSA.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 +71 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +43 -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 +37 -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 +40 -17
  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 +279 -0
  398. package/src/framer/cache/reader.ts +160 -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 +104 -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 +18 -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
@@ -0,0 +1,283 @@
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
+ // The query cache value-imports this module, so a runtime edge back into
11
+ // channel or ontology re-creates the import cycle this file exists to break.
12
+ // Runtime imports must stay on leaf modules (external packages, @/errors).
13
+
14
+ import { EOF } from "@synnaxlabs/freighter";
15
+ import { breaker, errors, observe, sync, TimeSpan, TimeStamp } from "@synnaxlabs/x";
16
+
17
+ import { type channel } from "@/channel";
18
+ import { AccessDeniedError, NotFoundError, ValidationError } from "@/errors";
19
+ import { type Frame } from "@/framer/frame";
20
+ import {
21
+ type Streamer,
22
+ type StreamerConfig,
23
+ type StreamOpener,
24
+ } from "@/framer/streamer";
25
+
26
+ type NormalizedStreamerConfig = Extract<StreamerConfig, { channels: unknown }>;
27
+
28
+ // Copies object configs: update() reassigns channels, and the caller's config must
29
+ // not observe that.
30
+ const normalizeConfig = (config: StreamerConfig): NormalizedStreamerConfig =>
31
+ typeof config === "object" && !Array.isArray(config) && "channels" in config
32
+ ? { ...config }
33
+ : { channels: config };
34
+
35
+ /**
36
+ * A hardened streamer that automatically reconnects on failure.
37
+ * This streamer wraps a regular streamer and adds automatic reconnection
38
+ * logic when the connection is lost or errors occur.
39
+ */
40
+ export class HardenedStreamer implements Streamer {
41
+ private current: Streamer | null = null;
42
+ private readonly breaker: breaker.Breaker;
43
+ private readonly opener: StreamOpener;
44
+ private readonly config: NormalizedStreamerConfig;
45
+ private readonly onReopen?: () => void;
46
+ private readonly onDrop?: (error: Error) => void;
47
+ private readonly closeNotifier = new sync.Notifier();
48
+ // A stream that outlives this span proves the incident over; a shorter
49
+ // life keeps the reconnect backoff escalating.
50
+ private readonly stableAfter: TimeSpan;
51
+ private openedAt = TimeStamp.now();
52
+ private closed = false;
53
+ private reconnecting: Promise<void> | null = null;
54
+
55
+ constructor(
56
+ opener: StreamOpener,
57
+ config: StreamerConfig,
58
+ breakerConfig: breaker.Config = {},
59
+ onReopen?: () => void,
60
+ onDrop?: (error: Error) => void,
61
+ ) {
62
+ this.opener = opener;
63
+ this.config = normalizeConfig(config);
64
+ const {
65
+ maxRetries = Infinity,
66
+ baseInterval = TimeSpan.seconds(1),
67
+ // reconnect attempts are cheap: a low cap bounds how long a returned
68
+ // cluster goes unnoticed while backoff is escalated
69
+ maxInterval = TimeSpan.seconds(5),
70
+ scale = 2,
71
+ jitter = 0.25,
72
+ } = breakerConfig ?? {};
73
+ this.breaker = new breaker.Breaker({
74
+ maxRetries,
75
+ baseInterval,
76
+ maxInterval,
77
+ scale,
78
+ jitter,
79
+ // close() interrupts a pending backoff so a retired streamer's
80
+ // reconnect loop ends promptly instead of sleeping through it
81
+ sleepFn: async (duration) => {
82
+ await this.closeNotifier.wait(duration);
83
+ },
84
+ });
85
+ this.stableAfter = new TimeSpan(maxInterval);
86
+ this.onReopen = onReopen;
87
+ this.onDrop = onDrop;
88
+ }
89
+
90
+ /**
91
+ * Opens a new hardened streamer with the given configuration.
92
+ * @param breakerConfig - Retry behavior for reconnect attempts. Defaults to retrying
93
+ * forever on capped, jittered exponential backoff.
94
+ * @param onReopen - Called after every successful reconnect (not the initial open).
95
+ * Frames may have been dropped between the failure and the reopen.
96
+ * @param onDrop - Called when the stream fails and reconnection begins.
97
+ * @returns A promise that resolves to a new hardened streamer
98
+ */
99
+ static async open(
100
+ opener: StreamOpener,
101
+ config: StreamerConfig,
102
+ breakerConfig?: breaker.Config,
103
+ onReopen?: () => void,
104
+ onDrop?: (error: Error) => void,
105
+ ): Promise<HardenedStreamer> {
106
+ const h = new HardenedStreamer(opener, config, breakerConfig, onReopen, onDrop);
107
+ await h.start();
108
+ return h;
109
+ }
110
+
111
+ /**
112
+ * Opens the underlying stream, retrying connectivity failures under the breaker.
113
+ * Call once after construction; {@link open} does both.
114
+ * @throws the open failure when it is not retriable or the breaker is exhausted.
115
+ */
116
+ async start(): Promise<void> {
117
+ await this.runStreamer(false);
118
+ }
119
+
120
+ private async runStreamer(notifyReopen: boolean = true): Promise<void> {
121
+ // A long-lived stream that dropped is a fresh incident: reconnect immediately. A
122
+ // short-lived one is a failing cycle (e.g. a server that accepts streams and
123
+ // instantly ends them): keep backing off, or the loop dials hot.
124
+ if (notifyReopen)
125
+ if (TimeStamp.since(this.openedAt).greaterThan(this.stableAfter))
126
+ this.breaker.reset();
127
+ else if (!(await this.breaker.wait())) throw new EOF();
128
+ while (!this.closed)
129
+ try {
130
+ if (this.current != null) this.current.close();
131
+ this.current = null;
132
+ const next = await this.opener(this.config);
133
+ // closed while the open was in flight: the fresh stream is already
134
+ // retired and must not be handed to callers
135
+ if (this.closed) {
136
+ next.close();
137
+ break;
138
+ }
139
+ this.current = next;
140
+ this.openedAt = TimeStamp.now();
141
+ if (notifyReopen) this.onReopen?.();
142
+ return;
143
+ } catch (e) {
144
+ this.current = null;
145
+ if (this.closed) break;
146
+ const err = errors.fromUnknown(e);
147
+ // Retrying only fixes connectivity; a definitive rejection recurs on every
148
+ // attempt. Expired and invalid tokens are not definitive: the auth
149
+ // middleware refreshes them, and a later attempt gets a fresh budget.
150
+ if (
151
+ AccessDeniedError.matches(err) ||
152
+ ValidationError.matches(err) ||
153
+ NotFoundError.matches(err)
154
+ )
155
+ throw err;
156
+ if (!(await this.breaker.wait())) throw err;
157
+ // close() interrupts the backoff above, so re-check: a retired
158
+ // streamer's failed reconnect is expected, not a fault to report.
159
+ if (this.closed) break;
160
+ console.error("failed to open streamer", e);
161
+ }
162
+ throw new EOF();
163
+ }
164
+
165
+ private get wrapped(): Streamer {
166
+ if (this.current == null) throw new Error("stream closed");
167
+ return this.current;
168
+ }
169
+
170
+ // A failure during an in-flight reconnect joins it; a second run would open a
171
+ // competing stream and leak the loser.
172
+ private async reconnect(error: Error): Promise<void> {
173
+ if (this.reconnecting == null) {
174
+ this.onDrop?.(error);
175
+ this.reconnecting = this.runStreamer().finally(() => {
176
+ this.reconnecting = null;
177
+ });
178
+ }
179
+ await this.reconnecting;
180
+ }
181
+
182
+ async update(channels: channel.Params): Promise<void> {
183
+ if (this.closed) throw new EOF();
184
+ this.config.channels = channels;
185
+ try {
186
+ await this.wrapped.update(channels);
187
+ } catch (e) {
188
+ if (this.closed || EOF.matches(e)) throw errors.fromUnknown(e);
189
+ await this.reconnect(errors.fromUnknown(e));
190
+ return await this.update(channels);
191
+ }
192
+ }
193
+
194
+ async next(): Promise<IteratorResult<Frame>> {
195
+ try {
196
+ return { done: false, value: await this.read() };
197
+ } catch (e) {
198
+ if (EOF.matches(e)) return { done: true, value: undefined };
199
+ throw errors.fromUnknown(e);
200
+ }
201
+ }
202
+
203
+ async read(): Promise<Frame> {
204
+ if (this.closed) throw new EOF();
205
+ try {
206
+ return await this.wrapped.read();
207
+ } catch (e) {
208
+ if (this.closed) throw new EOF();
209
+ // an EOF the client did not ask for is a drop: the server ended the
210
+ // stream, so reconnect like any other failure
211
+ await this.reconnect(errors.fromUnknown(e));
212
+ return await this.read();
213
+ }
214
+ }
215
+
216
+ /** Stops reconnecting and closes the stream. Idempotent; never throws. */
217
+ close(): void {
218
+ if (this.closed) return;
219
+ this.closed = true;
220
+ this.closeNotifier.notify();
221
+ this.current?.close();
222
+ }
223
+
224
+ get keys(): channel.Key[] {
225
+ return this.wrapped.keys;
226
+ }
227
+
228
+ [Symbol.asyncIterator](): AsyncIterator<Frame> {
229
+ return this;
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Wraps a standard streamer to implement an observable interface for handling changes
235
+ * to channel values through an onChange handler.
236
+ */
237
+ export class ObservableStreamer<V = Frame>
238
+ extends observe.Observer<Frame, V>
239
+ implements observe.ObservableAsyncCloseable<V>
240
+ {
241
+ private readonly streamer: Streamer;
242
+ private readonly closePromise: Promise<void>;
243
+ private readonly onDead?: (error: Error) => void;
244
+ private closeRequested = false;
245
+
246
+ /**
247
+ * Creates a new observable streamer.
248
+ * @param transform - An optional transform function to apply to each frame
249
+ * @param onDead - Called when the stream ends on a failure the wrapped streamer will
250
+ * not recover from. No frames follow.
251
+ */
252
+ constructor(
253
+ streamer: Streamer,
254
+ transform?: observe.Transform<Frame, V>,
255
+ onDead?: (error: Error) => void,
256
+ ) {
257
+ super(transform);
258
+ this.streamer = streamer;
259
+ this.onDead = onDead;
260
+ // Nothing awaits closePromise until close(), so a failure would go unhandled.
261
+ this.closePromise = this.stream().catch(console.error);
262
+ }
263
+
264
+ async update(channels: channel.Params): Promise<void> {
265
+ await this.streamer.update(channels);
266
+ }
267
+
268
+ async close(): Promise<void> {
269
+ this.closeRequested = true;
270
+ this.streamer.close();
271
+ await this.closePromise;
272
+ }
273
+
274
+ private async stream(): Promise<void> {
275
+ try {
276
+ for await (const frame of this.streamer) this.notify(frame);
277
+ } catch (exc) {
278
+ this.onDead?.(errors.fromUnknown(exc));
279
+ return;
280
+ }
281
+ if (!this.closeRequested) this.onDead?.(new EOF());
282
+ }
283
+ }
@@ -19,13 +19,15 @@ import {
19
19
  } from "@synnaxlabs/x";
20
20
  import { z } from "zod";
21
21
 
22
- import { channel } from "@/channel";
23
- import { ReadAdapter } from "@/framer/adapter";
22
+ import { type channel } from "@/channel";
23
+ import { keyZ } from "@/channel/types.gen";
24
+ import { type ChannelRetriever, ReadAdapter } from "@/framer/adapter";
24
25
  import { WSIteratorCodec } from "@/framer/codec";
25
26
  import { Frame, frameZ } from "@/framer/frame";
26
27
  import { StreamProxy } from "@/framer/streamProxy";
27
28
  import { IteratorCommand, IteratorResponseVariant } from "@/framer/types.gen";
28
29
 
30
+ /** Span that makes an iterator step by its chunk size instead of a fixed duration. */
29
31
  export const AUTO_SPAN = new TimeSpan(-1);
30
32
 
31
33
  export const iteratorReqZ = z.object({
@@ -33,7 +35,7 @@ export const iteratorReqZ = z.object({
33
35
  span: TimeSpan.z.optional(),
34
36
  bounds: TimeRange.z.optional(),
35
37
  stamp: TimeStamp.z.optional(),
36
- keys: channel.keyZ.array().optional(),
38
+ keys: keyZ.array().optional(),
37
39
  chunkSize: z.number().optional(),
38
40
  downsampleFactor: z.int().optional(),
39
41
  });
@@ -50,6 +52,7 @@ export const iteratorResZ = z.object({
50
52
 
51
53
  export interface IteratorResponse extends z.infer<typeof iteratorResZ> {}
52
54
 
55
+ /** Config for an iterator. Pass it to `client.telem.openIterator`. */
53
56
  export interface IteratorConfig {
54
57
  /** chunkSize is the maximum number of samples contained per channel in the frame
55
58
  * resulting from a call to next with {@link AUTO_SPAN}.
@@ -63,12 +66,9 @@ export interface IteratorConfig {
63
66
  }
64
67
 
65
68
  /**
66
- * Used to iterate over a clusters telemetry in time-order. It should not be
67
- * instantiated directly, and should instead be instantiated via the SegmentClient.
68
- *
69
- * Using an iterator is ideal when querying/processing large ranges of data, but
70
- * is relatively complex and difficult to use. If you're looking to retrieve
71
- * telemetry between two timestamps, see the SegmentClient.read method.
69
+ * Iterates over a cluster's telemetry in time order. Open one through the segment
70
+ * client, never directly. Suited to large ranges; to read between two timestamps, use
71
+ * the segment client's read method instead.
72
72
  */
73
73
  export class Iterator {
74
74
  private readonly stream: StreamProxy<typeof iteratorReqZ, typeof iteratorResZ>;
@@ -85,24 +85,20 @@ export class Iterator {
85
85
  }
86
86
 
87
87
  /**
88
- * Opens the iterator, configuring it to iterate over the telemetry in the
89
- * channels with the given keys within the provided time range.
90
- *
91
- * @param tr - The time range to iterate over.
92
- * @param channels - The channels for the iterator to iterate over (can be provided
93
- * in keys or names).
94
- * @param retriever - Retriever used to retrieve channel keys from names.
88
+ * Opens the iterator, configuring it to iterate over the telemetry in the channels
89
+ * with the given keys within the provided time range.
90
+ * @param retrieveChannels - Resolves channel names to keys and data types.
95
91
  * @param client - The stream client allowing streaming of iterated data.
96
92
  * @param opts - See {@link IteratorConfig}.
97
93
  */
98
94
  static async _open(
99
95
  tr: CrudeTimeRange,
100
96
  channels: channel.Params,
101
- retriever: channel.Retriever,
97
+ retrieveChannels: ChannelRetriever,
102
98
  client: WebSocketClient,
103
99
  opts: IteratorConfig = {},
104
100
  ): Promise<Iterator> {
105
- const adapter = await ReadAdapter.open(retriever, channels);
101
+ const adapter = await ReadAdapter.open(retrieveChannels, channels);
106
102
  client = client.withCodec(new WSIteratorCodec(adapter.codec));
107
103
  const stream = await client.stream("/frame/iterate", iteratorReqZ, iteratorResZ);
108
104
  const iter = new Iterator(stream, adapter);
@@ -118,14 +114,12 @@ export class Iterator {
118
114
 
119
115
  /**
120
116
  * Reads the next time span of telemetry for each channel in the iterator.
121
- *
122
- * @param span - The time span to read. A negative span is equivalent
123
- * to calling prev with the absolute value of the span. If the span is
124
- * AUTO_SPAN, the iterator will automatically determine the span to read.
125
- * This is useful for iterating over an entire range efficiently.
126
- *
127
- * @returns false if a segment satisfying the request can't be found for a
128
- * particular channel or the iterator has accumulated an error.
117
+ * @param span - The time span to read. A negative span is equivalent to calling prev
118
+ * with the absolute value of the span. If the span is AUTO_SPAN, the iterator will
119
+ * automatically determine the span to read. This is useful for iterating over an
120
+ * entire range efficiently.
121
+ * @returns false if a segment satisfying the request can't be found for a particular
122
+ * channel or the iterator has accumulated an error.
129
123
  */
130
124
  async next(span: CrudeTimeSpan = AUTO_SPAN): Promise<boolean> {
131
125
  return await this.execute({
@@ -136,12 +130,10 @@ export class Iterator {
136
130
 
137
131
  /**
138
132
  * Reads the previous time span of telemetry for each channel in the iterator.
139
- *
140
- * @param span - The time span to read. A negative span is equivalent
141
- * to calling next with the absolute value of the span. If the span is
142
- * AUTO_SPAN, the iterator will automatically determine the span to read.
143
- * This is useful for iterating over an entire range efficiently.
144
- *
133
+ * @param span - The time span to read. A negative span is equivalent to calling next
134
+ * with the absolute value of the span. If the span is AUTO_SPAN, the iterator will
135
+ * automatically determine the span to read. This is useful for iterating over an
136
+ * entire range efficiently.
145
137
  * @returns false if a segment satisfying the request can't be found for a particular
146
138
  * channel or the iterator has accumulated an error.
147
139
  */
@@ -153,10 +145,9 @@ export class Iterator {
153
145
  }
154
146
 
155
147
  /**
156
- * Seeks the iterator to the first segment in the time range, but does not read
157
- * it. Also invalidates the iterator. The iterator will not be considered valid
158
- * until a call to next or prev.
159
- *
148
+ * Seeks the iterator to the first segment in the time range, but does not read it.
149
+ * Also invalidates the iterator. The iterator will not be considered valid until a
150
+ * call to next or prev.
160
151
  * @returns false if the iterator is not pointing to a valid segment for a particular
161
152
  * channel or has accumulated an error.
162
153
  */
@@ -176,10 +167,9 @@ export class Iterator {
176
167
  }
177
168
 
178
169
  /**
179
- * Seeks the iterator to the first segment whose start is less than or equal to
180
- * the provided timestamp. Also invalidates the iterator. The iterator will not be
170
+ * Seeks the iterator to the first segment whose start is less than or equal to the
171
+ * provided timestamp. Also invalidates the iterator. The iterator will not be
181
172
  * considered valid until a call to next or prev.
182
- *
183
173
  * @returns false if the iterator is not pointing to a valid segment for a particular
184
174
  * channel or has accumulated an error.
185
175
  */
@@ -191,10 +181,9 @@ export class Iterator {
191
181
  }
192
182
 
193
183
  /**
194
- * Seeks the iterator to the first segment whose start is greater than or equal to
195
- * the provided timestamp. Also invalidates the iterator. The iterator will not be
184
+ * Seeks the iterator to the first segment whose start is greater than or equal to the
185
+ * provided timestamp. Also invalidates the iterator. The iterator will not be
196
186
  * considered valid until a call to next or prev.
197
- *
198
187
  * @returns false if the iterator is not pointing to a valid segment for a particular
199
188
  * channel or has accumulated an error.
200
189
  */
@@ -12,6 +12,7 @@ import { type CrudeTimeRange, csv, runtime } from "@synnaxlabs/x";
12
12
 
13
13
  import { type channel } from "@/channel";
14
14
  import { UnexpectedError } from "@/errors";
15
+ import { type ChannelRetriever } from "@/framer/adapter";
15
16
  import { type Frame } from "@/framer/frame";
16
17
  import { Iterator, type IteratorConfig } from "@/framer/iterator";
17
18
 
@@ -24,11 +25,11 @@ export interface ReadRequest {
24
25
  }
25
26
 
26
27
  export class Reader {
27
- private readonly retriever: channel.Retriever;
28
+ private readonly retrieveChannels: ChannelRetriever;
28
29
  private readonly streamClient: WebSocketClient;
29
30
 
30
- constructor(retriever: channel.Retriever, streamClient: WebSocketClient) {
31
- this.retriever = retriever;
31
+ constructor(retrieveChannels: ChannelRetriever, streamClient: WebSocketClient) {
32
+ this.retrieveChannels = retrieveChannels;
32
33
  this.streamClient = streamClient;
33
34
  }
34
35
 
@@ -39,23 +40,23 @@ export class Reader {
39
40
  channelNames,
40
41
  iteratorConfig,
41
42
  } = request;
42
- const channelPayloads = await this.retriever.retrieve(channelParams);
43
+ const channelPayloads = await this.retrieveChannels(channelParams);
43
44
  const allKeys = new Set<channel.Key>();
45
+ const payloadKeys = new Set<channel.Key>();
44
46
  channelPayloads.forEach((ch) => {
45
47
  allKeys.add(ch.key);
48
+ payloadKeys.add(ch.key);
46
49
  if (ch.index !== 0) allKeys.add(ch.index);
47
50
  });
48
- const missingIndexKeys = Array.from(allKeys).filter(
49
- (k) => !channelPayloads.some((ch) => ch.key === k),
50
- );
51
- if (missingIndexKeys.length > 0) {
52
- const indexChannels = await this.retriever.retrieve(missingIndexKeys);
51
+ const missingIndexKeys = allKeys.difference(payloadKeys);
52
+ if (missingIndexKeys.size > 0) {
53
+ const indexChannels = await this.retrieveChannels(Array.from(missingIndexKeys));
53
54
  channelPayloads.push(...indexChannels);
54
55
  }
55
56
  const iterator = await Iterator._open(
56
57
  timeRange,
57
58
  Array.from(allKeys),
58
- this.retriever,
59
+ this.retrieveChannels,
59
60
  this.streamClient,
60
61
  iteratorConfig,
61
62
  );
@@ -172,7 +173,6 @@ const createCSVReadableStream = ({
172
173
  if (remainingPending === 0 || stagedRecords.length === 0) {
173
174
  const hasMore = await iterator.next();
174
175
  if (!hasMore) {
175
- // Flush remaining records
176
176
  const finalRows = buildCSVRows(Infinity, true);
177
177
  if (finalRows.length > 0)
178
178
  controller.enqueue(