@synnaxlabs/client 0.56.1 → 0.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (741) hide show
  1. package/dist/client-B08VDLSA.js +14463 -0
  2. package/dist/client-B08VDLSA.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +71 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +43 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +37 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +40 -17
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +279 -0
  398. package/src/framer/cache/reader.ts +160 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +104 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +18 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -9,20 +9,41 @@
9
9
 
10
10
  // Code generated by Oracle. DO NOT EDIT.
11
11
 
12
- import { caseconv, type optional, record, status, zod } from "@synnaxlabs/x";
12
+ import { caseconv, type optional, record, uuid } from "@synnaxlabs/x";
13
13
  import { z } from "zod";
14
14
 
15
+ import { device } from "@/device";
15
16
  import { ontology } from "@/ontology";
17
+ import { rack } from "@/rack";
18
+ import { status } from "@/status";
16
19
 
17
- export const keyZ = z
18
- .string()
19
- .or(z.number().transform(String).or(z.bigint().transform(String)));
20
+ /** KeyedConfig is the base for every stored task configuration record. */
21
+ export const keyedConfigZ = z.object({
22
+ /** key is the unique identifier for the stored configuration record. */
23
+ key: z.uuid().default(uuid.create),
24
+ });
25
+ export interface KeyedConfig extends z.infer<typeof keyedConfigZ> {}
26
+
27
+ export const keyZ = z.uuid();
20
28
  export type Key = z.infer<typeof keyZ>;
21
29
 
30
+ export const startConfigZ = keyedConfigZ.extend({
31
+ autoStart: z.boolean().default(false),
32
+ });
33
+ export interface StartConfig extends z.infer<typeof startConfigZ> {}
34
+
35
+ export const scanConfigZ = keyedConfigZ.extend({
36
+ rate: z.number().default(0.2),
37
+ disabled: z.boolean().default(false),
38
+ });
39
+ export interface ScanConfig extends z.infer<typeof scanConfigZ> {}
40
+
22
41
  export type StatusDetailsZodObject<Data extends z.ZodType = z.ZodNever> = z.ZodObject<{
23
42
  task: typeof keyZ;
24
43
  running: z.ZodBoolean;
25
- cmd: z.ZodOptional<z.ZodString>;
44
+ cmd: z.ZodDefault<z.ZodString>;
45
+ configHash: z.ZodDefault<z.ZodString>;
46
+ rack: z.ZodDefault<typeof rack.keyZ>;
26
47
  data: [Data] extends [z.ZodNever] ? z.ZodOptional<z.ZodUnknown> : z.ZodOptional<Data>;
27
48
  }>;
28
49
 
