@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.
- package/dist/client-B08VDLSA.js +14463 -0
- package/dist/client-B08VDLSA.js.map +1 -0
- package/dist/client.js +1128 -14876
- package/dist/client.js.map +1 -0
- package/dist/src/access/client.d.ts +10 -1
- package/dist/src/access/client.d.ts.map +1 -1
- package/dist/src/access/enforce.d.ts.map +1 -1
- package/dist/src/access/external.d.ts +1 -0
- package/dist/src/access/external.d.ts.map +1 -1
- package/dist/src/access/granted.d.ts +39 -0
- package/dist/src/access/granted.d.ts.map +1 -0
- package/dist/src/access/policy/client.d.ts +136 -147
- package/dist/src/access/policy/client.d.ts.map +1 -1
- package/dist/src/access/policy/types.gen.d.ts +15 -68
- package/dist/src/access/policy/types.gen.d.ts.map +1 -1
- package/dist/src/access/role/client.d.ts +77 -58
- package/dist/src/access/role/client.d.ts.map +1 -1
- package/dist/src/access/role/types.gen.d.ts +8 -14
- package/dist/src/access/role/types.gen.d.ts.map +1 -1
- package/dist/src/actions/actions.d.ts +5 -6
- package/dist/src/actions/actions.d.ts.map +1 -1
- package/dist/src/actions/controller.d.ts +194 -0
- package/dist/src/actions/controller.d.ts.map +1 -0
- package/dist/src/actions/external.d.ts +1 -0
- package/dist/src/actions/external.d.ts.map +1 -1
- package/dist/src/arc/actions.d.ts +575 -0
- package/dist/src/arc/actions.d.ts.map +1 -0
- package/dist/src/arc/actions.gen.d.ts +1439 -0
- package/dist/src/arc/actions.gen.d.ts.map +1 -0
- package/dist/src/arc/client.d.ts +97 -13
- package/dist/src/arc/client.d.ts.map +1 -1
- package/dist/src/arc/compiler/types.gen.d.ts +3 -3
- package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
- package/dist/src/arc/external.d.ts +2 -0
- package/dist/src/arc/external.d.ts.map +1 -1
- package/dist/src/arc/graph/types.gen.d.ts +45 -597
- package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
- package/dist/src/arc/ir/index.d.ts +1 -1
- package/dist/src/arc/ir/index.d.ts.map +1 -1
- package/dist/src/arc/ir/ir.d.ts +2 -0
- package/dist/src/arc/ir/ir.d.ts.map +1 -0
- package/dist/src/arc/ir/types.gen.d.ts +58 -2807
- package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
- package/dist/src/arc/module/types.gen.d.ts +18 -1090
- package/dist/src/arc/module/types.gen.d.ts.map +1 -1
- package/dist/src/arc/program/types.gen.d.ts +18 -1090
- package/dist/src/arc/program/types.gen.d.ts.map +1 -1
- package/dist/src/arc/text/types.gen.d.ts +54 -1
- package/dist/src/arc/text/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types/types.gen.d.ts +35 -153
- package/dist/src/arc/types/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types.gen.d.ts +98 -2278
- package/dist/src/arc/types.gen.d.ts.map +1 -1
- package/dist/src/auth/auth.d.ts +14 -2
- package/dist/src/auth/auth.d.ts.map +1 -1
- package/dist/src/channel/client.d.ts +113 -75
- package/dist/src/channel/client.d.ts.map +1 -1
- package/dist/src/channel/external.d.ts +0 -1
- package/dist/src/channel/external.d.ts.map +1 -1
- package/dist/src/channel/payload.d.ts +65 -56
- package/dist/src/channel/payload.d.ts.map +1 -1
- package/dist/src/channel/types.gen.d.ts +26 -73
- package/dist/src/channel/types.gen.d.ts.map +1 -1
- package/dist/src/channel/writer.d.ts +1 -3
- package/dist/src/channel/writer.d.ts.map +1 -1
- package/dist/src/client.d.ts +55 -27
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/connection/client.d.ts +146 -0
- package/dist/src/connection/client.d.ts.map +1 -0
- package/dist/src/connection/external.d.ts +3 -0
- package/dist/src/connection/external.d.ts.map +1 -0
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/status.d.ts +252 -0
- package/dist/src/connection/status.d.ts.map +1 -0
- package/dist/src/control/client.d.ts +31 -7
- package/dist/src/control/client.d.ts.map +1 -1
- package/dist/src/control/state.d.ts +47 -16
- package/dist/src/control/state.d.ts.map +1 -1
- package/dist/src/device/client.d.ts +59 -17
- package/dist/src/device/client.d.ts.map +1 -1
- package/dist/src/device/types.gen.d.ts +17 -67
- package/dist/src/device/types.gen.d.ts.map +1 -1
- package/dist/src/errors.d.ts +17 -20
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/ethercat/external.d.ts +2 -0
- package/dist/src/ethercat/external.d.ts.map +1 -0
- package/dist/src/ethercat/index.d.ts +2 -0
- package/dist/src/ethercat/index.d.ts.map +1 -0
- package/dist/src/ethercat/types.gen.d.ts +243 -0
- package/dist/src/ethercat/types.gen.d.ts.map +1 -0
- package/dist/src/framer/adapter.d.ts +8 -5
- package/dist/src/framer/adapter.d.ts.map +1 -1
- package/dist/src/framer/benchutil.d.ts +19 -0
- package/dist/src/framer/benchutil.d.ts.map +1 -0
- package/dist/src/framer/cache/cache.d.ts +38 -0
- package/dist/src/framer/cache/cache.d.ts.map +1 -0
- package/dist/src/framer/cache/dynamic.d.ts +71 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +43 -0
- package/dist/src/framer/cache/reader.d.ts.map +1 -0
- package/dist/src/framer/cache/static.d.ts +66 -0
- package/dist/src/framer/cache/static.d.ts.map +1 -0
- package/dist/src/framer/cache/streamer.d.ts +86 -0
- package/dist/src/framer/cache/streamer.d.ts.map +1 -0
- package/dist/src/framer/cache/transform.d.ts +18 -0
- package/dist/src/framer/cache/transform.d.ts.map +1 -0
- package/dist/src/framer/cache/unary.d.ts +37 -0
- package/dist/src/framer/cache/unary.d.ts.map +1 -0
- package/dist/src/framer/client.d.ts +35 -14
- package/dist/src/framer/client.d.ts.map +1 -1
- package/dist/src/framer/codec.d.ts.map +1 -1
- package/dist/src/framer/deleter.d.ts +3 -2
- package/dist/src/framer/deleter.d.ts.map +1 -1
- package/dist/src/framer/external.d.ts +6 -0
- package/dist/src/framer/external.d.ts.map +1 -1
- package/dist/src/framer/feed.d.ts +40 -0
- package/dist/src/framer/feed.d.ts.map +1 -0
- package/dist/src/framer/frame.d.ts +16 -20
- package/dist/src/framer/frame.d.ts.map +1 -1
- package/dist/src/framer/hardened.d.ts +70 -0
- package/dist/src/framer/hardened.d.ts.map +1 -0
- package/dist/src/framer/iterator.d.ts +36 -43
- package/dist/src/framer/iterator.d.ts.map +1 -1
- package/dist/src/framer/reader.d.ts +3 -2
- package/dist/src/framer/reader.d.ts.map +1 -1
- package/dist/src/framer/streamer.d.ts +132 -205
- package/dist/src/framer/streamer.d.ts.map +1 -1
- package/dist/src/framer/writer.d.ts +130 -161
- package/dist/src/framer/writer.d.ts.map +1 -1
- package/dist/src/group/client.d.ts +66 -9
- package/dist/src/group/client.d.ts.map +1 -1
- package/dist/src/group/types.gen.d.ts +2 -2
- package/dist/src/http/external.d.ts +2 -0
- package/dist/src/http/external.d.ts.map +1 -0
- package/dist/src/http/index.d.ts +2 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/types.gen.d.ts +451 -0
- package/dist/src/http/types.gen.d.ts.map +1 -0
- package/dist/src/imex/client.d.ts +88 -0
- package/dist/src/imex/client.d.ts.map +1 -0
- package/dist/src/imex/index.d.ts +2 -0
- package/dist/src/imex/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +18 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/label/client.d.ts +55 -36
- package/dist/src/label/client.d.ts.map +1 -1
- package/dist/src/label/external.d.ts +2 -0
- package/dist/src/label/external.d.ts.map +1 -1
- package/dist/src/label/payload.d.ts +4 -46
- package/dist/src/label/payload.d.ts.map +1 -1
- package/dist/src/label/store.d.ts +8 -0
- package/dist/src/label/store.d.ts.map +1 -0
- package/dist/src/label/types.gen.d.ts +45 -0
- package/dist/src/label/types.gen.d.ts.map +1 -0
- package/dist/src/labjack/external.d.ts +2 -0
- package/dist/src/labjack/external.d.ts.map +1 -0
- package/dist/src/labjack/index.d.ts +2 -0
- package/dist/src/labjack/index.d.ts.map +1 -0
- package/dist/src/labjack/types.gen.d.ts +442 -0
- package/dist/src/labjack/types.gen.d.ts.map +1 -0
- package/dist/src/lineplot/actions.d.ts +914 -0
- package/dist/src/lineplot/actions.d.ts.map +1 -0
- package/dist/src/lineplot/actions.gen.d.ts +4208 -0
- package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
- package/dist/src/lineplot/client.d.ts +66 -16
- package/dist/src/lineplot/client.d.ts.map +1 -1
- package/dist/src/lineplot/external.d.ts +3 -0
- package/dist/src/lineplot/external.d.ts.map +1 -1
- package/dist/src/lineplot/line.d.ts +16 -0
- package/dist/src/lineplot/line.d.ts.map +1 -0
- package/dist/src/lineplot/types.gen.d.ts +837 -14
- package/dist/src/lineplot/types.gen.d.ts.map +1 -1
- package/dist/src/log/actions.d.ts +271 -0
- package/dist/src/log/actions.d.ts.map +1 -0
- package/dist/src/log/actions.gen.d.ts +1529 -0
- package/dist/src/log/actions.gen.d.ts.map +1 -0
- package/dist/src/log/client.d.ts +66 -16
- package/dist/src/log/client.d.ts.map +1 -1
- package/dist/src/log/external.d.ts +2 -0
- package/dist/src/log/external.d.ts.map +1 -1
- package/dist/src/log/types.gen.d.ts +139 -14
- package/dist/src/log/types.gen.d.ts.map +1 -1
- package/dist/src/modbus/external.d.ts +2 -0
- package/dist/src/modbus/external.d.ts.map +1 -0
- package/dist/src/modbus/index.d.ts +2 -0
- package/dist/src/modbus/index.d.ts.map +1 -0
- package/dist/src/modbus/types.gen.d.ts +280 -0
- package/dist/src/modbus/types.gen.d.ts.map +1 -0
- package/dist/src/ni/external.d.ts +2 -0
- package/dist/src/ni/external.d.ts.map +1 -0
- package/dist/src/ni/index.d.ts +2 -0
- package/dist/src/ni/index.d.ts.map +1 -0
- package/dist/src/ni/types.gen.d.ts +21029 -0
- package/dist/src/ni/types.gen.d.ts.map +1 -0
- package/dist/src/node/index.d.ts +2 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/types.gen.d.ts +4 -0
- package/dist/src/node/types.gen.d.ts.map +1 -0
- package/dist/src/ontology/client.d.ts +314 -67
- package/dist/src/ontology/client.d.ts.map +1 -1
- package/dist/src/ontology/external.d.ts +1 -0
- package/dist/src/ontology/external.d.ts.map +1 -1
- package/dist/src/ontology/payload.d.ts +60 -18
- package/dist/src/ontology/payload.d.ts.map +1 -1
- package/dist/src/ontology/store.d.ts +32 -0
- package/dist/src/ontology/store.d.ts.map +1 -0
- package/dist/src/ontology/types.gen.d.ts +3 -2
- package/dist/src/ontology/types.gen.d.ts.map +1 -1
- package/dist/src/ontology/writer.d.ts +16 -10
- package/dist/src/ontology/writer.d.ts.map +1 -1
- package/dist/src/opcua/external.d.ts +2 -0
- package/dist/src/opcua/external.d.ts.map +1 -0
- package/dist/src/opcua/index.d.ts +2 -0
- package/dist/src/opcua/index.d.ts.map +1 -0
- package/dist/src/opcua/types.gen.d.ts +82 -0
- package/dist/src/opcua/types.gen.d.ts.map +1 -0
- package/dist/src/pagerduty/external.d.ts +2 -0
- package/dist/src/pagerduty/external.d.ts.map +1 -0
- package/dist/src/pagerduty/index.d.ts +2 -0
- package/dist/src/pagerduty/index.d.ts.map +1 -0
- package/dist/src/pagerduty/types.gen.d.ts +30 -0
- package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
- package/dist/src/panel/actions.d.ts +273 -0
- package/dist/src/panel/actions.d.ts.map +1 -0
- package/dist/src/panel/actions.gen.d.ts +1255 -0
- package/dist/src/panel/actions.gen.d.ts.map +1 -0
- package/dist/src/panel/client.d.ts +148 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/external.d.ts +6 -0
- package/dist/src/panel/external.d.ts.map +1 -0
- package/dist/src/panel/index.d.ts +2 -0
- package/dist/src/panel/index.d.ts.map +1 -0
- package/dist/src/panel/tree.d.ts +50 -0
- package/dist/src/panel/tree.d.ts.map +1 -0
- package/dist/src/panel/types.gen.d.ts +370 -0
- package/dist/src/panel/types.gen.d.ts.map +1 -0
- package/dist/src/project/client.d.ts +89 -0
- package/dist/src/project/client.d.ts.map +1 -0
- package/dist/src/project/external.d.ts.map +1 -0
- package/dist/src/project/index.d.ts +2 -0
- package/dist/src/project/index.d.ts.map +1 -0
- package/dist/src/project/types.gen.d.ts +27 -0
- package/dist/src/project/types.gen.d.ts.map +1 -0
- package/dist/src/query/cache.d.ts +132 -0
- package/dist/src/query/cache.d.ts.map +1 -0
- package/dist/src/query/deleted.d.ts +20 -0
- package/dist/src/query/deleted.d.ts.map +1 -0
- package/dist/src/query/derived.d.ts +33 -0
- package/dist/src/query/derived.d.ts.map +1 -0
- package/dist/src/query/external.d.ts +10 -0
- package/dist/src/query/external.d.ts.map +1 -0
- package/dist/src/query/index.d.ts +2 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/query.d.ts +235 -0
- package/dist/src/query/query.d.ts.map +1 -0
- package/dist/src/query/retriever.d.ts +135 -0
- package/dist/src/query/retriever.d.ts.map +1 -0
- package/dist/src/query/streamer.d.ts +67 -0
- package/dist/src/query/streamer.d.ts.map +1 -0
- package/dist/src/query/table.d.ts +219 -0
- package/dist/src/query/table.d.ts.map +1 -0
- package/dist/src/query/types.d.ts +35 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/write.d.ts +21 -0
- package/dist/src/query/write.d.ts.map +1 -0
- package/dist/src/rack/client.d.ts +58 -20
- package/dist/src/rack/client.d.ts.map +1 -1
- package/dist/src/rack/types.gen.d.ts +11 -12
- package/dist/src/rack/types.gen.d.ts.map +1 -1
- package/dist/src/range/alias/types.gen.d.ts +2 -3
- package/dist/src/range/alias/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/client.d.ts +138 -27
- package/dist/src/ranger/client.d.ts.map +1 -1
- package/dist/src/ranger/kv/client.d.ts +7 -4
- package/dist/src/ranger/kv/client.d.ts.map +1 -1
- package/dist/src/ranger/payload.d.ts +3 -0
- package/dist/src/ranger/payload.d.ts.map +1 -1
- package/dist/src/ranger/types.gen.d.ts +45 -101
- package/dist/src/ranger/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/writer.d.ts +2 -74
- package/dist/src/ranger/writer.d.ts.map +1 -1
- package/dist/src/schematic/actions.d.ts +90 -33
- package/dist/src/schematic/actions.d.ts.map +1 -1
- package/dist/src/schematic/actions.gen.d.ts +207 -114
- package/dist/src/schematic/actions.gen.d.ts.map +1 -1
- package/dist/src/schematic/client.d.ts +70 -68
- package/dist/src/schematic/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/client.d.ts +133 -27
- package/dist/src/schematic/symbol/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
- package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
- package/dist/src/schematic/types.gen.d.ts +17 -96
- package/dist/src/schematic/types.gen.d.ts.map +1 -1
- package/dist/src/status/client.d.ts +69 -14
- package/dist/src/status/client.d.ts.map +1 -1
- package/dist/src/status/external.d.ts +2 -0
- package/dist/src/status/external.d.ts.map +1 -1
- package/dist/src/status/payload.d.ts +2 -36
- package/dist/src/status/payload.d.ts.map +1 -1
- package/dist/src/status/status.d.ts +65 -0
- package/dist/src/status/status.d.ts.map +1 -0
- package/dist/src/status/types.gen.d.ts +58 -0
- package/dist/src/status/types.gen.d.ts.map +1 -0
- package/dist/src/table/actions.d.ts +72 -13
- package/dist/src/table/actions.d.ts.map +1 -1
- package/dist/src/table/actions.gen.d.ts +221 -137
- package/dist/src/table/actions.gen.d.ts.map +1 -1
- package/dist/src/table/client.d.ts +64 -40
- package/dist/src/table/client.d.ts.map +1 -1
- package/dist/src/table/types.gen.d.ts +20 -55
- package/dist/src/table/types.gen.d.ts.map +1 -1
- package/dist/src/task/client.d.ts +149 -28
- package/dist/src/task/client.d.ts.map +1 -1
- package/dist/src/task/types.gen.d.ts +71 -89
- package/dist/src/task/types.gen.d.ts.map +1 -1
- package/dist/src/testutil/access.d.ts +27 -1
- package/dist/src/testutil/access.d.ts.map +1 -1
- package/dist/src/testutil/channels.d.ts +2 -0
- package/dist/src/testutil/channels.d.ts.map +1 -1
- package/dist/src/testutil/client.d.ts +5 -0
- package/dist/src/testutil/client.d.ts.map +1 -1
- package/dist/src/testutil/connection.d.ts +10 -0
- package/dist/src/testutil/connection.d.ts.map +1 -0
- package/dist/src/testutil/index.d.ts +9 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/panels.d.ts +8 -0
- package/dist/src/testutil/panels.d.ts.map +1 -0
- package/dist/src/testutil/proxy.d.ts +29 -0
- package/dist/src/testutil/proxy.d.ts.map +1 -0
- package/dist/src/testutil/query.d.ts +7 -0
- package/dist/src/testutil/query.d.ts.map +1 -0
- package/dist/src/testutil/telem.d.ts +4 -0
- package/dist/src/testutil/telem.d.ts.map +1 -1
- package/dist/src/transport.d.ts +10 -4
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/user/client.d.ts +29 -28
- package/dist/src/user/client.d.ts.map +1 -1
- package/dist/src/user/external.d.ts +1 -1
- package/dist/src/user/external.d.ts.map +1 -1
- package/dist/src/user/types.gen.d.ts +4 -4
- package/dist/src/util/retrieve.d.ts +2 -2
- package/dist/src/util/retrieve.d.ts.map +1 -1
- package/dist/src/util/telem.d.ts.map +1 -1
- package/dist/src/view/client.d.ts +30 -14
- package/dist/src/view/client.d.ts.map +1 -1
- package/dist/src/view/types.gen.d.ts +7 -15
- package/dist/src/view/types.gen.d.ts.map +1 -1
- package/dist/testutil.js +189 -0
- package/dist/testutil.js.map +1 -0
- package/package.json +40 -17
- package/src/access/client.ts +14 -3
- package/src/access/enforce.ts +0 -3
- package/src/access/external.ts +1 -0
- package/src/access/granted.ts +114 -0
- package/src/access/policy/client.ts +135 -43
- package/src/access/policy/types.gen.ts +9 -11
- package/src/access/role/client.ts +160 -38
- package/src/access/role/types.gen.ts +8 -12
- package/src/actions/actions.ts +5 -6
- package/src/actions/controller.ts +626 -0
- package/src/actions/external.ts +11 -0
- package/src/arc/actions.gen.ts +313 -0
- package/src/arc/actions.ts +192 -0
- package/src/arc/client.ts +424 -41
- package/src/arc/compiler/types.gen.ts +5 -6
- package/src/arc/external.ts +2 -0
- package/src/arc/graph/types.gen.ts +24 -22
- package/src/arc/ir/index.ts +1 -1
- package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
- package/src/arc/ir/types.gen.ts +42 -41
- package/src/arc/text/types.gen.ts +21 -2
- package/src/arc/types/types.gen.ts +40 -32
- package/src/arc/types.gen.ts +31 -29
- package/src/auth/auth.ts +40 -8
- package/src/channel/client.ts +529 -132
- package/src/channel/external.ts +0 -1
- package/src/channel/payload.ts +30 -3
- package/src/channel/types.gen.ts +37 -48
- package/src/channel/writer.ts +2 -11
- package/src/client.ts +215 -91
- package/src/connection/client.ts +495 -0
- package/src/connection/external.ts +34 -0
- package/src/connection/index.ts +1 -1
- package/src/connection/status.ts +442 -0
- package/src/control/client.ts +84 -12
- package/src/control/state.ts +17 -36
- package/src/device/client.ts +293 -41
- package/src/device/types.gen.ts +15 -26
- package/src/errors.ts +45 -22
- package/src/{workspace → ethercat}/external.ts +1 -2
- package/src/{workspace → ethercat}/index.ts +1 -1
- package/src/ethercat/types.gen.ts +151 -0
- package/src/framer/adapter.ts +60 -37
- package/src/framer/benchutil.ts +67 -0
- package/src/framer/cache/cache.ts +115 -0
- package/src/framer/cache/dynamic.ts +279 -0
- package/src/framer/cache/reader.ts +160 -0
- package/src/framer/cache/static.ts +215 -0
- package/src/framer/cache/streamer.ts +391 -0
- package/src/framer/cache/transform.ts +31 -0
- package/src/framer/cache/unary.ts +104 -0
- package/src/framer/client.ts +71 -43
- package/src/framer/codec.ts +55 -18
- package/src/framer/deleter.ts +4 -6
- package/src/framer/external.ts +10 -0
- package/src/framer/feed.ts +108 -0
- package/src/framer/frame.ts +13 -23
- package/src/framer/hardened.ts +283 -0
- package/src/framer/iterator.ts +31 -42
- package/src/framer/reader.ts +11 -11
- package/src/framer/streamer.ts +18 -178
- package/src/framer/writer.ts +39 -59
- package/src/group/client.ts +158 -23
- package/src/http/external.ts +10 -0
- package/src/{cluster → http}/index.ts +1 -1
- package/src/http/types.gen.ts +245 -0
- package/src/imex/client.ts +125 -0
- package/src/imex/index.ts +10 -0
- package/src/index.ts +18 -6
- package/src/label/client.ts +193 -54
- package/src/label/external.ts +2 -0
- package/src/label/payload.ts +4 -9
- package/src/label/store.ts +28 -0
- package/src/label/types.gen.ts +31 -0
- package/src/labjack/external.ts +10 -0
- package/src/labjack/index.ts +10 -0
- package/src/labjack/types.gen.ts +251 -0
- package/src/lineplot/actions.gen.ts +880 -0
- package/src/lineplot/actions.ts +535 -0
- package/src/lineplot/client.ts +224 -52
- package/src/lineplot/external.ts +3 -0
- package/src/lineplot/line.ts +80 -0
- package/src/lineplot/types.gen.ts +225 -12
- package/src/log/actions.gen.ts +474 -0
- package/src/log/actions.ts +242 -0
- package/src/log/client.ts +223 -52
- package/src/log/external.ts +2 -0
- package/src/log/types.gen.ts +45 -14
- package/src/modbus/external.ts +10 -0
- package/src/modbus/index.ts +10 -0
- package/src/modbus/types.gen.ts +185 -0
- package/src/ni/external.ts +10 -0
- package/src/ni/index.ts +10 -0
- package/src/ni/types.gen.ts +1632 -0
- package/src/node/index.ts +10 -0
- package/src/{cluster → node}/types.gen.ts +2 -2
- package/src/ontology/client.ts +408 -99
- package/src/ontology/external.ts +7 -0
- package/src/ontology/payload.ts +48 -7
- package/src/ontology/store.ts +83 -0
- package/src/ontology/types.gen.ts +2 -1
- package/src/ontology/writer.ts +1 -0
- package/src/opcua/external.ts +10 -0
- package/src/opcua/index.ts +10 -0
- package/src/opcua/types.gen.ts +65 -0
- package/src/pagerduty/external.ts +10 -0
- package/src/pagerduty/index.ts +10 -0
- package/src/pagerduty/types.gen.ts +41 -0
- package/src/panel/actions.gen.ts +267 -0
- package/src/panel/actions.ts +357 -0
- package/src/panel/client.ts +327 -0
- package/src/panel/external.ts +14 -0
- package/src/panel/index.ts +10 -0
- package/src/panel/tree.ts +163 -0
- package/src/panel/types.gen.ts +164 -0
- package/src/project/client.ts +273 -0
- package/src/project/external.ts +11 -0
- package/src/project/index.ts +10 -0
- package/src/project/types.gen.ts +40 -0
- package/src/query/cache.ts +326 -0
- package/src/query/deleted.ts +38 -0
- package/src/query/derived.ts +101 -0
- package/src/query/external.ts +51 -0
- package/src/query/index.ts +10 -0
- package/src/query/query.ts +865 -0
- package/src/query/retriever.ts +308 -0
- package/src/query/streamer.ts +207 -0
- package/src/query/table.ts +625 -0
- package/src/query/types.ts +54 -0
- package/src/query/write.ts +42 -0
- package/src/rack/client.ts +233 -45
- package/src/rack/types.gen.ts +15 -16
- package/src/range/alias/types.gen.ts +2 -3
- package/src/ranger/client.ts +581 -70
- package/src/ranger/kv/client.ts +52 -21
- package/src/ranger/payload.ts +3 -0
- package/src/ranger/types.gen.ts +21 -23
- package/src/ranger/writer.ts +4 -8
- package/src/schematic/actions.gen.ts +62 -53
- package/src/schematic/actions.ts +44 -42
- package/src/schematic/client.ts +226 -70
- package/src/schematic/symbol/client.ts +277 -48
- package/src/schematic/symbol/types.gen.ts +22 -34
- package/src/schematic/types.gen.ts +22 -29
- package/src/status/client.ts +321 -44
- package/src/status/external.ts +2 -0
- package/src/status/payload.ts +1 -23
- package/src/status/status.ts +241 -0
- package/src/status/types.gen.ts +108 -0
- package/src/table/actions.gen.ts +96 -63
- package/src/table/actions.ts +44 -19
- package/src/table/client.ts +220 -56
- package/src/table/types.gen.ts +24 -31
- package/src/task/client.ts +580 -101
- package/src/task/types.gen.ts +68 -75
- package/src/testutil/access.ts +102 -6
- package/src/testutil/channels.ts +29 -0
- package/src/testutil/client.ts +27 -2
- package/src/testutil/connection.ts +47 -0
- package/src/testutil/index.ts +17 -0
- package/src/testutil/panels.ts +26 -0
- package/src/testutil/proxy.ts +106 -0
- package/src/testutil/query.ts +28 -0
- package/src/testutil/telem.ts +17 -1
- package/src/transport.ts +18 -7
- package/src/user/client.ts +165 -64
- package/src/user/external.ts +1 -1
- package/src/user/types.gen.ts +5 -5
- package/src/util/retrieve.ts +4 -4
- package/src/util/telem.ts +0 -1
- package/src/view/client.ts +120 -37
- package/src/view/types.gen.ts +8 -11
- package/.turbo/turbo-build.log +0 -20
- package/.vscode/settings.json +0 -3
- package/CONTRIBUTING.md +0 -47
- package/dist/client.cjs +0 -118
- package/dist/eslint.config.d.ts +0 -4
- package/dist/eslint.config.d.ts.map +0 -1
- package/dist/src/access/enforce.spec.d.ts +0 -2
- package/dist/src/access/enforce.spec.d.ts.map +0 -1
- package/dist/src/access/policy/access.spec.d.ts +0 -2
- package/dist/src/access/policy/access.spec.d.ts.map +0 -1
- package/dist/src/access/role/role.spec.d.ts +0 -2
- package/dist/src/access/role/role.spec.d.ts.map +0 -1
- package/dist/src/actions/actions.spec.d.ts +0 -2
- package/dist/src/actions/actions.spec.d.ts.map +0 -1
- package/dist/src/arc/access.spec.d.ts +0 -2
- package/dist/src/arc/access.spec.d.ts.map +0 -1
- package/dist/src/arc/arc.spec.d.ts +0 -2
- package/dist/src/arc/arc.spec.d.ts.map +0 -1
- package/dist/src/arc/lsp.spec.d.ts +0 -2
- package/dist/src/arc/lsp.spec.d.ts.map +0 -1
- package/dist/src/auth/auth.spec.d.ts +0 -2
- package/dist/src/auth/auth.spec.d.ts.map +0 -1
- package/dist/src/channel/access.spec.d.ts +0 -2
- package/dist/src/channel/access.spec.d.ts.map +0 -1
- package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
- package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
- package/dist/src/channel/channel.spec.d.ts +0 -2
- package/dist/src/channel/channel.spec.d.ts.map +0 -1
- package/dist/src/channel/payload.spec.d.ts +0 -2
- package/dist/src/channel/payload.spec.d.ts.map +0 -1
- package/dist/src/channel/retriever.d.ts +0 -64
- package/dist/src/channel/retriever.d.ts.map +0 -1
- package/dist/src/cluster/index.d.ts +0 -2
- package/dist/src/cluster/index.d.ts.map +0 -1
- package/dist/src/cluster/types.gen.d.ts +0 -4
- package/dist/src/cluster/types.gen.d.ts.map +0 -1
- package/dist/src/connection/checker.d.ts +0 -86
- package/dist/src/connection/checker.d.ts.map +0 -1
- package/dist/src/connection/connection.spec.d.ts +0 -2
- package/dist/src/connection/connection.spec.d.ts.map +0 -1
- package/dist/src/connection.spec.d.ts +0 -2
- package/dist/src/connection.spec.d.ts.map +0 -1
- package/dist/src/control/state.spec.d.ts +0 -2
- package/dist/src/control/state.spec.d.ts.map +0 -1
- package/dist/src/device/access.spec.d.ts +0 -2
- package/dist/src/device/access.spec.d.ts.map +0 -1
- package/dist/src/device/device.spec.d.ts +0 -2
- package/dist/src/device/device.spec.d.ts.map +0 -1
- package/dist/src/device/payload.spec.d.ts +0 -2
- package/dist/src/device/payload.spec.d.ts.map +0 -1
- package/dist/src/errors.spec.d.ts +0 -2
- package/dist/src/errors.spec.d.ts.map +0 -1
- package/dist/src/framer/adapter.spec.d.ts +0 -2
- package/dist/src/framer/adapter.spec.d.ts.map +0 -1
- package/dist/src/framer/client.spec.d.ts +0 -2
- package/dist/src/framer/client.spec.d.ts.map +0 -1
- package/dist/src/framer/codec.spec.d.ts +0 -2
- package/dist/src/framer/codec.spec.d.ts.map +0 -1
- package/dist/src/framer/deleter.spec.d.ts +0 -2
- package/dist/src/framer/deleter.spec.d.ts.map +0 -1
- package/dist/src/framer/frame.spec.d.ts +0 -2
- package/dist/src/framer/frame.spec.d.ts.map +0 -1
- package/dist/src/framer/iterator.spec.d.ts +0 -2
- package/dist/src/framer/iterator.spec.d.ts.map +0 -1
- package/dist/src/framer/reader.spec.d.ts +0 -2
- package/dist/src/framer/reader.spec.d.ts.map +0 -1
- package/dist/src/framer/streamer.spec.d.ts +0 -2
- package/dist/src/framer/streamer.spec.d.ts.map +0 -1
- package/dist/src/framer/writer.spec.d.ts +0 -2
- package/dist/src/framer/writer.spec.d.ts.map +0 -1
- package/dist/src/group/access.spec.d.ts +0 -2
- package/dist/src/group/access.spec.d.ts.map +0 -1
- package/dist/src/group/group.spec.d.ts +0 -2
- package/dist/src/group/group.spec.d.ts.map +0 -1
- package/dist/src/label/access.spec.d.ts +0 -2
- package/dist/src/label/access.spec.d.ts.map +0 -1
- package/dist/src/label/label.spec.d.ts +0 -2
- package/dist/src/label/label.spec.d.ts.map +0 -1
- package/dist/src/lineplot/access.spec.d.ts +0 -2
- package/dist/src/lineplot/access.spec.d.ts.map +0 -1
- package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
- package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
- package/dist/src/log/access.spec.d.ts +0 -2
- package/dist/src/log/access.spec.d.ts.map +0 -1
- package/dist/src/log/log.spec.d.ts +0 -2
- package/dist/src/log/log.spec.d.ts.map +0 -1
- package/dist/src/ontology/ontology.spec.d.ts +0 -2
- package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
- package/dist/src/rack/access.spec.d.ts +0 -2
- package/dist/src/rack/access.spec.d.ts.map +0 -1
- package/dist/src/rack/rack.spec.d.ts +0 -2
- package/dist/src/rack/rack.spec.d.ts.map +0 -1
- package/dist/src/ranger/access.spec.d.ts +0 -2
- package/dist/src/ranger/access.spec.d.ts.map +0 -1
- package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
- package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
- package/dist/src/ranger/ranger.spec.d.ts +0 -2
- package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
- package/dist/src/schematic/access.spec.d.ts +0 -2
- package/dist/src/schematic/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/actions.spec.d.ts +0 -2
- package/dist/src/schematic/actions.spec.d.ts.map +0 -1
- package/dist/src/schematic/schematic.spec.d.ts +0 -2
- package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
- package/dist/src/status/access.spec.d.ts +0 -2
- package/dist/src/status/access.spec.d.ts.map +0 -1
- package/dist/src/status/status.spec.d.ts +0 -2
- package/dist/src/status/status.spec.d.ts.map +0 -1
- package/dist/src/table/access.spec.d.ts +0 -2
- package/dist/src/table/access.spec.d.ts.map +0 -1
- package/dist/src/table/table.spec.d.ts +0 -2
- package/dist/src/table/table.spec.d.ts.map +0 -1
- package/dist/src/task/access.spec.d.ts +0 -2
- package/dist/src/task/access.spec.d.ts.map +0 -1
- package/dist/src/task/payload.spec.d.ts +0 -2
- package/dist/src/task/payload.spec.d.ts.map +0 -1
- package/dist/src/task/task.spec.d.ts +0 -2
- package/dist/src/task/task.spec.d.ts.map +0 -1
- package/dist/src/user/access.spec.d.ts +0 -2
- package/dist/src/user/access.spec.d.ts.map +0 -1
- package/dist/src/user/user.spec.d.ts +0 -2
- package/dist/src/user/user.spec.d.ts.map +0 -1
- package/dist/src/util/retrieve.spec.d.ts +0 -2
- package/dist/src/util/retrieve.spec.d.ts.map +0 -1
- package/dist/src/view/view.spec.d.ts +0 -2
- package/dist/src/view/view.spec.d.ts.map +0 -1
- package/dist/src/workspace/access.spec.d.ts +0 -2
- package/dist/src/workspace/access.spec.d.ts.map +0 -1
- package/dist/src/workspace/client.d.ts +0 -36
- package/dist/src/workspace/client.d.ts.map +0 -1
- package/dist/src/workspace/external.d.ts.map +0 -1
- package/dist/src/workspace/index.d.ts +0 -2
- package/dist/src/workspace/index.d.ts.map +0 -1
- package/dist/src/workspace/types.gen.d.ts +0 -34
- package/dist/src/workspace/types.gen.d.ts.map +0 -1
- package/dist/src/workspace/workspace.spec.d.ts +0 -2
- package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
- package/examples/node/basicReadWrite.js +0 -86
- package/examples/node/createChannels.js +0 -50
- package/examples/node/createRange.js +0 -67
- package/examples/node/package-lock.json +0 -133
- package/examples/node/package.json +0 -17
- package/examples/node/readLatest.js +0 -76
- package/examples/node/seriesAndFrames.js +0 -173
- package/examples/node/streamRead.js +0 -50
- package/examples/node/streamWrite.js +0 -87
- package/src/access/enforce.spec.ts +0 -188
- package/src/access/policy/access.spec.ts +0 -147
- package/src/access/role/role.spec.ts +0 -95
- package/src/actions/actions.spec.ts +0 -229
- package/src/arc/access.spec.ts +0 -149
- package/src/arc/arc.spec.ts +0 -44
- package/src/arc/lsp.spec.ts +0 -717
- package/src/auth/auth.spec.ts +0 -101
- package/src/channel/access.spec.ts +0 -116
- package/src/channel/batchRetriever.spec.ts +0 -115
- package/src/channel/channel.spec.ts +0 -352
- package/src/channel/payload.spec.ts +0 -117
- package/src/channel/retriever.ts +0 -252
- package/src/connection/checker.ts +0 -203
- package/src/connection/connection.spec.ts +0 -152
- package/src/connection.spec.ts +0 -145
- package/src/control/state.spec.ts +0 -22
- package/src/device/access.spec.ts +0 -159
- package/src/device/device.spec.ts +0 -461
- package/src/device/payload.spec.ts +0 -142
- package/src/errors.spec.ts +0 -71
- package/src/framer/adapter.spec.ts +0 -620
- package/src/framer/client.spec.ts +0 -180
- package/src/framer/codec.spec.ts +0 -383
- package/src/framer/deleter.spec.ts +0 -103
- package/src/framer/frame.spec.ts +0 -973
- package/src/framer/iterator.spec.ts +0 -169
- package/src/framer/reader.spec.ts +0 -865
- package/src/framer/streamer.spec.ts +0 -871
- package/src/framer/writer.spec.ts +0 -486
- package/src/group/access.spec.ts +0 -77
- package/src/group/group.spec.ts +0 -65
- package/src/label/access.spec.ts +0 -109
- package/src/label/label.spec.ts +0 -83
- package/src/lineplot/access.spec.ts +0 -134
- package/src/lineplot/lineplot.spec.ts +0 -120
- package/src/log/access.spec.ts +0 -132
- package/src/log/log.spec.ts +0 -106
- package/src/ontology/ontology.spec.ts +0 -521
- package/src/rack/access.spec.ts +0 -102
- package/src/rack/rack.spec.ts +0 -171
- package/src/ranger/access.spec.ts +0 -115
- package/src/ranger/alias/payload.spec.ts +0 -52
- package/src/ranger/ranger.spec.ts +0 -343
- package/src/schematic/access.spec.ts +0 -134
- package/src/schematic/actions.spec.ts +0 -699
- package/src/schematic/schematic.spec.ts +0 -340
- package/src/schematic/symbol/access.spec.ts +0 -172
- package/src/schematic/symbol/client.spec.ts +0 -160
- package/src/status/access.spec.ts +0 -129
- package/src/status/status.spec.ts +0 -448
- package/src/table/access.spec.ts +0 -128
- package/src/table/table.spec.ts +0 -651
- package/src/task/access.spec.ts +0 -131
- package/src/task/payload.spec.ts +0 -113
- package/src/task/task.spec.ts +0 -657
- package/src/user/access.spec.ts +0 -107
- package/src/user/user.spec.ts +0 -290
- package/src/util/retrieve.spec.ts +0 -49
- package/src/view/view.spec.ts +0 -165
- package/src/workspace/access.spec.ts +0 -108
- package/src/workspace/client.ts +0 -112
- package/src/workspace/types.gen.ts +0 -46
- package/src/workspace/workspace.spec.ts +0 -111
- package/tsconfig.json +0 -5
- package/tsconfig.vite.json +0 -4
- package/vite.config.ts +0 -29
- /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
|
-
|
|
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
|
|
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 =
|
|
50
|
-
export type RetrieveMultipleParams = z.input<typeof
|
|
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
|
-
|
|
50
|
+
interface RetrieveRequest extends z.infer<typeof retrieveRequestZ> {}
|
|
55
51
|
|
|
56
|
-
const retrieveResZ = z.object({ policies: array.
|
|
52
|
+
const retrieveResZ = z.object({ policies: policyZ.array().default(() => []) });
|
|
57
53
|
|
|
58
|
-
const
|
|
59
|
-
export type
|
|
54
|
+
const singleCreateParamsZ = policyZ.transform((p) => ({ policies: [p] }));
|
|
55
|
+
export type SingleCreateParams = z.input<typeof singleCreateParamsZ>;
|
|
60
56
|
|
|
61
|
-
export const
|
|
57
|
+
export const multipleCreateParamsZ = policyZ
|
|
58
|
+
.array()
|
|
59
|
+
.transform((policies) => ({ policies }));
|
|
62
60
|
|
|
63
|
-
export const
|
|
64
|
-
export type
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
74
|
-
|
|
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:
|
|
123
|
+
async create(policies: CreateParams): Promise<Policy | Policy[]> {
|
|
80
124
|
const isMany = Array.isArray(policies);
|
|
81
|
-
const res = await this.
|
|
125
|
+
const res = await this.cfg.unary.send(
|
|
82
126
|
"/access/policy/create",
|
|
83
127
|
policies,
|
|
84
|
-
|
|
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
|
|
91
|
-
async
|
|
92
|
-
async
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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 {
|
|
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
|
-
*
|
|
24
|
-
*
|
|
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:
|
|
32
|
+
objects: ontology.idZ.array().default(() => []),
|
|
33
33
|
/** actions is the list of actions this policy permits. */
|
|
34
|
-
actions:
|
|
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)
|
|
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 {
|
|
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
|
|
29
|
-
export type
|
|
42
|
+
const singleCreateParamsZ = roleZ.transform((r) => ({ roles: [r] }));
|
|
43
|
+
export type SingleCreateParams = z.input<typeof singleCreateParamsZ>;
|
|
30
44
|
|
|
31
|
-
export const
|
|
45
|
+
export const multipleCreateParamsZ = roleZ.array().transform((roles) => ({ roles }));
|
|
32
46
|
|
|
33
|
-
export const
|
|
34
|
-
export type
|
|
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.
|
|
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
|
|
43
|
-
export type
|
|
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
|
|
63
|
+
const deleteParamsZ = keyZ
|
|
48
64
|
.transform((key) => ({ keys: [key] }))
|
|
49
65
|
.or(keyZ.array().transform((keys) => ({ keys })));
|
|
50
|
-
export type
|
|
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
|
|
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
|
|
80
|
+
export type UnassignParams = z.input<typeof unassignReqZ>;
|
|
65
81
|
|
|
66
82
|
const unassignResZ = z.object({});
|
|
67
83
|
|
|
68
|
-
|
|
69
|
-
|
|
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
|
|
72
|
-
|
|
103
|
+
export interface ClientConfig {
|
|
104
|
+
unary: UnaryClient;
|
|
105
|
+
cache: query.Cache;
|
|
106
|
+
ontology: ontology.Client;
|
|
107
|
+
}
|
|
73
108
|
|
|
74
|
-
|
|
75
|
-
|
|
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.
|
|
140
|
+
const res = await this.cfg.unary.send(
|
|
83
141
|
"/access/role/create",
|
|
84
142
|
roles,
|
|
85
|
-
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
105
|
-
await this.
|
|
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
|
|
109
|
-
await
|
|
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
|
|
113
|
-
await this.
|
|
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
|
}
|