@synnaxlabs/client 0.56.1 → 0.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (741) hide show
  1. package/dist/client-B08VDLSA.js +14463 -0
  2. package/dist/client-B08VDLSA.js.map +1 -0
  3. package/dist/client.js +1128 -14876
  4. package/dist/client.js.map +1 -0
  5. package/dist/src/access/client.d.ts +10 -1
  6. package/dist/src/access/client.d.ts.map +1 -1
  7. package/dist/src/access/enforce.d.ts.map +1 -1
  8. package/dist/src/access/external.d.ts +1 -0
  9. package/dist/src/access/external.d.ts.map +1 -1
  10. package/dist/src/access/granted.d.ts +39 -0
  11. package/dist/src/access/granted.d.ts.map +1 -0
  12. package/dist/src/access/policy/client.d.ts +136 -147
  13. package/dist/src/access/policy/client.d.ts.map +1 -1
  14. package/dist/src/access/policy/types.gen.d.ts +15 -68
  15. package/dist/src/access/policy/types.gen.d.ts.map +1 -1
  16. package/dist/src/access/role/client.d.ts +77 -58
  17. package/dist/src/access/role/client.d.ts.map +1 -1
  18. package/dist/src/access/role/types.gen.d.ts +8 -14
  19. package/dist/src/access/role/types.gen.d.ts.map +1 -1
  20. package/dist/src/actions/actions.d.ts +5 -6
  21. package/dist/src/actions/actions.d.ts.map +1 -1
  22. package/dist/src/actions/controller.d.ts +194 -0
  23. package/dist/src/actions/controller.d.ts.map +1 -0
  24. package/dist/src/actions/external.d.ts +1 -0
  25. package/dist/src/actions/external.d.ts.map +1 -1
  26. package/dist/src/arc/actions.d.ts +575 -0
  27. package/dist/src/arc/actions.d.ts.map +1 -0
  28. package/dist/src/arc/actions.gen.d.ts +1439 -0
  29. package/dist/src/arc/actions.gen.d.ts.map +1 -0
  30. package/dist/src/arc/client.d.ts +97 -13
  31. package/dist/src/arc/client.d.ts.map +1 -1
  32. package/dist/src/arc/compiler/types.gen.d.ts +3 -3
  33. package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
  34. package/dist/src/arc/external.d.ts +2 -0
  35. package/dist/src/arc/external.d.ts.map +1 -1
  36. package/dist/src/arc/graph/types.gen.d.ts +45 -597
  37. package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
  38. package/dist/src/arc/ir/index.d.ts +1 -1
  39. package/dist/src/arc/ir/index.d.ts.map +1 -1
  40. package/dist/src/arc/ir/ir.d.ts +2 -0
  41. package/dist/src/arc/ir/ir.d.ts.map +1 -0
  42. package/dist/src/arc/ir/types.gen.d.ts +58 -2807
  43. package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
  44. package/dist/src/arc/module/types.gen.d.ts +18 -1090
  45. package/dist/src/arc/module/types.gen.d.ts.map +1 -1
  46. package/dist/src/arc/program/types.gen.d.ts +18 -1090
  47. package/dist/src/arc/program/types.gen.d.ts.map +1 -1
  48. package/dist/src/arc/text/types.gen.d.ts +54 -1
  49. package/dist/src/arc/text/types.gen.d.ts.map +1 -1
  50. package/dist/src/arc/types/types.gen.d.ts +35 -153
  51. package/dist/src/arc/types/types.gen.d.ts.map +1 -1
  52. package/dist/src/arc/types.gen.d.ts +98 -2278
  53. package/dist/src/arc/types.gen.d.ts.map +1 -1
  54. package/dist/src/auth/auth.d.ts +14 -2
  55. package/dist/src/auth/auth.d.ts.map +1 -1
  56. package/dist/src/channel/client.d.ts +113 -75
  57. package/dist/src/channel/client.d.ts.map +1 -1
  58. package/dist/src/channel/external.d.ts +0 -1
  59. package/dist/src/channel/external.d.ts.map +1 -1
  60. package/dist/src/channel/payload.d.ts +65 -56
  61. package/dist/src/channel/payload.d.ts.map +1 -1
  62. package/dist/src/channel/types.gen.d.ts +26 -73
  63. package/dist/src/channel/types.gen.d.ts.map +1 -1
  64. package/dist/src/channel/writer.d.ts +1 -3
  65. package/dist/src/channel/writer.d.ts.map +1 -1
  66. package/dist/src/client.d.ts +55 -27
  67. package/dist/src/client.d.ts.map +1 -1
  68. package/dist/src/connection/client.d.ts +146 -0
  69. package/dist/src/connection/client.d.ts.map +1 -0
  70. package/dist/src/connection/external.d.ts +3 -0
  71. package/dist/src/connection/external.d.ts.map +1 -0
  72. package/dist/src/connection/index.d.ts +1 -1
  73. package/dist/src/connection/index.d.ts.map +1 -1
  74. package/dist/src/connection/status.d.ts +252 -0
  75. package/dist/src/connection/status.d.ts.map +1 -0
  76. package/dist/src/control/client.d.ts +31 -7
  77. package/dist/src/control/client.d.ts.map +1 -1
  78. package/dist/src/control/state.d.ts +47 -16
  79. package/dist/src/control/state.d.ts.map +1 -1
  80. package/dist/src/device/client.d.ts +59 -17
  81. package/dist/src/device/client.d.ts.map +1 -1
  82. package/dist/src/device/types.gen.d.ts +17 -67
  83. package/dist/src/device/types.gen.d.ts.map +1 -1
  84. package/dist/src/errors.d.ts +17 -20
  85. package/dist/src/errors.d.ts.map +1 -1
  86. package/dist/src/ethercat/external.d.ts +2 -0
  87. package/dist/src/ethercat/external.d.ts.map +1 -0
  88. package/dist/src/ethercat/index.d.ts +2 -0
  89. package/dist/src/ethercat/index.d.ts.map +1 -0
  90. package/dist/src/ethercat/types.gen.d.ts +243 -0
  91. package/dist/src/ethercat/types.gen.d.ts.map +1 -0
  92. package/dist/src/framer/adapter.d.ts +8 -5
  93. package/dist/src/framer/adapter.d.ts.map +1 -1
  94. package/dist/src/framer/benchutil.d.ts +19 -0
  95. package/dist/src/framer/benchutil.d.ts.map +1 -0
  96. package/dist/src/framer/cache/cache.d.ts +38 -0
  97. package/dist/src/framer/cache/cache.d.ts.map +1 -0
  98. package/dist/src/framer/cache/dynamic.d.ts +71 -0
  99. package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
  100. package/dist/src/framer/cache/reader.d.ts +43 -0
  101. package/dist/src/framer/cache/reader.d.ts.map +1 -0
  102. package/dist/src/framer/cache/static.d.ts +66 -0
  103. package/dist/src/framer/cache/static.d.ts.map +1 -0
  104. package/dist/src/framer/cache/streamer.d.ts +86 -0
  105. package/dist/src/framer/cache/streamer.d.ts.map +1 -0
  106. package/dist/src/framer/cache/transform.d.ts +18 -0
  107. package/dist/src/framer/cache/transform.d.ts.map +1 -0
  108. package/dist/src/framer/cache/unary.d.ts +37 -0
  109. package/dist/src/framer/cache/unary.d.ts.map +1 -0
  110. package/dist/src/framer/client.d.ts +35 -14
  111. package/dist/src/framer/client.d.ts.map +1 -1
  112. package/dist/src/framer/codec.d.ts.map +1 -1
  113. package/dist/src/framer/deleter.d.ts +3 -2
  114. package/dist/src/framer/deleter.d.ts.map +1 -1
  115. package/dist/src/framer/external.d.ts +6 -0
  116. package/dist/src/framer/external.d.ts.map +1 -1
  117. package/dist/src/framer/feed.d.ts +40 -0
  118. package/dist/src/framer/feed.d.ts.map +1 -0
  119. package/dist/src/framer/frame.d.ts +16 -20
  120. package/dist/src/framer/frame.d.ts.map +1 -1
  121. package/dist/src/framer/hardened.d.ts +70 -0
  122. package/dist/src/framer/hardened.d.ts.map +1 -0
  123. package/dist/src/framer/iterator.d.ts +36 -43
  124. package/dist/src/framer/iterator.d.ts.map +1 -1
  125. package/dist/src/framer/reader.d.ts +3 -2
  126. package/dist/src/framer/reader.d.ts.map +1 -1
  127. package/dist/src/framer/streamer.d.ts +132 -205
  128. package/dist/src/framer/streamer.d.ts.map +1 -1
  129. package/dist/src/framer/writer.d.ts +130 -161
  130. package/dist/src/framer/writer.d.ts.map +1 -1
  131. package/dist/src/group/client.d.ts +66 -9
  132. package/dist/src/group/client.d.ts.map +1 -1
  133. package/dist/src/group/types.gen.d.ts +2 -2
  134. package/dist/src/http/external.d.ts +2 -0
  135. package/dist/src/http/external.d.ts.map +1 -0
  136. package/dist/src/http/index.d.ts +2 -0
  137. package/dist/src/http/index.d.ts.map +1 -0
  138. package/dist/src/http/types.gen.d.ts +451 -0
  139. package/dist/src/http/types.gen.d.ts.map +1 -0
  140. package/dist/src/imex/client.d.ts +88 -0
  141. package/dist/src/imex/client.d.ts.map +1 -0
  142. package/dist/src/imex/index.d.ts +2 -0
  143. package/dist/src/imex/index.d.ts.map +1 -0
  144. package/dist/src/index.d.ts +18 -5
  145. package/dist/src/index.d.ts.map +1 -1
  146. package/dist/src/label/client.d.ts +55 -36
  147. package/dist/src/label/client.d.ts.map +1 -1
  148. package/dist/src/label/external.d.ts +2 -0
  149. package/dist/src/label/external.d.ts.map +1 -1
  150. package/dist/src/label/payload.d.ts +4 -46
  151. package/dist/src/label/payload.d.ts.map +1 -1
  152. package/dist/src/label/store.d.ts +8 -0
  153. package/dist/src/label/store.d.ts.map +1 -0
  154. package/dist/src/label/types.gen.d.ts +45 -0
  155. package/dist/src/label/types.gen.d.ts.map +1 -0
  156. package/dist/src/labjack/external.d.ts +2 -0
  157. package/dist/src/labjack/external.d.ts.map +1 -0
  158. package/dist/src/labjack/index.d.ts +2 -0
  159. package/dist/src/labjack/index.d.ts.map +1 -0
  160. package/dist/src/labjack/types.gen.d.ts +442 -0
  161. package/dist/src/labjack/types.gen.d.ts.map +1 -0
  162. package/dist/src/lineplot/actions.d.ts +914 -0
  163. package/dist/src/lineplot/actions.d.ts.map +1 -0
  164. package/dist/src/lineplot/actions.gen.d.ts +4208 -0
  165. package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
  166. package/dist/src/lineplot/client.d.ts +66 -16
  167. package/dist/src/lineplot/client.d.ts.map +1 -1
  168. package/dist/src/lineplot/external.d.ts +3 -0
  169. package/dist/src/lineplot/external.d.ts.map +1 -1
  170. package/dist/src/lineplot/line.d.ts +16 -0
  171. package/dist/src/lineplot/line.d.ts.map +1 -0
  172. package/dist/src/lineplot/types.gen.d.ts +837 -14
  173. package/dist/src/lineplot/types.gen.d.ts.map +1 -1
  174. package/dist/src/log/actions.d.ts +271 -0
  175. package/dist/src/log/actions.d.ts.map +1 -0
  176. package/dist/src/log/actions.gen.d.ts +1529 -0
  177. package/dist/src/log/actions.gen.d.ts.map +1 -0
  178. package/dist/src/log/client.d.ts +66 -16
  179. package/dist/src/log/client.d.ts.map +1 -1
  180. package/dist/src/log/external.d.ts +2 -0
  181. package/dist/src/log/external.d.ts.map +1 -1
  182. package/dist/src/log/types.gen.d.ts +139 -14
  183. package/dist/src/log/types.gen.d.ts.map +1 -1
  184. package/dist/src/modbus/external.d.ts +2 -0
  185. package/dist/src/modbus/external.d.ts.map +1 -0
  186. package/dist/src/modbus/index.d.ts +2 -0
  187. package/dist/src/modbus/index.d.ts.map +1 -0
  188. package/dist/src/modbus/types.gen.d.ts +280 -0
  189. package/dist/src/modbus/types.gen.d.ts.map +1 -0
  190. package/dist/src/ni/external.d.ts +2 -0
  191. package/dist/src/ni/external.d.ts.map +1 -0
  192. package/dist/src/ni/index.d.ts +2 -0
  193. package/dist/src/ni/index.d.ts.map +1 -0
  194. package/dist/src/ni/types.gen.d.ts +21029 -0
  195. package/dist/src/ni/types.gen.d.ts.map +1 -0
  196. package/dist/src/node/index.d.ts +2 -0
  197. package/dist/src/node/index.d.ts.map +1 -0
  198. package/dist/src/node/types.gen.d.ts +4 -0
  199. package/dist/src/node/types.gen.d.ts.map +1 -0
  200. package/dist/src/ontology/client.d.ts +314 -67
  201. package/dist/src/ontology/client.d.ts.map +1 -1
  202. package/dist/src/ontology/external.d.ts +1 -0
  203. package/dist/src/ontology/external.d.ts.map +1 -1
  204. package/dist/src/ontology/payload.d.ts +60 -18
  205. package/dist/src/ontology/payload.d.ts.map +1 -1
  206. package/dist/src/ontology/store.d.ts +32 -0
  207. package/dist/src/ontology/store.d.ts.map +1 -0
  208. package/dist/src/ontology/types.gen.d.ts +3 -2
  209. package/dist/src/ontology/types.gen.d.ts.map +1 -1
  210. package/dist/src/ontology/writer.d.ts +16 -10
  211. package/dist/src/ontology/writer.d.ts.map +1 -1
  212. package/dist/src/opcua/external.d.ts +2 -0
  213. package/dist/src/opcua/external.d.ts.map +1 -0
  214. package/dist/src/opcua/index.d.ts +2 -0
  215. package/dist/src/opcua/index.d.ts.map +1 -0
  216. package/dist/src/opcua/types.gen.d.ts +82 -0
  217. package/dist/src/opcua/types.gen.d.ts.map +1 -0
  218. package/dist/src/pagerduty/external.d.ts +2 -0
  219. package/dist/src/pagerduty/external.d.ts.map +1 -0
  220. package/dist/src/pagerduty/index.d.ts +2 -0
  221. package/dist/src/pagerduty/index.d.ts.map +1 -0
  222. package/dist/src/pagerduty/types.gen.d.ts +30 -0
  223. package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
  224. package/dist/src/panel/actions.d.ts +273 -0
  225. package/dist/src/panel/actions.d.ts.map +1 -0
  226. package/dist/src/panel/actions.gen.d.ts +1255 -0
  227. package/dist/src/panel/actions.gen.d.ts.map +1 -0
  228. package/dist/src/panel/client.d.ts +148 -0
  229. package/dist/src/panel/client.d.ts.map +1 -0
  230. package/dist/src/panel/external.d.ts +6 -0
  231. package/dist/src/panel/external.d.ts.map +1 -0
  232. package/dist/src/panel/index.d.ts +2 -0
  233. package/dist/src/panel/index.d.ts.map +1 -0
  234. package/dist/src/panel/tree.d.ts +50 -0
  235. package/dist/src/panel/tree.d.ts.map +1 -0
  236. package/dist/src/panel/types.gen.d.ts +370 -0
  237. package/dist/src/panel/types.gen.d.ts.map +1 -0
  238. package/dist/src/project/client.d.ts +89 -0
  239. package/dist/src/project/client.d.ts.map +1 -0
  240. package/dist/src/project/external.d.ts.map +1 -0
  241. package/dist/src/project/index.d.ts +2 -0
  242. package/dist/src/project/index.d.ts.map +1 -0
  243. package/dist/src/project/types.gen.d.ts +27 -0
  244. package/dist/src/project/types.gen.d.ts.map +1 -0
  245. package/dist/src/query/cache.d.ts +132 -0
  246. package/dist/src/query/cache.d.ts.map +1 -0
  247. package/dist/src/query/deleted.d.ts +20 -0
  248. package/dist/src/query/deleted.d.ts.map +1 -0
  249. package/dist/src/query/derived.d.ts +33 -0
  250. package/dist/src/query/derived.d.ts.map +1 -0
  251. package/dist/src/query/external.d.ts +10 -0
  252. package/dist/src/query/external.d.ts.map +1 -0
  253. package/dist/src/query/index.d.ts +2 -0
  254. package/dist/src/query/index.d.ts.map +1 -0
  255. package/dist/src/query/query.d.ts +235 -0
  256. package/dist/src/query/query.d.ts.map +1 -0
  257. package/dist/src/query/retriever.d.ts +135 -0
  258. package/dist/src/query/retriever.d.ts.map +1 -0
  259. package/dist/src/query/streamer.d.ts +67 -0
  260. package/dist/src/query/streamer.d.ts.map +1 -0
  261. package/dist/src/query/table.d.ts +219 -0
  262. package/dist/src/query/table.d.ts.map +1 -0
  263. package/dist/src/query/types.d.ts +35 -0
  264. package/dist/src/query/types.d.ts.map +1 -0
  265. package/dist/src/query/write.d.ts +21 -0
  266. package/dist/src/query/write.d.ts.map +1 -0
  267. package/dist/src/rack/client.d.ts +58 -20
  268. package/dist/src/rack/client.d.ts.map +1 -1
  269. package/dist/src/rack/types.gen.d.ts +11 -12
  270. package/dist/src/rack/types.gen.d.ts.map +1 -1
  271. package/dist/src/range/alias/types.gen.d.ts +2 -3
  272. package/dist/src/range/alias/types.gen.d.ts.map +1 -1
  273. package/dist/src/ranger/client.d.ts +138 -27
  274. package/dist/src/ranger/client.d.ts.map +1 -1
  275. package/dist/src/ranger/kv/client.d.ts +7 -4
  276. package/dist/src/ranger/kv/client.d.ts.map +1 -1
  277. package/dist/src/ranger/payload.d.ts +3 -0
  278. package/dist/src/ranger/payload.d.ts.map +1 -1
  279. package/dist/src/ranger/types.gen.d.ts +45 -101
  280. package/dist/src/ranger/types.gen.d.ts.map +1 -1
  281. package/dist/src/ranger/writer.d.ts +2 -74
  282. package/dist/src/ranger/writer.d.ts.map +1 -1
  283. package/dist/src/schematic/actions.d.ts +90 -33
  284. package/dist/src/schematic/actions.d.ts.map +1 -1
  285. package/dist/src/schematic/actions.gen.d.ts +207 -114
  286. package/dist/src/schematic/actions.gen.d.ts.map +1 -1
  287. package/dist/src/schematic/client.d.ts +70 -68
  288. package/dist/src/schematic/client.d.ts.map +1 -1
  289. package/dist/src/schematic/symbol/client.d.ts +133 -27
  290. package/dist/src/schematic/symbol/client.d.ts.map +1 -1
  291. package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
  292. package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
  293. package/dist/src/schematic/types.gen.d.ts +17 -96
  294. package/dist/src/schematic/types.gen.d.ts.map +1 -1
  295. package/dist/src/status/client.d.ts +69 -14
  296. package/dist/src/status/client.d.ts.map +1 -1
  297. package/dist/src/status/external.d.ts +2 -0
  298. package/dist/src/status/external.d.ts.map +1 -1
  299. package/dist/src/status/payload.d.ts +2 -36
  300. package/dist/src/status/payload.d.ts.map +1 -1
  301. package/dist/src/status/status.d.ts +65 -0
  302. package/dist/src/status/status.d.ts.map +1 -0
  303. package/dist/src/status/types.gen.d.ts +58 -0
  304. package/dist/src/status/types.gen.d.ts.map +1 -0
  305. package/dist/src/table/actions.d.ts +72 -13
  306. package/dist/src/table/actions.d.ts.map +1 -1
  307. package/dist/src/table/actions.gen.d.ts +221 -137
  308. package/dist/src/table/actions.gen.d.ts.map +1 -1
  309. package/dist/src/table/client.d.ts +64 -40
  310. package/dist/src/table/client.d.ts.map +1 -1
  311. package/dist/src/table/types.gen.d.ts +20 -55
  312. package/dist/src/table/types.gen.d.ts.map +1 -1
  313. package/dist/src/task/client.d.ts +149 -28
  314. package/dist/src/task/client.d.ts.map +1 -1
  315. package/dist/src/task/types.gen.d.ts +71 -89
  316. package/dist/src/task/types.gen.d.ts.map +1 -1
  317. package/dist/src/testutil/access.d.ts +27 -1
  318. package/dist/src/testutil/access.d.ts.map +1 -1
  319. package/dist/src/testutil/channels.d.ts +2 -0
  320. package/dist/src/testutil/channels.d.ts.map +1 -1
  321. package/dist/src/testutil/client.d.ts +5 -0
  322. package/dist/src/testutil/client.d.ts.map +1 -1
  323. package/dist/src/testutil/connection.d.ts +10 -0
  324. package/dist/src/testutil/connection.d.ts.map +1 -0
  325. package/dist/src/testutil/index.d.ts +9 -0
  326. package/dist/src/testutil/index.d.ts.map +1 -0
  327. package/dist/src/testutil/panels.d.ts +8 -0
  328. package/dist/src/testutil/panels.d.ts.map +1 -0
  329. package/dist/src/testutil/proxy.d.ts +29 -0
  330. package/dist/src/testutil/proxy.d.ts.map +1 -0
  331. package/dist/src/testutil/query.d.ts +7 -0
  332. package/dist/src/testutil/query.d.ts.map +1 -0
  333. package/dist/src/testutil/telem.d.ts +4 -0
  334. package/dist/src/testutil/telem.d.ts.map +1 -1
  335. package/dist/src/transport.d.ts +10 -4
  336. package/dist/src/transport.d.ts.map +1 -1
  337. package/dist/src/user/client.d.ts +29 -28
  338. package/dist/src/user/client.d.ts.map +1 -1
  339. package/dist/src/user/external.d.ts +1 -1
  340. package/dist/src/user/external.d.ts.map +1 -1
  341. package/dist/src/user/types.gen.d.ts +4 -4
  342. package/dist/src/util/retrieve.d.ts +2 -2
  343. package/dist/src/util/retrieve.d.ts.map +1 -1
  344. package/dist/src/util/telem.d.ts.map +1 -1
  345. package/dist/src/view/client.d.ts +30 -14
  346. package/dist/src/view/client.d.ts.map +1 -1
  347. package/dist/src/view/types.gen.d.ts +7 -15
  348. package/dist/src/view/types.gen.d.ts.map +1 -1
  349. package/dist/testutil.js +189 -0
  350. package/dist/testutil.js.map +1 -0
  351. package/package.json +40 -17
  352. package/src/access/client.ts +14 -3
  353. package/src/access/enforce.ts +0 -3
  354. package/src/access/external.ts +1 -0
  355. package/src/access/granted.ts +114 -0
  356. package/src/access/policy/client.ts +135 -43
  357. package/src/access/policy/types.gen.ts +9 -11
  358. package/src/access/role/client.ts +160 -38
  359. package/src/access/role/types.gen.ts +8 -12
  360. package/src/actions/actions.ts +5 -6
  361. package/src/actions/controller.ts +626 -0
  362. package/src/actions/external.ts +11 -0
  363. package/src/arc/actions.gen.ts +313 -0
  364. package/src/arc/actions.ts +192 -0
  365. package/src/arc/client.ts +424 -41
  366. package/src/arc/compiler/types.gen.ts +5 -6
  367. package/src/arc/external.ts +2 -0
  368. package/src/arc/graph/types.gen.ts +24 -22
  369. package/src/arc/ir/index.ts +1 -1
  370. package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
  371. package/src/arc/ir/types.gen.ts +42 -41
  372. package/src/arc/text/types.gen.ts +21 -2
  373. package/src/arc/types/types.gen.ts +40 -32
  374. package/src/arc/types.gen.ts +31 -29
  375. package/src/auth/auth.ts +40 -8
  376. package/src/channel/client.ts +529 -132
  377. package/src/channel/external.ts +0 -1
  378. package/src/channel/payload.ts +30 -3
  379. package/src/channel/types.gen.ts +37 -48
  380. package/src/channel/writer.ts +2 -11
  381. package/src/client.ts +215 -91
  382. package/src/connection/client.ts +495 -0
  383. package/src/connection/external.ts +34 -0
  384. package/src/connection/index.ts +1 -1
  385. package/src/connection/status.ts +442 -0
  386. package/src/control/client.ts +84 -12
  387. package/src/control/state.ts +17 -36
  388. package/src/device/client.ts +293 -41
  389. package/src/device/types.gen.ts +15 -26
  390. package/src/errors.ts +45 -22
  391. package/src/{workspace → ethercat}/external.ts +1 -2
  392. package/src/{workspace → ethercat}/index.ts +1 -1
  393. package/src/ethercat/types.gen.ts +151 -0
  394. package/src/framer/adapter.ts +60 -37
  395. package/src/framer/benchutil.ts +67 -0
  396. package/src/framer/cache/cache.ts +115 -0
  397. package/src/framer/cache/dynamic.ts +279 -0
  398. package/src/framer/cache/reader.ts +160 -0
  399. package/src/framer/cache/static.ts +215 -0
  400. package/src/framer/cache/streamer.ts +391 -0
  401. package/src/framer/cache/transform.ts +31 -0
  402. package/src/framer/cache/unary.ts +104 -0
  403. package/src/framer/client.ts +71 -43
  404. package/src/framer/codec.ts +55 -18
  405. package/src/framer/deleter.ts +4 -6
  406. package/src/framer/external.ts +10 -0
  407. package/src/framer/feed.ts +108 -0
  408. package/src/framer/frame.ts +13 -23
  409. package/src/framer/hardened.ts +283 -0
  410. package/src/framer/iterator.ts +31 -42
  411. package/src/framer/reader.ts +11 -11
  412. package/src/framer/streamer.ts +18 -178
  413. package/src/framer/writer.ts +39 -59
  414. package/src/group/client.ts +158 -23
  415. package/src/http/external.ts +10 -0
  416. package/src/{cluster → http}/index.ts +1 -1
  417. package/src/http/types.gen.ts +245 -0
  418. package/src/imex/client.ts +125 -0
  419. package/src/imex/index.ts +10 -0
  420. package/src/index.ts +18 -6
  421. package/src/label/client.ts +193 -54
  422. package/src/label/external.ts +2 -0
  423. package/src/label/payload.ts +4 -9
  424. package/src/label/store.ts +28 -0
  425. package/src/label/types.gen.ts +31 -0
  426. package/src/labjack/external.ts +10 -0
  427. package/src/labjack/index.ts +10 -0
  428. package/src/labjack/types.gen.ts +251 -0
  429. package/src/lineplot/actions.gen.ts +880 -0
  430. package/src/lineplot/actions.ts +535 -0
  431. package/src/lineplot/client.ts +224 -52
  432. package/src/lineplot/external.ts +3 -0
  433. package/src/lineplot/line.ts +80 -0
  434. package/src/lineplot/types.gen.ts +225 -12
  435. package/src/log/actions.gen.ts +474 -0
  436. package/src/log/actions.ts +242 -0
  437. package/src/log/client.ts +223 -52
  438. package/src/log/external.ts +2 -0
  439. package/src/log/types.gen.ts +45 -14
  440. package/src/modbus/external.ts +10 -0
  441. package/src/modbus/index.ts +10 -0
  442. package/src/modbus/types.gen.ts +185 -0
  443. package/src/ni/external.ts +10 -0
  444. package/src/ni/index.ts +10 -0
  445. package/src/ni/types.gen.ts +1632 -0
  446. package/src/node/index.ts +10 -0
  447. package/src/{cluster → node}/types.gen.ts +2 -2
  448. package/src/ontology/client.ts +408 -99
  449. package/src/ontology/external.ts +7 -0
  450. package/src/ontology/payload.ts +48 -7
  451. package/src/ontology/store.ts +83 -0
  452. package/src/ontology/types.gen.ts +2 -1
  453. package/src/ontology/writer.ts +1 -0
  454. package/src/opcua/external.ts +10 -0
  455. package/src/opcua/index.ts +10 -0
  456. package/src/opcua/types.gen.ts +65 -0
  457. package/src/pagerduty/external.ts +10 -0
  458. package/src/pagerduty/index.ts +10 -0
  459. package/src/pagerduty/types.gen.ts +41 -0
  460. package/src/panel/actions.gen.ts +267 -0
  461. package/src/panel/actions.ts +357 -0
  462. package/src/panel/client.ts +327 -0
  463. package/src/panel/external.ts +14 -0
  464. package/src/panel/index.ts +10 -0
  465. package/src/panel/tree.ts +163 -0
  466. package/src/panel/types.gen.ts +164 -0
  467. package/src/project/client.ts +273 -0
  468. package/src/project/external.ts +11 -0
  469. package/src/project/index.ts +10 -0
  470. package/src/project/types.gen.ts +40 -0
  471. package/src/query/cache.ts +326 -0
  472. package/src/query/deleted.ts +38 -0
  473. package/src/query/derived.ts +101 -0
  474. package/src/query/external.ts +51 -0
  475. package/src/query/index.ts +10 -0
  476. package/src/query/query.ts +865 -0
  477. package/src/query/retriever.ts +308 -0
  478. package/src/query/streamer.ts +207 -0
  479. package/src/query/table.ts +625 -0
  480. package/src/query/types.ts +54 -0
  481. package/src/query/write.ts +42 -0
  482. package/src/rack/client.ts +233 -45
  483. package/src/rack/types.gen.ts +15 -16
  484. package/src/range/alias/types.gen.ts +2 -3
  485. package/src/ranger/client.ts +581 -70
  486. package/src/ranger/kv/client.ts +52 -21
  487. package/src/ranger/payload.ts +3 -0
  488. package/src/ranger/types.gen.ts +21 -23
  489. package/src/ranger/writer.ts +4 -8
  490. package/src/schematic/actions.gen.ts +62 -53
  491. package/src/schematic/actions.ts +44 -42
  492. package/src/schematic/client.ts +226 -70
  493. package/src/schematic/symbol/client.ts +277 -48
  494. package/src/schematic/symbol/types.gen.ts +22 -34
  495. package/src/schematic/types.gen.ts +22 -29
  496. package/src/status/client.ts +321 -44
  497. package/src/status/external.ts +2 -0
  498. package/src/status/payload.ts +1 -23
  499. package/src/status/status.ts +241 -0
  500. package/src/status/types.gen.ts +108 -0
  501. package/src/table/actions.gen.ts +96 -63
  502. package/src/table/actions.ts +44 -19
  503. package/src/table/client.ts +220 -56
  504. package/src/table/types.gen.ts +24 -31
  505. package/src/task/client.ts +580 -101
  506. package/src/task/types.gen.ts +68 -75
  507. package/src/testutil/access.ts +102 -6
  508. package/src/testutil/channels.ts +29 -0
  509. package/src/testutil/client.ts +27 -2
  510. package/src/testutil/connection.ts +47 -0
  511. package/src/testutil/index.ts +17 -0
  512. package/src/testutil/panels.ts +26 -0
  513. package/src/testutil/proxy.ts +106 -0
  514. package/src/testutil/query.ts +28 -0
  515. package/src/testutil/telem.ts +17 -1
  516. package/src/transport.ts +18 -7
  517. package/src/user/client.ts +165 -64
  518. package/src/user/external.ts +1 -1
  519. package/src/user/types.gen.ts +5 -5
  520. package/src/util/retrieve.ts +4 -4
  521. package/src/util/telem.ts +0 -1
  522. package/src/view/client.ts +120 -37
  523. package/src/view/types.gen.ts +8 -11
  524. package/.turbo/turbo-build.log +0 -20
  525. package/.vscode/settings.json +0 -3
  526. package/CONTRIBUTING.md +0 -47
  527. package/dist/client.cjs +0 -118
  528. package/dist/eslint.config.d.ts +0 -4
  529. package/dist/eslint.config.d.ts.map +0 -1
  530. package/dist/src/access/enforce.spec.d.ts +0 -2
  531. package/dist/src/access/enforce.spec.d.ts.map +0 -1
  532. package/dist/src/access/policy/access.spec.d.ts +0 -2
  533. package/dist/src/access/policy/access.spec.d.ts.map +0 -1
  534. package/dist/src/access/role/role.spec.d.ts +0 -2
  535. package/dist/src/access/role/role.spec.d.ts.map +0 -1
  536. package/dist/src/actions/actions.spec.d.ts +0 -2
  537. package/dist/src/actions/actions.spec.d.ts.map +0 -1
  538. package/dist/src/arc/access.spec.d.ts +0 -2
  539. package/dist/src/arc/access.spec.d.ts.map +0 -1
  540. package/dist/src/arc/arc.spec.d.ts +0 -2
  541. package/dist/src/arc/arc.spec.d.ts.map +0 -1
  542. package/dist/src/arc/lsp.spec.d.ts +0 -2
  543. package/dist/src/arc/lsp.spec.d.ts.map +0 -1
  544. package/dist/src/auth/auth.spec.d.ts +0 -2
  545. package/dist/src/auth/auth.spec.d.ts.map +0 -1
  546. package/dist/src/channel/access.spec.d.ts +0 -2
  547. package/dist/src/channel/access.spec.d.ts.map +0 -1
  548. package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
  549. package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
  550. package/dist/src/channel/channel.spec.d.ts +0 -2
  551. package/dist/src/channel/channel.spec.d.ts.map +0 -1
  552. package/dist/src/channel/payload.spec.d.ts +0 -2
  553. package/dist/src/channel/payload.spec.d.ts.map +0 -1
  554. package/dist/src/channel/retriever.d.ts +0 -64
  555. package/dist/src/channel/retriever.d.ts.map +0 -1
  556. package/dist/src/cluster/index.d.ts +0 -2
  557. package/dist/src/cluster/index.d.ts.map +0 -1
  558. package/dist/src/cluster/types.gen.d.ts +0 -4
  559. package/dist/src/cluster/types.gen.d.ts.map +0 -1
  560. package/dist/src/connection/checker.d.ts +0 -86
  561. package/dist/src/connection/checker.d.ts.map +0 -1
  562. package/dist/src/connection/connection.spec.d.ts +0 -2
  563. package/dist/src/connection/connection.spec.d.ts.map +0 -1
  564. package/dist/src/connection.spec.d.ts +0 -2
  565. package/dist/src/connection.spec.d.ts.map +0 -1
  566. package/dist/src/control/state.spec.d.ts +0 -2
  567. package/dist/src/control/state.spec.d.ts.map +0 -1
  568. package/dist/src/device/access.spec.d.ts +0 -2
  569. package/dist/src/device/access.spec.d.ts.map +0 -1
  570. package/dist/src/device/device.spec.d.ts +0 -2
  571. package/dist/src/device/device.spec.d.ts.map +0 -1
  572. package/dist/src/device/payload.spec.d.ts +0 -2
  573. package/dist/src/device/payload.spec.d.ts.map +0 -1
  574. package/dist/src/errors.spec.d.ts +0 -2
  575. package/dist/src/errors.spec.d.ts.map +0 -1
  576. package/dist/src/framer/adapter.spec.d.ts +0 -2
  577. package/dist/src/framer/adapter.spec.d.ts.map +0 -1
  578. package/dist/src/framer/client.spec.d.ts +0 -2
  579. package/dist/src/framer/client.spec.d.ts.map +0 -1
  580. package/dist/src/framer/codec.spec.d.ts +0 -2
  581. package/dist/src/framer/codec.spec.d.ts.map +0 -1
  582. package/dist/src/framer/deleter.spec.d.ts +0 -2
  583. package/dist/src/framer/deleter.spec.d.ts.map +0 -1
  584. package/dist/src/framer/frame.spec.d.ts +0 -2
  585. package/dist/src/framer/frame.spec.d.ts.map +0 -1
  586. package/dist/src/framer/iterator.spec.d.ts +0 -2
  587. package/dist/src/framer/iterator.spec.d.ts.map +0 -1
  588. package/dist/src/framer/reader.spec.d.ts +0 -2
  589. package/dist/src/framer/reader.spec.d.ts.map +0 -1
  590. package/dist/src/framer/streamer.spec.d.ts +0 -2
  591. package/dist/src/framer/streamer.spec.d.ts.map +0 -1
  592. package/dist/src/framer/writer.spec.d.ts +0 -2
  593. package/dist/src/framer/writer.spec.d.ts.map +0 -1
  594. package/dist/src/group/access.spec.d.ts +0 -2
  595. package/dist/src/group/access.spec.d.ts.map +0 -1
  596. package/dist/src/group/group.spec.d.ts +0 -2
  597. package/dist/src/group/group.spec.d.ts.map +0 -1
  598. package/dist/src/label/access.spec.d.ts +0 -2
  599. package/dist/src/label/access.spec.d.ts.map +0 -1
  600. package/dist/src/label/label.spec.d.ts +0 -2
  601. package/dist/src/label/label.spec.d.ts.map +0 -1
  602. package/dist/src/lineplot/access.spec.d.ts +0 -2
  603. package/dist/src/lineplot/access.spec.d.ts.map +0 -1
  604. package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
  605. package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
  606. package/dist/src/log/access.spec.d.ts +0 -2
  607. package/dist/src/log/access.spec.d.ts.map +0 -1
  608. package/dist/src/log/log.spec.d.ts +0 -2
  609. package/dist/src/log/log.spec.d.ts.map +0 -1
  610. package/dist/src/ontology/ontology.spec.d.ts +0 -2
  611. package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
  612. package/dist/src/rack/access.spec.d.ts +0 -2
  613. package/dist/src/rack/access.spec.d.ts.map +0 -1
  614. package/dist/src/rack/rack.spec.d.ts +0 -2
  615. package/dist/src/rack/rack.spec.d.ts.map +0 -1
  616. package/dist/src/ranger/access.spec.d.ts +0 -2
  617. package/dist/src/ranger/access.spec.d.ts.map +0 -1
  618. package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
  619. package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
  620. package/dist/src/ranger/ranger.spec.d.ts +0 -2
  621. package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
  622. package/dist/src/schematic/access.spec.d.ts +0 -2
  623. package/dist/src/schematic/access.spec.d.ts.map +0 -1
  624. package/dist/src/schematic/actions.spec.d.ts +0 -2
  625. package/dist/src/schematic/actions.spec.d.ts.map +0 -1
  626. package/dist/src/schematic/schematic.spec.d.ts +0 -2
  627. package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
  628. package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
  629. package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
  630. package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
  631. package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
  632. package/dist/src/status/access.spec.d.ts +0 -2
  633. package/dist/src/status/access.spec.d.ts.map +0 -1
  634. package/dist/src/status/status.spec.d.ts +0 -2
  635. package/dist/src/status/status.spec.d.ts.map +0 -1
  636. package/dist/src/table/access.spec.d.ts +0 -2
  637. package/dist/src/table/access.spec.d.ts.map +0 -1
  638. package/dist/src/table/table.spec.d.ts +0 -2
  639. package/dist/src/table/table.spec.d.ts.map +0 -1
  640. package/dist/src/task/access.spec.d.ts +0 -2
  641. package/dist/src/task/access.spec.d.ts.map +0 -1
  642. package/dist/src/task/payload.spec.d.ts +0 -2
  643. package/dist/src/task/payload.spec.d.ts.map +0 -1
  644. package/dist/src/task/task.spec.d.ts +0 -2
  645. package/dist/src/task/task.spec.d.ts.map +0 -1
  646. package/dist/src/user/access.spec.d.ts +0 -2
  647. package/dist/src/user/access.spec.d.ts.map +0 -1
  648. package/dist/src/user/user.spec.d.ts +0 -2
  649. package/dist/src/user/user.spec.d.ts.map +0 -1
  650. package/dist/src/util/retrieve.spec.d.ts +0 -2
  651. package/dist/src/util/retrieve.spec.d.ts.map +0 -1
  652. package/dist/src/view/view.spec.d.ts +0 -2
  653. package/dist/src/view/view.spec.d.ts.map +0 -1
  654. package/dist/src/workspace/access.spec.d.ts +0 -2
  655. package/dist/src/workspace/access.spec.d.ts.map +0 -1
  656. package/dist/src/workspace/client.d.ts +0 -36
  657. package/dist/src/workspace/client.d.ts.map +0 -1
  658. package/dist/src/workspace/external.d.ts.map +0 -1
  659. package/dist/src/workspace/index.d.ts +0 -2
  660. package/dist/src/workspace/index.d.ts.map +0 -1
  661. package/dist/src/workspace/types.gen.d.ts +0 -34
  662. package/dist/src/workspace/types.gen.d.ts.map +0 -1
  663. package/dist/src/workspace/workspace.spec.d.ts +0 -2
  664. package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
  665. package/examples/node/basicReadWrite.js +0 -86
  666. package/examples/node/createChannels.js +0 -50
  667. package/examples/node/createRange.js +0 -67
  668. package/examples/node/package-lock.json +0 -133
  669. package/examples/node/package.json +0 -17
  670. package/examples/node/readLatest.js +0 -76
  671. package/examples/node/seriesAndFrames.js +0 -173
  672. package/examples/node/streamRead.js +0 -50
  673. package/examples/node/streamWrite.js +0 -87
  674. package/src/access/enforce.spec.ts +0 -188
  675. package/src/access/policy/access.spec.ts +0 -147
  676. package/src/access/role/role.spec.ts +0 -95
  677. package/src/actions/actions.spec.ts +0 -229
  678. package/src/arc/access.spec.ts +0 -149
  679. package/src/arc/arc.spec.ts +0 -44
  680. package/src/arc/lsp.spec.ts +0 -717
  681. package/src/auth/auth.spec.ts +0 -101
  682. package/src/channel/access.spec.ts +0 -116
  683. package/src/channel/batchRetriever.spec.ts +0 -115
  684. package/src/channel/channel.spec.ts +0 -352
  685. package/src/channel/payload.spec.ts +0 -117
  686. package/src/channel/retriever.ts +0 -252
  687. package/src/connection/checker.ts +0 -203
  688. package/src/connection/connection.spec.ts +0 -152
  689. package/src/connection.spec.ts +0 -145
  690. package/src/control/state.spec.ts +0 -22
  691. package/src/device/access.spec.ts +0 -159
  692. package/src/device/device.spec.ts +0 -461
  693. package/src/device/payload.spec.ts +0 -142
  694. package/src/errors.spec.ts +0 -71
  695. package/src/framer/adapter.spec.ts +0 -620
  696. package/src/framer/client.spec.ts +0 -180
  697. package/src/framer/codec.spec.ts +0 -383
  698. package/src/framer/deleter.spec.ts +0 -103
  699. package/src/framer/frame.spec.ts +0 -973
  700. package/src/framer/iterator.spec.ts +0 -169
  701. package/src/framer/reader.spec.ts +0 -865
  702. package/src/framer/streamer.spec.ts +0 -871
  703. package/src/framer/writer.spec.ts +0 -486
  704. package/src/group/access.spec.ts +0 -77
  705. package/src/group/group.spec.ts +0 -65
  706. package/src/label/access.spec.ts +0 -109
  707. package/src/label/label.spec.ts +0 -83
  708. package/src/lineplot/access.spec.ts +0 -134
  709. package/src/lineplot/lineplot.spec.ts +0 -120
  710. package/src/log/access.spec.ts +0 -132
  711. package/src/log/log.spec.ts +0 -106
  712. package/src/ontology/ontology.spec.ts +0 -521
  713. package/src/rack/access.spec.ts +0 -102
  714. package/src/rack/rack.spec.ts +0 -171
  715. package/src/ranger/access.spec.ts +0 -115
  716. package/src/ranger/alias/payload.spec.ts +0 -52
  717. package/src/ranger/ranger.spec.ts +0 -343
  718. package/src/schematic/access.spec.ts +0 -134
  719. package/src/schematic/actions.spec.ts +0 -699
  720. package/src/schematic/schematic.spec.ts +0 -340
  721. package/src/schematic/symbol/access.spec.ts +0 -172
  722. package/src/schematic/symbol/client.spec.ts +0 -160
  723. package/src/status/access.spec.ts +0 -129
  724. package/src/status/status.spec.ts +0 -448
  725. package/src/table/access.spec.ts +0 -128
  726. package/src/table/table.spec.ts +0 -651
  727. package/src/task/access.spec.ts +0 -131
  728. package/src/task/payload.spec.ts +0 -113
  729. package/src/task/task.spec.ts +0 -657
  730. package/src/user/access.spec.ts +0 -107
  731. package/src/user/user.spec.ts +0 -290
  732. package/src/util/retrieve.spec.ts +0 -49
  733. package/src/view/view.spec.ts +0 -165
  734. package/src/workspace/access.spec.ts +0 -108
  735. package/src/workspace/client.ts +0 -112
  736. package/src/workspace/types.gen.ts +0 -46
  737. package/src/workspace/workspace.spec.ts +0 -111
  738. package/tsconfig.json +0 -5
  739. package/tsconfig.vite.json +0 -4
  740. package/vite.config.ts +0 -29
  741. /package/dist/src/{workspace → project}/external.d.ts +0 -0
