@synnaxlabs/client 0.56.2 → 0.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (741) hide show
  1. package/dist/client-B08VDLSA.js +14463 -0
  2. package/dist/client-B08VDLSA.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +71 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +43 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +37 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +40 -17
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +279 -0
  398. package/src/framer/cache/reader.ts +160 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +104 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +18 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -8,12 +8,12 @@
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
10
  import { EOF, type Stream, type WebSocketClient } from "@synnaxlabs/freighter";
11
- import { breaker, errors, observe, Rate, TimeSpan } from "@synnaxlabs/x";
11
+ import { errors, Rate, zod } from "@synnaxlabs/x";
12
12
  import { z } from "zod";
13
13
 
14
14
  import { type channel } from "@/channel";
15
15
  import { paramsZ } from "@/channel/payload";
16
- import { ReadAdapter } from "@/framer/adapter";
16
+ import { type ChannelRetriever, ReadAdapter } from "@/framer/adapter";
17
17
  import { WSStreamerCodec } from "@/framer/codec";
18
18
  import { Frame, frameZ } from "@/framer/frame";
19
19
  import { StreamProxy } from "@/framer/streamProxy";
@@ -51,39 +51,25 @@ const intermediateStreamerConfigZ = z.object({
51
51
  excludeGroups: z.uint32().array().default([]),
52
52
  });
53
53
 
54
+ /** Zod schema for {@link StreamerConfig}. A bare channel list parses as a config. */
54
55
  export const streamerConfigZ = intermediateStreamerConfigZ.or(
55
56
  paramsZ.transform((channels) => intermediateStreamerConfigZ.parse({ channels })),
56
57
  );
57
58
 
59
+ /** Config for a streamer. Pass it to `client.telem.openStreamer`. */
58
60
  export type StreamerConfig = z.input<typeof streamerConfigZ>;
59
- type ParsedStreamerConfig = z.output<typeof streamerConfigZ>;
60
61
 
61
62
  /**
62
- * A streamer is used to stream frames of telemetry in real-time from a Synnax cluster.
63
- * It should not be constructed directly, and should instead be created using the
64
- * client's openStreamer method.
63
+ * Streams frames of telemetry from a Synnax cluster in real time. Open one with the
64
+ * client's openStreamer method, never directly. Read frames with `read` or by
65
+ * iterating the streamer. Close it in a `finally` block to free its resources.
65
66
  *
66
- * To open a streamer, use the openStreamer method on the client and pass it in the list
67
- * of channels you'd like to receive data from. Once the streamer has been opened, call
68
- * the `read` method to read the next frame of telemetry, or use the streamer as an
69
- * async iterator to iterate over the frames of telemetry as they are received.
70
- *
71
- * The list of channels being streamed can be updated at any time by using the `update`
72
- * method.
73
- *
74
- * Once done, call the `close` method to close the streamer and free all associated
75
- * resources. We recommend using the streamer within a try-finally block to ensure
76
- * that it is closed properly in the event of an error.
77
- *
78
- * For detailed documentation, see https://docs.synnaxlabs.com/reference/client/working-with-data/streaming-data
67
+ * @see https://docs.synnaxlabs.com/reference/client/working-with-data/streaming-data
79
68
  */
