@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
@@ -10,28 +10,26 @@
10
10
  import { type UnaryClient } from "@synnaxlabs/freighter";
11
11
  import {
12
12
  array,
13
- type CrudeDensity,
13
+ control,
14
14
  type CrudeTimeRange,
15
- type CrudeTimeSpan,
16
15
  type CrudeTimeStamp,
17
16
  DataType,
17
+ deep,
18
+ type destructor,
19
+ errors,
18
20
  type MultiSeries,
19
- status,
20
- TimeSpan,
21
+ primitive,
21
22
  type TypedArray,
23
+ zod,
22
24
  } from "@synnaxlabs/x";
23
25
  import { z } from "zod";
24
26
 
25
- import { type Params } from "@/channel/payload";
26
27
  import {
27
28
  analyzeParams,
28
- CacheRetriever,
29
- ClusterRetriever,
30
- DebouncedBatchRetriever,
31
- type RetrieveOptions,
32
- type Retriever,
33
- type RetrieveRequest,
34
- } from "@/channel/retriever";
29
+ type Params,
30
+ type PrimitiveParams,
31
+ statusKey,
32
+ } from "@/channel/payload";
35
33
  import {
36
34
  type Key,
37
35
  keyZ,
@@ -39,34 +37,39 @@ import {
39
37
  type New,
40
38
  ontologyID,
41
39
  type Operation,
40
+ operationZ,
42
41
  type Payload,
43
42
  payloadZ,
43
+ statusZ,
44
44
  } from "@/channel/types.gen";
45
45
  import { type Writer } from "@/channel/writer";
46
- import { ValidationError } from "@/errors";
46
+ import { NotFoundError, ValidationError } from "@/errors";
47
47
  import { type framer } from "@/framer";
48
48
  import { group } from "@/group";
49
- import { type ontology } from "@/ontology";
49
+ import { ontology } from "@/ontology";
50
+ import { query } from "@/query";
51
+ import { type ranger } from "@/ranger";
52
+ import { createKey, decodeDeleteChange } from "@/ranger/alias/payload";
53
+ import { keyZ as rangerKeyZ } from "@/ranger/types.gen";
54
+ import { type status } from "@/status";
50
55
  import { checkForMultipleOrNoResults } from "@/util/retrieve";
51
56
 
57
+ export const SET_CHANNEL_NAME = "sy_channel_set";
58
+ export const DELETE_CHANNEL_NAME = "sy_channel_delete";
59
+
52
60
  interface CreateOptions {
53
61
  retrieveIfNameExists?: boolean;
54
62
  }
55
63
 
56
- export const SET_CHANNEL_NAME = "sy_channel_set";
57
- export const DELETE_CHANNEL_NAME = "sy_channel_delete";
58
-
59
64
  /**
60
65
  * Represents a Channel in a Synnax database. Typically, channels should not be
61
66
  * instantiated directly, but instead created via the `.channels.create` or retrieved
62
- * via the `.channels.retrieve` method on a Synnax client.
63
- *
64
- * Please refer to the [Synnax
67
+ * via the `.channels.retrieve` method on a Synnax client. Please refer to the [Synnax
65
68
  * documentation](https://docs.synnaxlabs.com/reference/concepts/channels) for detailed
66
69
  * information on what channels are and how to use them.
67
70
  */
68
71
  export class Channel {
69
- private readonly _frameClient: framer.Client | null;
72
+ private readonly frameClient: framer.Client | null;
70
73
  /**
71
74
  * A unique key identifying the channel in the Synnax database. This key is
72
75
  * automatically assigned by Synnax.
@@ -76,9 +79,7 @@ export class Channel {
76
79
  * A human-readable name for the channel. This name is not guaranteed to be unique.
77
80
  */
78
81
  readonly name: string;
79
- /**
80
- * The data type of the channel.
81
- */
82
+ /** The data type of the channel. */
82
83
  readonly dataType: DataType;
83
84
  /**
84
85
  * The key of the node in the Synnax cluster that holds the 'lease' over the channel
@@ -91,13 +92,9 @@ export class Channel {
91
92
  * that stores its timestamps.
92
93
  */
93
94
  readonly index: Key;
94
- /**
95
- * This is set to true if the channel is an index channel, and false otherwise.
96
- */
95
+ /** This is set to true if the channel is an index channel, and false otherwise. */
97
96
  readonly isIndex: boolean;
98
- /**
99
- * This is set to true if the channel is an internal channel, and false otherwise.
100
- */
97
+ /** This is set to true if the channel is an internal channel, and false otherwise. */
101
98
  readonly internal: boolean;
102
99
  /**
103
100
  * An alias for the channel under a specific range. This parameter is unstable and
@@ -115,9 +112,8 @@ export class Channel {
115
112
  */
116
113
  readonly expression: string;
117
114
  readonly operations: Operation[];
118
- /**
119
- * The status of the channel.
120
- */
115
+ readonly concurrency: control.Concurrency;
116
+ /** The status of the channel. */
121
117
  readonly status?: status.Status;
122
118
 
123
119
  constructor({
@@ -134,32 +130,31 @@ export class Channel {
134
130
  status: argsStatus,
135
131
  expression = "",
136
132
  operations = [],
137
- }: New & {
138
- internal?: boolean;
139
- frameClient?: framer.Client;
140
- density?: CrudeDensity;
141
- status?: status.New;
142
- operations?: Operation[];
143
- }) {
144
- this.key = keyZ.parse(key);
133
+ concurrency = control.Concurrency.exclusive,
134
+ }: New & { frameClient?: framer.Client }) {
135
+ this.key = zod.parse(keyZ, key, { label: "channel key" });
145
136
  this.name = name;
146
137
  this.dataType = new DataType(dataType);
147
138
  this.leaseholder = leaseholder;
148
- this.index = keyZ.parse(index);
139
+ this.index = zod.parse(keyZ, index, { label: "channel index" });
149
140
  this.isIndex = isIndex;
150
141
  this.internal = internal;
151
142
  this.alias = alias;
152
143
  this.virtual = virtual;
153
144
  this.expression = expression;
154
- this.operations = operations;
155
- if (argsStatus != null) this.status = status.create(argsStatus);
156
- this._frameClient = frameClient ?? null;
145
+ this.operations = zod.parse(operationZ.array(), operations, {
146
+ label: "channel operations",
147
+ });
148
+ this.concurrency = concurrency;
149
+ if (argsStatus != null)
150
+ this.status = zod.parse(statusZ, argsStatus, { label: "channel status" });
151
+ this.frameClient = frameClient ?? null;
157
152
  }
158
153
 
159
154
  private get framer(): framer.Client {
160
- if (this._frameClient == null)
155
+ if (this.frameClient == null)
161
156
  throw new ValidationError("cannot read from a channel that has not been created");
162
- return this._frameClient;
157
+ return this.frameClient;
163
158
  }
164
159
 
165
160
  /**
@@ -168,37 +163,37 @@ export class Channel {
168
163
  * network transportation, but also provided to you as a convenience.
169
164
  */
170
165
  get payload(): Payload {
171
- return payloadZ.parse({
172
- key: this.key,
173
- name: this.name,
174
- dataType: this.dataType.valueOf(),
175
- leaseholder: this.leaseholder,
176
- index: this.index,
177
- isIndex: this.isIndex,
178
- internal: this.internal,
179
- virtual: this.virtual,
180
- expression: this.expression,
181
- status: this.status,
182
- operations: this.operations,
183
- });
166
+ return zod.parse(
167
+ payloadZ,
168
+ {
169
+ key: this.key,
170
+ name: this.name,
171
+ dataType: this.dataType.valueOf(),
172
+ leaseholder: this.leaseholder,
173
+ index: this.index,
174
+ isIndex: this.isIndex,
175
+ internal: this.internal,
176
+ virtual: this.virtual,
177
+ expression: this.expression,
178
+ status: this.status,
179
+ operations: this.operations,
180
+ concurrency: this.concurrency,
181
+ },
182
+ { label: "channel payload" },
183
+ );
184
184
  }
185
185
 
186
186
  get isCalculated(): boolean {
187
187
  return isCalculated(this.payload);
188
188
  }
189
189
 
190
- /***
191
- * @returns the ontology ID of the channel
192
- */
190
+ /** @returns the ontology ID of the channel */
193
191
  get ontologyID(): ontology.ID {
194
192
  return ontologyID(this.key);
195
193
  }
196
194
 
197
195
  /**
198
196
  * Reads telemetry from the channel between the two timestamps.
199
- *
200
- * @param start - The starting timestamp of the range to read from.
201
- * @param end - The ending timestamp of the range to read from.
202
197
  * @returns A typed array containing the retrieved
203
198
  */
204
199
  async read(tr: CrudeTimeRange): Promise<MultiSeries> {
@@ -207,45 +202,269 @@ export class Channel {
207
202
 
208
203
  /**
209
204
  * Writes telemetry to the channel starting at the given timestamp.
210
- *
211
205
  * @param start - The starting timestamp of the first sample in data.
212
- * @param data - THe telemetry to write to the channel.
213
206
  */
214
207
  async write(start: CrudeTimeStamp, data: TypedArray): Promise<void> {
215
208
  return await this.framer.write(start, this.key, data);
216
209
  }
217
210
  }
218
211
 
212
+ /** Zod schema for {@link RetrieveRequest}. */
213
+ export const retrieveRequestZ = z.object({
214
+ nodeKey: zod.uint12.optional(),
215
+ keys: keyZ.array().optional(),
216
+ names: z.string().array().optional(),
217
+ searchTerm: z.string().optional(),
218
+ rangeKey: rangerKeyZ.optional(),
219
+ limit: z.int().optional(),
220
+ offset: z.int().optional(),
221
+ dataTypes: DataType.z.array().optional(),
222
+ notDataTypes: DataType.z.array().optional(),
223
+ virtual: z.boolean().optional(),
224
+ isIndex: z.boolean().optional(),
225
+ internal: z.boolean().optional(),
226
+ legacyCalculated: z.boolean().optional(),
227
+ });
228
+ /** Everything a channel retrieval can filter on. */
229
+ export type RetrieveRequest = z.input<typeof retrieveRequestZ>;
230
+
231
+ /** The filters a retrieval accepts alongside its keys or names. */
232
+ export type RetrieveOptions = Omit<RetrieveRequest, "keys" | "names" | "search">;
233
+
234
+ const retrieveResZ = z.object({ channels: payloadZ.array().default(() => []) });
235
+
219
236
  const retrieveGroupReqZ = z.object({});
220
237
 
221
238
  const retrieveGroupResZ = z.object({ group: group.groupZ });
222
239
 
240
+ /** Names one channel. Give a `rangeKey` to resolve its alias in that range. */
241
+ export type RetrieveSingleParams = { key: Key; rangeKey?: ranger.Key };
242
+
243
+ type NormalizedRequest = z.infer<typeof retrieveRequestZ>;
244
+
245
+ /** Aliases and statuses are composed from their stores on read. */
246
+ const stripComposed = ({ alias: _alias, status: _status, ...rest }: Payload): Payload =>
247
+ rest;
248
+
249
+ const normalizeSingle = ({
250
+ key,
251
+ rangeKey,
252
+ }: RetrieveSingleParams): RetrieveSingleParams =>
253
+ rangeKey == null ? { key } : { key, rangeKey };
254
+
255
+ const singleParamsZ = z
256
+ .union([
257
+ z.strictObject({ key: z.uint32(), rangeKey: rangerKeyZ.optional() }),
258
+ z.uint32().transform((key) => ({ key })),
259
+ ])
260
+ .transform(normalizeSingle);
261
+
262
+ const onlyRangeKey = (options?: RetrieveOptions): boolean =>
263
+ options == null ||
264
+ Object.entries(options).every(([k, v]) => v === undefined || k === "rangeKey");
265
+
266
+ const isKeysOnly = (
267
+ req: NormalizedRequest,
268
+ ): req is NormalizedRequest & { keys: Key[] } =>
269
+ primitive.isNonZero(req.keys) &&
270
+ req.names == null &&
271
+ req.searchTerm == null &&
272
+ req.nodeKey == null &&
273
+ req.limit == null &&
274
+ req.offset == null &&
275
+ req.dataTypes == null &&
276
+ req.notDataTypes == null &&
277
+ req.virtual == null &&
278
+ req.isIndex == null &&
279
+ req.internal == null &&
280
+ req.legacyCalculated == null;
281
+
282
+ const isNamesOnly = (
283
+ req: NormalizedRequest,
284
+ ): req is NormalizedRequest & { names: string[] } =>
285
+ primitive.isNonZero(req.names) &&
286
+ req.keys == null &&
287
+ req.searchTerm == null &&
288
+ req.nodeKey == null &&
289
+ req.limit == null &&
290
+ req.offset == null &&
291
+ req.dataTypes == null &&
292
+ req.notDataTypes == null &&
293
+ req.virtual == null &&
294
+ req.isIndex == null &&
295
+ req.internal == null &&
296
+ req.legacyCalculated == null;
297
+
298
+ const NAME_LITERAL_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
299
+
300
+ /**
301
+ * Mirrors the server's name matching: literal names compare exactly, anything
302
+ * else compiles as a regular expression, anchored when unanchored.
303
+ */
304
+ const createNameMatcher = (pattern: string): ((name: string) => boolean) => {
305
+ if (NAME_LITERAL_PATTERN.test(pattern)) return (name) => name === pattern;
306
+ const anchored =
307
+ pattern.startsWith("^") || pattern.endsWith("$") ? pattern : `^${pattern}$`;
308
+ try {
309
+ const rx = new RegExp(anchored);
310
+ return (name) => rx.test(name);
311
+ } catch {
312
+ return (name) => name === pattern;
313
+ }
314
+ };
315
+
316
+ /**
317
+ * Client-side matching for a request over every locally evaluable field.
318
+ * Server-computed shapes (search, pagination) never reach this filter; they
319
+ * refetch instead.
320
+ */
321
+ const requestFilter = (req: NormalizedRequest): ((ch: Channel) => boolean) => {
322
+ const keySet = primitive.isNonZero(req.keys) ? new Set(req.keys) : undefined;
323
+ const nameMatchers = primitive.isNonZero(req.names)
324
+ ? req.names.map(createNameMatcher)
325
+ : undefined;
326
+ return (ch) => {
327
+ if (keySet != null && !keySet.has(ch.key)) return false;
328
+ if (nameMatchers != null && !nameMatchers.some((m) => m(ch.name))) return false;
329
+ if (primitive.isNonZero(req.nodeKey) && ch.leaseholder !== req.nodeKey)
330
+ return false;
331
+ // The server's virtual bucket excludes calculated channels even though
332
+ // they are stored with virtual=true.
333
+ if (req.virtual != null && (ch.virtual && !ch.isCalculated) !== req.virtual)
334
+ return false;
335
+ if (req.isIndex != null && ch.isIndex !== req.isIndex) return false;
336
+ if (req.internal != null && ch.internal !== req.internal) return false;
337
+ if (
338
+ primitive.isNonZero(req.dataTypes) &&
339
+ !req.dataTypes.some((dt) => dt.equals(ch.dataType))
340
+ )
341
+ return false;
342
+ if (
343
+ primitive.isNonZero(req.notDataTypes) &&
344
+ req.notDataTypes.some((dt) => dt.equals(ch.dataType))
345
+ )
346
+ return false;
347
+ return true;
348
+ };
349
+ };
350
+
351
+ // Channel statuses live in the status table under the "channel:<key>" status key.
352
+ const affectedChannelKeys = (
353
+ event: query.TableEvent<status.Key, status.Status>,
354
+ ): Key[] | null => {
355
+ const [type, key] = event.key.split(":");
356
+ if (type !== "channel" || !primitive.isNonZero(key)) return null;
357
+ const parsed = keyZ.safeParse(key);
358
+ return parsed.success ? [parsed.data] : null;
359
+ };
360
+
223
361
  /**
224
362
  * The main client class for executing channel operations against a Synnax Core. This
225
363
  * class should not be instantiated directly, and instead should be used through the
226
364
  * `channels` property of an {@link Synnax} client.
227
365
  */
228
- export class Client {
229
- private readonly frameClient: framer.Client;
230
- private readonly client: UnaryClient;
231
- readonly retriever: Retriever;
366
+ export interface ClientConfig {
367
+ framer: framer.Client;
368
+ unary: UnaryClient;
369
+ writer: Writer;
370
+ statuses: status.Client;
371
+ ranges: ranger.Client;
372
+ cache: query.Cache;
373
+ ontology: ontology.Client;
374
+ }
375
+
376
+ /**
377
+ * Creates, reads, and deletes channels on a Core. Reach it through `client.channels`.
378
+ * Retrievals are served from a cache that a change stream keeps current, so a repeated
379
+ * read costs nothing.
380
+ */
381
+ export class Client extends query.Retriever<
382
+ typeof retrieveRequestZ,
383
+ Key,
384
+ Channel,
385
+ Channel,
386
+ RetrieveSingleParams,
387
+ RetrieveSingleParams
388
+ > {
389
+ private readonly cfg: ClientConfig;
232
390
  readonly writer: Writer;
391
+ readonly store: query.Table<Key, Channel>;
233
392
 
234
- constructor(
235
- frameClient: framer.Client,
236
- retriever: Retriever,
237
- client: UnaryClient,
238
- writer: Writer,
239
- ) {
240
- this.frameClient = frameClient;
241
- this.retriever = retriever;
242
- this.client = client;
393
+ constructor(cfg: ClientConfig) {
394
+ const { writer, statuses, ranges, cache } = cfg;
395
+ const statusStore = statuses.store;
396
+ const aliasStore = ranges.aliases;
397
+ const sugar = (payload: Payload): Channel => this.sugar(payload);
398
+ const store = cache.createTable<Key, Channel>({
399
+ name: "channels",
400
+ equal: (a, b) => deep.equal(a.payload, b.payload),
401
+ fetch: async (keys) =>
402
+ (await this.execRetrieve(keys)).map((p) => sugar(stripComposed(p))),
403
+ listen: [
404
+ query.createSetListener(SET_CHANNEL_NAME, payloadZ, {
405
+ value: (changed) => sugar(stripComposed(changed)),
406
+ }),
407
+ query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
408
+ ],
409
+ });
410
+ const composed = cache.derive<Key, Channel, Channel>({
411
+ name: "channel.composed",
412
+ source: store,
413
+ compose: (record) => this.compose(record.payload),
414
+ equal: (a, b) => deep.equal(a.payload, b.payload),
415
+ watch: [query.deriveWatch(statusStore, (event) => affectedChannelKeys(event))],
416
+ });
417
+ const single = cache.queries<RetrieveSingleParams, Channel, Key, Channel>({
418
+ name: "channel",
419
+ table: composed,
420
+ fetch: async (query) => [(await this.fetchSingle(query)).key],
421
+ // Composed rows carry status; the read-time step only glues the alias.
422
+ compose: (records, query) =>
423
+ query.rangeKey == null
424
+ ? records[0]
425
+ : this.composeAlias(records[0].payload, query.rangeKey),
426
+ keyOf: (query) => query.key,
427
+ single: true,
428
+ watch: [
429
+ query.watch(aliasStore, (event, query: RetrieveSingleParams) => {
430
+ if (query.rangeKey == null) return null;
431
+ const aliasKey = createKey({ range: query.rangeKey, channel: query.key });
432
+ return event.key === aliasKey ? [query.key] : null;
433
+ }),
434
+ ],
435
+ });
436
+ super(cache, {
437
+ name: "channel",
438
+ table: store,
439
+ request: {
440
+ schema: retrieveRequestZ,
441
+ fetch: async (query) => await this.fetchRequest(query),
442
+ matches: (ch, query) => requestFilter(query)(ch),
443
+ watch: [
444
+ query.watch(aliasStore, (event, query: NormalizedRequest) => {
445
+ if (query.rangeKey == null) return null;
446
+ if (event.variant === "set")
447
+ return event.value.range === query.rangeKey
448
+ ? [event.value.channel]
449
+ : null;
450
+ const decoded = decodeDeleteChange(event.key);
451
+ return decoded.range === query.rangeKey ? [decoded.channel] : null;
452
+ }),
453
+ ],
454
+ },
455
+ compose: (ch, query) => {
456
+ const { rangeKey } = query as NormalizedRequest;
457
+ return rangeKey == null ? ch : this.composeAlias(ch.payload, rangeKey);
458
+ },
459
+ single: { schema: singleParamsZ, space: single },
460
+ });
461
+ this.cfg = cfg;
243
462
  this.writer = writer;
463
+ this.store = store;
244
464
  }
245
465
 
246
466
  /**
247
467
  * Creates a single channel with the given properties.
248
- *
249
468
  * @param name - A human-readable name for the channel.
250
469
  * @param rate - The rate of the channel. This only applies to fixed rate channels.
251
470
  * @param dataType - The data type for the samples stored in the channel.
@@ -283,25 +502,21 @@ export class Client {
283
502
  /**
284
503
  * Creates multiple channels with the given properties. The order of the channels
285
504
  * returned is guaranteed to match the order of the channels passed in.
286
- *
287
- * @param channels - An array of channel properties to create.
288
- * For each channel, the following properties should be considered:
289
- *
505
+ * @param channels - An array of channel properties to create. For each channel, the
506
+ * following properties should be considered:
290
507
  * @param name - A human-readable name for the channel.
291
508
  * @param rate - The rate of the channel. This only applies to fixed rate channels. If
292
509
  * the 'index' parameter is specified or 'isIndex' is set to true, this parameter will
293
510
  * be ignored.
294
511
  * @param dataType - The data type for the samples stored in the channel.
295
512
  * @param index - The key of the index channel that this channel should be associated
296
- * with. An 'index' channel is a channel that stores timestamps for other channels. Refer
297
- * to the Synnax documentation (https://docs.synnaxlabs.com) for more information. The
298
- * index channel must have already been created. This field does not need to be specified
299
- * if the channel is an index channel, or the channel is a fixed rate channel. If this
300
- * value is specified, the 'rate' parameter will be ignored.
301
- * @param isIndex - Set to true if the channel is an index channel, and false otherwise.
302
- * Index channels must have a data type of `DataType.TIMESTAMP`.
303
- *
304
- * @param channels
513
+ * with. An 'index' channel is a channel that stores timestamps for other channels.
514
+ * Refer to the Synnax documentation (https://docs.synnaxlabs.com) for more
515
+ * information. The index channel must have already been created. This field does not
516
+ * need to be specified if the channel is an index channel, or the channel is a fixed
517
+ * rate channel. If this value is specified, the 'rate' parameter will be ignored.
518
+ * @param isIndex - Set to true if the channel is an index channel, and false
519
+ * otherwise. Index channels must have a data type of `DataType.TIMESTAMP`.
305
520
  */
306
521
  async create(channels: New[], options?: CreateOptions): Promise<Channel[]>;
307
522
 
@@ -314,25 +529,23 @@ export class Client {
314
529
  let toCreate = array.toArray(channels);
315
530
  let created: Channel[] = [];
316
531
  if (retrieveIfNameExists) {
317
- const res = await this.retriever.retrieve(toCreate.map((c) => c.name));
532
+ const res = await this.execRetrieve(toCreate.map((c) => c.name));
318
533
  const existingNames = new Set(res.map((c) => c.name));
319
534
  toCreate = toCreate.filter((c) => !existingNames.has(c.name));
320
535
  created = this.sugar(res);
321
536
  }
322
537
  created = created.concat(this.sugar(await this.writer.create(toCreate)));
538
+ this.store.set(created.map((ch) => this.sugar(stripComposed(ch.payload))));
323
539
  return single ? created[0] : created;
324
540
  }
325
541
 
326
542
  /**
327
543
  * Retrieves a channel from the database using the given key or name.
328
- *
329
- * @param params - The key or name of the channel to retrieve.
330
544
  * @param options - Optional parameters to control the retrieval process.
331
- * @param options.dataTypes - Limits the query to only channels with the specified data
332
- * type.
333
- * @param options.notDataTypes - Limits the query to only channels without the specified
545
+ * @param options.dataTypes - Limits the query to only channels with the specified
334
546
  * data type.
335
- *
547
+ * @param options.notDataTypes - Limits the query to only channels without the
548
+ * specified data type.
336
549
  * @returns The retrieved channel.
337
550
  * @throws {NotFoundError} if the channel does not exist in the cluster.
338
551
  * @throws {MultipleFoundError} is only thrown if the channel is retrieved by name,
@@ -350,16 +563,22 @@ export class Client {
350
563
  /**
351
564
  * Retrieves multiple channels from the database using the provided keys or the
352
565
  * provided names.
353
- *
354
- * @param params - The keys or the names of the channels to retrieve. Note that
355
- * this method does not support mixing keys and names in the same call.
566
+ * @param params - The keys or the names of the channels to retrieve. Note that this
567
+ * method does not support mixing keys and names in the same call.
356
568
  * @param options - Optional parameters to control the retrieval process.
357
- * @param options.dataTypes - Limits the query to only channels with the specified data
358
- * type.
359
- * @param options.notDataTypes - Limits the query to only channels without the specified
360
- *
569
+ * @param options.dataTypes - Limits the query to only channels with the specified
570
+ * data type.
571
+ * @param options.notDataTypes - Limits the query to only channels without the
572
+ * specified
361
573
  */
362
- async retrieve(params: Params, options?: RetrieveOptions): Promise<Channel[]>;
574
+ async retrieve(params: Key | string, options?: RetrieveOptions): Promise<Channel>;
575
+
576
+ async retrieve(
577
+ params: PrimitiveParams | Payload[],
578
+ options?: RetrieveOptions,
579
+ ): Promise<Channel[]>;
580
+
581
+ async retrieve(params: RetrieveSingleParams): Promise<Channel>;
363
582
 
364
583
  async retrieve(params: RetrieveRequest): Promise<Channel[]>;
365
584
 
@@ -371,53 +590,103 @@ export class Client {
371
590
  * @raises {QueryError} If the channel does not exist or if multiple results are returned.
372
591
  */
373
592
  async retrieve(
374
- params: Params | RetrieveRequest,
593
+ params: PrimitiveParams | Payload[] | RetrieveSingleParams | RetrieveRequest,
375
594
  options?: RetrieveOptions,
376
595
  ): Promise<Channel | Channel[]> {
377
596
  if (typeof params === "object" && !Array.isArray(params))
378
- return this.sugar(await this.retriever.retrieve(params));
379
-
597
+ return await super.retrieve(params);
380
598
  const isSingle = !Array.isArray(params);
381
- const res = this.sugar(await this.retriever.retrieve(params, options));
599
+ const { variant, normalized: rawNormalized } = analyzeParams(params);
600
+ const normalized =
601
+ variant === "keys" ? rawNormalized.filter((k) => k !== 0) : rawNormalized;
602
+ if (normalized.length === 0) {
603
+ checkForMultipleOrNoResults<Params, Channel>("channel", params, [], isSingle);
604
+ return [];
605
+ }
606
+ if (isSingle && variant === "keys" && onlyRangeKey(options))
607
+ return await super.retrieve({
608
+ key: normalized[0] as Key,
609
+ rangeKey: options?.rangeKey,
610
+ });
611
+ const res = await super.retrieve(
612
+ zod.parse(
613
+ retrieveRequestZ,
614
+ { [variant]: normalized, ...options },
615
+ { label: "channel retrieve request" },
616
+ ),
617
+ );
382
618
  checkForMultipleOrNoResults<Params, Channel>("channel", params, res, isSingle);
383
619
  return isSingle ? res[0] : res;
384
620
  }
385
621
 
386
- /***
387
- * Deletes channels from the database using the given keys or names.
388
- * @param params - The keys or names of the channels to delete.
389
- */
390
- async delete(params: Params): Promise<void> {
622
+ /** * Deletes channels from the database using the given keys or names. */
623
+ async delete(params: Params, opts: query.WriteOptions = {}): Promise<void> {
391
624
  const { normalized, variant } = analyzeParams(params);
392
- if (variant === "keys") return await this.writer.delete({ keys: normalized });
393
- return await this.writer.delete({ names: normalized as string[] });
625
+ if (variant === "keys") {
626
+ const keys = normalized;
627
+ const ids = ontologyID(keys);
628
+ const drop = () => [
629
+ this.cfg.ontology.cache.deleteRelationships(ids),
630
+ this.store.delete(keys),
631
+ this.cfg.ontology.cache.resources.delete(ontology.idToString(ids)),
632
+ ];
633
+ await query.optimistic({
634
+ rollbacks: drop(),
635
+ onOptimistic: opts.onOptimistic,
636
+ commit: async () => await this.writer.delete({ keys }),
637
+ });
638
+ drop();
639
+ return;
640
+ }
641
+ const names = normalized;
642
+ await this.writer.delete({ names });
643
+ const cached = this.store.get((ch) => names.includes(ch.name));
644
+ if (cached.length > 0) this.store.delete(cached.map((ch) => ch.key));
394
645
  }
395
646
 
396
- async rename(key: Key, name: string): Promise<void>;
397
- async rename(keys: Key[], names: string[]): Promise<void>;
398
- async rename(keys: Key | Key[], names: string | string[]): Promise<void> {
399
- return await this.writer.rename(array.toArray(keys), array.toArray(names));
647
+ async rename(key: Key, name: string, opts?: query.WriteOptions): Promise<void>;
648
+ async rename(keys: Key[], names: string[], opts?: query.WriteOptions): Promise<void>;
649
+ async rename(
650
+ keys: Key | Key[],
651
+ names: string | string[],
652
+ opts: query.WriteOptions = {},
653
+ ): Promise<void> {
654
+ const keysArr = array.toArray(keys);
655
+ const namesArr = array.toArray(names);
656
+ const rename = () =>
657
+ keysArr.flatMap((key, i) => {
658
+ const name = namesArr[i];
659
+ return [
660
+ this.renameThrough(key, name),
661
+ this.cfg.ontology.cache.renameResource(ontologyID(key), name),
662
+ ];
663
+ });
664
+ await query.optimistic({
665
+ rollbacks: rename(),
666
+ onOptimistic: opts.onOptimistic,
667
+ commit: async () => await this.writer.rename(keysArr, namesArr),
668
+ });
669
+ rename();
400
670
  }
401
671
 
402
- createDebouncedBatchRetriever(
403
- deb: CrudeTimeSpan = TimeSpan.milliseconds(10),
404
- ): Retriever {
405
- return new CacheRetriever(
406
- new DebouncedBatchRetriever(new ClusterRetriever(this.client), deb),
672
+ /** Renames the cached channel, skipping when absent. Returns a rollback. */
673
+ private renameThrough(key: Key, name: string): destructor.Destructor {
674
+ return this.store.set(key, (p) =>
675
+ p == null ? undefined : this.sugar({ ...p.payload, name }),
407
676
  );
408
677
  }
409
678
 
410
679
  sugar(payload: Payload): Channel;
411
680
  sugar(payloads: Payload[]): Channel[];
412
681
  sugar(payloads: Payload | Payload[]): Channel | Channel[] {
413
- const { frameClient } = this;
682
+ const { framer: frameClient } = this.cfg;
414
683
  if (Array.isArray(payloads))
415
684
  return payloads.map((p) => new Channel({ ...p, frameClient }));
416
685
  return new Channel({ ...payloads, frameClient });
417
686
  }
418
687
 
419
688
  async retrieveGroup(): Promise<group.Group> {
420
- const res = await this.client.send(
689
+ const res = await this.cfg.unary.send(
421
690
  "/channel/retrieve-group",
422
691
  {},
423
692
  retrieveGroupReqZ,
@@ -425,7 +694,135 @@ export class Client {
425
694
  );
426
695
  return res.group;
427
696
  }
697
+
698
+ /** Rebuilds a cached channel with its cached status attached. */
699
+ private compose(payload: Payload): Channel {
700
+ const next: Payload = { ...payload, status: undefined, alias: undefined };
701
+ if (isCalculated(payload)) {
702
+ const parsed = statusZ.safeParse(
703
+ this.cfg.statuses.store.get(statusKey(payload.key)),
704
+ );
705
+ if (parsed.success) next.status = parsed.data;
706
+ }
707
+ return this.sugar(next);
708
+ }
709
+
710
+ private composeAlias(payload: Payload, rangeKey: ranger.Key): Channel {
711
+ return this.sugar({
712
+ ...payload,
713
+ alias: this.cfg.ranges.aliases.get(
714
+ createKey({ range: rangeKey, channel: payload.key }),
715
+ )?.alias,
716
+ });
717
+ }
718
+
719
+ /** Fetches aliases under the range for keys the alias store has no entry for. */
720
+ private async ensureAliases(rangeKey: ranger.Key, keys: Key[]): Promise<void> {
721
+ const missing = keys.filter(
722
+ (key) =>
723
+ !this.cfg.ranges.aliases.has(createKey({ range: rangeKey, channel: key })),
724
+ );
725
+ if (missing.length === 0) return;
726
+ const fetched = await this.cfg.ranges.retrieveAliases(rangeKey, missing);
727
+ Object.entries(fetched).forEach(([channel, alias]) => {
728
+ const entry: ranger.alias.Alias = {
729
+ range: rangeKey,
730
+ channel: Number(channel),
731
+ alias,
732
+ };
733
+ this.cfg.ranges.aliases.set(createKey(entry), entry);
734
+ });
735
+ }
736
+
737
+ /** Fetches channel payloads. Missing channels are omitted, not thrown. */
738
+ private async execRetrieve(
739
+ channels: Params | RetrieveRequest,
740
+ options?: RetrieveOptions,
741
+ ): Promise<Payload[]> {
742
+ let request: RetrieveRequest;
743
+ if (
744
+ !Array.isArray(channels) &&
745
+ typeof channels === "object" &&
746
+ !("key" in channels)
747
+ )
748
+ request = channels;
749
+ else {
750
+ const { variant, normalized: raw } = analyzeParams(channels);
751
+ const normalized = raw.filter((k) => k !== 0);
752
+ if (normalized.length === 0) return [];
753
+ request = { [variant]: normalized, ...options };
754
+ }
755
+ const res = await this.cfg.unary.send(
756
+ "/channel/retrieve",
757
+ request,
758
+ retrieveRequestZ,
759
+ retrieveResZ,
760
+ );
761
+ return res.channels;
762
+ }
763
+
764
+ private async fetchSingle(query: RetrieveSingleParams): Promise<Channel> {
765
+ const { key, rangeKey } = query;
766
+ let ch = this.store.get(key);
767
+ if (ch == null) {
768
+ const payloads = await this.execRetrieve([key]);
769
+ checkForMultipleOrNoResults("channel", key, payloads, true);
770
+ ch = this.sugar(stripComposed(payloads[0]));
771
+ this.store.set(key, ch);
772
+ }
773
+ // A cached calculated channel without a cached status is ambiguous: the
774
+ // status may not exist, or may simply never have been fetched.
775
+ if (ch.isCalculated && !this.cfg.statuses.store.has(statusKey(key)))
776
+ try {
777
+ await this.cfg.statuses.retrieve(statusKey(key));
778
+ } catch (e) {
779
+ if (!NotFoundError.matches(e)) throw errors.fromUnknown(e);
780
+ }
781
+ if (rangeKey != null) await this.ensureAliases(rangeKey, [key]);
782
+ return ch;
783
+ }
784
+
785
+ /**
786
+ * Resolves literal names against the record store, fetching only the names it
787
+ * cannot resolve. A name matching two stored channels is ambiguous, which only
788
+ * a cluster running without name validation can produce, so the whole request
789
+ * falls through to the cluster. Returns null when the store cannot be trusted
790
+ * to answer any part of the request.
791
+ */
792
+ private async resolveNames(names: string[]): Promise<Channel[] | null> {
793
+ if (!names.every((name) => NAME_LITERAL_PATTERN.test(name))) return null;
794
+ const resolved: Channel[] = [];
795
+ const missing: string[] = [];
796
+ for (const name of new Set(names)) {
797
+ const matches = this.store.get((ch) => ch.name === name);
798
+ if (matches.length > 1) return null;
799
+ if (matches.length === 0) missing.push(name);
800
+ else resolved.push(matches[0]);
801
+ }
802
+ if (missing.length === 0) return resolved;
803
+ const fetched = (await this.execRetrieve({ names: missing })).map((p) =>
804
+ this.sugar(stripComposed(p)),
805
+ );
806
+ return [...resolved, ...fetched];
807
+ }
808
+
809
+ private async fetchRequest(query: NormalizedRequest): Promise<Channel[]> {
810
+ const { rangeKey } = query;
811
+ let channels: Channel[] | null = null;
812
+ if (isKeysOnly(query)) channels = await this.store.retrieve(query.keys);
813
+ else if (isNamesOnly(query)) channels = await this.resolveNames(query.names);
814
+ channels ??= (await this.execRetrieve(query)).map((p) =>
815
+ this.sugar(stripComposed(p)),
816
+ );
817
+ if (rangeKey != null)
818
+ await this.ensureAliases(
819
+ rangeKey,
820
+ channels.map((ch) => ch.key),
821
+ );
822
+ return channels;
823
+ }
428
824
  }
429
825
 
826
+ /** @returns whether the channel computes its samples from an expression. */
430
827
  export const isCalculated = ({ virtual, expression }: Payload): boolean =>
431
828
  virtual && expression !== "";