@@ -0,0 +1,114 @@
1
+ // Copyright 2026 Synnax Labs, Inc.
2
+ //
3
+ // Use of this software is governed by the Business Source License included in the file
4
+ // licenses/BSL.txt.
5
+ //
6
+ // As of the Change Date specified in that file, in accordance with the Business Source
7
+ // License, use of this software will be governed by the Apache License, Version 2.0,
8
+ // included in the file licenses/APL.txt.
9
+
10
+ import { type destructor } from "@synnaxlabs/x";
11
+
12
+ import { type Action } from "@/access/action/types.gen";
13
+ import { allowRequest } from "@/access/enforce";
14
+ import { type policy } from "@/access/policy";
15
+ import { ontology } from "@/ontology";
16
+ import { query } from "@/query";
17
+
18
+ /** A permission question: may the subject apply the action to the objects? */
19
+ export interface GrantedQuery {
20
+ objects: ontology.ID | ontology.ID[];
21
+ action: Action;
22
+ }
23
+
24
+ interface Verdict {
25
+ subject: string;
26
+ policies: policy.Policy[];
27
+ verdict: boolean;
28
+ }
29
+
30
+ interface SubjectEntry {
31
+ key: string;
32
+ query: { for: ontology.ID };
33
+ }
34
+
35
+ export interface GrantedConfig {
36
+ policies: policy.Client;
37
+ }
38
+
39
+ /**
40
+ * The cached read surface for permission checks, answering {@link GrantedQuery}
41
+ * questions against the subject's cached policies. Snapshot reads memoize the
42
+ * verdict per query object, so render-hot callers pay a policy evaluation only
43
+ * when the policies actually change.
44
+ */
45
+ export class Granted {
46
+ private readonly policies: policy.Client;
47
+ private readonly subjects = new Map<string, SubjectEntry>();
48
+ private readonly verdicts = new WeakMap<GrantedQuery, Verdict>();
49
+
50
+ constructor(cfg: GrantedConfig) {
51
+ this.policies = cfg.policies;
52
+ }
53
+
54
+ // A subject's entry holds its canonical key and a stable `{ for }` query, so
55
+ // repeat reads stringify once and stay on the retriever's normalization memo.
56
+ private subjectFor(subject: ontology.ID): SubjectEntry {
57
+ const key = ontology.idToString(subject);
58
+ let held = this.subjects.get(key);
59
+ if (held == null) {
60
+ held = { key, query: { for: subject } };
61
+ this.subjects.set(key, held);
62
+ }
63
+ return held;
64
+ }
65
+
66
+ /** Fetches the subject's policies and answers the question. */
67
+ async retrieve(subject: ontology.ID, q: GrantedQuery): Promise<boolean> {
68
+ const policies = await this.policies.retrieveForSubject(subject);
69
+ return allowRequest({ subject, objects: q.objects, action: q.action }, policies);
70
+ }
71
+
72
+ /**
73
+ * Subscribes to the verdict, firing only when it flips: policy churn that
74
+ * cannot change the answer never reaches the handler.
75
+ */
76
+ onChange(
77
+ subject: ontology.ID,
78
+ q: GrantedQuery,
79
+ handler: (granted: boolean) => void,
80
+ ): destructor.Destructor {
81
+ const { query: policiesQuery } = this.subjectFor(subject);
82
+ const evaluate = (policies: policy.Policy[]): boolean =>
83
+ allowRequest({ subject, objects: q.objects, action: q.action }, policies);
84
+ const cached = this.policies.getCached(policiesQuery);
85
+ let prev = query.isLive(cached) ? evaluate(cached) : undefined;
86
+ return this.policies.onChange(policiesQuery, (result) => {
87
+ if (!query.isLive(result)) return;
88
+ const next = evaluate(result);
89
+ if (next === prev) return;
90
+ prev = next;
91
+ handler(next);
92
+ });
93
+ }
94
+
95
+ /**
96
+ * Returns the cached verdict, or undefined when the subject's policies are
97
+ * not cached. Repeat calls with the same query object skip the policy
98
+ * evaluation until the cached policies change.
99
+ */
100
+ getCached(subject: ontology.ID, q: GrantedQuery): boolean | undefined {
101
+ const { key: subjectKey, query: policiesQuery } = this.subjectFor(subject);
102
+ const cached = this.policies.getCached(policiesQuery);
103
+ if (!query.isLive(cached)) return undefined;
104
+ const held = this.verdicts.get(q);
105
+ if (held != null && held.policies === cached && held.subject === subjectKey)
106
+ return held.verdict;
107
+ const verdict = allowRequest(
108
+ { subject, objects: q.objects, action: q.action },
109
+ cached,
110
+ );
111
+ this.verdicts.set(q, { subject: subjectKey, policies: cached, verdict });
112
+ return verdict;
113
+ }
114
+ }
@@ -8,18 +8,19 @@
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, primitive } from "@synnaxlabs/x";
12
12
  import { z } from "zod";