80
69
  export interface Streamer extends AsyncIterator<Frame>, AsyncIterable<Frame> {
81
70
  /** The keys of the channels currently being streamed from. */
82
71
  keys: channel.Key[];
83
- /**
84
- * Update the list of channels being streamed from. This replaces the list of channels
85
- * being streamed from with the new list of channels.
86
- */
72
+ /** Replaces the list of channels being streamed from. */
87
73
  update: (channels: channel.Params) => Promise<void>;
88
74
  /** Close the streamer and free all associated resources. */
89
75
  close: () => void;
@@ -91,24 +77,22 @@ export interface Streamer extends AsyncIterator<Frame>, AsyncIterable<Frame> {
91
77
  read: () => Promise<Frame>;
92
78
  }
93
79
 
94
- /**
95
- * A function that opens a streamer.
96
- */
80
+ /** A function that opens a streamer. */
97
81
  export interface StreamOpener {
98
82
  (config: StreamerConfig): Promise<Streamer>;
99
83
  }
100
84
 
101
85
  /**
102
- * Creates a function that opens streamers with the given retriever and client.
103
- * @param retriever - The channel retriever to use for resolving channel information
86
+ * Creates a function that opens streamers with the given channel resolver and client.
87
+ * @param retrieveChannels - Resolves channel params to payloads for the codec
104
88
  * @param client - The WebSocket client to use for streaming
105
89
  * @returns A function that opens streamers with the given configuration
106
90
  */
107
91
  export const createStreamOpener =
108
- (retriever: channel.Retriever, client: WebSocketClient): StreamOpener =>
92
+ (retrieveChannels: ChannelRetriever, client: WebSocketClient): StreamOpener =>
109
93
  async (config) => {
110
- const cfg = streamerConfigZ.parse(config);
111
- const adapter = await ReadAdapter.open(retriever, cfg.channels);
94
+ const cfg = zod.parse(streamerConfigZ, config, { label: "streamer config" });
95
+ const adapter = await ReadAdapter.open(retrieveChannels, cfg.channels);
112
96
  client = client.withCodec(new WSStreamerCodec(adapter.codec));
113
97
  const stream = await client.stream("/frame/stream", reqZ, resZ);
114
98
  const streamer = new BaseStreamer(
@@ -130,16 +114,15 @@ export const createStreamOpener =
130
114
 
131
115
  /**
132
116
  * Opens a new streamer with the given configuration.
133
- * @param retriever - The channel retriever to use for resolving channel information
117
+ * @param retrieveChannels - Resolves channel params to payloads for the codec
134
118
  * @param client - The WebSocket client to use for streaming
135
- * @param config - The configuration for the streamer
136
119
  * @returns A promise that resolves to a new streamer
137
120
  */
138
121
  export const openStreamer = async (
139
- retriever: channel.Retriever,
122
+ retrieveChannels: ChannelRetriever,
140
123
  client: WebSocketClient,
141
124
  config: StreamerConfig,
142
- ): Promise<Streamer> => await createStreamOpener(retriever, client)(config);
125
+ ): Promise<Streamer> => await createStreamOpener(retrieveChannels, client)(config);
143
126
 
144
127
  class BaseStreamer implements Streamer {
145
128
  private readonly stream: StreamProxy<typeof reqZ, typeof resZ>;
@@ -199,146 +182,3 @@ class BaseStreamer implements Streamer {
199
182
  return this;
200
183
  }
201
184
  }
202
-
203
- /**
204
- * A hardened streamer that automatically reconnects on failure.
205
- * This streamer wraps a regular streamer and adds automatic reconnection
206
- * logic when the connection is lost or errors occur.
207
- */
208
- export class HardenedStreamer implements Streamer {
209
- private wrapped_: Streamer | null = null;
210
- private readonly breaker: breaker.Breaker;
211
- private readonly opener: StreamOpener;
212
- private readonly config: ParsedStreamerConfig;
213
-
214
- private constructor(
215
- opener: StreamOpener,
216
- config: StreamerConfig,
217
- breakerConfig: breaker.Config = {},
218
- ) {
219
- this.opener = opener;
220
- this.config = streamerConfigZ.parse(config);
221
- const {
222
- maxRetries = 5000,
223
- baseInterval = TimeSpan.seconds(1),
224
- scale = 1,
225
- } = breakerConfig ?? {};
226
- this.breaker = new breaker.Breaker({ maxRetries, baseInterval, scale });
227
- }
228
-
229
- /**
230
- * Opens a new hardened streamer with the given configuration.
231
- * @param opener - The function to use for opening streamers
232
- * @param config - The configuration for the streamer
233
- * @returns A promise that resolves to a new hardened streamer
234
- */
235
- static async open(
236
- opener: StreamOpener,
237
- config: StreamerConfig,
238
- breakerConfig?: breaker.Config,
239
- ): Promise<HardenedStreamer> {
240
- const h = new HardenedStreamer(opener, config, breakerConfig);
241
- await h.runStreamer();
242
- return h;
243
- }
244
-
245
- private async runStreamer(): Promise<void> {
246
- while (true)
247
- try {
248
- if (this.wrapped_ != null) this.wrapped_.close();
249
- this.wrapped_ = await this.opener(this.config);
250
- this.breaker.reset();
251
- return;
252
- } catch (e) {
253
- this.wrapped_ = null;
254
- if (!(await this.breaker.wait())) throw errors.fromUnknown(e);
255
- console.error("failed to open streamer", e);
256
- continue;
257
- }
258
- }
259
-
260
- private get wrapped(): Streamer {
261
- if (this.wrapped_ == null) throw new Error("stream closed");
262
- return this.wrapped_;
263
- }
264
-
265
- async update(channels: channel.Params): Promise<void> {
266
- this.config.channels = paramsZ.parse(channels);
267
- try {
268
- await this.wrapped.update(channels);
269
- } catch {
270
- await this.runStreamer();
271
- return await this.update(channels);
272
- }
273
- }
274
-
275
- async next(): Promise<IteratorResult<Frame>> {
276
- try {
277
- return { done: false, value: await this.read() };
278
- } catch (e) {
279
- if (EOF.matches(e)) return { done: true, value: undefined };
280
- throw errors.fromUnknown(e);
281
- }
282
- }
283
-
284
- async read(): Promise<Frame> {
285
- try {
286
- const fr = await this.wrapped.read();
287
- this.breaker.reset();
288
- return fr;
289
- } catch (e) {
290
- if (EOF.matches(e)) throw errors.fromUnknown(e);
291
- await this.runStreamer();
292
- return await this.read();
293
- }
294
- }
295
- close(): void {
296
- this.wrapped.close();
297
- }
298
-
299
- get keys(): channel.Key[] {
300
- return this.wrapped.keys;
301
- }
302
-
303
- [Symbol.asyncIterator](): AsyncIterator<Frame> {
304
- return this;
305
- }
306
- }
307
-
308
- /**
309
- * Wraps a standard streamer to implement an observable interface for handling changes
310
- * to channel values through an onChange handler.
311
- */
312
- export class ObservableStreamer<V = Frame>
313
- extends observe.Observer<Frame, V>
314
- implements observe.ObservableAsyncCloseable<V>
315
- {
316
- private readonly streamer: Streamer;
317
- private readonly closePromise: Promise<void>;
318
-
319
- /**
320
- * Creates a new observable streamer.
321
- * @param streamer - The streamer to wrap
322
- * @param transform - An optional transform function to apply to each frame
323
- * @template V - The type of the transformed value. Only relevant if transform is
324
- * provided. Defaults to Frame.
325
- */
326
- constructor(streamer: Streamer, transform?: observe.Transform<Frame, V>) {
327
- super(transform);
328
- this.streamer = streamer;
329
- this.closePromise = this.stream();
330
- }
331
-
332
- async update(channels: channel.Params): Promise<void> {
333
- await this.streamer.update(channels);
334
- }
335
-
336
- async close(): Promise<void> {
337
- this.streamer.close();
338
- await this.closePromise;
339
- }
340
-
341
- private async stream(): Promise<void> {
342
- for await (const frame of this.streamer) this.notify(frame);
343
- }
344
- }
@@ -18,19 +18,23 @@ import {
18
18
  } from "@synnaxlabs/x";
19
19
  import { z } from "zod";
20
20
 
21
- import { channel } from "@/channel";
21
+ import { type channel } from "@/channel";
22
+ import { paramsZ } from "@/channel/payload";
23
+ import { keyZ, nameZ } from "@/channel/types.gen";
22
24
  import { SynnaxError } from "@/errors";
23
- import { WriteAdapter } from "@/framer/adapter";
25
+ import { type ChannelRetriever, WriteAdapter } from "@/framer/adapter";
24
26
  import { WSWriterCodec } from "@/framer/codec";
25
27
  import { type CrudeFrame, frameZ } from "@/framer/frame";
26
28
  import { WriterCommand } from "@/framer/types.gen";
27
29
 
30
+ /** Whether a writer persists its samples, streams them to subscribers, or both. */
28
31
  export enum WriterMode {
29
32
  PersistStream = 1,
30
33
  Persist = 2,
31
34
  Stream = 3,
32
35
  }
33
36
 
37
+ /** `autoIndexPersistInterval` that flushes the index on every auto commit. */
34
38
  export const ALWAYS_INDEX_PERSIST_ON_AUTO_COMMIT: TimeSpan = new TimeSpan(-1);
35
39
 
36
40
  export class WriterClosedError extends SynnaxError.sub("writer_closed") {
@@ -52,6 +56,7 @@ const writerModeZ = z.enum(WriterMode).or(
52
56
  }),
53
57
  );
54
58
 
59
+ /** A {@link WriterMode}, or its name as a string. */
55
60
  export type CrudeWriterMode = z.input<typeof writerModeZ>;
56
61
 
57
62
  const baseWriterConfigZ = z.object({
@@ -96,22 +101,24 @@ const baseWriterConfigZ = z.object({
96
101
  });
97
102
 
98
103
  const netWriterConfigZ = baseWriterConfigZ.extend({
99
- keys: channel.keyZ.array().optional(),
104
+ keys: keyZ.array().optional(),
100
105
  });
101
106
 
102
107
  export type NetWriterConfig = z.input<typeof netWriterConfigZ>;
103
108
 
104
109
  // Intermediate utility type to allow for the use of paramsZ in the writer config.
105
110
  const intermediateWriterConfigZ = baseWriterConfigZ.extend({
106
- channels: channel.paramsZ,
111
+ channels: paramsZ,
107
112
  });
108
113
 
114
+ /** Zod schema for {@link WriterConfig}. A bare channel list parses as a config. */
109
115
  export const writerConfigZ = intermediateWriterConfigZ.or(
110
- channel.paramsZ.transform((channels) =>
116
+ paramsZ.transform((channels) =>
111
117
  intermediateWriterConfigZ.parse({ channels, start: TimeStamp.now() }),
112
118
  ),
113
119
  );
114
120
 
121
+ /** Config for a writer. Pass it to `client.telem.openWriter`. */
115
122
  export type WriterConfig = z.input<typeof writerConfigZ>;
116
123
 
117
124
  const reqZ = z.object({
@@ -129,11 +136,11 @@ const resZ = z.object({
129
136
  err: errors.payloadZ.optional(),
130
137
  });
131
138
 
132
- const authorityArgsZ = z
139
+ const authorityParamsZ = z
133
140
  .tuple([
134
141
  z.union([
135
- z.record(channel.keyZ.or(channel.nameZ), control.authorityZ),
136
- channel.keyZ.or(channel.nameZ),
142
+ z.record(keyZ.or(nameZ), control.authorityZ),
143
+ keyZ.or(nameZ),
137
144
  control.authorityZ,
138
145
  ]),
139
146
  control.authorityZ.optional(),
@@ -141,7 +148,7 @@ const authorityArgsZ = z
141
148
  .transform(([value, authority]) => {
142
149
  if (control.authorityZ.safeParse(value).success)
143
150
  return { keys: [], authorities: [value as control.Authority] };
144
- if (channel.keyZ.or(channel.nameZ).safeParse(value).success) {
151
+ if (keyZ.or(nameZ).safeParse(value).success) {
145
152
  if (authority == null)
146
153
  throw new Error(
147
154
  "authority is required when setting authority for a single channel",
@@ -155,49 +162,25 @@ const authorityArgsZ = z
155
162
  return { keys: Object.keys(oValue), authorities: Object.values(oValue) };
156
163
  });
157
164
 
158
- export type AuthorityArgs = z.input<typeof authorityArgsZ>;
165
+ /**
166
+ * Arguments to `Writer.setAuthority`: one authority for every channel, one channel and
167
+ * its authority, or a record of channel to authority.
168
+ */
169
+ export type AuthorityParams = z.input<typeof authorityParamsZ>;
159
170
 
160
171
  interface Response extends z.infer<typeof resZ> {}
161
172
 
162
173
  /**
163
- * Writer is used to write telemetry to a set of channels in time order. It should not
164
- * be instantiated directly, and should instead be instantiated via the FramerClient
165
- * {@link FrameClient#openWriter}.
166
- *
167
- * The writer is a streaming protocol that is heavily optimized for performance. This
168
- * comes at the cost of increased complexity, and should only be used directly when
169
- * writing large volumes of data (such as recording telemetry from a sensor or ingesting
170
- * data from file). Simpler methods (such as the frame client's write method) should be
171
- * used for most use cases.
172
- *
173
- * The protocol is as follows:
174
- *
175
- * 1. The writer is opened with a starting timestamp and a list of channel keys. The
176
- * writer will fail to open if the starting timestamp overlaps with any existing
177
- * telemetry for any channels specified. If the writer opens successfully, the caller
178
- * is then free to write frames to the writer.
174
+ * Writes telemetry to a set of channels in time order. Open one with
175
+ * {@link FrameClient#openWriter}, never directly. Prefer the frame client's write
176
+ * method unless the volume warrants the streaming protocol.
179
177
  *
180
- * 2. To write a frame, the caller can use the write method and follow the validation
181
- * rules described in its method's documentation. This process is asynchronous,
182
- * meaning that write calls may return before the frame has been written to the
183
- * cluster. This also means that the writer can accumulate an error after write is
184
- * called. If the writer accumulates an error, all subsequent write and commit calls
185
- * will return False. The caller can check for errors by calling the error method,
186
- * which returns the accumulated error and resets the writer for future use. The
187
- * caller can also check for errors by closing the writer, which will throw any
188
- * accumulated error.
189
- *
190
- * 3. To commit the written frames to the cluster, the caller can call the commit
191
- * method. Unlike write, commit is synchronous, meaning that it will not return until
192
- * the frames have been written to the cluster. If the writer has accumulated an
193
- * error, commit will return false. After the caller acknowledges the error, they can
194
- * attempt to commit again. Commit can be called several times throughout a writer's
195
- * lifetime, and will only commit the frames that have been written since the last
196
- * commit.
197
- *
198
- * 4. A writer MUST be closed after use in order to prevent resource leaks. Close should
199
- * typically be called in a 'finally' block. If the writer has accumulated an error,
200
- * close will throw the error.
178
+ * Opening fails when the start timestamp overlaps existing telemetry on any of the
179
+ * channels. `write` is asynchronous, so a failure surfaces on a later call: once the
180
+ * writer accumulates an error, every write and commit returns false until `error`
181
+ * reads and clears it. `commit` blocks until the cluster has the frames written since
182
+ * the last commit, and may be called repeatedly. Close in a `finally` block to release
183
+ * resources; close throws any accumulated error.
201
184
  */
202
185
  export class Writer {
203
186
  private readonly stream: Stream<typeof reqZ, typeof resZ>;
@@ -210,12 +193,12 @@ export class Writer {
210
193
  }
211
194
 
212
195
  static async _open(
213
- retriever: channel.Retriever,
196
+ retrieveChannels: ChannelRetriever,
214
197
  client: WebSocketClient,
215
198
  config: WriterConfig,
216
199
  ): Promise<Writer> {
217
200
  const cfg = zod.parse(writerConfigZ, config);
218
- const adapter = await WriteAdapter.open(retriever, cfg.channels);
201
+ const adapter = await WriteAdapter.open(retrieveChannels, cfg.channels);
219
202
  client = client.withCodec(new WSWriterCodec(adapter.codec));
220
203
  const stream = await client.stream("/frame/write", reqZ, resZ);
221
204
  const writer = new Writer(stream, adapter);
@@ -236,9 +219,7 @@ export class Writer {
236
219
  ): Promise<void>;
237
220
  async write(
238
221
  channelsOrData:
239
- | channel.Params
240
- | Record<channel.Key | channel.Name, CrudeSeries>
241
- | CrudeFrame,
222
+ channel.Params | Record<channel.Key | channel.Name, CrudeSeries> | CrudeFrame,
242
223
  series?: CrudeSeries | CrudeSeries[],
243
224
  ): Promise<void>;
244
225
 
@@ -259,9 +240,7 @@ export class Writer {
259
240
  */
260
241
  async write(
261
242
  channelsOrData:
262
- | channel.Params
263
- | Record<channel.Key | channel.Name, CrudeSeries>
264
- | CrudeFrame,
243
+ channel.Params | Record<channel.Key | channel.Name, CrudeSeries> | CrudeFrame,
265
244
  series?: CrudeSeries | CrudeSeries[],
266
245
  ): Promise<void> {
267
246
  if (this.closeErr != null) throw this.closeErr;
@@ -275,11 +254,13 @@ export class Writer {
275
254
  }
276
255
 
277
256
  async setAuthority(
278
- value: AuthorityArgs[0],
279
- authority?: AuthorityArgs[1],
257
+ value: AuthorityParams[0],
258
+ authority?: AuthorityParams[1],
280
259
  ): Promise<void> {
281
260
  if (this.closeErr != null) throw this.closeErr;
282
- const parsed = authorityArgsZ.parse([value, authority]);
261
+ const parsed = zod.parse(authorityParamsZ, [value, authority], {
262
+ label: "authority params",
263
+ });
283
264
  const config = {
284
265
  keys: await this.adapter.adaptParams(parsed.keys),
285
266
  authorities: parsed.authorities,
@@ -290,7 +271,6 @@ export class Writer {
290
271
  /**
291
272
  * Commits the written frames to the database. Commit is synchronous, meaning that it
292
273
  * will not return until all frames have been committed to the database.
293
- *
294
274
  * @returns the timestamp of the last sample written to the writer.
295
275
  * @throws if the commit fails or any previous writer method has thrown. Once commit
296
276
  * throws, the writer must be closed and re-opened to continue use.
@@ -8,11 +8,13 @@
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
10
  import { type UnaryClient } from "@synnaxlabs/freighter";
11
- import { array } from "@synnaxlabs/x";
11
+ import { array, zod } from "@synnaxlabs/x";
12
12
  import z from "zod";
13
13
 
14
- import { type Group, groupZ, type Key, keyZ } from "@/group/types.gen";
14
+ import { type Group, groupZ, type Key, keyZ, ontologyID } from "@/group/types.gen";
15
+ import { ontology } from "@/ontology";
15
16
  import { idZ as ontologyIDZ } from "@/ontology/payload";
17
+ import { query } from "@/query";
16
18
 
17
19
  export const SET_CHANNEL_NAME = "sy_group_set";
18
20
  export const DELETE_CHANNEL_NAME = "sy_group_delete";
@@ -29,40 +31,173 @@ const renameReqZ = z.object({ key: keyZ, name: z.string() });
29
31
 
30
32
  const deleteReqZ = z.object({ keys: z.array(keyZ) });
31
33
 
32
- export interface CreateArgs extends z.infer<typeof createReqZ> {}
34
+ export interface CreateParams extends z.infer<typeof createReqZ> {}
33
35
 
34
- export class Client {
35
- client: UnaryClient;
36
+ const retrieveChildrenParamsZ = z.object({
37
+ parent: ontologyIDZ,
38
+ searchTerm: z.string().optional(),
39
+ offset: z.int().optional(),
40
+ limit: z.int().optional(),
41
+ });
42
+
43
+ export type RetrieveSingleParams = { key: Key };
44
+ export type RetrieveChildrenParams = z.input<typeof retrieveChildrenParamsZ>;
45
+ export type RetrieveParams = RetrieveSingleParams | RetrieveChildrenParams;
46
+
47
+ interface ChildrenRequest extends z.infer<typeof retrieveChildrenParamsZ> {}
48
+
49
+ const isChildOf = (rel: ontology.Relationship, parent: ontology.ID): boolean =>
50
+ ontology.matchRelationship(rel, {
51
+ from: parent,
52
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
53
+ to: { type: "group" },
54
+ });
36
55
 
37
- constructor(client: UnaryClient) {
38
- this.client = client;
56
+ export interface ClientConfig {
57
+ unary: UnaryClient;
58
+ ontology: ontology.Client;
59
+ cache: query.Cache;
60
+ }
61
+
62
+ export class Client extends query.Retriever<
63
+ typeof retrieveChildrenParamsZ,
64
+ Key,
65
+ Group
66
+ > {
67
+ /** Public so a client that deletes a group through an endpoint of its own can drop
68
+ * the group from the cache. */
69
+ readonly store: query.Table<Key, Group>;
70
+ private readonly cfg: ClientConfig;
71
+
72
+ constructor(cfg: ClientConfig) {
73
+ const { cache, ontology: ontologyClient } = cfg;
74
+ const store = cache.createTable<Key, Group>({
75
+ name: "groups",
76
+ fetch: async (keys) => await this.execRetrieveKeys(keys),
77
+ listen: [
78
+ query.createSetListener(SET_CHANNEL_NAME, groupZ),
79
+ query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
80
+ ],
81
+ });
82
+ super(cache, {
83
+ name: "group",
84
+ table: store,
85
+ request: {
86
+ schema: retrieveChildrenParamsZ,
87
+ fetch: async (req) => await this.fetchChildren(req),
88
+ matches: (g, req) => this.isCachedChild(req.parent, g.key),
89
+ watch: [
90
+ query.watch(
91
+ ontologyClient.cache.relationships,
92
+ (event, req: ChildrenRequest) => {
93
+ const rel =
94
+ event.variant === "set"
95
+ ? event.value
96
+ : ontology.relationshipZ.parse(event.key);
97
+ if (!isChildOf(rel, req.parent)) return null;
98
+ return [rel.to.key];
99
+ },
100
+ ),
101
+ ],
102
+ },
103
+ });
104
+ this.cfg = cfg;
105
+ this.store = store;
39
106
  }
40
107
 
41
- async create(args: CreateArgs): Promise<Group> {
42
- const res = await this.client.send(
108
+ async create(params: CreateParams): Promise<Group> {
109
+ const res = await this.cfg.unary.send(
43
110
  "/ontology/create-group",
44
- args,
111
+ params,
45
112
  createReqZ,
46
113
  resZ,
47
114
  );
115
+ this.store.set(res.group);
116
+ const rel: ontology.Relationship = {
117
+ from: params.parent,
118
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
119
+ to: ontologyID(res.group.key),
120
+ };
121
+ this.cfg.ontology.cache.relationships.set(ontology.relationshipToString(rel), rel);
48
122
  return res.group;
49
123
  }
50
124
 
51
- async rename(key: Key, name: string): Promise<void> {
52
- await this.client.send(
53
- "/ontology/rename-group",
54
- { key, name },
55
- renameReqZ,
56
- z.object({}),
57
- );
125
+ async rename(key: Key, name: string, opts: query.WriteOptions = {}): Promise<void> {
126
+ const rename = () => [
127
+ query.partialUpdate(this.store, key, { name }),
128
+ this.cfg.ontology.cache.renameResource(ontologyID(key), name),
129
+ ];
130
+ await query.optimistic({
131
+ rollbacks: rename(),
132
+ onOptimistic: opts.onOptimistic,
133
+ commit: async () =>
134
+ await this.cfg.unary.send(
135
+ "/ontology/rename-group",
136
+ { key, name },
137
+ renameReqZ,
138
+ z.object({}),
139
+ ),
140
+ });
141
+ rename();
58
142
  }
59
143
 
60
- async delete(keys: Key | Key[]): Promise<void> {
61
- await this.client.send(
62
- "/ontology/delete-group",
63
- { keys: array.toArray(keys) },
64
- deleteReqZ,
65
- z.object({}),
144
+ async delete(keys: Key | Key[], opts: query.WriteOptions = {}): Promise<void> {
145
+ const keysArr = array.toArray(keys);
146
+ const drop = () => this.store.delete(keysArr);
147
+ await query.optimistic({
148
+ rollbacks: [drop()],
149
+ onOptimistic: opts.onOptimistic,
150
+ commit: async () =>
151
+ await this.cfg.unary.send(
152
+ "/ontology/delete-group",
153
+ { keys: keysArr },
154
+ deleteReqZ,
155
+ z.object({}),
156
+ ),
157
+ });
158
+ drop();
159
+ }
160
+
161
+ private isCachedChild(parent: ontology.ID, key: Key): boolean {
162
+ return this.cfg.ontology.cache.relationships.has(
163
+ ontology.relationshipToString({
164
+ from: parent,
165
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
166
+ to: ontologyID(key),
167
+ }),
66
168
  );
67
169
  }
170
+
171
+ private requireOntology(): ontology.Client {
172
+ if (this.cfg.ontology == null)
173
+ throw new Error("ontology client is not available on this client");
174
+ return this.cfg.ontology;
175
+ }
176
+
177
+ private async execRetrieveKeys(keys: Key[]): Promise<Group[]> {
178
+ const res = await this.requireOntology().retrieve({
179
+ ids: keys.map((key) => ontologyID(key)),
180
+ });
181
+ return res.map((r) => zod.parse(groupZ, r.data, { label: "group" }));
182
+ }
183
+
184
+ private async fetchChildren(req: ChildrenRequest): Promise<Group[]> {
185
+ const { parent, ...options } = req;
186
+ const res = await this.requireOntology().children.retrieve({
187
+ ids: parent,
188
+ ...options,
189
+ types: ["group"],
190
+ });
191
+ const groups = res.map((r) => zod.parse(groupZ, r.data, { label: "group" }));
192
+ const rels = this.cfg.ontology.cache.relationships;
193
+ groups.forEach((g) => {
194
+ const rel: ontology.Relationship = {
195
+ from: parent,
196
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
197
+ to: ontologyID(g.key),
198
+ };
199
+ rels.set(ontology.relationshipToString(rel), rel);
200
+ });
201
+ return groups;
202
+ }
68
203
  }