@@ -37,43 +58,17 @@ export const statusDetailsZ: StatusDetailsZFunction = <Data extends z.ZodType>(
37
58
  z.object({
38
59
  task: keyZ,
39
60
  running: z.boolean(),
40
- cmd: z.string().optional(),
61
+ cmd: z.string().default(""),
62
+ configHash: z.string().default(""),
63
+ rack: rack.keyZ.default(0),
41
64
  data: (data ?? z.unknown()).optional(),
42
65
  });
43
66
  export type StatusDetails<Data extends z.ZodType = z.ZodNever> = {
44
67
  task: Key;
45
68
  running: boolean;
46
- cmd?: string;
47
- } & ([Data] extends [z.ZodNever] ? {} : { data?: z.infer<Data> });
48
-
49
- export type NewStatusDetailsZodObject<Data extends z.ZodType = z.ZodNever> =
50
- z.ZodObject<{
51
- task: z.ZodOptional<typeof keyZ>;
52
- running: z.ZodBoolean;
53
- cmd: z.ZodOptional<z.ZodString>;
54
- data: [Data] extends [z.ZodNever]
55
- ? z.ZodOptional<z.ZodUnknown>
56
- : z.ZodOptional<Data>;
57
- }>;
58
-
59
- export interface NewStatusDetailsZFunction {
60
- <Data extends z.ZodType>(data: Data): NewStatusDetailsZodObject<Data>;
61
- <Data extends z.ZodType = z.ZodNever>(data?: Data): NewStatusDetailsZodObject<Data>;
62
- }
63
-
64
- export const newStatusDetailsZ: NewStatusDetailsZFunction = <Data extends z.ZodType>(
65
- data?: Data,
66
- ) =>
67
- z.object({
68
- task: keyZ.optional(),
69
- running: z.boolean(),
70
- cmd: z.string().optional(),
71
- data: (data ?? z.unknown()).optional(),
72
- });
73
- export type NewStatusDetails<Data extends z.ZodType = z.ZodNever> = {
74
- task?: Key;
75
- running: boolean;
76
- cmd?: string;
69
+ cmd: string;
70
+ configHash: string;
71
+ rack: rack.Key;
77
72
  } & ([Data] extends [z.ZodNever] ? {} : { data?: z.infer<Data> });
78
73
 
79
74
  /** Command is a command to execute on a task in the Driver system. */
@@ -84,22 +79,38 @@ export const commandZ = z.object({
84
79
  type: z.string(),
85
80
  /** key is a unique identifier for this command instance. */
86
81
  key: z.string(),
82
+ /**
83
+ * configHash is the config hash the sender wants running. Empty when the sender does
84
+ * not know it. The Driver reuses its live instance when the hash matches and
85
+ * redeploys when it differs.
86
+ */
87
+ configHash: z.string().default(""),
87
88
  /** args contains optional arguments for the command. */
88
- args: caseconv.preserveCase(zod.nullToUndefined(record.unknownZ())),
89
+ args: caseconv.preserveCase(record.unknownZ().default(() => ({}))),
89
90
  });
90
91
  export interface Command extends z.infer<typeof commandZ> {}
91
92
 
93
+ export const persistConfigZ = startConfigZ.extend({
94
+ dataSavingDisabled: z.boolean().default(false),
95
+ });
96
+ export interface PersistConfig extends z.infer<typeof persistConfigZ> {}
97
+
92
98
  export const statusZ = <Data extends z.ZodType = z.ZodNever>(data?: Data) =>
93
99
  status.statusZ({ details: statusDetailsZ(data) });
94
100
  export type Status<Data extends z.ZodType = z.ZodNever> = z.infer<
95
101
  ReturnType<typeof statusZ<Data>>
96
102
  >;
97
103
 
98
- export const newStatusZ = <Data extends z.ZodType = z.ZodNever>(data?: Data) =>
99
- status.newZ({ details: newStatusDetailsZ(data) });
100
- export type NewStatus<Data extends z.ZodType = z.ZodNever> = z.infer<
101
- ReturnType<typeof newStatusZ<Data>>
102
- >;
104
+ export const readConfigZ = persistConfigZ.extend({
105
+ sampleRate: z.number().default(10),
106
+ streamRate: z.number().default(5),
107
+ });
108
+ export interface ReadConfig extends z.infer<typeof readConfigZ> {}
109
+
110
+ export const writeConfigZ = persistConfigZ.extend({
111
+ device: device.keyZ.default(""),
112
+ });
113
+ export interface WriteConfig extends z.infer<typeof writeConfigZ> {}
103
114
 
104
115
  export interface PayloadSchemas<
105
116
  Type extends z.ZodType<string> = z.ZodType<string>,
@@ -121,50 +132,32 @@ export const payloadZ = <
121
132
  statusData,
122
133
  }: Partial<PayloadSchemas<Type, Config, StatusData>> = {}) =>
123
134
  z.object({
124
- key: keyZ,
135
+ key: keyZ.default(uuid.create),
136
+ rack: rack.keyZ.default(0),
125
137
  name: z.string(),
126
138
  type: type ?? z.string(),
127
- config: config ?? record.nullishToEmpty(),
128
- internal: z.boolean().optional(),
129
- snapshot: z.boolean().optional(),
139
+ config: config ?? record.unknownZ().default(() => ({})),
140
+ configHash: z.string().default(""),
141
+ internal: z.boolean().default(false),
142
+ snapshot: z.boolean().default(false),
130
143
  status: status.statusZ({ details: statusDetailsZ(statusData) }).optional(),
131
144
  });
