@synnaxlabs/client 0.56.2 → 0.57.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (741) hide show
  1. package/dist/client-DDACDVZ-.js +14505 -0
  2. package/dist/client-DDACDVZ-.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +91 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +57 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +39 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +39 -16
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +340 -0
  398. package/src/framer/cache/reader.ts +231 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +108 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +19 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -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 { MultiSeries, type Series, type TimeRange } from "@synnaxlabs/x";
11
+
12
+ import { UnexpectedError } from "@/errors";
13
+ import { Dynamic, type DynamicProps } from "@/framer/cache/dynamic";
14
+ import {
15
+ type DirtyReadResult,
16
+ type GCMetrics,
17
+ Static,
18
+ type StaticProps,
19
+ } from "@/framer/cache/static";
20
+
21
+ export interface UnaryProps
22
+ extends StaticProps, Pick<DynamicProps, "dynamicBufferSize"> {}
23
+
24
+ /**
25
+ * Caches data for a single channel: a dynamic leading buffer for live writes backed
26
+ * by a static cache for flushed and historical data.
27
+ * @throws {UnexpectedError} from every method after close().
28
+ */
29
+ export class Unary {
30
+ private closed: boolean = false;
31
+ private readonly static: Static;
32
+ private readonly dynamic: Dynamic;
33
+
34
+ constructor(props: UnaryProps) {
35
+ this.static = new Static(props);
36
+ this.dynamic = new Dynamic({
37
+ dynamicBufferSize: props.dynamicBufferSize,
38
+ transform: props.transform,
39
+ instrumentation: props.instrumentation,
40
+ });
41
+ }
42
+
43
+ writeDynamic(series: MultiSeries): MultiSeries {
44
+ this.checkOpen("writeDynamic");
45
+ const { flushed, allocated } = this.dynamic.write(series);
46
+ // Flushed buffers stay streamed until a fetch replaces them.
47
+ if (flushed.length > 0) this.static.write(flushed, true);
48
+ return allocated;
49
+ }
50
+
51
+ get leadingBuffer(): Series | null {
52
+ this.checkOpen("leadingBuffer");
53
+ return this.dynamic.leadingBuffer;
54
+ }
55
+
56
+ /**
57
+ * Flushes the live leading buffer into the static cache with its real end time,
58
+ * so reads treat the span after it as a gap to fetch. Call when streaming for
59
+ * the channel stops.
60
+ */
61
+ flushDynamic(): void {
62
+ this.checkOpen("flushDynamic");
63
+ const flushed = this.dynamic.flush();
64
+ if (flushed != null && flushed.length > 0)
65
+ this.static.write(new MultiSeries([flushed]), true);
66
+ }
67
+
68
+ writeStatic(series: MultiSeries): void {
69
+ this.checkOpen("writeStatic");
70
+ this.static.write(series);
71
+ }
72
+
73
+ /**
74
+ * Reads cached data overlapping the given time range. The result includes the live
75
+ * leading buffer when the data it actually holds overlaps the range, judged by the
76
+ * last stamped write rather than the buffer's provisional MAX end, so the buffer
77
+ * never leaks into reads of spans it has no samples for. It never claims coverage
78
+ * either: its samples carry provisional leading alignments that cannot pair with
79
+ * fetched data on another channel, so its span is still reported as a gap to fetch. A
80
+ * span may therefore return in both its streamed and fetched representation.
81
+ */
82
+ read(tr: TimeRange): DirtyReadResult {
83
+ this.checkOpen("read");
84
+ const res = this.static.dirtyRead(tr);
85
+ const buf = this.dynamic.leadingBuffer;
86
+ const dataTr = this.dynamic.dataTimeRange;
87
+ if (buf == null || dataTr == null || buf.length === 0 || !dataTr.overlapsWith(tr))
88
+ return res;
89
+ res.series.push(buf);
90
+ return res;
91
+ }
92
+
93
+ gc(): GCMetrics {
94
+ this.checkOpen("gc");
95
+ return this.static.gc();
96
+ }
97
+
98
+ close(): void {
99
+ this.closed = true;
100
+ this.dynamic.close();
101
+ this.static.close();
102
+ }
103
+
104
+ private checkOpen(op: string): void {
105
+ if (this.closed)
106
+ throw new UnexpectedError(`${op} called on a closed telemetry cache entry`);
107
+ }
108
+ }
@@ -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
+ }