13
13
 
14
14
  import {
15
15
  type Key,
16
16
  keyZ,
17
17
  type New,
18
- newZ,
18
+ ontologyID,
19
19
  type Policy,
20
20
  policyZ,
21
21
  } from "@/access/policy/types.gen";
22
22
  import { ontology } from "@/ontology";
23
+ import { query } from "@/query";
23
24
 
24
25
  export const SET_CHANNEL_NAME = "sy_policy_set";
25
26
  export const DELETE_CHANNEL_NAME = "sy_policy_delete";
@@ -32,11 +33,7 @@ const retrieveRequestZ = z.object({
32
33
  internal: z.boolean().optional(),
33
34
  });
34
35
 
35
- const keyRetrieveRequestZ = z
36
- .object({ key: keyZ })
37
- .transform(({ key }) => ({ keys: [key] }));
38
-
39
- const listRetrieveArgsZ = z.union([
36
+ const listRetrieveParamsZ = z.union([
40
37
  z
41
38
  .object({ for: ontology.idZ })
42
39
  .transform(({ for: forId }) => ({ subjects: [forId] })),
@@ -45,69 +42,164 @@ const listRetrieveArgsZ = z.union([
45
42
  .transform(({ for: forIds }) => ({ subjects: forIds })),
46
43
  retrieveRequestZ,
47
44
  ]);
45
+ const retrieveMultiParamsZ = listRetrieveParamsZ.or(query.keyListZ(keyZ));
48
46
 
49
- export type RetrieveSingleParams = z.input<typeof keyRetrieveRequestZ>;
50
- export type RetrieveMultipleParams = z.input<typeof listRetrieveArgsZ>;
51
-
52
- const retrieveArgsZ = z.union([keyRetrieveRequestZ, listRetrieveArgsZ]);
47
+ export type RetrieveSingleParams = { key: Key };
48
+ export type RetrieveMultipleParams = z.input<typeof listRetrieveParamsZ>;
53
49
 
54
- export type RetrieveArgs = z.input<typeof retrieveArgsZ>;
50
+ interface RetrieveRequest extends z.infer<typeof retrieveRequestZ> {}
55
51
 
56
- const retrieveResZ = z.object({ policies: array.nullishToEmpty(policyZ) });
52
+ const retrieveResZ = z.object({ policies: policyZ.array().default(() => []) });
57
53
 
58
- const singleCreateArgsZ = newZ.transform((p) => ({ policies: [p] }));
59
- export type SingleCreateArgs = z.input<typeof singleCreateArgsZ>;
54
+ const singleCreateParamsZ = policyZ.transform((p) => ({ policies: [p] }));
55
+ export type SingleCreateParams = z.input<typeof singleCreateParamsZ>;
60
56
 
61
- export const multipleCreateArgsZ = newZ.array().transform((policies) => ({ policies }));
57
+ export const multipleCreateParamsZ = policyZ
58
+ .array()
59
+ .transform((policies) => ({ policies }));
62
60
 
63
- export const createArgsZ = z.union([singleCreateArgsZ, multipleCreateArgsZ]);
64
- export type CreateArgs = z.input<typeof createArgsZ>;
61
+ export const createParamsZ = z.union([singleCreateParamsZ, multipleCreateParamsZ]);
62
+ export type CreateParams = z.input<typeof createParamsZ>;
65
63
 
66
64
  const createResZ = z.object({ policies: policyZ.array() });
67
65
  const deleteReqZ = z.object({ keys: keyZ.array() });
68
66
  const deleteResZ = z.object({});
69
67
 
70
- export class Client {
71
- private readonly client: UnaryClient;
68
+ /**
69
+ * Query fields only the server can evaluate: policy records do not carry
70
+ * their subjects, so subject membership cannot be checked locally.
71
+ */
72
+ const SERVER_FIELDS = ["subjects", "limit", "offset"] as const;
73
+
74
+ /**
75
+ * Client-side matching for a request: key sets and the internal flag. Server-computed
76
+ * shapes (subjects, pagination) never reach this filter; they refetch instead.
77
+ */
78
+ const requestFilter = (req: RetrieveRequest): ((p: Policy) => boolean) => {
79
+ const keySet = primitive.isNonZero(req.keys) ? new Set(req.keys) : undefined;
80
+ return (p) => {
81
+ if (keySet != null && !keySet.has(p.key)) return false;
82
+ if (req.internal != null && p.internal !== req.internal) return false;
83
+ return true;
84
+ };
85
+ };
86
+
87
+ export interface ClientConfig {
88
+ unary: UnaryClient;
89
+ cache: query.Cache;
90
+ ontology: ontology.Client;
91
+ }
72
92
 
73
- constructor(client: UnaryClient) {
74
- this.client = client;
93
+ export class Client extends query.Retriever<typeof retrieveMultiParamsZ, Key, Policy> {
94
+ private readonly cfg: ClientConfig;
95
+ private readonly store: query.Table<Key, Policy>;
96
+
97
+ constructor(cfg: ClientConfig) {
98
+ const { cache } = cfg;
99
+ const store = cache.createTable<Key, Policy>({
100
+ name: "policies",
101
+ fetch: async (keys) => await this.execRetrieve({ keys }),
102
+ listen: [
103
+ query.createSetListener(SET_CHANNEL_NAME, policyZ),
104
+ query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
105
+ ],
106
+ });
107
+ super(cache, {
108
+ name: "policy",
109
+ table: store,
110
+ request: {
111
+ schema: retrieveMultiParamsZ,
112
+ fetch: async (req) => await this.execRetrieve(req),
113
+ matches: (policy, req) => requestFilter(req)(policy),
114
+ serverFields: SERVER_FIELDS,
115
+ },
116
+ });
117
+ this.cfg = cfg;
118
+ this.store = store;
75
119
  }
76
120
 
77
121
  async create(policy: New): Promise<Policy>;
78
122
  async create(policies: New[]): Promise<Policy[]>;
79
- async create(policies: CreateArgs): Promise<Policy | Policy[]> {
123
+ async create(policies: CreateParams): Promise<Policy | Policy[]> {
80
124
  const isMany = Array.isArray(policies);
81
- const res = await this.client.send(
125
+ const res = await this.cfg.unary.send(
82
126
  "/access/policy/create",
83
127
  policies,
84
- createArgsZ,
128
+ createParamsZ,
85
129
  createResZ,
86
130
  );
131
+ this.store.set(res.policies);
87
132
  return isMany ? res.policies : res.policies[0];
88
133
  }
89
134
 
90
- async retrieve(args: RetrieveSingleParams): Promise<Policy>;
91
- async retrieve(args: RetrieveMultipleParams): Promise<Policy[]>;
92
- async retrieve(args: RetrieveArgs): Promise<Policy | Policy[]> {
93
- const isSingle = "key" in args;
94
- const res = await this.client.send(
95
- "/access/policy/retrieve",
96
- args,
97
- retrieveArgsZ,
98
- retrieveResZ,
135
+ async delete(key: Key, opts?: query.WriteOptions): Promise<void>;
136
+ async delete(keys: Key[], opts?: query.WriteOptions): Promise<void>;
137
+ async delete(keys: Key | Key[], opts: query.WriteOptions = {}): Promise<void> {
138
+ const keysArr = array.toArray(keys);
139
+ const ids = ontologyID(keysArr);
140
+ const drop = () => [
141
+ this.cfg.ontology.cache.deleteResources(ids),
142
+ this.store.delete(keysArr),
143
+ ];
144
+ await query.optimistic({
145
+ rollbacks: drop(),
146
+ onOptimistic: opts.onOptimistic,
147
+ commit: async () =>
148
+ await this.cfg.unary.send(
149
+ "/access/policy/delete",
150
+ { keys: keysArr },
151
+ deleteReqZ,
152
+ deleteResZ,
153
+ ),
154
+ });
155
+ drop();
156
+ this.cfg.ontology.cache.relationships.delete((r) =>
157
+ ids.some((id) => ontology.idsEqual(r.from, id) || ontology.idsEqual(r.to, id)),
99
158
  );
100
- return isSingle ? res.policies[0] : res.policies;
101
159
  }
102
160
 
103
- async delete(key: Key): Promise<void>;
104
- async delete(keys: Key[]): Promise<void>;
105
- async delete(keys: Key | Key[]): Promise<void> {
106
- await this.client.send(
107
- "/access/policy/delete",
108
- { keys: array.toArray(keys) },
109
- deleteReqZ,
110
- deleteResZ,
161
+ async rename(key: Key, name: string, opts: query.WriteOptions = {}): Promise<void> {
162
+ const existing = await this.retrieve(key);
163
+ const rename = () => [
164
+ query.partialUpdate(this.store, key, { name }),
165
+ this.cfg.ontology.cache.renameResource(ontologyID(key), name),
166
+ ];
167
+ await query.optimistic({
168
+ rollbacks: rename(),
169
+ onOptimistic: opts.onOptimistic,
170
+ commit: async () => {
171
+ await this.create({ ...existing, name });
172
+ },
173
+ });
174
+ rename();
175
+ }
176
+
177
+ /**
178
+ * Retrieves every policy governing the subject, warming the role links of
179
+ * the subject and its policies so role reads resolve from the cache.
180
+ */
181
+ async retrieveForSubject(subject: ontology.ID): Promise<Policy[]> {
182
+ const policies = await this.retrieve({ for: subject });
183
+ const { parents } = this.cfg.ontology;
184
+ const warms = [parents.retrieve({ ids: subject, types: ["role"] })];
185
+ if (policies.length > 0)
186
+ warms.push(
187
+ parents.retrieve({
188
+ ids: policies.map((p) => ontologyID(p.key)),
189
+ types: ["role"],
190
+ }),
191
+ );
192
+ await Promise.all(warms);
193
+ return policies;
194
+ }
195
+
196
+ private async execRetrieve(params: RetrieveRequest): Promise<Policy[]> {
197
+ const res = await this.cfg.unary.send(
198
+ "/access/policy/retrieve",
199
+ params,
200
+ retrieveRequestZ,
201
+ retrieveResZ,
111
202
  );
203
+ return res.policies;
112
204
  }
113
205
  }
@@ -9,7 +9,7 @@
9
9
 
10
10
  // Code generated by Oracle. DO NOT EDIT.
11
11
 
12
- import { array } from "@synnaxlabs/x";
12
+ import { uuid } from "@synnaxlabs/x";
13
13
  import { z } from "zod";
14
14
 
15
15
  import { access } from "@/access/action";
@@ -19,26 +19,24 @@ export const keyZ = z.uuid();
19
19
  export type Key = z.infer<typeof keyZ>;
20
20
 
21
21
  /**
22
- * Policy is an access control policy that defines which actions are permitted on
23
- * which resources. Policies are attached to roles, and roles are assigned
24
- * to users via ontology relationships.
22
+ * Policy is an access control policy that defines which actions are permitted on which
23
+ * resources. Policies are attached to roles, and roles are assigned to users via
24
+ * ontology relationships.
25
25
  */
26
26
  export const policyZ = z.object({
27
27
  /** key is the unique identifier for this policy. */
28
- key: keyZ,
28
+ key: keyZ.default(uuid.create),
29
29
  /** name is a human-readable name for the policy. */
30
30
  name: z.string(),
31
31
  /** objects is the list of ontology resources this policy applies to. */
32
- objects: array.nullishToEmpty(ontology.idZ),
32
+ objects: ontology.idZ.array().default(() => []),
33
33
  /** actions is the list of actions this policy permits. */
34
- actions: array.nullishToEmpty(access.actionZ),
34
+ actions: access.actionZ.array().default(() => []),
35
35
  /** internal is true if this is a built-in system policy that cannot be deleted. */
36
- internal: z.boolean().default(false).optional(),
36
+ internal: z.boolean().default(false),
37
37
  });
38
38
  export interface Policy extends z.infer<typeof policyZ> {}
39
-
40
- export const newZ = policyZ.partial({ key: true });
41
- export interface New extends z.input<typeof newZ> {}
39
+ export interface New extends z.input<typeof policyZ> {}
42
40
 
43
41
  export const ontologyID = ontology.createIDFactory<Key>("policy");
44
42
  export const TYPE_ONTOLOGY_ID = ontologyID("");
@@ -8,52 +8,68 @@
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, primitive } from "@synnaxlabs/x";
12
12
  import { z } from "zod";
13
13
 
14
- import { keyZ, type New, newZ, type Role, roleZ } from "@/access/role/types.gen";
14
+ import {
15
+ type Key,
16
+ keyZ,
17
+ type New,
18
+ ontologyID,
19
+ type Role,
20
+ roleZ,
21
+ } from "@/access/role/types.gen";
22
+ import { ontology } from "@/ontology";
23
+ import { query } from "@/query";
15
24
  import { user } from "@/user";
16
25
 
26
+ export const SET_CHANNEL_NAME = "sy_role_set";
27
+ export const DELETE_CHANNEL_NAME = "sy_role_delete";
28
+
17
29
  const retrieveRequestZ = z.object({
18
30
  keys: keyZ.array().optional(),
31
+ searchTerm: z.string().optional(),
19
32
  limit: z.number().optional(),
20
33
  offset: z.number().optional(),
21
34
  internal: z.boolean().optional(),
22
35
  });
36
+ const retrieveMultiParamsZ = retrieveRequestZ.or(query.keyListZ(keyZ));
23
37
 
24
38
  const keyRetrieveRequestZ = z
25
39
  .object({ key: keyZ })
26
40
  .transform(({ key }) => ({ keys: [key] }));
27
41
 
28
- const singleCreateArgsZ = newZ.transform((r) => ({ roles: [r] }));
29
- export type SingleCreateArgs = z.input<typeof singleCreateArgsZ>;
42
+ const singleCreateParamsZ = roleZ.transform((r) => ({ roles: [r] }));
43
+ export type SingleCreateParams = z.input<typeof singleCreateParamsZ>;
30
44
 
31
- export const multipleCreateArgsZ = newZ.array().transform((roles) => ({ roles }));
45
+ export const multipleCreateParamsZ = roleZ.array().transform((roles) => ({ roles }));
32
46
 
33
- export const createArgsZ = z.union([singleCreateArgsZ, multipleCreateArgsZ]);
34
- export type CreateArgs = z.input<typeof createArgsZ>;
47
+ export const createParamsZ = z.union([singleCreateParamsZ, multipleCreateParamsZ]);
48
+ export type CreateParams = z.input<typeof createParamsZ>;
35
49
 
36
50
  const createResZ = z.object({ roles: roleZ.array() });
37
- const retrieveResZ = z.object({ roles: array.nullishToEmpty(roleZ) });
51
+ const retrieveResZ = z.object({ roles: roleZ.array().default(() => []) });
38
52
 
39
53
  export type RetrieveSingleParams = z.input<typeof keyRetrieveRequestZ>;
40
54
  export type RetrieveMultipleParams = z.input<typeof retrieveRequestZ>;
41
55
 
42
- export const retrieveArgsZ = z.union([keyRetrieveRequestZ, retrieveRequestZ]);
43
- export type RetrieveArgs = z.input<typeof retrieveArgsZ>;
56
+ export const retrieveParamsZ = z.union([keyRetrieveRequestZ, retrieveRequestZ]);
57
+ export type RetrieveParams = z.input<typeof retrieveParamsZ>;
58
+
59
+ interface RetrieveRequest extends z.infer<typeof retrieveRequestZ> {}
44
60
 
45
61
  const deleteResZ = z.object({});
46
62
 
47
- const deleteArgsZ = keyZ
63
+ const deleteParamsZ = keyZ
48
64
  .transform((key) => ({ keys: [key] }))
49
65
  .or(keyZ.array().transform((keys) => ({ keys })));
50
- export type DeleteArgs = z.input<typeof deleteArgsZ>;
66
+ export type DeleteParams = z.input<typeof deleteParamsZ>;
51
67
 
52
68
  const assignReqZ = z.object({
53
69
  user: user.keyZ,
54
70
  role: keyZ,
55
71
  });
56
- export type AssignArgs = z.input<typeof assignReqZ>;
72
+ export type AssignParams = z.input<typeof assignReqZ>;
57
73
 
58
74
  const assignResZ = z.object({});
59
75
 
@@ -61,55 +77,161 @@ const unassignReqZ = z.object({
61
77
  user: user.keyZ,
62
78
  role: keyZ,
63
79
  });
64
- export type UnassignArgs = z.input<typeof unassignReqZ>;
80
+ export type UnassignParams = z.input<typeof unassignReqZ>;
65
81
 
66
82
  const unassignResZ = z.object({});
67
83
 
68
- export const SET_CHANNEL_NAME = "sy_role_set";
69
- export const DELETE_CHANNEL_NAME = "sy_role_delete";
84
+ /**
85
+ * Client-side matching for a request: key sets and the internal flag. Server-computed
86
+ * shapes (search, limit/offset) never reach this filter; they refetch instead.
87
+ */
88
+ const requestFilter = (req: RetrieveRequest): ((r: Role) => boolean) => {
89
+ const keySet = primitive.isNonZero(req.keys) ? new Set(req.keys) : undefined;
90
+ return (r) => {
91
+ if (keySet != null && !keySet.has(r.key)) return false;
92
+ if (req.internal != null && r.internal !== req.internal) return false;
93
+ return true;
94
+ };
95
+ };
96
+
97
+ const assignmentRel = (role: Key, userKey: user.Key): ontology.Relationship => ({
98
+ from: ontologyID(role),
99
+ type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
100
+ to: user.ontologyID(userKey),
101
+ });
70
102
 
71
- export class Client {
72
- private readonly client: UnaryClient;
103
+ export interface ClientConfig {
104
+ unary: UnaryClient;
105
+ cache: query.Cache;
106
+ ontology: ontology.Client;
107
+ }
73
108
 
74
- constructor(client: UnaryClient) {
75
- this.client = client;
109
+ export class Client extends query.Retriever<typeof retrieveMultiParamsZ, Key, Role> {
110
+ private readonly cfg: ClientConfig;
111
+ private readonly store: query.Table<Key, Role>;
112
+
113
+ constructor(cfg: ClientConfig) {
114
+ const { cache } = cfg;
115
+ const store = cache.createTable<Key, Role>({
116
+ name: "roles",
117
+ fetch: async (keys) => await this.execRetrieve({ keys }),
118
+ listen: [
119
+ query.createSetListener(SET_CHANNEL_NAME, roleZ),
120
+ query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
121
+ ],
122
+ });
123
+ super(cache, {
124
+ name: "role",
125
+ table: store,
126
+ request: {
127
+ schema: retrieveMultiParamsZ,
128
+ fetch: async (req) => await this.execRetrieve(req),
129
+ matches: (role, req) => requestFilter(req)(role),
130
+ },
131
+ });
132
+ this.cfg = cfg;
133
+ this.store = store;
76
134
  }
77
135
 
78
136
  async create(role: New): Promise<Role>;
79
137
  async create(roles: New[]): Promise<Role[]>;
80
138
  async create(roles: New | New[]): Promise<Role | Role[]> {
81
139
  const isMany = Array.isArray(roles);
82
- const res = await this.client.send(
140
+ const res = await this.cfg.unary.send(
83
141
  "/access/role/create",
84
142
  roles,
85
- createArgsZ,
143
+ createParamsZ,
86
144
  createResZ,
87
145
  );
146
+ this.store.set(res.roles);
88
147
  return isMany ? res.roles : res.roles[0];
89
148
  }
90
149
 
91
- async retrieve(args: RetrieveSingleParams): Promise<Role>;
92
- async retrieve(args: RetrieveMultipleParams): Promise<Role[]>;
93
- async retrieve(args: RetrieveArgs): Promise<Role | Role[]> {
94
- const isSingle = "key" in args;
95
- const res = await this.client.send(
96
- "/access/role/retrieve",
97
- args,
98
- retrieveArgsZ,
99
- retrieveResZ,
150
+ async delete(params: DeleteParams, opts: query.WriteOptions = {}): Promise<void> {
151
+ const keysArr = array.toArray(params);
152
+ const ids = ontologyID(keysArr);
153
+ const drop = () => [
154
+ this.cfg.ontology.cache.deleteResources(ids),
155
+ this.store.delete(keysArr),
156
+ ];
157
+ await query.optimistic({
158
+ rollbacks: drop(),
159
+ onOptimistic: opts.onOptimistic,
160
+ commit: async () =>
161
+ await this.cfg.unary.send(
162
+ "/access/role/delete",
163
+ params,
164
+ deleteParamsZ,
165
+ deleteResZ,
166
+ ),
167
+ });
168
+ drop();
169
+ this.cfg.ontology.cache.relationships.delete((r) =>
170
+ ids.some((id) => ontology.idsEqual(r.from, id) || ontology.idsEqual(r.to, id)),
100
171
  );
101
- return isSingle ? res.roles[0] : res.roles;
102
172
  }
103
173
 
104
- async delete(args: DeleteArgs): Promise<void> {
105
- await this.client.send("/access/role/delete", args, deleteArgsZ, deleteResZ);
174
+ async rename(key: Key, name: string, opts: query.WriteOptions = {}): Promise<void> {
175
+ const existing = await this.retrieve(key);
176
+ const rename = () => [
177
+ query.partialUpdate(this.store, key, { name }),
178
+ this.cfg.ontology.cache.renameResource(ontologyID(key), name),
179
+ ];
180
+ await query.optimistic({
181
+ rollbacks: rename(),
182
+ onOptimistic: opts.onOptimistic,
183
+ commit: async () => {
184
+ await this.create({ ...existing, name });
185
+ },
186
+ });
187
+ rename();
188
+ }
189
+
190
+ async assign(params: AssignParams, opts: query.WriteOptions = {}): Promise<void> {
191
+ const rel = assignmentRel(params.role, params.user);
192
+ await query.optimistic({
193
+ rollbacks: [
194
+ this.cfg.ontology.cache.relationships.set(
195
+ ontology.relationshipToString(rel),
196
+ rel,
197
+ ),
198
+ ],
199
+ onOptimistic: opts.onOptimistic,
200
+ commit: async () =>
201
+ await this.cfg.unary.send(
202
+ "/access/role/assign",
203
+ params,
204
+ assignReqZ,
205
+ assignResZ,
206
+ ),
207
+ });
106
208
  }
107
209
 
108
- async assign(args: AssignArgs): Promise<void> {
109
- await this.client.send("/access/role/assign", args, assignReqZ, assignResZ);
210
+ async unassign(params: UnassignParams, opts: query.WriteOptions = {}): Promise<void> {
211
+ await query.optimistic({
212
+ rollbacks: [
213
+ this.cfg.ontology.cache.relationships.delete(
214
+ ontology.relationshipToString(assignmentRel(params.role, params.user)),
215
+ ),
216
+ ],
217
+ onOptimistic: opts.onOptimistic,
218
+ commit: async () =>
219
+ await this.cfg.unary.send(
220
+ "/access/role/unassign",
221
+ params,
222
+ unassignReqZ,
223
+ unassignResZ,
224
+ ),
225
+ });
110
226
  }
111
227
 
112
- async unassign(args: UnassignArgs): Promise<void> {
113
- await this.client.send("/access/role/unassign", args, unassignReqZ, unassignResZ);
228
+ private async execRetrieve(params: RetrieveMultipleParams): Promise<Role[]> {
229
+ const res = await this.cfg.unary.send(
230
+ "/access/role/retrieve",
231
+ params,
232
+ retrieveRequestZ,
233
+ retrieveResZ,
234
+ );
235
+ return res.roles;
114
236
  }
115
237
  }