@synnaxlabs/client 0.56.2 → 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
@@ -17,8 +17,11 @@ import {
17
17
  TimeSpan,
18
18
  } from "@synnaxlabs/x";
19
19
 
20
- import { channel } from "@/channel";
20
+ import { type channel } from "@/channel";
21
+ import { analyzeParams } from "@/channel/payload";
22
+ import { type ChannelRetriever } from "@/framer/adapter";
21
23
  import { Deleter } from "@/framer/deleter";
24
+ import { Feed, type FeedOptions } from "@/framer/feed";
22
25
  import { Frame } from "@/framer/frame";
23
26
  import { AUTO_SPAN, Iterator, type IteratorConfig } from "@/framer/iterator";
24
27
  import { Reader, type ReadRequest } from "@/framer/reader";
@@ -29,27 +32,32 @@ import { ontology } from "@/ontology";
29
32
  export const ontologyID = ontology.createIDFactory<string>("framer");
30
33
  export const TYPE_ONTOLOGY_ID = ontologyID("");
31
34
 
35
+ /** Config for {@link Client}. */
36
+ export interface ClientConfig {
37
+ stream: WebSocketClient;
38
+ unary: UnaryClient;
39
+ retrieveChannels: ChannelRetriever;
40
+ }
41
+
42
+ /**
43
+ * Reads and writes telemetry on a Core. Reach it through `client.telem` rather than
44
+ * building one: `read` and `write` cover one-shot access, and the `open*` methods hand
45
+ * back a long-lived stream the caller must close.
46
+ */
32
47
  export class Client {
33
- private readonly streamClient: WebSocketClient;
34
- private readonly retriever: channel.Retriever;
48
+ private readonly cfg: ClientConfig;
35
49
  private readonly deleter: Deleter;
36
50
  private readonly reader: Reader;
37
51
 
38
- constructor(
39
- stream: WebSocketClient,
40
- unary: UnaryClient,
41
- retriever: channel.Retriever,
42
- ) {
43
- this.streamClient = stream;
44
- this.retriever = retriever;
52
+ constructor(cfg: ClientConfig) {
53
+ const { stream, unary, retrieveChannels } = cfg;
54
+ this.cfg = cfg;
45
55
  this.deleter = new Deleter(unary);
46
- this.reader = new Reader(retriever, stream);
56
+ this.reader = new Reader(retrieveChannels, stream);
47
57
  }
48
58
 
49
59
  /**
50
60
  * Opens a new iterator over the given channels within the provided time range.
51
- *
52
- * @param tr - A time range to iterate over.
53
61
  * @param channels - A list of channels (by name or key) to iterate over.
54
62
  * @param opts - see {@link IteratorConfig}
55
63
  * @returns a new {@link Iterator}.
@@ -59,33 +67,47 @@ export class Client {
59
67
  channels: channel.Params,
60
68
  opts?: IteratorConfig,
61
69
  ): Promise<Iterator> {
62
- return await Iterator._open(tr, channels, this.retriever, this.streamClient, opts);
70
+ return await Iterator._open(
71
+ tr,
72
+ channels,
73
+ this.cfg.retrieveChannels,
74
+ this.cfg.stream,
75
+ opts,
76
+ );
63
77
  }
64
78
 
65
79
  /**
66
80
  * Opens a new writer on the given channels.
67
- *
68
81
  * @param config - The configuration for the created writer, see documentation for
69
82
  * writerConfig for more detail.
70
83
  * @returns a new {@link Writer}.
71
84
  */
72
85
  async openWriter(config: WriterConfig): Promise<Writer> {
73
- return await Writer._open(this.retriever, this.streamClient, config);
86
+ return await Writer._open(this.cfg.retrieveChannels, this.cfg.stream, config);
74
87
  }
75
88
 
76
89
  /**
77
90
  * Opens a new streamer with the provided configuration.
78
- *
79
- * @param config - Configuration parameters for the streamer.
80
91
  * @param config.channels - The channels to stream values from. Can be a key, name,
81
92
  * list of keys, or list of names.
82
- * @param config.from - If this parameter is set and is before the current time,
83
- * the streamer will first read and receive historical data from before this point
84
- * and then will start reading new values.
85
- *
93
+ * @param config.from - If this parameter is set and is before the current time, the
94
+ * streamer will first read and receive historical data from before this point and
95
+ * then will start reading new values.
86
96
  */
87
97
  async openStreamer(config: StreamerConfig): Promise<Streamer> {
88
- return await openStreamer(this.retriever, this.streamClient, config);
98
+ return await openStreamer(this.cfg.retrieveChannels, this.cfg.stream, config);
99
+ }
100
+
101
+ /**
102
+ * Opens a feed over this client. The underlying stream opens on first demand;
103
+ * the caller must close the feed.
104
+ */
105
+ openFeed(options: FeedOptions = {}): Feed {
106
+ return new Feed({
107
+ ...options,
108
+ readRemote: async (tr, keys) => await this.read(tr, keys),
109
+ openStreamer: async (config) => await this.openStreamer(config),
110
+ });
89
111
  }
90
112
 
91
113
  async write(
@@ -106,13 +128,13 @@ export class Client {
106
128
  ): Promise<void>;
107
129
 
108
130
  /**
109
- * Writes telemetry to the given channel starting at the given timestamp.
131
+ * Writes telemetry to the given channels, starting at the given timestamp. It commits
132
+ * and closes before it returns, so the samples land on disk.
110
133
  *
111
- * @param channels - The key of the channel to write to.
112
- * @param start - The starting timestamp of the first sample in data.
113
- * @param data - The telemetry to write. This telemetry must have the same
114
- * data type as the channel.
115
- * @throws if the channel does not exist.
134
+ * @param start - The timestamp of the first sample.
135
+ * @throws {NotFoundError} if a channel does not exist.
136
+ * @throws {UnauthorizedError} if another writer holds control of a channel.
137
+ * @throws {ValidationError} if the data type does not match the channel's.
116
138
  */
117
139
  async write(
118
140
  start: CrudeTimeStamp,
@@ -142,6 +164,12 @@ export class Client {
142
164
  await w.close();
143
165
  }
144
166
 
167
+ /**
168
+ * Reads every sample in the time range from the given channels.
169
+ *
170
+ * @returns a {@link MultiSeries} for one channel, or a {@link Frame} for several.
171
+ * @throws {NotFoundError} if a channel does not exist.
172
+ */
145
173
  async read(
146
174
  tr: CrudeTimeRange,
147
175
  channel: channel.Key | channel.Name,
@@ -153,7 +181,7 @@ export class Client {
153
181
  channels?: channel.Params,
154
182
  ): Promise<MultiSeries | Frame | ReadableStream<Uint8Array>> {
155
183
  if (!("start" in tr)) return await this.reader.read(tr);
156
- const { single } = channel.analyzeParams(channels!);
184
+ const { single } = analyzeParams(channels!);
157
185
  const fr = await this.readFrame(tr, channels!);
158
186
  if (single) return fr.get(channels as channel.Key | channel.Name);
159
187
  return fr;
@@ -181,22 +209,18 @@ export class Client {
181
209
  async readLatest(channels: channel.Params, n: number): Promise<Frame>;
182
210
 
183
211
  /**
184
- * Reads the latest n samples from the given channel(s).
185
- *
186
- * If fewer than n samples are available, returns only the samples that
187
- * exist.
188
- *
189
- * @param channels - A single channel key/name or an array of channel
190
- * keys/names.
212
+ * Reads the latest n samples from the given channel(s). If fewer than n samples are
213
+ * available, returns only the samples that exist.
214
+ * @param channels - A single channel key/name or an array of channel keys/names.
191
215
  * @param n - The maximum number of samples to read. Defaults to 1.
192
- * @returns A MultiSeries when a single channel is provided, or a Frame when
193
- * multiple channels are provided.
216
+ * @returns A MultiSeries when a single channel is provided, or a Frame when multiple
217
+ * channels are provided.
194
218
  */
195
219
  async readLatest(
196
220
  channels: channel.Params,
197
221
  n: number = 1,
198
222
  ): Promise<MultiSeries | Frame> {
199
- const { single } = channel.analyzeParams(channels);
223
+ const { single } = analyzeParams(channels);
200
224
  const fr = await this.readLatestNFrame(channels, n);
201
225
  if (single) return fr.get(channels as channel.Key | channel.Name);
202
226
  return fr;
@@ -216,11 +240,15 @@ export class Client {
216
240
  return frame;
217
241
  }
218
242
 
243
+ /**
244
+ * Deletes every sample in the time range from the given channels. Deletion is
245
+ * permanent.
246
+ */
219
247
  async delete(channels: channel.Params, timeRange: CrudeTimeRange): Promise<void> {
220
- const { normalized, variant } = channel.analyzeParams(channels);
248
+ const { normalized, variant } = analyzeParams(channels);
221
249
  const bounds = new TimeRange(timeRange);
222
250
  if (variant === "keys")
223
- return await this.deleter.delete({ keys: normalized as channel.Key[], bounds });
224
- return await this.deleter.delete({ names: normalized as string[], bounds });
251
+ return await this.deleter.delete({ keys: normalized, bounds });
252
+ return await this.deleter.delete({ names: normalized, bounds });
225
253
  }
226
254
  }
@@ -24,22 +24,51 @@ import { type StreamerResponse } from "@/framer/streamer";
24
24
  import { IteratorResponseVariant, WriterCommand } from "@/framer/types.gen";
25
25
  import { type WriteRequest } from "@/framer/writer";
26
26
 
27
+ const BITS_PER_BYTE = 8;
28
+
29
+ const bitPackedByteCount = (nSamples: number): number =>
30
+ Math.ceil(nSamples / BITS_PER_BYTE);
31
+
27
32
  const seriesPldLength = (series: SeriesPayload): number =>
28
33
  series.data.byteLength / series.dataType.density.valueOf();
29
34
 
30
- interface KeyedSeries extends SeriesPayload {
31
- key: number;
32
- }
35
+ const seriesWireByteLength = (series: SeriesPayload): number => {
36
+ if (series.dataType.equals(DataType.BOOLEAN))
37
+ return bitPackedByteCount(seriesPldLength(series));
38
+ return series.data.byteLength;
39
+ };
40
+
41
+ const packBoolBits = (src: ArrayBuffer | Uint8Array): Uint8Array => {
42
+ const srcBytes = src instanceof Uint8Array ? src : new Uint8Array(src);
43
+ const dst = new Uint8Array(bitPackedByteCount(srcBytes.length));
44
+ for (let i = 0; i < srcBytes.length; i++)
45
+ if (srcBytes[i] !== 0)
46
+ dst[Math.floor(i / BITS_PER_BYTE)] |= 1 << (i % BITS_PER_BYTE);
47
+ return dst;
48
+ };
49
+
50
+ const unpackBoolBits = (src: Uint8Array, sampleCount: number): ArrayBuffer => {
51
+ const buf = new ArrayBuffer(sampleCount);
52
+ const dst = new Uint8Array(buf);
53
+ for (let i = 0; i < sampleCount; i++)
54
+ dst[i] = (src[Math.floor(i / BITS_PER_BYTE)] >> (i % BITS_PER_BYTE)) & 1;
55
+ return buf;
56
+ };
57
+
58
+ /** Orders channel keys the way the Core does. The default comparator sorts numbers as
59
+ * strings and diverges as soon as two keys differ in decimal width. */
60
+ const compareKeys = (a: channel.Key, b: channel.Key): number => a - b;
33
61
 
34
62
  const sortFramePayloadByKey = (framePayload: Payload): void => {
35
63
  const { keys, series } = framePayload;
36
- keys.forEach((key, index) => {
37
- (series[index] as KeyedSeries).key = key;
38
- });
39
- series.sort((a, b) => (a as KeyedSeries).key - (b as KeyedSeries).key);
40
- keys.sort((a, b) => a - b);
41
- // @ts-expect-error - deleting static property keys.
42
- series.forEach((ser) => delete (ser as KeyedSeries).key);
64
+ if (keys.every((k, i) => i === 0 || keys[i - 1] <= k)) return;
65
+ const order = keys.map((_, i) => i).sort((a, b) => compareKeys(keys[a], keys[b]));
66
+ const orderedKeys = order.map((i) => keys[i]);
67
+ const orderedSeries = order.map((i) => series[i]);
68
+ for (let i = 0; i < keys.length; i++) {
69
+ keys[i] = orderedKeys[i];
70
+ series[i] = orderedSeries[i];
71
+ }
43
72
  };
44
73
 
45
74
  const ZERO_ALIGNMENTS_FLAG_POS = 5;
@@ -75,7 +104,7 @@ export class Codec {
75
104
  update(keys: channel.Key[], dataTypes: DataType[]): void {
76
105
  this.seqNum++;
77
106
  const state = {
78
- keys,
107
+ keys: [...keys],
79
108
  keyDataTypes: new Map(),
80
109
  hasVariableDataTypes: false,
81
110
  };
@@ -84,7 +113,9 @@ export class Codec {
84
113
  state.keyDataTypes.set(k, dt);
85
114
  if (dt.isVariable) state.hasVariableDataTypes = true;
86
115
  });
87
- state.keys.sort();
116
+ // Encoder and decoder walk this order positionally when a frame carries every
117
+ // channel, so it has to match the Core's.
118
+ state.keys.sort(compareKeys);
88
119
  this.states.set(this.seqNum, state);
89
120
  this.currState = state;
90
121
  }
@@ -133,7 +164,7 @@ export class Codec {
133
164
  `Series data type of ${series.dataType.toString()} does not match the data type of ${dt.toString()} for channel ${key}`,
134
165
  );
135
166
 
136
- byteArraySize += series.data.byteLength;
167
+ byteArraySize += seriesWireByteLength(series);
137
168
  if (currDataSize === -1) {
138
169
  currDataSize = pldLength;
139
170
  startTime = series.timeRange?.start;
@@ -208,8 +239,11 @@ export class Codec {
208
239
  view.setUint32(offset, seriesLengthOrSize, true);
209
240
  offset += DATA_LENGTH_SIZE;
210
241
  }
211
- buffer.set(new Uint8Array(series.data), offset);
212
- offset += series.data.byteLength;
242
+ const bytes = series.dataType.equals(DataType.BOOLEAN)
243
+ ? packBoolBits(series.data)
244
+ : new Uint8Array(series.data);
245
+ buffer.set(bytes, offset);
246
+ offset += bytes.byteLength;
213
247
  if (!equalTimeRangesFlag && !timeRangesZeroFlag) {
214
248
  view.setBigUint64(offset, series.timeRange?.start.valueOf() ?? 0n, true);
215
249
  offset += TIMESTAMP_SIZE;
@@ -281,12 +315,15 @@ export class Codec {
281
315
 
282
316
  let dataByteLength = currSize;
283
317
  if (!dataType.isVariable) dataByteLength *= dataType.density.valueOf();
284
- if (index + dataByteLength > view.byteLength) return false;
318
+ const isBool = dataType.equals(DataType.BOOLEAN);
319
+ const wireByteLength = isBool ? bitPackedByteCount(currSize) : dataByteLength;
320
+ if (index + wireByteLength > view.byteLength) return false;
321
+ const wireBytes = src.slice(index, index + wireByteLength);
285
322
  const currSeries: SeriesPayload = {
286
323
  dataType,
287
- data: src.slice(index, index + dataByteLength).buffer,
324
+ data: isBool ? unpackBoolBits(wireBytes, currSize) : wireBytes.buffer,
288
325
  };
289
- index += dataByteLength;
326
+ index += wireByteLength;
290
327
  if (!equalTimeRangesFlag && !timeRangesZeroFlag) {
291
328
  if (index + TIMESTAMP_SIZE * 2 > view.byteLength) return false;
292
329
  const start = view.getBigUint64(index, true);
@@ -11,21 +11,19 @@ import { type UnaryClient } from "@synnaxlabs/freighter";
11
11
  import { TimeRange } from "@synnaxlabs/x";
12
12
  import { z } from "zod";
13
13
 
14
- import { channel } from "@/channel";
14
+ import { keyZ, nameZ } from "@/channel/types.gen";
15
15
 
16
16
  const reqZ = z.object({
17
- keys: channel.keyZ.array().optional(),
17
+ keys: keyZ.array().optional(),
18
18
  bounds: TimeRange.z,
19
- names: channel.nameZ.array().optional(),
19
+ names: nameZ.array().optional(),
20
20
  });
21
21
  interface Request extends z.infer<typeof reqZ> {}
22
22
 
23
23
  const resZ = z.object({});
24
24
 
25
+ /** Deletes a time range of telemetry from a Core. Reach it through `client.telem`. */
25
26
  export class Deleter {
26
- /*
27
- Deleter is used to delete a time range of telemetry from the data engine.
28
- */
29
27
  private readonly client: UnaryClient;
30
28
 
31
29
  constructor(client: UnaryClient) {
@@ -7,8 +7,18 @@
7
7
  // License, use of this software will be governed by the Apache License, Version 2.0,
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
+ export { type ChannelRetriever } from "@/framer/adapter";
11
+ export { type RemoteReader } from "@/framer/cache/reader";
12
+ export {
13
+ type StatusHandler,
14
+ type StreamHandler,
15
+ type Subscription,
16
+ } from "@/framer/cache/streamer";
17
+ export { IDENTITY_TRANSFORM, type Transform } from "@/framer/cache/transform";
10
18
  export * from "@/framer/client";
19
+ export * from "@/framer/feed";
11
20
  export * from "@/framer/frame";
21
+ export * from "@/framer/hardened";
12
22
  export * from "@/framer/iterator";
13
23
  export * from "@/framer/reader";
14
24
  export * from "@/framer/streamer";
@@ -0,0 +1,108 @@
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 { type MultiSeries, type TimeRange } from "@synnaxlabs/x";
11
+
12
+ import { type channel } from "@/channel";
13
+ import { Cache, type CacheProps } from "@/framer/cache/cache";
14
+ import { Reader, type ReaderProps } from "@/framer/cache/reader";
15
+ import {
16
+ MultiplexedStreamer,
17
+ type MultiplexedStreamerProps,
18
+ type StreamHandler,
19
+ type Subscription,
20
+ } from "@/framer/cache/streamer";
21
+ import { HardenedStreamer } from "@/framer/hardened";
22
+ import { type StreamOpener } from "@/framer/streamer";
23
+
24
+ /** Props for {@link Feed}, including the transport it reads and streams through. */
25
+ export interface FeedProps
26
+ extends
27
+ CacheProps,
28
+ Omit<ReaderProps, "cache">,
29
+ Omit<MultiplexedStreamerProps, "cache" | "openStreamer"> {
30
+ openStreamer: StreamOpener;
31
+ }
32
+
33
+ /** The part of {@link FeedProps} a caller sets. The client supplies the rest. */
34
+ export interface FeedOptions extends Omit<FeedProps, "readRemote" | "openStreamer"> {}
35
+
36
+ /**
37
+ * Cached, demand-managed access to channel telemetry: durable streaming
38
+ * subscriptions multiplexed onto one frame stream, and batched historical reads
39
+ * served through per-channel rolling buffers.
40
+ */
41
+ export class Feed {
42
+ private readonly cache: Cache;
43
+ private readonly reader: Reader;
44
+ private readonly streamer: MultiplexedStreamer;
45
+
46
+ constructor(props: FeedProps) {
47
+ const {
48
+ readRemote,
49
+ openStreamer,
50
+ transform,
51
+ instrumentation,
52
+ dynamicBufferSize,
53
+ gcInterval,
54
+ staleEntryThreshold,
55
+ removalDelay,
56
+ breaker,
57
+ batchDebounce,
58
+ overlapThreshold,
59
+ } = props;
60
+ this.cache = new Cache({
61
+ transform,
62
+ dynamicBufferSize,
63
+ gcInterval,
64
+ staleEntryThreshold,
65
+ instrumentation: instrumentation?.child("cache"),
66
+ });
67
+ this.reader = new Reader({
68
+ readRemote,
69
+ cache: this.cache,
70
+ batchDebounce,
71
+ overlapThreshold,
72
+ });
73
+ this.streamer = new MultiplexedStreamer({
74
+ cache: this.cache,
75
+ openStreamer: async (config, { onReopen, onDrop }) =>
76
+ await HardenedStreamer.open(openStreamer, config, breaker, onReopen, onDrop),
77
+ removalDelay,
78
+ breaker,
79
+ instrumentation: instrumentation?.child("streamer"),
80
+ });
81
+ }
82
+
83
+ /**
84
+ * Registers durable streaming demand for the given keys. Returns synchronously;
85
+ * convergence failures surface as per-key statuses, never as rejections. The
86
+ * handler's first call precedes registration, so a throw from it leaves no
87
+ * subscription behind.
88
+ * @throws {UnexpectedError} if the feed has been closed.
89
+ */
90
+ stream(handler: StreamHandler, keys: channel.Key[]): Subscription {
91
+ return this.streamer.stream(handler, keys);
92
+ }
93
+
94
+ /**
95
+ * Reads the given time range for the given channel, serving from the cache and
96
+ * gap-filling from the cluster.
97
+ */
98
+ async read(tr: TimeRange, key: channel.Key): Promise<MultiSeries> {
99
+ return await this.reader.read(tr, key);
100
+ }
101
+
102
+ /** Closes the feed, releasing the stream and all cached buffers. */
103
+ async close(): Promise<void> {
104
+ await this.streamer.close();
105
+ await this.reader.close();
106
+ this.cache.close();
107
+ }
108
+ }
@@ -26,6 +26,7 @@ import { UnexpectedError, ValidationError } from "@/errors";
26
26
 
27
27
  type ColumnType = "key" | "name" | null;
28
28
 
29
+ /** A frame's shape without its samples, for logging and debugging. */
29
30
  export interface Digest extends Record<channel.Key | channel.Name, SeriesDigest[]> {}
30
31
 
31
32
  const columnType = (columns: channel.PrimitiveParams): ColumnType => {
@@ -53,6 +54,7 @@ const validateMatchedColsAndSeries = (
53
54
  );
54
55
  };
55
56
 
57
+ /** Anything {@link Frame}'s constructor accepts. */
56
58
  export type CrudeFrame =
57
59
  | Frame
58
60
  | CrudePayload
@@ -108,7 +110,6 @@ export class Frame {
108
110
  return;
109
111
  }
110
112
 
111
- // Construction from a map.
112
113
  if (columnsOrData instanceof Map) {
113
114
  columnsOrData.forEach((v, k) => this.push(k, ...array.toArray(v)));
114
115
  return;
@@ -116,7 +117,6 @@ export class Frame {
116
117
 
117
118
  const isObject = typeof columnsOrData === "object" && !Array.isArray(columnsOrData);
118
119
 
119
- // Construction from a payload.
120
120
  if (isObject) {
121
121
  if ("keys" in columnsOrData && "series" in columnsOrData) {
122
122
  const data_ = columnsOrData as Payload;
@@ -124,7 +124,8 @@ export class Frame {
124
124
  data_.keys ??= [];
125
125
  const series = data_.series.map((a) => seriesFromPayload(a));
126
126
  validateMatchedColsAndSeries(data_.keys, series);
127
- data_.keys.forEach((key, i) => this.push(key, series[i]));
127
+ this.columns = data_.keys.slice();
128
+ this.series = series;
128
129
  } else
129
130
  Object.entries(columnsOrData).forEach(([k, v]) => {
130
131
  const key = parseInt(k, 10);
@@ -134,7 +135,6 @@ export class Frame {
134
135
  return;
135
136
  }
136
137
 
137
- // Construction from a set of series and columns.
138
138
  if (
139
139
  Array.isArray(columnsOrData) ||
140
140
  ["string", "number"].includes(typeof columnsOrData)
@@ -197,9 +197,7 @@ export class Frame {
197
197
  return unique.unique(this.names);
198
198
  }
199
199
 
200
- /**
201
- * @returns the unique columns in the frame.
202
- */
200
+ /** @returns the unique columns in the frame. */
203
201
  get uniqueColumns(): channel.Key[] | channel.Name[] {
204
202
  return this.colType === "key" ? this.uniqueKeys : this.uniqueNames;
205
203
  }
@@ -246,8 +244,8 @@ export class Frame {
246
244
  */
247
245
  get isWeaklyAligned(): boolean {
248
246
  if (this.columns.length <= 1) return true;
249
- const ranges = this.timeRanges;
250
- return ranges.every((tr) => tr.equals(ranges[0]));
247
+ const { timeRanges } = this;
248
+ return timeRanges.every((tr) => tr.equals(timeRanges[0]));
251
249
  }
252
250
 
253
251
  timeRange(col?: channel.Key | channel.Name): TimeRange {
@@ -288,19 +286,10 @@ export class Frame {
288
286
  return new MultiSeries(this.series.filter((_, i) => this.columns[i] === key));
289
287
  }
290
288
 
291
- /**
292
- * Pushes a set of series for the given channel onto the frame.
293
- *
294
- * @param key the channel key or name;
295
- * @param v the series to push.
296
- */
289
+ /** Pushes a set of series for the given channel onto the frame. */
297
290
  push(key: channel.Key | channel.Name, ...v: Series[]): void;
298
291
 
299
- /**
300
- * Pushes the frame onto the current frame.
301
- *
302
- * @param frame - the frame to push.
303
- */
292
+ /** Pushes the frame onto the current frame. */
304
293
  push(frame: Frame): void;
305
294
 
306
295
  push(keyOrFrame: channel.Key | channel.Name | Frame, ...v: Series[]): void {
@@ -348,8 +337,7 @@ export class Frame {
348
337
 
349
338
  /**
350
339
  * @returns a new frame containing the mapped output of the provided function.
351
- * @param fn a function that takes a channel key and series and returns a
352
- * boolean.
340
+ * @param fn a function that takes a channel key and series and returns a boolean.
353
341
  */
354
342
  map(
355
343
  fn: (
@@ -380,7 +368,6 @@ export class Frame {
380
368
 
381
369
  /**
382
370
  * Iterates over all series in the current frame.
383
- *
384
371
  * @param fn a function that takes a channel key and series.
385
372
  */
386
373
  forEach(fn: (k: channel.Key | channel.Name, arr: Series, i: number) => void): void {
@@ -470,6 +457,7 @@ export class Frame {
470
457
  }
471
458
  }
472
459
 
460
+ /** Zod schema for a frame on the wire. */
473
461
  export const frameZ = z.object({
474
462
  keys: z.union([
475
463
  z.null().transform<number[]>(() => []),
@@ -485,11 +473,13 @@ export interface Payload extends z.infer<typeof frameZ> {}
485
473
 
486
474
  export interface CrudePayload extends z.input<typeof frameZ> {}
487
475
 
476
+ /** Rebuilds a {@link Series} from its wire form. */
488
477
  export const seriesFromPayload = (series: SeriesPayload): Series => {
489
478
  const { dataType, data, timeRange, alignment } = series;
490
479
  return new Series({ data, dataType, timeRange, glBufferUsage: "static", alignment });
491
480
  };
492
481
 
482
+ /** Reduces a {@link Series} to its wire form. */
493
483
  export const seriesToPayload = (series: Series): SeriesPayload => ({
494
484
  timeRange: series.timeRange,
495
485
  dataType: series.dataType,