132
145
  export interface Payload<S extends PayloadSchemas = PayloadSchemas> {
133
146
  key: Key;
147
+ rack: rack.Key;
134
148
  name: string;
135
149
  type: z.infer<S["type"]>;
136
150
  config: z.infer<S["config"]>;
137
- internal?: boolean;
138
- snapshot?: boolean;
151
+ configHash: string;
152
+ internal: boolean;
153
+ snapshot: boolean;
139
154
  status?: Status<S["statusData"]>;
140
155
  }
141
-
142
- export interface NewSchemas<
143
- Type extends z.ZodType<string> = z.ZodType<string>,
144
- Config extends z.ZodType<record.Unknown> = z.ZodType<record.Unknown>,
145
- StatusData extends z.ZodType = z.ZodType,
146
- > {
147
- type: Type;
148
- config: Config;
149
- statusData: StatusData;
150
- }
151
-
152
- export const newZ = <
153
- Type extends z.ZodType<string> = z.ZodString,
154
- Config extends z.ZodType<record.Unknown> = z.ZodType<record.Unknown>,
155
- StatusData extends z.ZodType = z.ZodNever,
156
- >({ type, config, statusData }: Partial<NewSchemas<Type, Config, StatusData>> = {}) =>
157
- payloadZ({ type, config, statusData })
158
- .omit({ internal: true, snapshot: true, status: true })
159
- .partial({ key: true })
160
- .extend({
161
- status: status.newZ({ details: newStatusDetailsZ(statusData) }).optional(),
162
- });
163
- export type New<S extends NewSchemas = NewSchemas> = optional.Optional<
164
- Omit<Payload<S>, "internal" | "snapshot" | "status">,
165
- "key"
156
+ export type New<S extends PayloadSchemas = PayloadSchemas> = optional.Optional<
157
+ Omit<Payload<S>, "status">,
158
+ "key" | "rack" | "configHash" | "internal" | "snapshot"
166
159
  > & {
167
- status?: NewStatus<S["statusData"]>;
160
+ status?: status.New<ReturnType<typeof statusDetailsZ>>;
168
161
  };
169
162
 
170
163
  export const ontologyID = ontology.createIDFactory<Key>("task");
@@ -7,14 +7,42 @@
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
- import { id } from "@synnaxlabs/x";
10
+ import { array, errors, id } from "@synnaxlabs/x";
11
11
 
12
12
  import { policy } from "@/access/policy";
13
13
  import { role } from "@/access/role";
14
14
  import type Synnax from "@/client";
15
+ import { AccessDeniedError, NotFoundError } from "@/errors";
15
16
  import { createTestClient } from "@/testutil/client";
17
+ import { user } from "@/user";
16
18
 
