@synnaxlabs/client 0.56.2 → 0.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-DDACDVZ-.js +14505 -0
- package/dist/client-DDACDVZ-.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 +91 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +57 -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 +39 -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 +39 -16
- 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 +340 -0
- package/src/framer/cache/reader.ts +231 -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 +108 -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 +19 -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
package/src/framer/streamer.ts
CHANGED
|
@@ -8,12 +8,12 @@
|
|
|
8
8
|
// included in the file licenses/APL.txt.
|
|
9
9
|
|
|
10
10
|
import { EOF, type Stream, type WebSocketClient } from "@synnaxlabs/freighter";
|
|
11
|
-
import {
|
|
11
|
+
import { errors, Rate, zod } from "@synnaxlabs/x";
|
|
12
12
|
import { z } from "zod";
|
|
13
13
|
|
|
14
14
|
import { type channel } from "@/channel";
|
|
15
15
|
import { paramsZ } from "@/channel/payload";
|
|
16
|
-
import { ReadAdapter } from "@/framer/adapter";
|
|
16
|
+
import { type ChannelRetriever, ReadAdapter } from "@/framer/adapter";
|
|
17
17
|
import { WSStreamerCodec } from "@/framer/codec";
|
|
18
18
|
import { Frame, frameZ } from "@/framer/frame";
|
|
19
19
|
import { StreamProxy } from "@/framer/streamProxy";
|
|
@@ -51,39 +51,25 @@ const intermediateStreamerConfigZ = z.object({
|
|
|
51
51
|
excludeGroups: z.uint32().array().default([]),
|
|
52
52
|
});
|
|
53
53
|
|
|
54
|
+
/** Zod schema for {@link StreamerConfig}. A bare channel list parses as a config. */
|
|
54
55
|
export const streamerConfigZ = intermediateStreamerConfigZ.or(
|
|
55
56
|
paramsZ.transform((channels) => intermediateStreamerConfigZ.parse({ channels })),
|
|
56
57
|
);
|
|
57
58
|
|
|
59
|
+
/** Config for a streamer. Pass it to `client.telem.openStreamer`. */
|
|
58
60
|
export type StreamerConfig = z.input<typeof streamerConfigZ>;
|
|
59
|
-
type ParsedStreamerConfig = z.output<typeof streamerConfigZ>;
|
|
60
61
|
|
|
61
62
|
/**
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
63
|
+
* Streams frames of telemetry from a Synnax cluster in real time. Open one with the
|
|
64
|
+
* client's openStreamer method, never directly. Read frames with `read` or by
|
|
65
|
+
* iterating the streamer. Close it in a `finally` block to free its resources.
|
|
65
66
|
*
|
|
66
|
-
*
|
|
67
|
-
* of channels you'd like to receive data from. Once the streamer has been opened, call
|
|
68
|
-
* the `read` method to read the next frame of telemetry, or use the streamer as an
|
|
69
|
-
* async iterator to iterate over the frames of telemetry as they are received.
|
|
70
|
-
*
|
|
71
|
-
* The list of channels being streamed can be updated at any time by using the `update`
|
|
72
|
-
* method.
|
|
73
|
-
*
|
|
74
|
-
* Once done, call the `close` method to close the streamer and free all associated
|
|
75
|
-
* resources. We recommend using the streamer within a try-finally block to ensure
|
|
76
|
-
* that it is closed properly in the event of an error.
|
|
77
|
-
*
|
|
78
|
-
* For detailed documentation, see https://docs.synnaxlabs.com/reference/client/working-with-data/streaming-data
|
|
67
|
+
* @see https://docs.synnaxlabs.com/reference/client/working-with-data/streaming-data
|
|
79
68
|
*/
|
|
80
69
|
export interface Streamer extends AsyncIterator<Frame>, AsyncIterable<Frame> {
|
|
81
70
|
/** The keys of the channels currently being streamed from. */
|
|
82
71
|
keys: channel.Key[];
|
|
83
|
-
/**
|
|
84
|
-
* Update the list of channels being streamed from. This replaces the list of channels
|
|
85
|
-
* being streamed from with the new list of channels.
|
|
86
|
-
*/
|
|
72
|
+
/** Replaces the list of channels being streamed from. */
|
|
87
73
|
update: (channels: channel.Params) => Promise<void>;
|
|
88
74
|
/** Close the streamer and free all associated resources. */
|
|
89
75
|
close: () => void;
|
|
@@ -91,24 +77,22 @@ export interface Streamer extends AsyncIterator<Frame>, AsyncIterable<Frame> {
|
|
|
91
77
|
read: () => Promise<Frame>;
|
|
92
78
|
}
|
|
93
79
|
|
|
94
|
-
/**
|
|
95
|
-
* A function that opens a streamer.
|
|
96
|
-
*/
|
|
80
|
+
/** A function that opens a streamer. */
|
|
97
81
|
export interface StreamOpener {
|
|
98
82
|
(config: StreamerConfig): Promise<Streamer>;
|
|
99
83
|
}
|
|
100
84
|
|
|
101
85
|
/**
|
|
102
|
-
* Creates a function that opens streamers with the given
|
|
103
|
-
* @param
|
|
86
|
+
* Creates a function that opens streamers with the given channel resolver and client.
|
|
87
|
+
* @param retrieveChannels - Resolves channel params to payloads for the codec
|
|
104
88
|
* @param client - The WebSocket client to use for streaming
|
|
105
89
|
* @returns A function that opens streamers with the given configuration
|
|
106
90
|
*/
|
|
107
91
|
export const createStreamOpener =
|
|
108
|
-
(
|
|
92
|
+
(retrieveChannels: ChannelRetriever, client: WebSocketClient): StreamOpener =>
|
|
109
93
|
async (config) => {
|
|
110
|
-
const cfg =
|
|
111
|
-
const adapter = await ReadAdapter.open(
|
|
94
|
+
const cfg = zod.parse(streamerConfigZ, config, { label: "streamer config" });
|
|
95
|
+
const adapter = await ReadAdapter.open(retrieveChannels, cfg.channels);
|
|
112
96
|
client = client.withCodec(new WSStreamerCodec(adapter.codec));
|
|
113
97
|
const stream = await client.stream("/frame/stream", reqZ, resZ);
|
|
114
98
|
const streamer = new BaseStreamer(
|
|
@@ -130,16 +114,15 @@ export const createStreamOpener =
|
|
|
130
114
|
|
|
131
115
|
/**
|
|
132
116
|
* Opens a new streamer with the given configuration.
|
|
133
|
-
* @param
|
|
117
|
+
* @param retrieveChannels - Resolves channel params to payloads for the codec
|
|
134
118
|
* @param client - The WebSocket client to use for streaming
|
|
135
|
-
* @param config - The configuration for the streamer
|
|
136
119
|
* @returns A promise that resolves to a new streamer
|
|
137
120
|
*/
|
|
138
121
|
export const openStreamer = async (
|
|
139
|
-
|
|
122
|
+
retrieveChannels: ChannelRetriever,
|
|
140
123
|
client: WebSocketClient,
|
|
141
124
|
config: StreamerConfig,
|
|
142
|
-
): Promise<Streamer> => await createStreamOpener(
|
|
125
|
+
): Promise<Streamer> => await createStreamOpener(retrieveChannels, client)(config);
|
|
143
126
|
|
|
144
127
|
class BaseStreamer implements Streamer {
|
|
145
128
|
private readonly stream: StreamProxy<typeof reqZ, typeof resZ>;
|
|
@@ -199,146 +182,3 @@ class BaseStreamer implements Streamer {
|
|
|
199
182
|
return this;
|
|
200
183
|
}
|
|
201
184
|
}
|
|
202
|
-
|
|
203
|
-
/**
|
|
204
|
-
* A hardened streamer that automatically reconnects on failure.
|
|
205
|
-
* This streamer wraps a regular streamer and adds automatic reconnection
|
|
206
|
-
* logic when the connection is lost or errors occur.
|
|
207
|
-
*/
|
|
208
|
-
export class HardenedStreamer implements Streamer {
|
|
209
|
-
private wrapped_: Streamer | null = null;
|
|
210
|
-
private readonly breaker: breaker.Breaker;
|
|
211
|
-
private readonly opener: StreamOpener;
|
|
212
|
-
private readonly config: ParsedStreamerConfig;
|
|
213
|
-
|
|
214
|
-
private constructor(
|
|
215
|
-
opener: StreamOpener,
|
|
216
|
-
config: StreamerConfig,
|
|
217
|
-
breakerConfig: breaker.Config = {},
|
|
218
|
-
) {
|
|
219
|
-
this.opener = opener;
|
|
220
|
-
this.config = streamerConfigZ.parse(config);
|
|
221
|
-
const {
|
|
222
|
-
maxRetries = 5000,
|
|
223
|
-
baseInterval = TimeSpan.seconds(1),
|
|
224
|
-
scale = 1,
|
|
225
|
-
} = breakerConfig ?? {};
|
|
226
|
-
this.breaker = new breaker.Breaker({ maxRetries, baseInterval, scale });
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
/**
|
|
230
|
-
* Opens a new hardened streamer with the given configuration.
|
|
231
|
-
* @param opener - The function to use for opening streamers
|
|
232
|
-
* @param config - The configuration for the streamer
|
|
233
|
-
* @returns A promise that resolves to a new hardened streamer
|
|
234
|
-
*/
|
|
235
|
-
static async open(
|
|
236
|
-
opener: StreamOpener,
|
|
237
|
-
config: StreamerConfig,
|
|
238
|
-
breakerConfig?: breaker.Config,
|
|
239
|
-
): Promise<HardenedStreamer> {
|
|
240
|
-
const h = new HardenedStreamer(opener, config, breakerConfig);
|
|
241
|
-
await h.runStreamer();
|
|
242
|
-
return h;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
private async runStreamer(): Promise<void> {
|
|
246
|
-
while (true)
|
|
247
|
-
try {
|
|
248
|
-
if (this.wrapped_ != null) this.wrapped_.close();
|
|
249
|
-
this.wrapped_ = await this.opener(this.config);
|
|
250
|
-
this.breaker.reset();
|
|
251
|
-
return;
|
|
252
|
-
} catch (e) {
|
|
253
|
-
this.wrapped_ = null;
|
|
254
|
-
if (!(await this.breaker.wait())) throw errors.fromUnknown(e);
|
|
255
|
-
console.error("failed to open streamer", e);
|
|
256
|
-
continue;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
private get wrapped(): Streamer {
|
|
261
|
-
if (this.wrapped_ == null) throw new Error("stream closed");
|
|
262
|
-
return this.wrapped_;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
async update(channels: channel.Params): Promise<void> {
|
|
266
|
-
this.config.channels = paramsZ.parse(channels);
|
|
267
|
-
try {
|
|
268
|
-
await this.wrapped.update(channels);
|
|
269
|
-
} catch {
|
|
270
|
-
await this.runStreamer();
|
|
271
|
-
return await this.update(channels);
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
async next(): Promise<IteratorResult<Frame>> {
|
|
276
|
-
try {
|
|
277
|
-
return { done: false, value: await this.read() };
|
|
278
|
-
} catch (e) {
|
|
279
|
-
if (EOF.matches(e)) return { done: true, value: undefined };
|
|
280
|
-
throw errors.fromUnknown(e);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
async read(): Promise<Frame> {
|
|
285
|
-
try {
|
|
286
|
-
const fr = await this.wrapped.read();
|
|
287
|
-
this.breaker.reset();
|
|
288
|
-
return fr;
|
|
289
|
-
} catch (e) {
|
|
290
|
-
if (EOF.matches(e)) throw errors.fromUnknown(e);
|
|
291
|
-
await this.runStreamer();
|
|
292
|
-
return await this.read();
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
close(): void {
|
|
296
|
-
this.wrapped.close();
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
get keys(): channel.Key[] {
|
|
300
|
-
return this.wrapped.keys;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
[Symbol.asyncIterator](): AsyncIterator<Frame> {
|
|
304
|
-
return this;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Wraps a standard streamer to implement an observable interface for handling changes
|
|
310
|
-
* to channel values through an onChange handler.
|
|
311
|
-
*/
|
|
312
|
-
export class ObservableStreamer<V = Frame>
|
|
313
|
-
extends observe.Observer<Frame, V>
|
|
314
|
-
implements observe.ObservableAsyncCloseable<V>
|
|
315
|
-
{
|
|
316
|
-
private readonly streamer: Streamer;
|
|
317
|
-
private readonly closePromise: Promise<void>;
|
|
318
|
-
|
|
319
|
-
/**
|
|
320
|
-
* Creates a new observable streamer.
|
|
321
|
-
* @param streamer - The streamer to wrap
|
|
322
|
-
* @param transform - An optional transform function to apply to each frame
|
|
323
|
-
* @template V - The type of the transformed value. Only relevant if transform is
|
|
324
|
-
* provided. Defaults to Frame.
|
|
325
|
-
*/
|
|
326
|
-
constructor(streamer: Streamer, transform?: observe.Transform<Frame, V>) {
|
|
327
|
-
super(transform);
|
|
328
|
-
this.streamer = streamer;
|
|
329
|
-
this.closePromise = this.stream();
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
async update(channels: channel.Params): Promise<void> {
|
|
333
|
-
await this.streamer.update(channels);
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
async close(): Promise<void> {
|
|
337
|
-
this.streamer.close();
|
|
338
|
-
await this.closePromise;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
private async stream(): Promise<void> {
|
|
342
|
-
for await (const frame of this.streamer) this.notify(frame);
|
|
343
|
-
}
|
|
344
|
-
}
|
package/src/framer/writer.ts
CHANGED
|
@@ -18,19 +18,23 @@ import {
|
|
|
18
18
|
} from "@synnaxlabs/x";
|
|
19
19
|
import { z } from "zod";
|
|
20
20
|
|
|
21
|
-
import { channel } from "@/channel";
|
|
21
|
+
import { type channel } from "@/channel";
|
|
22
|
+
import { paramsZ } from "@/channel/payload";
|
|
23
|
+
import { keyZ, nameZ } from "@/channel/types.gen";
|
|
22
24
|
import { SynnaxError } from "@/errors";
|
|
23
|
-
import { WriteAdapter } from "@/framer/adapter";
|
|
25
|
+
import { type ChannelRetriever, WriteAdapter } from "@/framer/adapter";
|
|
24
26
|
import { WSWriterCodec } from "@/framer/codec";
|
|
25
27
|
import { type CrudeFrame, frameZ } from "@/framer/frame";
|
|
26
28
|
import { WriterCommand } from "@/framer/types.gen";
|
|
27
29
|
|
|
30
|
+
/** Whether a writer persists its samples, streams them to subscribers, or both. */
|
|
28
31
|
export enum WriterMode {
|
|
29
32
|
PersistStream = 1,
|
|
30
33
|
Persist = 2,
|
|
31
34
|
Stream = 3,
|
|
32
35
|
}
|
|
33
36
|
|
|
37
|
+
/** `autoIndexPersistInterval` that flushes the index on every auto commit. */
|
|
34
38
|
export const ALWAYS_INDEX_PERSIST_ON_AUTO_COMMIT: TimeSpan = new TimeSpan(-1);
|
|
35
39
|
|
|
36
40
|
export class WriterClosedError extends SynnaxError.sub("writer_closed") {
|
|
@@ -52,6 +56,7 @@ const writerModeZ = z.enum(WriterMode).or(
|
|
|
52
56
|
}),
|
|
53
57
|
);
|
|
54
58
|
|
|
59
|
+
/** A {@link WriterMode}, or its name as a string. */
|
|
55
60
|
export type CrudeWriterMode = z.input<typeof writerModeZ>;
|
|
56
61
|
|
|
57
62
|
const baseWriterConfigZ = z.object({
|
|
@@ -96,22 +101,24 @@ const baseWriterConfigZ = z.object({
|
|
|
96
101
|
});
|
|
97
102
|
|
|
98
103
|
const netWriterConfigZ = baseWriterConfigZ.extend({
|
|
99
|
-
keys:
|
|
104
|
+
keys: keyZ.array().optional(),
|
|
100
105
|
});
|
|
101
106
|
|
|
102
107
|
export type NetWriterConfig = z.input<typeof netWriterConfigZ>;
|
|
103
108
|
|
|
104
109
|
// Intermediate utility type to allow for the use of paramsZ in the writer config.
|
|
105
110
|
const intermediateWriterConfigZ = baseWriterConfigZ.extend({
|
|
106
|
-
channels:
|
|
111
|
+
channels: paramsZ,
|
|
107
112
|
});
|
|
108
113
|
|
|
114
|
+
/** Zod schema for {@link WriterConfig}. A bare channel list parses as a config. */
|
|
109
115
|
export const writerConfigZ = intermediateWriterConfigZ.or(
|
|
110
|
-
|
|
116
|
+
paramsZ.transform((channels) =>
|
|
111
117
|
intermediateWriterConfigZ.parse({ channels, start: TimeStamp.now() }),
|
|
112
118
|
),
|
|
113
119
|
);
|
|
114
120
|
|
|
121
|
+
/** Config for a writer. Pass it to `client.telem.openWriter`. */
|
|
115
122
|
export type WriterConfig = z.input<typeof writerConfigZ>;
|
|
116
123
|
|
|
117
124
|
const reqZ = z.object({
|
|
@@ -129,11 +136,11 @@ const resZ = z.object({
|
|
|
129
136
|
err: errors.payloadZ.optional(),
|
|
130
137
|
});
|
|
131
138
|
|
|
132
|
-
const
|
|
139
|
+
const authorityParamsZ = z
|
|
133
140
|
.tuple([
|
|
134
141
|
z.union([
|
|
135
|
-
z.record(
|
|
136
|
-
|
|
142
|
+
z.record(keyZ.or(nameZ), control.authorityZ),
|
|
143
|
+
keyZ.or(nameZ),
|
|
137
144
|
control.authorityZ,
|
|
138
145
|
]),
|
|
139
146
|
control.authorityZ.optional(),
|
|
@@ -141,7 +148,7 @@ const authorityArgsZ = z
|
|
|
141
148
|
.transform(([value, authority]) => {
|
|
142
149
|
if (control.authorityZ.safeParse(value).success)
|
|
143
150
|
return { keys: [], authorities: [value as control.Authority] };
|
|
144
|
-
if (
|
|
151
|
+
if (keyZ.or(nameZ).safeParse(value).success) {
|
|
145
152
|
if (authority == null)
|
|
146
153
|
throw new Error(
|
|
147
154
|
"authority is required when setting authority for a single channel",
|
|
@@ -155,49 +162,25 @@ const authorityArgsZ = z
|
|
|
155
162
|
return { keys: Object.keys(oValue), authorities: Object.values(oValue) };
|
|
156
163
|
});
|
|
157
164
|
|
|
158
|
-
|
|
165
|
+
/**
|
|
166
|
+
* Arguments to `Writer.setAuthority`: one authority for every channel, one channel and
|
|
167
|
+
* its authority, or a record of channel to authority.
|
|
168
|
+
*/
|
|
169
|
+
export type AuthorityParams = z.input<typeof authorityParamsZ>;
|
|
159
170
|
|
|
160
171
|
interface Response extends z.infer<typeof resZ> {}
|
|
161
172
|
|
|
162
173
|
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
* The writer is a streaming protocol that is heavily optimized for performance. This
|
|
168
|
-
* comes at the cost of increased complexity, and should only be used directly when
|
|
169
|
-
* writing large volumes of data (such as recording telemetry from a sensor or ingesting
|
|
170
|
-
* data from file). Simpler methods (such as the frame client's write method) should be
|
|
171
|
-
* used for most use cases.
|
|
172
|
-
*
|
|
173
|
-
* The protocol is as follows:
|
|
174
|
-
*
|
|
175
|
-
* 1. The writer is opened with a starting timestamp and a list of channel keys. The
|
|
176
|
-
* writer will fail to open if the starting timestamp overlaps with any existing
|
|
177
|
-
* telemetry for any channels specified. If the writer opens successfully, the caller
|
|
178
|
-
* is then free to write frames to the writer.
|
|
174
|
+
* Writes telemetry to a set of channels in time order. Open one with
|
|
175
|
+
* {@link FrameClient#openWriter}, never directly. Prefer the frame client's write
|
|
176
|
+
* method unless the volume warrants the streaming protocol.
|
|
179
177
|
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
182
|
-
*
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
186
|
-
* which returns the accumulated error and resets the writer for future use. The
|
|
187
|
-
* caller can also check for errors by closing the writer, which will throw any
|
|
188
|
-
* accumulated error.
|
|
189
|
-
*
|
|
190
|
-
* 3. To commit the written frames to the cluster, the caller can call the commit
|
|
191
|
-
* method. Unlike write, commit is synchronous, meaning that it will not return until
|
|
192
|
-
* the frames have been written to the cluster. If the writer has accumulated an
|
|
193
|
-
* error, commit will return false. After the caller acknowledges the error, they can
|
|
194
|
-
* attempt to commit again. Commit can be called several times throughout a writer's
|
|
195
|
-
* lifetime, and will only commit the frames that have been written since the last
|
|
196
|
-
* commit.
|
|
197
|
-
*
|
|
198
|
-
* 4. A writer MUST be closed after use in order to prevent resource leaks. Close should
|
|
199
|
-
* typically be called in a 'finally' block. If the writer has accumulated an error,
|
|
200
|
-
* close will throw the error.
|
|
178
|
+
* Opening fails when the start timestamp overlaps existing telemetry on any of the
|
|
179
|
+
* channels. `write` is asynchronous, so a failure surfaces on a later call: once the
|
|
180
|
+
* writer accumulates an error, every write and commit returns false until `error`
|
|
181
|
+
* reads and clears it. `commit` blocks until the cluster has the frames written since
|
|
182
|
+
* the last commit, and may be called repeatedly. Close in a `finally` block to release
|
|
183
|
+
* resources; close throws any accumulated error.
|
|
201
184
|
*/
|
|
202
185
|
export class Writer {
|
|
203
186
|
private readonly stream: Stream<typeof reqZ, typeof resZ>;
|
|
@@ -210,12 +193,12 @@ export class Writer {
|
|
|
210
193
|
}
|
|
211
194
|
|
|
212
195
|
static async _open(
|
|
213
|
-
|
|
196
|
+
retrieveChannels: ChannelRetriever,
|
|
214
197
|
client: WebSocketClient,
|
|
215
198
|
config: WriterConfig,
|
|
216
199
|
): Promise<Writer> {
|
|
217
200
|
const cfg = zod.parse(writerConfigZ, config);
|
|
218
|
-
const adapter = await WriteAdapter.open(
|
|
201
|
+
const adapter = await WriteAdapter.open(retrieveChannels, cfg.channels);
|
|
219
202
|
client = client.withCodec(new WSWriterCodec(adapter.codec));
|
|
220
203
|
const stream = await client.stream("/frame/write", reqZ, resZ);
|
|
221
204
|
const writer = new Writer(stream, adapter);
|
|
@@ -236,9 +219,7 @@ export class Writer {
|
|
|
236
219
|
): Promise<void>;
|
|
237
220
|
async write(
|
|
238
221
|
channelsOrData:
|
|
239
|
-
| channel.
|
|
240
|
-
| Record<channel.Key | channel.Name, CrudeSeries>
|
|
241
|
-
| CrudeFrame,
|
|
222
|
+
channel.Params | Record<channel.Key | channel.Name, CrudeSeries> | CrudeFrame,
|
|
242
223
|
series?: CrudeSeries | CrudeSeries[],
|
|
243
224
|
): Promise<void>;
|
|
244
225
|
|
|
@@ -259,9 +240,7 @@ export class Writer {
|
|
|
259
240
|
*/
|
|
260
241
|
async write(
|
|
261
242
|
channelsOrData:
|
|
262
|
-
| channel.
|
|
263
|
-
| Record<channel.Key | channel.Name, CrudeSeries>
|
|
264
|
-
| CrudeFrame,
|
|
243
|
+
channel.Params | Record<channel.Key | channel.Name, CrudeSeries> | CrudeFrame,
|
|
265
244
|
series?: CrudeSeries | CrudeSeries[],
|
|
266
245
|
): Promise<void> {
|
|
267
246
|
if (this.closeErr != null) throw this.closeErr;
|
|
@@ -275,11 +254,13 @@ export class Writer {
|
|
|
275
254
|
}
|
|
276
255
|
|
|
277
256
|
async setAuthority(
|
|
278
|
-
value:
|
|
279
|
-
authority?:
|
|
257
|
+
value: AuthorityParams[0],
|
|
258
|
+
authority?: AuthorityParams[1],
|
|
280
259
|
): Promise<void> {
|
|
281
260
|
if (this.closeErr != null) throw this.closeErr;
|
|
282
|
-
const parsed =
|
|
261
|
+
const parsed = zod.parse(authorityParamsZ, [value, authority], {
|
|
262
|
+
label: "authority params",
|
|
263
|
+
});
|
|
283
264
|
const config = {
|
|
284
265
|
keys: await this.adapter.adaptParams(parsed.keys),
|
|
285
266
|
authorities: parsed.authorities,
|
|
@@ -290,7 +271,6 @@ export class Writer {
|
|
|
290
271
|
/**
|
|
291
272
|
* Commits the written frames to the database. Commit is synchronous, meaning that it
|
|
292
273
|
* will not return until all frames have been committed to the database.
|
|
293
|
-
*
|
|
294
274
|
* @returns the timestamp of the last sample written to the writer.
|
|
295
275
|
* @throws if the commit fails or any previous writer method has thrown. Once commit
|
|
296
276
|
* throws, the writer must be closed and re-opened to continue use.
|
package/src/group/client.ts
CHANGED
|
@@ -8,11 +8,13 @@
|
|
|
8
8
|
// included in the file licenses/APL.txt.
|
|
9
9
|
|
|
10
10
|
import { type UnaryClient } from "@synnaxlabs/freighter";
|
|
11
|
-
import { array } from "@synnaxlabs/x";
|
|
11
|
+
import { array, zod } from "@synnaxlabs/x";
|
|
12
12
|
import z from "zod";
|
|
13
13
|
|
|
14
|
-
import { type Group, groupZ, type Key, keyZ } from "@/group/types.gen";
|
|
14
|
+
import { type Group, groupZ, type Key, keyZ, ontologyID } from "@/group/types.gen";
|
|
15
|
+
import { ontology } from "@/ontology";
|
|
15
16
|
import { idZ as ontologyIDZ } from "@/ontology/payload";
|
|
17
|
+
import { query } from "@/query";
|
|
16
18
|
|
|
17
19
|
export const SET_CHANNEL_NAME = "sy_group_set";
|
|
18
20
|
export const DELETE_CHANNEL_NAME = "sy_group_delete";
|
|
@@ -29,40 +31,173 @@ const renameReqZ = z.object({ key: keyZ, name: z.string() });
|
|
|
29
31
|
|
|
30
32
|
const deleteReqZ = z.object({ keys: z.array(keyZ) });
|
|
31
33
|
|
|
32
|
-
export interface
|
|
34
|
+
export interface CreateParams extends z.infer<typeof createReqZ> {}
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
const retrieveChildrenParamsZ = z.object({
|
|
37
|
+
parent: ontologyIDZ,
|
|
38
|
+
searchTerm: z.string().optional(),
|
|
39
|
+
offset: z.int().optional(),
|
|
40
|
+
limit: z.int().optional(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export type RetrieveSingleParams = { key: Key };
|
|
44
|
+
export type RetrieveChildrenParams = z.input<typeof retrieveChildrenParamsZ>;
|
|
45
|
+
export type RetrieveParams = RetrieveSingleParams | RetrieveChildrenParams;
|
|
46
|
+
|
|
47
|
+
interface ChildrenRequest extends z.infer<typeof retrieveChildrenParamsZ> {}
|
|
48
|
+
|
|
49
|
+
const isChildOf = (rel: ontology.Relationship, parent: ontology.ID): boolean =>
|
|
50
|
+
ontology.matchRelationship(rel, {
|
|
51
|
+
from: parent,
|
|
52
|
+
type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
|
|
53
|
+
to: { type: "group" },
|
|
54
|
+
});
|
|
36
55
|
|
|
37
|
-
|
|
38
|
-
|
|
56
|
+
export interface ClientConfig {
|
|
57
|
+
unary: UnaryClient;
|
|
58
|
+
ontology: ontology.Client;
|
|
59
|
+
cache: query.Cache;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export class Client extends query.Retriever<
|
|
63
|
+
typeof retrieveChildrenParamsZ,
|
|
64
|
+
Key,
|
|
65
|
+
Group
|
|
66
|
+
> {
|
|
67
|
+
/** Public so a client that deletes a group through an endpoint of its own can drop
|
|
68
|
+
* the group from the cache. */
|
|
69
|
+
readonly store: query.Table<Key, Group>;
|
|
70
|
+
private readonly cfg: ClientConfig;
|
|
71
|
+
|
|
72
|
+
constructor(cfg: ClientConfig) {
|
|
73
|
+
const { cache, ontology: ontologyClient } = cfg;
|
|
74
|
+
const store = cache.createTable<Key, Group>({
|
|
75
|
+
name: "groups",
|
|
76
|
+
fetch: async (keys) => await this.execRetrieveKeys(keys),
|
|
77
|
+
listen: [
|
|
78
|
+
query.createSetListener(SET_CHANNEL_NAME, groupZ),
|
|
79
|
+
query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
|
|
80
|
+
],
|
|
81
|
+
});
|
|
82
|
+
super(cache, {
|
|
83
|
+
name: "group",
|
|
84
|
+
table: store,
|
|
85
|
+
request: {
|
|
86
|
+
schema: retrieveChildrenParamsZ,
|
|
87
|
+
fetch: async (req) => await this.fetchChildren(req),
|
|
88
|
+
matches: (g, req) => this.isCachedChild(req.parent, g.key),
|
|
89
|
+
watch: [
|
|
90
|
+
query.watch(
|
|
91
|
+
ontologyClient.cache.relationships,
|
|
92
|
+
(event, req: ChildrenRequest) => {
|
|
93
|
+
const rel =
|
|
94
|
+
event.variant === "set"
|
|
95
|
+
? event.value
|
|
96
|
+
: ontology.relationshipZ.parse(event.key);
|
|
97
|
+
if (!isChildOf(rel, req.parent)) return null;
|
|
98
|
+
return [rel.to.key];
|
|
99
|
+
},
|
|
100
|
+
),
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
this.cfg = cfg;
|
|
105
|
+
this.store = store;
|
|
39
106
|
}
|
|
40
107
|
|
|
41
|
-
async create(
|
|
42
|
-
const res = await this.
|
|
108
|
+
async create(params: CreateParams): Promise<Group> {
|
|
109
|
+
const res = await this.cfg.unary.send(
|
|
43
110
|
"/ontology/create-group",
|
|
44
|
-
|
|
111
|
+
params,
|
|
45
112
|
createReqZ,
|
|
46
113
|
resZ,
|
|
47
114
|
);
|
|
115
|
+
this.store.set(res.group);
|
|
116
|
+
const rel: ontology.Relationship = {
|
|
117
|
+
from: params.parent,
|
|
118
|
+
type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
|
|
119
|
+
to: ontologyID(res.group.key),
|
|
120
|
+
};
|
|
121
|
+
this.cfg.ontology.cache.relationships.set(ontology.relationshipToString(rel), rel);
|
|
48
122
|
return res.group;
|
|
49
123
|
}
|
|
50
124
|
|
|
51
|
-
async rename(key: Key, name: string): Promise<void> {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
125
|
+
async rename(key: Key, name: string, opts: query.WriteOptions = {}): Promise<void> {
|
|
126
|
+
const rename = () => [
|
|
127
|
+
query.partialUpdate(this.store, key, { name }),
|
|
128
|
+
this.cfg.ontology.cache.renameResource(ontologyID(key), name),
|
|
129
|
+
];
|
|
130
|
+
await query.optimistic({
|
|
131
|
+
rollbacks: rename(),
|
|
132
|
+
onOptimistic: opts.onOptimistic,
|
|
133
|
+
commit: async () =>
|
|
134
|
+
await this.cfg.unary.send(
|
|
135
|
+
"/ontology/rename-group",
|
|
136
|
+
{ key, name },
|
|
137
|
+
renameReqZ,
|
|
138
|
+
z.object({}),
|
|
139
|
+
),
|
|
140
|
+
});
|
|
141
|
+
rename();
|
|
58
142
|
}
|
|
59
143
|
|
|
60
|
-
async delete(keys: Key | Key[]): Promise<void> {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
144
|
+
async delete(keys: Key | Key[], opts: query.WriteOptions = {}): Promise<void> {
|
|
145
|
+
const keysArr = array.toArray(keys);
|
|
146
|
+
const drop = () => this.store.delete(keysArr);
|
|
147
|
+
await query.optimistic({
|
|
148
|
+
rollbacks: [drop()],
|
|
149
|
+
onOptimistic: opts.onOptimistic,
|
|
150
|
+
commit: async () =>
|
|
151
|
+
await this.cfg.unary.send(
|
|
152
|
+
"/ontology/delete-group",
|
|
153
|
+
{ keys: keysArr },
|
|
154
|
+
deleteReqZ,
|
|
155
|
+
z.object({}),
|
|
156
|
+
),
|
|
157
|
+
});
|
|
158
|
+
drop();
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
private isCachedChild(parent: ontology.ID, key: Key): boolean {
|
|
162
|
+
return this.cfg.ontology.cache.relationships.has(
|
|
163
|
+
ontology.relationshipToString({
|
|
164
|
+
from: parent,
|
|
165
|
+
type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
|
|
166
|
+
to: ontologyID(key),
|
|
167
|
+
}),
|
|
66
168
|
);
|
|
67
169
|
}
|
|
170
|
+
|
|
171
|
+
private requireOntology(): ontology.Client {
|
|
172
|
+
if (this.cfg.ontology == null)
|
|
173
|
+
throw new Error("ontology client is not available on this client");
|
|
174
|
+
return this.cfg.ontology;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
private async execRetrieveKeys(keys: Key[]): Promise<Group[]> {
|
|
178
|
+
const res = await this.requireOntology().retrieve({
|
|
179
|
+
ids: keys.map((key) => ontologyID(key)),
|
|
180
|
+
});
|
|
181
|
+
return res.map((r) => zod.parse(groupZ, r.data, { label: "group" }));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
private async fetchChildren(req: ChildrenRequest): Promise<Group[]> {
|
|
185
|
+
const { parent, ...options } = req;
|
|
186
|
+
const res = await this.requireOntology().children.retrieve({
|
|
187
|
+
ids: parent,
|
|
188
|
+
...options,
|
|
189
|
+
types: ["group"],
|
|
190
|
+
});
|
|
191
|
+
const groups = res.map((r) => zod.parse(groupZ, r.data, { label: "group" }));
|
|
192
|
+
const rels = this.cfg.ontology.cache.relationships;
|
|
193
|
+
groups.forEach((g) => {
|
|
194
|
+
const rel: ontology.Relationship = {
|
|
195
|
+
from: parent,
|
|
196
|
+
type: ontology.PARENT_OF_RELATIONSHIP_TYPE,
|
|
197
|
+
to: ontologyID(g.key),
|
|
198
|
+
};
|
|
199
|
+
rels.set(ontology.relationshipToString(rel), rel);
|
|
200
|
+
});
|
|
201
|
+
return groups;
|
|
202
|
+
}
|
|
68
203
|
}
|