@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
@@ -12,8 +12,12 @@ import {
12
12
  array,
13
13
  color,
14
14
  type CrudeTimeRange,
15
+ deep,
16
+ type destructor,
17
+ primitive,
15
18
  type Series,
16
19
  TimeRange,
20
+ zod,
17
21
  } from "@synnaxlabs/x";
18
22
  import { z } from "zod";
19
23
 
@@ -21,9 +25,12 @@ import { type channel } from "@/channel";
21
25
  import { QueryError } from "@/errors";
22
26
  import { type framer } from "@/framer";
23
27
  import { label } from "@/label";
24
- import { type ontology } from "@/ontology";
25
- import { type Client as AliasClient } from "@/ranger/alias/client";
26
- import { type Client as KVClient } from "@/ranger/kv/client";
28
+ import { ontology } from "@/ontology";
29
+ import { query } from "@/query";
30
+ import { alias } from "@/ranger/alias";
31
+ import { Client as AliasClient } from "@/ranger/alias/client";
32
+ import { kv } from "@/ranger/kv";
33
+ import { Client as KVClient } from "@/ranger/kv/client";
27
34
  import { type Name, type Params } from "@/ranger/payload";
28
35
  import {
29
36
  type Key,
@@ -33,22 +40,94 @@ import {
33
40
  type Payload,
34
41
  payloadZ,
35
42
  } from "@/ranger/types.gen";
36
- import { type CreateOptions, type Writer } from "@/ranger/writer";
43
+ import { Writer } from "@/ranger/writer";
37
44
  import { checkForMultipleOrNoResults } from "@/util/retrieve";
38
45
 
39
46
  export const SET_CHANNEL_NAME = "sy_range_set";
40
47
  export const DELETE_CHANNEL_NAME = "sy_range_delete";
41
48
 
49
+ const kvDeleteZ = z
50
+ .string()
51
+ .transform((val) => val.split("<--->"))
52
+ .transform(([range, key]) => ({ key, range }));
53
+
54
+ const aliasDeleteZ = z.string().transform((val) => alias.decodeDeleteChange(val));
55
+
56
+ interface Stores {
57
+ ranges: query.Table<Key, Range>;
58
+ kvPairs: query.Table<string, kv.Pair>;
59
+ aliases: query.Table<string, alias.Alias>;
60
+ }
61
+
62
+ /** Creates the range, range KV, and range alias tables on the given cache. */
63
+ const createTables = (
64
+ cache: query.Cache,
65
+ sugarOne: (payload: Payload) => Range,
66
+ relationships: query.Table<string, ontology.Relationship>,
67
+ fetch: (keys: Key[]) => Promise<Range[]>,
68
+ backfill: (rel: ontology.Relationship) => Promise<void>,
69
+ ): Stores => {
70
+ const ranges = cache.createTable<Key, Range>({
71
+ name: "ranges",
72
+ equal: (a, b) => deep.equal(a.payload, b.payload),
73
+ fetch,
74
+ listen: [
75
+ // Labels and parents are composed from the relationship tables on read, so the
76
+ // event only carries the base payload; enriched fields are preserved.
77
+ query.createSetListener(SET_CHANNEL_NAME, payloadZ, {
78
+ value: (changed, prev) =>
79
+ sugarOne({ ...changed, labels: prev?.labels, parent: prev?.parent }),
80
+ }),
81
+ query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
82
+ ],
83
+ });
84
+
85
+ // Fetches missing relationship targets so compositions and membership
86
+ // checks can see them.
87
+ relationships.subscribe((event) => {
88
+ if (event.variant === "set") backfill(event.value).catch(cache.onError);
89
+ });
90
+
91
+ const kvPairs = cache.createTable<string, kv.Pair>({
92
+ name: "range_kv",
93
+ listen: [
94
+ query.createSetListener(kv.SET_CHANNEL_NAME, kv.pairZ, {
95
+ key: (changed) => kv.createPairKey(changed),
96
+ }),
97
+ query.createDeleteListener(kv.DELETE_CHANNEL_NAME, kvDeleteZ, {
98
+ key: (changed) => kv.createPairKey(changed),
99
+ }),
100
+ ],
101
+ });
102
+
103
+ const aliases = cache.createTable<string, alias.Alias>({
104
+ name: "range_aliases",
105
+ listen: [
106
+ query.createSetListener(alias.SET_CHANNEL_NAME, alias.aliasZ, {
107
+ key: (changed) => alias.createKey(changed),
108
+ }),
109
+ query.createDeleteListener(alias.DELETE_CHANNEL_NAME, aliasDeleteZ, {
110
+ key: (changed) => alias.createKey(changed),
111
+ }),
112
+ ],
113
+ });
114
+ return { ranges, kvPairs, aliases };
115
+ };
116
+
42
117
  interface RangeConstructionOptions {
43
118
  frameClient: framer.Client;
44
119
  kv: KVClient;
45
120
  aliaser: AliasClient;
46
- channels: channel.Retriever;
121
+ channels: framer.ChannelRetriever;
47
122
  labelClient: label.Client;
48
123
  ontologyClient: ontology.Client;
49
124
  rangeClient: Client;
50
125
  }
51
126
 
127
+ /**
128
+ * A named window of time, with the labels, metadata, and channel aliases attached to
129
+ * it. Its `read` and `kv` members scope those operations to its own time range.
130
+ */
52
131
  export class Range {
53
132
  key: string;
54
133
  name: string;
@@ -57,7 +136,7 @@ export class Range {
57
136
  readonly color?: color.Color;
58
137
  readonly parent?: Payload;
59
138
  readonly labels?: label.Label[];
60
- readonly channels: channel.Retriever;
139
+ readonly channels: framer.ChannelRetriever;
61
140
  private readonly aliaser: AliasClient;
62
141
  private readonly frameClient: framer.Client;
63
142
  private readonly labelClient: label.Client;
@@ -110,13 +189,13 @@ export class Range {
110
189
  }
111
190
 
112
191
  async setAlias(channel: channel.Key | Name, alias: string): Promise<void> {
113
- const ch = await this.channels.retrieve(channel);
192
+ const ch = await this.channels(channel);
114
193
  if (ch.length === 0) throw new QueryError(`Channel ${channel} does not exist`);
115
- await this.aliaser.set({ [ch[0].key]: alias });
194
+ await this.rangeClient.setAlias(this.key, ch[0].key, alias);
116
195
  }
117
196
 
118
197
  async deleteAlias(...channels: channel.Key[]): Promise<void> {
119
- await this.aliaser.delete(channels);
198
+ await this.rangeClient.deleteAlias(this.key, channels);
120
199
  }
121
200
 
122
201
  async listAliases(): Promise<Record<channel.Key, string>> {
@@ -133,7 +212,8 @@ export class Range {
133
212
 
134
213
  async retrieveChildren(): Promise<Range[]> {
135
214
  const res = (
136
- await this.ontologyClient.retrieveChildren(this.ontologyID, {
215
+ await this.ontologyClient.children.retrieve({
216
+ ids: this.ontologyID,
137
217
  excludeFieldData: true,
138
218
  types: ["range"],
139
219
  })
@@ -174,11 +254,13 @@ const retrieveRequestZ = z.object({
174
254
  offset: z.int().optional(),
175
255
  includeLabels: z.boolean().optional(),
176
256
  includeParent: z.boolean().optional(),
257
+ ignoreNotFoundError: z.boolean().optional(),
177
258
  });
178
259
 
260
+ /** Everything a range retrieval can filter on. */
179
261
  export type RetrieveRequest = z.infer<typeof retrieveRequestZ>;
180
262
 
181
- const retrieveArgsZ = retrieveRequestZ
263
+ const retrieveParamsZ = retrieveRequestZ
182
264
  .or(keyZ.array().transform((keys) => ({ keys })))
183
265
  .or(keyZ.transform((key) => ({ keys: [key] })))
184
266
  .or(z.string().transform((name) => ({ names: [name] })))
@@ -190,86 +272,480 @@ const retrieveArgsZ = retrieveRequestZ
190
272
  )
191
273
  .or(TimeRange.z.transform((timeRange) => ({ overlapsWith: timeRange })));
192
274
 
193
- export type RetrieveArgs = z.input<typeof retrieveArgsZ>;
275
+ /** Params for a range retrieval. A bare key, name, or time range is shorthand. */
276
+ export type RetrieveParams = z.input<typeof retrieveParamsZ>;
277
+
278
+ /** Canonicalizes every retrieve shape addressing more than one range. */
279
+ const retrieveMultiParamsZ = retrieveRequestZ
280
+ .or(keyZ.array().transform((keys) => ({ keys })))
281
+ .or(
282
+ z
283
+ .string()
284
+ .array()
285
+ .transform((names) => ({ names })),
286
+ )
287
+ .or(TimeRange.z.transform((timeRange) => ({ overlapsWith: timeRange })));
288
+
289
+ const retrieveResZ = z.object({ ranges: payloadZ.array().default(() => []) });
290
+
291
+ /** The base flags applied to every composed range fetch. */
292
+ const BASE_REQUEST: Partial<RetrieveRequest> = {
293
+ includeLabels: true,
294
+ includeParent: true,
295
+ };
296
+
297
+ const isKeysOnly = (req: RetrieveRequest): req is RetrieveRequest & { keys: Key[] } =>
298
+ primitive.isNonZero(req.keys) &&
299
+ req.names == null &&
300
+ req.searchTerm == null &&
301
+ req.overlapsWith == null &&
302
+ req.hasLabels == null &&
303
+ req.limit == null &&
304
+ req.offset == null;
305
+
306
+ const isParentChange = (rel: ontology.Relationship, id: ontology.ID): boolean =>
307
+ ontology.matchRelationship(rel, {
308
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
309
+ to: id,
310
+ });
311
+
312
+ const relOfEvent = (
313
+ event: query.TableEvent<string, ontology.Relationship>,
314
+ ): ontology.Relationship =>
315
+ event.variant === "set"
316
+ ? event.value
317
+ : zod.parse(ontology.relationshipZ, event.key, { label: "ontology relationship" });
318
+
319
+ /** Range keys whose composed labels or parent the relationship affects. */
320
+ const affectedRangeKeys = (rel: ontology.Relationship): Key[] | null => {
321
+ const keys: Key[] = [];
322
+ const labeled = ontology.matchRelationship(rel, {
323
+ type: label.LABELED_BY_ONTOLOGY_RELATIONSHIP_TYPE,
324
+ from: { type: "range" },
325
+ });
326
+ if (labeled) keys.push(rel.from.key);
327
+ const parented = ontology.matchRelationship(rel, {
328
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
329
+ to: { type: "range" },
330
+ });
331
+ if (parented) keys.push(rel.to.key);
332
+ return keys.length === 0 ? null : keys;
333
+ };
334
+
335
+ /** Projects relationship events onto the range keys they affect. */
336
+ const watchRelationships = <Q extends query.Params>(
337
+ relationships: query.Table<string, ontology.Relationship>,
338
+ ): query.Watch<Q, Key> =>
339
+ query.watch<Q, Key, string, ontology.Relationship>(relationships, (event) =>
340
+ affectedRangeKeys(relOfEvent(event)),
341
+ );
342
+
343
+ const rangesWithLabel = (
344
+ relationships: query.Table<string, ontology.Relationship>,
345
+ key: label.Key,
346
+ ): Key[] | null => {
347
+ const keys = relationships
348
+ .get(
349
+ (r) =>
350
+ r.type === label.LABELED_BY_ONTOLOGY_RELATIONSHIP_TYPE &&
351
+ r.from.type === "range" &&
352
+ r.to.key === key,
353
+ )
354
+ .map((r) => r.from.key);
355
+ return keys.length === 0 ? null : keys;
356
+ };
194
357
 
195
- const retrieveResZ = z.object({ ranges: array.nullishToEmpty(payloadZ) });
358
+ /** Projects label content changes onto the ranges they label. */
359
+ const watchLabels = <Q extends query.Params>(
360
+ labels: query.Table<label.Key, label.Label>,
361
+ relationships: query.Table<string, ontology.Relationship>,
362
+ ): query.Watch<Q, Key> =>
363
+ query.watch<Q, Key, label.Key, label.Label>(labels, (event) =>
364
+ rangesWithLabel(relationships, event.key),
365
+ );
366
+
367
+ /** Config for {@link Client}. */
368
+ export interface ClientConfig {
369
+ framer: framer.Client;
370
+ unary: UnaryClient;
371
+ channels: framer.ChannelRetriever;
372
+ labels: label.Client;
373
+ ontology: ontology.Client;
374
+ cache: query.Cache;
375
+ }
196
376
 
197
- export class Client {
377
+ /**
378
+ * Creates, reads, and deletes ranges on a Core. Reach it through `client.ranges`. Reads
379
+ * return sugared {@link Range}s, served from a cache a change stream keeps current.
380
+ */
381
+ export class Client extends query.Retriever<
382
+ typeof retrieveMultiParamsZ,
383
+ Key,
384
+ Range,
385
+ Range,
386
+ Key | Name
387
+ > {
198
388
  readonly type: string = "range";
199
- private readonly frameClient: framer.Client;
389
+ /** The range alias table; injected into sibling clients at wiring. */
390
+ readonly aliases: query.Table<string, alias.Alias>;
391
+ /** Cached queries for the children of a range, keyed by the parent's key. */
392
+ readonly children: query.Retrieves<Key, Range[]>;
393
+ /**
394
+ * Cached queries for the closest range parent of a resource, keyed by the
395
+ * child's ontology ID.
396
+ */
397
+ readonly parent: query.Retrieves<ontology.ID, Range | null>;
398
+ /** Cached queries for a range's KV metadata pairs, keyed by the range's key. */
399
+ readonly kv: query.Retrieves<Key, kv.Pair[]>;
400
+ private readonly cfg: ClientConfig;
200
401
  private readonly writer: Writer;
201
- private readonly unaryClient: UnaryClient;
202
- private readonly channels: channel.Retriever;
203
- private readonly labelClient: label.Client;
204
- private readonly ontologyClient: ontology.Client;
205
- private readonly createAliasClient: (key: Key) => AliasClient;
206
- private readonly createKVClient: (key: Key) => KVClient;
207
-
208
- constructor(
209
- frameClient: framer.Client,
210
- writer: Writer,
211
- unary: UnaryClient,
212
- channels: channel.Retriever,
213
- labelClient: label.Client,
214
- ontologyClient: ontology.Client,
215
- createAliasClient: (key: Key) => AliasClient,
216
- createKVClient: (key: Key) => KVClient,
217
- ) {
218
- this.frameClient = frameClient;
219
- this.writer = writer;
220
- this.unaryClient = unary;
221
- this.channels = channels;
222
- this.labelClient = labelClient;
223
- this.ontologyClient = ontologyClient;
224
- this.createAliasClient = createAliasClient;
225
- this.createKVClient = createKVClient;
402
+ private readonly store: query.Table<Key, Range>;
403
+ private readonly kvPairs: query.Table<string, kv.Pair>;
404
+
405
+ constructor(cfg: ClientConfig) {
406
+ const { labels: labelClient, ontology: ontologyClient, cache } = cfg;
407
+ const labels = labelClient.store;
408
+ const { relationships } = ontologyClient.cache;
409
+ const { ranges, kvPairs, aliases } = createTables(
410
+ cache,
411
+ (payload) => this.sugarOne(payload),
412
+ relationships,
413
+ async (keys) => await this.fetchThrough(keys),
414
+ async (rel) => await this.ensureRelationshipTargets(rel),
415
+ );
416
+ const composed = cache.derive<Key, Range, Range>({
417
+ name: "range.composed",
418
+ source: ranges,
419
+ compose: (record) => this.composeOne(record),
420
+ equal: (a, b) => deep.equal(a.payload, b.payload),
421
+ watch: [
422
+ query.deriveWatch(relationships, (event) =>
423
+ affectedRangeKeys(relOfEvent(event)),
424
+ ),
425
+ query.deriveWatch(labels, (event) => rangesWithLabel(relationships, event.key)),
426
+ ],
427
+ });
428
+ const single = cache.queries<Key | Name, Range, Key, Range>({
429
+ name: "range",
430
+ table: composed,
431
+ fetch: async (query) => [(await this.fetchSingle(query)).key],
432
+ compose: ([record]) => record,
433
+ keyOf: (query) => (keyZ.safeParse(query).success ? query : null),
434
+ matches: (r, query) => r.key === query || r.name === query,
435
+ single: true,
436
+ });
437
+ super(cache, {
438
+ name: "range",
439
+ table: ranges,
440
+ request: {
441
+ schema: retrieveMultiParamsZ,
442
+ fetch: async (query) => await this.fetchRequest(query),
443
+ matches: (r, query) => this.requestMatches(r, query),
444
+ watch: [
445
+ watchRelationships<RetrieveRequest>(relationships),
446
+ watchLabels<RetrieveRequest>(labels, relationships),
447
+ ],
448
+ },
449
+ compose: (r) => this.composeOne(r),
450
+ single: { schema: z.string(), space: single },
451
+ });
452
+ this.cfg = cfg;
453
+ this.writer = new Writer(cfg.unary);
454
+ this.store = ranges;
455
+ this.kvPairs = kvPairs;
456
+ this.aliases = aliases;
457
+ this.children = cache.queries<Key, Range[], Key, Range>({
458
+ name: "child ranges",
459
+ table: composed,
460
+ fetch: async (query) => (await this.fetchChildren(query)).map((r) => r.key),
461
+ compose: (records) => records,
462
+ matches: (r, query) => {
463
+ const parent = this.cfg.ontology.cache.parentID(ontologyID(r.key));
464
+ return parent != null && ontology.idsEqual(parent, ontologyID(query));
465
+ },
466
+ watch: [watchRelationships<Key>(this.cfg.ontology.cache.relationships)],
467
+ });
468
+ this.parent = cache.queries<ontology.ID, Range | null, Key, Range>({
469
+ name: "parent range",
470
+ table: composed,
471
+ fetch: async (query) => {
472
+ const range = await this.fetchParent(query);
473
+ return range == null ? [] : [range.key];
474
+ },
475
+ compose: (records) => records[0] ?? null,
476
+ matches: (r, query) => {
477
+ const parent = this.cfg.ontology.cache.parentID(query);
478
+ return parent != null && parent.type === "range" && parent.key === r.key;
479
+ },
480
+ watch: [
481
+ query.watch<ontology.ID, Key, string, ontology.Relationship>(
482
+ this.cfg.ontology.cache.relationships,
483
+ (event, query) => {
484
+ const rel = relOfEvent(event);
485
+ if (isParentChange(rel, query))
486
+ return rel.from.type === "range" ? [rel.from.key] : "refetch";
487
+ return affectedRangeKeys(rel);
488
+ },
489
+ ),
490
+ ],
491
+ });
492
+ this.kv = cache.queries<Key, kv.Pair[], string, kv.Pair>({
493
+ name: "range metadata",
494
+ table: this.kvPairs,
495
+ fetch: async (query) =>
496
+ (await this.fetchKV(query)).map((p) => kv.createPairKey(p)),
497
+ compose: (records) => records,
498
+ matches: (pair, query) => pair.range === query,
499
+ });
226
500
  }
227
501
 
228
- async create(range: New, options?: CreateOptions): Promise<Range>;
229
- async create(ranges: New[], options?: CreateOptions): Promise<Range[]>;
230
- async create(ranges: New | New[], options?: CreateOptions): Promise<Range | Range[]> {
502
+ async create(range: New): Promise<Range>;
503
+ async create(ranges: New[]): Promise<Range[]>;
504
+ async create(ranges: New | New[]): Promise<Range | Range[]> {
231
505
  const single = !Array.isArray(ranges);
232
- const res = this.sugarMany(
233
- await this.writer.create(array.toArray(ranges), options),
234
- );
506
+ const news = array.toArray(ranges);
507
+ const res = this.sugarMany(await this.writer.create(news));
508
+ res.forEach((r, i) => {
509
+ this.writeThrough(r);
510
+ const parent = news[i]?.parent;
511
+ if (r.parent != null || parent == null) return;
512
+ const rel: ontology.Relationship = {
513
+ from: ontologyID(parent.key),
514
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
515
+ to: ontologyID(r.key),
516
+ };
517
+ this.cfg.ontology.cache.relationships.set(
518
+ ontology.relationshipToString(rel),
519
+ rel,
520
+ );
521
+ });
235
522
  return single ? res[0] : res;
236
523
  }
237
524
 
238
- async rename(key: Key, name: Name): Promise<void> {
239
- await this.writer.rename(key, name);
525
+ async rename(key: Key, name: Name, opts: query.WriteOptions = {}): Promise<void> {
526
+ const rename = () => [
527
+ this.store.set(key, (p) =>
528
+ p == null ? undefined : this.sugarOne({ ...p.payload, name }),
529
+ ),
530
+ this.cfg.ontology.cache.renameResource(ontologyID(key), name),
531
+ ];
532
+ await query.optimistic({
533
+ rollbacks: rename(),
534
+ onOptimistic: opts.onOptimistic,
535
+ commit: async () => await this.writer.rename(key, name),
536
+ });
537
+ rename();
240
538
  }
241
539
 
242
- async delete(key: Key | Key[]): Promise<void> {
243
- await this.writer.delete(array.toArray(key));
540
+ async delete(key: Key | Key[], opts: query.WriteOptions = {}): Promise<void> {
541
+ const keys = array.toArray(key);
542
+ const drop = () => [
543
+ this.cfg.ontology.cache.deleteRelationships(ontologyID(keys)),
544
+ this.store.delete(keys),
545
+ ];
546
+ await query.optimistic({
547
+ rollbacks: drop(),
548
+ onOptimistic: opts.onOptimistic,
549
+ commit: async () => await this.writer.delete(keys),
550
+ });
551
+ drop();
244
552
  }
245
553
 
246
554
  async retrieve(params: Key | Name): Promise<Range>;
247
555
  async retrieve(params: Key[] | Name[]): Promise<Range[]>;
248
556
  async retrieve(params: CrudeTimeRange): Promise<Range[]>;
249
557
  async retrieve(params: RetrieveRequest): Promise<Range[]>;
250
- async retrieve(params: RetrieveArgs): Promise<Range | Range[]> {
251
- const isSingle = typeof params === "string";
252
- const { ranges } = await this.unaryClient.send(
558
+ async retrieve(params: RetrieveParams): Promise<Range | Range[]> {
559
+ // The branches narrow params onto different base overloads.
560
+ if (typeof params === "string") return await super.retrieve(params);
561
+ return await super.retrieve(params);
562
+ }
563
+
564
+ private async execRetrieve(params: RetrieveParams): Promise<Range[]> {
565
+ const { ranges } = await this.cfg.unary.send(
253
566
  "/range/retrieve",
254
567
  params,
255
- retrieveArgsZ,
568
+ retrieveParamsZ,
256
569
  retrieveResZ,
257
570
  );
258
- checkForMultipleOrNoResults("Range", params, ranges, isSingle);
259
- if (isSingle) return this.sugarMany(ranges)[0];
260
571
  return this.sugarMany(ranges);
261
572
  }
262
573
 
574
+ /** Subscribes to every range set delivered to the cache. */
575
+ onSet(handler: (range: Range) => void): destructor.Destructor {
576
+ return this.store.subscribe((event) => {
577
+ if (event.variant === "set") handler(event.value);
578
+ });
579
+ }
580
+
581
+ /** Subscribes to every range delete delivered to the cache. */
582
+ onDelete(handler: (key: Key) => void): destructor.Destructor {
583
+ return this.store.subscribe((event) => {
584
+ if (event.variant === "delete") handler(event.key);
585
+ });
586
+ }
587
+
588
+ private createAliasClient(key: Key): AliasClient {
589
+ return new AliasClient(key, this.cfg.unary);
590
+ }
591
+
592
+ private createKVClient(key: Key): KVClient {
593
+ return new KVClient(key, this.cfg.unary, this.kvPairs);
594
+ }
595
+
596
+ /** Rebuilds a cached range with its cached labels and parent attached. */
597
+ private composeOne(cached: Range): Range {
598
+ const id = ontologyID(cached.key);
599
+ const labels = label.cachedLabelsOf(
600
+ this.cfg.ontology.cache.relationships,
601
+ this.cfg.labels.store,
602
+ id,
603
+ );
604
+ const next: Payload = { ...cached.payload, labels };
605
+ const parentID = this.cfg.ontology.cache.parentID(id);
606
+ if (parentID == null) delete next.parent;
607
+ else {
608
+ const parent = this.store.get(parentID.key);
609
+ if (parent != null) next.parent = parent.payload;
610
+ }
611
+ return this.sugarOne(next);
612
+ }
613
+
614
+ /** Writes a fetched range and its included labels/parent relationships. */
615
+ private writeThrough(range: Range): void {
616
+ this.store.set(range);
617
+ const id = ontologyID(range.key);
618
+ if (range.labels != null) {
619
+ this.cfg.labels.store.set(range.labels);
620
+ range.labels.forEach((l) => {
621
+ const rel: ontology.Relationship = {
622
+ from: id,
623
+ type: label.LABELED_BY_ONTOLOGY_RELATIONSHIP_TYPE,
624
+ to: label.ontologyID(l.key),
625
+ };
626
+ this.cfg.ontology.cache.relationships.set(
627
+ ontology.relationshipToString(rel),
628
+ rel,
629
+ );
630
+ });
631
+ }
632
+ if (range.parent != null) {
633
+ const rel: ontology.Relationship = {
634
+ from: ontologyID(range.parent.key),
635
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
636
+ to: id,
637
+ };
638
+ this.cfg.ontology.cache.relationships.set(
639
+ ontology.relationshipToString(rel),
640
+ rel,
641
+ );
642
+ }
643
+ }
644
+
645
+ /**
646
+ * Fetches the given keys with labels and parents included, writing them and
647
+ * their relationships through. Powers the table's fetch primitive.
648
+ */
649
+ private async fetchThrough(keys: Key[]): Promise<Range[]> {
650
+ const ranges = await this.execRetrieve({
651
+ ...BASE_REQUEST,
652
+ keys,
653
+ ignoreNotFoundError: true,
654
+ });
655
+ ranges.forEach((r) => this.writeThrough(r));
656
+ return ranges;
657
+ }
658
+
659
+ private async fetchSingle(query: Key | Name): Promise<Range> {
660
+ const cached = this.store.get(query);
661
+ if (cached != null) return this.composeOne(cached);
662
+ const req = keyZ.safeParse(query).success ? { keys: [query] } : { names: [query] };
663
+ const ranges = await this.execRetrieve({ ...BASE_REQUEST, ...req });
664
+ checkForMultipleOrNoResults("Range", query, ranges, true);
665
+ this.writeThrough(ranges[0]);
666
+ return ranges[0];
667
+ }
668
+
669
+ /**
670
+ * Fetches records a relationship points at that the cache is missing, so compositions
671
+ * and membership checks can include them. Presence guards make it idempotent.
672
+ */
673
+ private async ensureRelationshipTargets(rel: ontology.Relationship): Promise<void> {
674
+ if (rel.type === label.LABELED_BY_ONTOLOGY_RELATIONSHIP_TYPE) {
675
+ if (rel.to.type !== "label" || this.cfg.labels.store.has(rel.to.key)) return;
676
+ const fetched = await this.cfg.labels.retrieve(rel.to.key);
677
+ this.cfg.labels.store.set(rel.to.key, fetched);
678
+ return;
679
+ }
680
+ if (rel.type === ontology.PARENT_OF_RELATIONSHIP_TYPE) {
681
+ if (rel.from.type !== "range" || this.store.has(rel.from.key)) return;
682
+ await this.store.retrieve([rel.from.key]);
683
+ }
684
+ }
685
+
686
+ private async fetchRequest(query: RetrieveRequest): Promise<Range[]> {
687
+ if (isKeysOnly(query)) return await this.store.retrieve(query.keys);
688
+ const ranges = await this.execRetrieve({ ...BASE_REQUEST, ...query });
689
+ ranges.forEach((r) => this.writeThrough(r));
690
+ return ranges;
691
+ }
692
+
693
+ /** Exact client-side evaluation of a request against a cached range. */
694
+ private requestMatches(r: Range, req: RetrieveRequest): boolean {
695
+ if (primitive.isNonZero(req.keys) && !req.keys.includes(r.key)) return false;
696
+ if (primitive.isNonZero(req.names) && !req.names.includes(r.name)) return false;
697
+ if (
698
+ req.overlapsWith != null &&
699
+ !new TimeRange(req.overlapsWith).overlapsWith(r.timeRange)
700
+ )
701
+ return false;
702
+ if (primitive.isNonZero(req.hasLabels)) {
703
+ const labels = label.cachedLabelsOf(
704
+ this.cfg.ontology.cache.relationships,
705
+ this.cfg.labels.store,
706
+ ontologyID(r.key),
707
+ );
708
+ const wanted = new Set(req.hasLabels);
709
+ if (!labels.some((l) => wanted.has(l.key))) return false;
710
+ }
711
+ return true;
712
+ }
713
+
714
+ private async fetchChildren(query: Key): Promise<Range[]> {
715
+ const resources = await this.cfg.ontology.children.retrieve({
716
+ ids: ontologyID(query),
717
+ types: ["range"],
718
+ });
719
+ if (resources.length === 0) return [];
720
+ return await this.store.retrieve(resources.map(({ id: { key } }) => key));
721
+ }
722
+
723
+ private async fetchParent(query: ontology.ID): Promise<Range | null> {
724
+ const res = await this.cfg.ontology.parents.retrieve({ ids: query });
725
+ const parent = res.find(({ id: { type } }) => type === "range");
726
+ if (parent == null) return null;
727
+ const [range] = await this.store.retrieve([parent.id.key]);
728
+ return range ?? null;
729
+ }
730
+
731
+ private async fetchKV(query: Key): Promise<kv.Pair[]> {
732
+ const pairs = await this.createKVClient(query).list();
733
+ const result: kv.Pair[] = Object.entries(pairs).map(([key, value]) => ({
734
+ range: query,
735
+ key,
736
+ value,
737
+ }));
738
+ result.forEach((p) => this.kvPairs.set(kv.createPairKey(p), p));
739
+ return result;
740
+ }
741
+
263
742
  getKV(range: Key): KVClient {
264
743
  return this.createKVClient(range);
265
744
  }
266
745
 
746
+ /** Returns the parent of the given range, or null when it has none. */
267
747
  async retrieveParent(range: Key): Promise<Range | null> {
268
- const res = await this.ontologyClient.retrieveParents(ontologyID(range));
269
- if (res.length === 0) return null;
270
- const first = res[0];
271
- if (first.id.type !== "range") return null;
272
- return await this.retrieve(first.id.key);
748
+ return await this.parent.retrieve(ontologyID(range));
273
749
  }
274
750
 
275
751
  sugarOntologyResource(resource: ontology.Resource): Range {
@@ -292,22 +768,50 @@ export class Client {
292
768
  return await this.createAliasClient(range).list();
293
769
  }
294
770
 
295
- async setAlias(range: Key, channel: channel.Key, alias: string): Promise<void> {
296
- await this.createAliasClient(range).set({ [channel]: alias });
771
+ async setAlias(
772
+ range: Key,
773
+ channel: channel.Key,
774
+ aliasName: string,
775
+ opts: query.WriteOptions = {},
776
+ ): Promise<void> {
777
+ const entry: alias.Alias = { range, channel, alias: aliasName };
778
+ const set = () => [this.aliases.set(alias.createKey(entry), entry)];
779
+ await query.optimistic({
780
+ rollbacks: set(),
781
+ onOptimistic: opts.onOptimistic,
782
+ commit: async () =>
783
+ await this.createAliasClient(range).set({ [channel]: aliasName }),
784
+ });
785
+ set();
297
786
  }
298
787
 
299
- async deleteAlias(range: Key, channels: channel.Key | channel.Key[]): Promise<void> {
300
- await this.createAliasClient(range).delete(channels);
788
+ async deleteAlias(
789
+ range: Key,
790
+ channels: channel.Key | channel.Key[],
791
+ opts: query.WriteOptions = {},
792
+ ): Promise<void> {
793
+ const channelsArr = array.toArray(channels);
794
+ const drop = () => [
795
+ this.aliases.delete(
796
+ channelsArr.map((channel) => alias.createKey({ range, channel })),
797
+ ),
798
+ ];
799
+ await query.optimistic({
800
+ rollbacks: drop(),
801
+ onOptimistic: opts.onOptimistic,
802
+ commit: async () => await this.createAliasClient(range).delete(channelsArr),
803
+ });
804
+ drop();
301
805
  }
302
806
 
303
807
  sugarOne(payload: Payload): Range {
304
808
  return new Range(payload, {
305
- frameClient: this.frameClient,
809
+ frameClient: this.cfg.framer,
306
810
  kv: this.createKVClient(payload.key),
307
811
  aliaser: this.createAliasClient(payload.key),
308
- channels: this.channels,
309
- labelClient: this.labelClient,
310
- ontologyClient: this.ontologyClient,
812
+ channels: this.cfg.channels,
813
+ labelClient: this.cfg.labels,
814
+ ontologyClient: this.cfg.ontology,
311
815
  rangeClient: this,
312
816
  });
313
817
  }
@@ -321,17 +825,24 @@ export class Client {
321
825
  }
322
826
  }
323
827
 
828
+ /** @returns the ontology ID of a range's alias set. */
324
829
  export const aliasOntologyID = (key: Key): ontology.ID => ({
325
830
  type: "range-alias",
326
831
  key,
327
832
  });
328
833
 
834
+ /**
835
+ * Rebuilds a range payload from its ontology resource, for a search result that arrives
836
+ * through the ontology rather than the range endpoint.
837
+ */
329
838
  export const convertOntologyResourceToPayload = ({
330
839
  data,
331
840
  id: { key },
332
841
  name,
333
842
  }: ontology.Resource): Payload => {
334
- const timeRange = TimeRange.z.parse(data?.timeRange);
843
+ const timeRange = zod.parse(TimeRange.z, data?.timeRange, {
844
+ label: "range time range",
845
+ });
335
846
  const c = color.colorZ.safeParse(data?.color);
336
847
  return {
337
848
  key,