17
- export const createTestClientWithPolicy = async (client: Synnax, pol: policy.New) => {
19
+ /** Reports whether the error, or any error in its cause chain, is an access denial. */
20
+ const isDenial = (err: unknown): boolean =>
21
+ AccessDeniedError.matches(err) ||
22
+ (err instanceof Error && err.cause != null && isDenial(err.cause));
23
+
24
+ /**
25
+ * Connects as a new user and primes its policy cache. Denials are tolerated: the Core
26
+ * refuses restricted subjects by design, and the change-stream refusal logs after
27
+ * teardown, which vitest counts as an unhandled error.
28
+ */
29
+ const connectAs = async (username: string, key: user.Key) => {
30
+ const client = createTestClient({
31
+ username,
32
+ password: "test",
33
+ onInternalError: (err) => {
34
+ if (!isDenial(err)) console.error(err);
35
+ },
36
+ });
37
+ try {
38
+ await client.access.policies.retrieveForSubject(user.ontologyID(key));
39
+ } catch (err) {
40
+ if (!isDenial(err)) throw errors.fromUnknown(err);
41
+ }
42
+ return client;
43
+ };
44
+
45
+ const createUser = async (client: Synnax) => {
18
46
  const username = id.create();
19
47
  const u = await client.users.create({
20
48
  username,
@@ -22,13 +50,81 @@ export const createTestClientWithPolicy = async (client: Synnax, pol: policy.New
22
50
  firstName: "test",
23
51
  lastName: "test",
24
52
  });
25
- const p = await client.access.policies.create(pol);
53
+ return { username, key: u.key };
54
+ };
55
+
56
+ /**
57
+ * Creates a client authenticated as a new user holding a role that carries the
58
+ * policies. Pass several to grant different actions on different objects, which one
59
+ * policy cannot express.
60
+ */
61
+ export const createTestClientWithPolicy = async (
62
+ client: Synnax,
63
+ pol: policy.New | policy.New[],
64
+ ) => {
65
+ const u = await createUser(client);
66
+ const policies = await Promise.all(
67
+ array.toArray(pol).map(async (p) => await client.access.policies.create(p)),
68
+ );
26
69
  const r = await client.access.roles.create({
27
70
  name: "test",
28
71
  description: "test",
29
72
  });
30
- await client.ontology.addChildren(role.ontologyID(r.key), policy.ontologyID(p.key));
73
+ await client.ontology.addChildren(
74
+ role.ontologyID(r.key),
75
+ ...policies.map(({ key }) => policy.ontologyID(key)),
76
+ );
31
77
  await client.access.roles.assign({ user: u.key, role: r.key });
32
- const userClient = createTestClient({ username, password: "test" });
33
- return userClient;
78
+ return await connectAs(u.username, u.key);
34
79
  };
80
+
81
+ /** The roles the Core provisions on startup. */
82
+ export const BUILT_IN_ROLES = [
83
+ "Owner",
84
+ "Engineer",
85
+ "Host",
86
+ "Operator",
87
+ "Viewer",
88
+ ] as const;
89
+
90
+ export type BuiltInRole = (typeof BUILT_IN_ROLES)[number];
91
+
92
+ /**
93
+ * Creates a client authenticated as a new user holding one of the Core's built-in
94
+ * roles, for exercising a real role's permission set instead of a synthetic policy.
95
+ * @param name - The built-in role to assign.
96
+ * @throws {NotFoundError} if the Core provisions no role under the name.
97
+ */
98
+ export const createTestClientWithRole = async (
99
+ client: Synnax,
100
+ name: BuiltInRole,
101
+ ): Promise<Synnax> => {
102
+ const roles = await client.access.roles.retrieve({});
103
+ const r = roles.find((r) => r.name === name);
104
+ if (r == null) throw new NotFoundError(`no built-in role named ${name}`);
105
+ const u = await createUser(client);
106
+ await client.access.roles.assign({ user: u.key, role: r.key });
107
+ return await connectAs(u.username, u.key);
108
+ };
109
+
110
+ /**
111
+ * Caches one client per built-in role, so a spec covering many roles pays the user
112
+ * creation cost once each. Construct one per spec file.
113
+ */
114
+ export class RoleClients {
115
+ private readonly client: Synnax;
116
+ private readonly byRole = new Map<BuiltInRole, Promise<Synnax>>();
117
+
118
+ constructor(client: Synnax) {
119
+ this.client = client;
120
+ }
121
+
122
+ /** Returns a client authenticated as a user holding the role. */
123
+ async get(name: BuiltInRole): Promise<Synnax> {
124
+ const existing = this.byRole.get(name);
125
+ if (existing != null) return await existing;
126
+ const created = createTestClientWithRole(this.client, name);
127
+ this.byRole.set(name, created);
128
+ return await created;
129
+ }
130
+ }
@@ -30,6 +30,24 @@ export const newIndexedPair = async (
30
30
  return [index, data];
31
31
  };
32
32
 
33
+ export const newIndexedBoolPair = async (
34
+ client: Synnax,
35
+ ): Promise<[channel.Channel, channel.Channel]> => {
36
+ const index = await client.channels.create({
37
+ leaseholder: 1,
38
+ name: id.create(),
39
+ dataType: DataType.TIMESTAMP,
40
+ isIndex: true,
41
+ });
42
+ const data = await client.channels.create({
43
+ leaseholder: 1,
44
+ name: id.create(),
45
+ dataType: DataType.BOOLEAN,
46
+ index: index.key,
47
+ });
48
+ return [index, data];
49
+ };
50
+
33
51
  export const newVirtualChannel = async (client: Synnax): Promise<channel.Channel> => {
34
52
  const ch = await client.channels.create({
35
53
  name: id.create(),
@@ -38,3 +56,14 @@ export const newVirtualChannel = async (client: Synnax): Promise<channel.Channel
38
56
  });
39
57
  return ch;
40
58
  };
59
+
60
+ export const newVirtualBoolChannel = async (
61
+ client: Synnax,
62
+ ): Promise<channel.Channel> => {
63
+ const ch = await client.channels.create({
64
+ name: id.create(),
65
+ dataType: DataType.BOOLEAN,
66
+ virtual: true,
67
+ });
68
+ return ch;
69
+ };
@@ -8,6 +8,7 @@
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
10
  import { TimeSpan } from "@synnaxlabs/x";
11
+ import { afterAll } from "vitest";
11
12
 
12
13
  import Synnax, { type SynnaxParams } from "@/client";
13
14
 
@@ -23,5 +24,29 @@ export const TEST_CLIENT_PARAMS: SynnaxParams = {
23
24
  },
24
25
  };
25
26
 
26
- export const createTestClient = (params?: Partial<SynnaxParams>): Synnax =>
27
- new Synnax({ ...TEST_CLIENT_PARAMS, ...params });
27
+ // A hook registered mid-test is silently dropped by vitest, so per-client afterAll
28
+ // calls leak clients created inside test bodies. This module-level hook registers
29
+ // during spec collection (import time) and covers every call site.
30
+ const openClients: Synnax[] = [];
31
+ // Awaited so every close finishes before vitest tears down the worker; a close
32
+ // still in flight at teardown races its logging against the closing RPC channel.
33
+ afterAll(async () => {
34
+ const results = await Promise.allSettled(openClients.map((client) => client.close()));
35
+ const failures = results.filter((result) => result.status === "rejected");
36
+ if (failures.length > 0)
37
+ throw new AggregateError(
38
+ failures.map((failure) => failure.reason),
39
+ "failed to close test clients",
40
+ );
41
+ });
42
+
43
+ /**
44
+ * Creates a client connected to the local test cluster. The client is closed
45
+ * automatically once every test in the current spec file has finished, so callers do
46
+ * not need to close it themselves.
47
+ */
48
+ export const createTestClient = (params?: Partial<SynnaxParams>): Synnax => {
49
+ const client = new Synnax({ ...TEST_CLIENT_PARAMS, ...params });
50
+ openClients.push(client);
51
+ return client;
52
+ };
@@ -0,0 +1,47 @@
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 { TimeSpan } from "@synnaxlabs/x";
11
+
12
+ import { type connection } from "@/connection";
13
+
14
+ /** Resolves once the handle's status satisfies the predicate. */
15
+ export const waitForStatus = async (
16
+ handle: connection.Handle,
17
+ predicate: (status: connection.Status) => boolean,
18
+ timeout: TimeSpan = TimeSpan.seconds(5),
19
+ ): Promise<connection.Status> => {
20
+ if (predicate(handle.status)) return handle.status;
21
+ return await new Promise<connection.Status>((resolve, reject) => {
22
+ const timer = setTimeout(() => {
23
+ detach();
24
+ reject(new Error("timed out waiting for connection status"));
25
+ }, timeout.milliseconds);
26
+ const detach = handle.onChange((status) => {
27
+ if (!predicate(status)) return;
28
+ clearTimeout(timer);
29
+ detach();
30
+ resolve(status);
31
+ });
32
+ });
33
+ };
34
+
35
+ /**
36
+ * Resolves once the handle's change stream is live, so every later cluster write
37
+ * reaches the client's cache.
38
+ */
39
+ export const waitForStreamLive = async (
40
+ handle: connection.Handle,
41
+ timeout?: TimeSpan,
42
+ ): Promise<connection.Status> =>
43
+ await waitForStatus(
44
+ handle,
45
+ ({ variant, details }) => variant === "success" && details.streamLive,
46
+ timeout,
47
+ );
@@ -0,0 +1,17 @@
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
+ export * from "@/testutil/access";
11
+ export * from "@/testutil/channels";
12
+ export * from "@/testutil/client";
13
+ export * from "@/testutil/connection";
14
+ export * from "@/testutil/panels";
15
+ export * from "@/testutil/proxy";
16
+ export * from "@/testutil/query";
17
+ export * from "@/testutil/telem";
@@ -0,0 +1,26 @@
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 { id } from "@synnaxlabs/x";
11
+
12
+ import type Synnax from "@/client";
13
+ import { type ontology } from "@/ontology";
14
+ import { project } from "@/project";
15
+
16
+ /**
17
+ * Creates a throwaway project and returns its ontology ID. Panel creation requires a
18
+ * parent, so tests that mint panels directly parent them here.
19
+ */
20
+ export const createPanelParent = async (client: Synnax): Promise<ontology.ID> => {
21
+ const proj = await client.projects.create({
22
+ name: `project-${id.create()}`,
23
+ layout: {},
24
+ });
25
+ return project.ontologyID(proj.key);
26
+ };
@@ -0,0 +1,106 @@
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 { connect, createServer, type Socket } from "node:net";
11
+
12
+ import { type breaker, TimeSpan } from "@synnaxlabs/x";
13
+
14
+ const DEFAULT_TARGET = { host: "localhost", port: 9090 };
15
+
16
+ /**
17
+ * Retry policy for a client pointed at a severable proxy. A spec drives its own
18
+ * retries, so the client's must finish well inside one assertion budget: the
19
+ * default policy waits seconds per request and outlasts a single `expect.poll`
20
+ * attempt, which reports as a timeout rather than the real answer.
21
+ */
22
+ export const FAST_RETRY: breaker.Config = {
23
+ baseInterval: TimeSpan.milliseconds(10),
24
+ maxInterval: TimeSpan.milliseconds(50),
25
+ scale: 1.5,
26
+ };
27
+
28
+ export interface SeverableProxyTarget {
29
+ host?: string;
30
+ port?: number;
31
+ }
32
+
33
+ export interface SeverableProxy {
34
+ /** Port the proxy accepts connections on. Point the client here. */
35
+ port: number;
36
+ /** Drops every live connection and refuses new ones, as if the cluster died. */
37
+ sever: () => Promise<void>;
38
+ /** Accepts connections again on the same port. */
39
+ restore: () => Promise<void>;
40
+ /** Shuts the proxy down for good. */
41
+ close: () => Promise<void>;
42
+ }
43
+
44
+ /**
45
+ * Creates a TCP proxy in front of the live test cluster so specs can simulate
46
+ * cluster downtime without touching the cluster itself. Connect a client to
47
+ * the returned port, then sever() and restore() the link.
48
+ */
49
+ export const createSeverableProxy = async (
50
+ target: SeverableProxyTarget = {},
51
+ ): Promise<SeverableProxy> => {
52
+ const { host, port } = { ...DEFAULT_TARGET, ...target };
53
+ const sockets = new Set<Socket>();
54
+ let severed = false;
55
+ const server = createServer((downstream) => {
56
+ // A connection the kernel accepted before the sever is still delivered after it,
57
+ // and forwarding it would let a request through a severed link.
58
+ if (severed) {
59
+ downstream.destroy();
60
+ return;
61
+ }
62
+ const upstream = connect(port, host);
63
+ sockets.add(downstream).add(upstream);
64
+ const destroy = (): void => {
65
+ sockets.delete(downstream);
66
+ sockets.delete(upstream);
67
+ downstream.destroy();
68
+ upstream.destroy();
69
+ };
70
+ downstream.on("error", destroy);
71
+ upstream.on("error", destroy);
72
+ downstream.on("close", destroy);
73
+ upstream.on("close", destroy);
74
+ downstream.pipe(upstream);
75
+ upstream.pipe(downstream);
76
+ });
77
+ const listen = async (listenPort: number): Promise<void> =>
78
+ await new Promise((resolve, reject) => {
79
+ server.once("error", reject);
80
+ server.listen(listenPort, () => {
81
+ server.removeListener("error", reject);
82
+ resolve();
83
+ });
84
+ });
85
+ await listen(0);
86
+ const address = server.address();
87
+ if (address == null || typeof address === "string")
88
+ throw new Error("proxy failed to bind a port");
89
+ const boundPort = address.port;
90
+ const sever = async (): Promise<void> => {
91
+ severed = true;
92
+ const closed = new Promise<void>((resolve) => server.close(() => resolve()));
93
+ sockets.forEach((socket) => socket.destroy());
94
+ sockets.clear();
95
+ await closed;
96
+ };
97
+ return {
98
+ port: boundPort,
99
+ sever,
100
+ restore: async () => {
101
+ severed = false;
102
+ await listen(boundPort);
103
+ },
104
+ close: sever,
105
+ };
106
+ };
@@ -0,0 +1,28 @@
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 { query } from "@/query";
11
+
12
+ export { isLive } from "@/query/query";
13
+
14
+ /** Asserts the cached answer is live (present and not deleted) and returns it. */
15
+ export const expectLive = <D extends query.Data>(
16
+ value: query.Cached<D> | undefined,
17
+ ): D => {
18
+ if (!query.isLive<D>(value)) throw new Error("expected a live cached answer");
19
+ return value;
20
+ };
21
+
22
+ /** Asserts the cached answer is a deletion and returns it. */
23
+ export const expectDeleted = <D extends query.Data>(
24
+ value: query.Cached<D> | undefined,
25
+ ): query.Deleted<D> => {
26
+ if (!query.Deleted.matches<D>(value)) throw new Error("expected a deleted answer");
27
+ return value;
28
+ };
@@ -7,7 +7,23 @@
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
- import { TimeStamp } from "@synnaxlabs/x";
10
+ import { DataType, type Series, TimeStamp } from "@synnaxlabs/x";
11
+
12
+ import { type framer } from "@/framer";
11
13
 
12
14
  export const secondsLinspace = (start: number, n: number): TimeStamp[] =>
13
15
  Array.from({ length: n }, (_, i) => start + i).map((n) => TimeStamp.seconds(n));
16
+
17
+ const isRaw = (dt: DataType): boolean => dt.isVariable || dt.equals(DataType.UINT8);
18
+
19
+ /** Narrows every numeric series to float32, anchoring bigints on an offset. Mirrors
20
+ * the transform the visualization layer injects for WebGL rendering. */
21
+ export const glTransform: framer.Transform = {
22
+ resolveDataType: (dt: DataType) => (isRaw(dt) ? dt : DataType.FLOAT32),
23
+ convert: (series: Series, offset) => {
24
+ if (isRaw(series.dataType)) return series;
25
+ if (offset == null && series.dataType.usesBigInt && series.length > 0)
26
+ offset = BigInt(series.data[0]);
27
+ return series.convert(DataType.FLOAT32, offset);
28
+ },
29
+ };