@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/channel/client.ts
CHANGED
|
@@ -10,28 +10,26 @@
|
|
|
10
10
|
import { type UnaryClient } from "@synnaxlabs/freighter";
|
|
11
11
|
import {
|
|
12
12
|
array,
|
|
13
|
-
|
|
13
|
+
control,
|
|
14
14
|
type CrudeTimeRange,
|
|
15
|
-
type CrudeTimeSpan,
|
|
16
15
|
type CrudeTimeStamp,
|
|
17
16
|
DataType,
|
|
17
|
+
deep,
|
|
18
|
+
type destructor,
|
|
19
|
+
errors,
|
|
18
20
|
type MultiSeries,
|
|
19
|
-
|
|
20
|
-
TimeSpan,
|
|
21
|
+
primitive,
|
|
21
22
|
type TypedArray,
|
|
23
|
+
zod,
|
|
22
24
|
} from "@synnaxlabs/x";
|
|
23
25
|
import { z } from "zod";
|
|
24
26
|
|
|
25
|
-
import { type Params } from "@/channel/payload";
|
|
26
27
|
import {
|
|
27
28
|
analyzeParams,
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
type Retriever,
|
|
33
|
-
type RetrieveRequest,
|
|
34
|
-
} from "@/channel/retriever";
|
|
29
|
+
type Params,
|
|
30
|
+
type PrimitiveParams,
|
|
31
|
+
statusKey,
|
|
32
|
+
} from "@/channel/payload";
|
|
35
33
|
import {
|
|
36
34
|
type Key,
|
|
37
35
|
keyZ,
|
|
@@ -39,34 +37,39 @@ import {
|
|
|
39
37
|
type New,
|
|
40
38
|
ontologyID,
|
|
41
39
|
type Operation,
|
|
40
|
+
operationZ,
|
|
42
41
|
type Payload,
|
|
43
42
|
payloadZ,
|
|
43
|
+
statusZ,
|
|
44
44
|
} from "@/channel/types.gen";
|
|
45
45
|
import { type Writer } from "@/channel/writer";
|
|
46
|
-
import { ValidationError } from "@/errors";
|
|
46
|
+
import { NotFoundError, ValidationError } from "@/errors";
|
|
47
47
|
import { type framer } from "@/framer";
|
|
48
48
|
import { group } from "@/group";
|
|
49
|
-
import {
|
|
49
|
+
import { ontology } from "@/ontology";
|
|
50
|
+
import { query } from "@/query";
|
|
51
|
+
import { type ranger } from "@/ranger";
|
|
52
|
+
import { createKey, decodeDeleteChange } from "@/ranger/alias/payload";
|
|
53
|
+
import { keyZ as rangerKeyZ } from "@/ranger/types.gen";
|
|
54
|
+
import { type status } from "@/status";
|
|
50
55
|
import { checkForMultipleOrNoResults } from "@/util/retrieve";
|
|
51
56
|
|
|
57
|
+
export const SET_CHANNEL_NAME = "sy_channel_set";
|
|
58
|
+
export const DELETE_CHANNEL_NAME = "sy_channel_delete";
|
|
59
|
+
|
|
52
60
|
interface CreateOptions {
|
|
53
61
|
retrieveIfNameExists?: boolean;
|
|
54
62
|
}
|
|
55
63
|
|
|
56
|
-
export const SET_CHANNEL_NAME = "sy_channel_set";
|
|
57
|
-
export const DELETE_CHANNEL_NAME = "sy_channel_delete";
|
|
58
|
-
|
|
59
64
|
/**
|
|
60
65
|
* Represents a Channel in a Synnax database. Typically, channels should not be
|
|
61
66
|
* instantiated directly, but instead created via the `.channels.create` or retrieved
|
|
62
|
-
* via the `.channels.retrieve` method on a Synnax client.
|
|
63
|
-
*
|
|
64
|
-
* Please refer to the [Synnax
|
|
67
|
+
* via the `.channels.retrieve` method on a Synnax client. Please refer to the [Synnax
|
|
65
68
|
* documentation](https://docs.synnaxlabs.com/reference/concepts/channels) for detailed
|
|
66
69
|
* information on what channels are and how to use them.
|
|
67
70
|
*/
|
|
68
71
|
export class Channel {
|
|
69
|
-
private readonly
|
|
72
|
+
private readonly frameClient: framer.Client | null;
|
|
70
73
|
/**
|
|
71
74
|
* A unique key identifying the channel in the Synnax database. This key is
|
|
72
75
|
* automatically assigned by Synnax.
|
|
@@ -76,9 +79,7 @@ export class Channel {
|
|
|
76
79
|
* A human-readable name for the channel. This name is not guaranteed to be unique.
|
|
77
80
|
*/
|
|
78
81
|
readonly name: string;
|
|
79
|
-
/**
|
|
80
|
-
* The data type of the channel.
|
|
81
|
-
*/
|
|
82
|
+
/** The data type of the channel. */
|
|
82
83
|
readonly dataType: DataType;
|
|
83
84
|
/**
|
|
84
85
|
* The key of the node in the Synnax cluster that holds the 'lease' over the channel
|
|
@@ -91,13 +92,9 @@ export class Channel {
|
|
|
91
92
|
* that stores its timestamps.
|
|
92
93
|
*/
|
|
93
94
|
readonly index: Key;
|
|
94
|
-
/**
|
|
95
|
-
* This is set to true if the channel is an index channel, and false otherwise.
|
|
96
|
-
*/
|
|
95
|
+
/** This is set to true if the channel is an index channel, and false otherwise. */
|
|
97
96
|
readonly isIndex: boolean;
|
|
98
|
-
/**
|
|
99
|
-
* This is set to true if the channel is an internal channel, and false otherwise.
|
|
100
|
-
*/
|
|
97
|
+
/** This is set to true if the channel is an internal channel, and false otherwise. */
|
|
101
98
|
readonly internal: boolean;
|
|
102
99
|
/**
|
|
103
100
|
* An alias for the channel under a specific range. This parameter is unstable and
|
|
@@ -115,9 +112,8 @@ export class Channel {
|
|
|
115
112
|
*/
|
|
116
113
|
readonly expression: string;
|
|
117
114
|
readonly operations: Operation[];
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
*/
|
|
115
|
+
readonly concurrency: control.Concurrency;
|
|
116
|
+
/** The status of the channel. */
|
|
121
117
|
readonly status?: status.Status;
|
|
122
118
|
|
|
123
119
|
constructor({
|
|
@@ -134,32 +130,31 @@ export class Channel {
|
|
|
134
130
|
status: argsStatus,
|
|
135
131
|
expression = "",
|
|
136
132
|
operations = [],
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
density?: CrudeDensity;
|
|
141
|
-
status?: status.New;
|
|
142
|
-
operations?: Operation[];
|
|
143
|
-
}) {
|
|
144
|
-
this.key = keyZ.parse(key);
|
|
133
|
+
concurrency = control.Concurrency.exclusive,
|
|
134
|
+
}: New & { frameClient?: framer.Client }) {
|
|
135
|
+
this.key = zod.parse(keyZ, key, { label: "channel key" });
|
|
145
136
|
this.name = name;
|
|
146
137
|
this.dataType = new DataType(dataType);
|
|
147
138
|
this.leaseholder = leaseholder;
|
|
148
|
-
this.index =
|
|
139
|
+
this.index = zod.parse(keyZ, index, { label: "channel index" });
|
|
149
140
|
this.isIndex = isIndex;
|
|
150
141
|
this.internal = internal;
|
|
151
142
|
this.alias = alias;
|
|
152
143
|
this.virtual = virtual;
|
|
153
144
|
this.expression = expression;
|
|
154
|
-
this.operations = operations
|
|
155
|
-
|
|
156
|
-
|
|
145
|
+
this.operations = zod.parse(operationZ.array(), operations, {
|
|
146
|
+
label: "channel operations",
|
|
147
|
+
});
|
|
148
|
+
this.concurrency = concurrency;
|
|
149
|
+
if (argsStatus != null)
|
|
150
|
+
this.status = zod.parse(statusZ, argsStatus, { label: "channel status" });
|
|
151
|
+
this.frameClient = frameClient ?? null;
|
|
157
152
|
}
|
|
158
153
|
|
|
159
154
|
private get framer(): framer.Client {
|
|
160
|
-
if (this.
|
|
155
|
+
if (this.frameClient == null)
|
|
161
156
|
throw new ValidationError("cannot read from a channel that has not been created");
|
|
162
|
-
return this.
|
|
157
|
+
return this.frameClient;
|
|
163
158
|
}
|
|
164
159
|
|
|
165
160
|
/**
|
|
@@ -168,37 +163,37 @@ export class Channel {
|
|
|
168
163
|
* network transportation, but also provided to you as a convenience.
|
|
169
164
|
*/
|
|
170
165
|
get payload(): Payload {
|
|
171
|
-
return
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
166
|
+
return zod.parse(
|
|
167
|
+
payloadZ,
|
|
168
|
+
{
|
|
169
|
+
key: this.key,
|
|
170
|
+
name: this.name,
|
|
171
|
+
dataType: this.dataType.valueOf(),
|
|
172
|
+
leaseholder: this.leaseholder,
|
|
173
|
+
index: this.index,
|
|
174
|
+
isIndex: this.isIndex,
|
|
175
|
+
internal: this.internal,
|
|
176
|
+
virtual: this.virtual,
|
|
177
|
+
expression: this.expression,
|
|
178
|
+
status: this.status,
|
|
179
|
+
operations: this.operations,
|
|
180
|
+
concurrency: this.concurrency,
|
|
181
|
+
},
|
|
182
|
+
{ label: "channel payload" },
|
|
183
|
+
);
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
get isCalculated(): boolean {
|
|
187
187
|
return isCalculated(this.payload);
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
-
|
|
191
|
-
* @returns the ontology ID of the channel
|
|
192
|
-
*/
|
|
190
|
+
/** @returns the ontology ID of the channel */
|
|
193
191
|
get ontologyID(): ontology.ID {
|
|
194
192
|
return ontologyID(this.key);
|
|
195
193
|
}
|
|
196
194
|
|
|
197
195
|
/**
|
|
198
196
|
* Reads telemetry from the channel between the two timestamps.
|
|
199
|
-
*
|
|
200
|
-
* @param start - The starting timestamp of the range to read from.
|
|
201
|
-
* @param end - The ending timestamp of the range to read from.
|
|
202
197
|
* @returns A typed array containing the retrieved
|
|
203
198
|
*/
|
|
204
199
|
async read(tr: CrudeTimeRange): Promise<MultiSeries> {
|
|
@@ -207,45 +202,269 @@ export class Channel {
|
|
|
207
202
|
|
|
208
203
|
/**
|
|
209
204
|
* Writes telemetry to the channel starting at the given timestamp.
|
|
210
|
-
*
|
|
211
205
|
* @param start - The starting timestamp of the first sample in data.
|
|
212
|
-
* @param data - THe telemetry to write to the channel.
|
|
213
206
|
*/
|
|
214
207
|
async write(start: CrudeTimeStamp, data: TypedArray): Promise<void> {
|
|
215
208
|
return await this.framer.write(start, this.key, data);
|
|
216
209
|
}
|
|
217
210
|
}
|
|
218
211
|
|
|
212
|
+
/** Zod schema for {@link RetrieveRequest}. */
|
|
213
|
+
export const retrieveRequestZ = z.object({
|
|
214
|
+
nodeKey: zod.uint12.optional(),
|
|
215
|
+
keys: keyZ.array().optional(),
|
|
216
|
+
names: z.string().array().optional(),
|
|
217
|
+
searchTerm: z.string().optional(),
|
|
218
|
+
rangeKey: rangerKeyZ.optional(),
|
|
219
|
+
limit: z.int().optional(),
|
|
220
|
+
offset: z.int().optional(),
|
|
221
|
+
dataTypes: DataType.z.array().optional(),
|
|
222
|
+
notDataTypes: DataType.z.array().optional(),
|
|
223
|
+
virtual: z.boolean().optional(),
|
|
224
|
+
isIndex: z.boolean().optional(),
|
|
225
|
+
internal: z.boolean().optional(),
|
|
226
|
+
legacyCalculated: z.boolean().optional(),
|
|
227
|
+
});
|
|
228
|
+
/** Everything a channel retrieval can filter on. */
|
|
229
|
+
export type RetrieveRequest = z.input<typeof retrieveRequestZ>;
|
|
230
|
+
|
|
231
|
+
/** The filters a retrieval accepts alongside its keys or names. */
|
|
232
|
+
export type RetrieveOptions = Omit<RetrieveRequest, "keys" | "names" | "search">;
|
|
233
|
+
|
|
234
|
+
const retrieveResZ = z.object({ channels: payloadZ.array().default(() => []) });
|
|
235
|
+
|
|
219
236
|
const retrieveGroupReqZ = z.object({});
|
|
220
237
|
|
|
221
238
|
const retrieveGroupResZ = z.object({ group: group.groupZ });
|
|
222
239
|
|
|
240
|
+
/** Names one channel. Give a `rangeKey` to resolve its alias in that range. */
|
|
241
|
+
export type RetrieveSingleParams = { key: Key; rangeKey?: ranger.Key };
|
|
242
|
+
|
|
243
|
+
type NormalizedRequest = z.infer<typeof retrieveRequestZ>;
|
|
244
|
+
|
|
245
|
+
/** Aliases and statuses are composed from their stores on read. */
|
|
246
|
+
const stripComposed = ({ alias: _alias, status: _status, ...rest }: Payload): Payload =>
|
|
247
|
+
rest;
|
|
248
|
+
|
|
249
|
+
const normalizeSingle = ({
|
|
250
|
+
key,
|
|
251
|
+
rangeKey,
|
|
252
|
+
}: RetrieveSingleParams): RetrieveSingleParams =>
|
|
253
|
+
rangeKey == null ? { key } : { key, rangeKey };
|
|
254
|
+
|
|
255
|
+
const singleParamsZ = z
|
|
256
|
+
.union([
|
|
257
|
+
z.strictObject({ key: z.uint32(), rangeKey: rangerKeyZ.optional() }),
|
|
258
|
+
z.uint32().transform((key) => ({ key })),
|
|
259
|
+
])
|
|
260
|
+
.transform(normalizeSingle);
|
|
261
|
+
|
|
262
|
+
const onlyRangeKey = (options?: RetrieveOptions): boolean =>
|
|
263
|
+
options == null ||
|
|
264
|
+
Object.entries(options).every(([k, v]) => v === undefined || k === "rangeKey");
|
|
265
|
+
|
|
266
|
+
const isKeysOnly = (
|
|
267
|
+
req: NormalizedRequest,
|
|
268
|
+
): req is NormalizedRequest & { keys: Key[] } =>
|
|
269
|
+
primitive.isNonZero(req.keys) &&
|
|
270
|
+
req.names == null &&
|
|
271
|
+
req.searchTerm == null &&
|
|
272
|
+
req.nodeKey == null &&
|
|
273
|
+
req.limit == null &&
|
|
274
|
+
req.offset == null &&
|
|
275
|
+
req.dataTypes == null &&
|
|
276
|
+
req.notDataTypes == null &&
|
|
277
|
+
req.virtual == null &&
|
|
278
|
+
req.isIndex == null &&
|
|
279
|
+
req.internal == null &&
|
|
280
|
+
req.legacyCalculated == null;
|
|
281
|
+
|
|
282
|
+
const isNamesOnly = (
|
|
283
|
+
req: NormalizedRequest,
|
|
284
|
+
): req is NormalizedRequest & { names: string[] } =>
|
|
285
|
+
primitive.isNonZero(req.names) &&
|
|
286
|
+
req.keys == null &&
|
|
287
|
+
req.searchTerm == null &&
|
|
288
|
+
req.nodeKey == null &&
|
|
289
|
+
req.limit == null &&
|
|
290
|
+
req.offset == null &&
|
|
291
|
+
req.dataTypes == null &&
|
|
292
|
+
req.notDataTypes == null &&
|
|
293
|
+
req.virtual == null &&
|
|
294
|
+
req.isIndex == null &&
|
|
295
|
+
req.internal == null &&
|
|
296
|
+
req.legacyCalculated == null;
|
|
297
|
+
|
|
298
|
+
const NAME_LITERAL_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Mirrors the server's name matching: literal names compare exactly, anything
|
|
302
|
+
* else compiles as a regular expression, anchored when unanchored.
|
|
303
|
+
*/
|
|
304
|
+
const createNameMatcher = (pattern: string): ((name: string) => boolean) => {
|
|
305
|
+
if (NAME_LITERAL_PATTERN.test(pattern)) return (name) => name === pattern;
|
|
306
|
+
const anchored =
|
|
307
|
+
pattern.startsWith("^") || pattern.endsWith("$") ? pattern : `^${pattern}$`;
|
|
308
|
+
try {
|
|
309
|
+
const rx = new RegExp(anchored);
|
|
310
|
+
return (name) => rx.test(name);
|
|
311
|
+
} catch {
|
|
312
|
+
return (name) => name === pattern;
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Client-side matching for a request over every locally evaluable field.
|
|
318
|
+
* Server-computed shapes (search, pagination) never reach this filter; they
|
|
319
|
+
* refetch instead.
|
|
320
|
+
*/
|
|
321
|
+
const requestFilter = (req: NormalizedRequest): ((ch: Channel) => boolean) => {
|
|
322
|
+
const keySet = primitive.isNonZero(req.keys) ? new Set(req.keys) : undefined;
|
|
323
|
+
const nameMatchers = primitive.isNonZero(req.names)
|
|
324
|
+
? req.names.map(createNameMatcher)
|
|
325
|
+
: undefined;
|
|
326
|
+
return (ch) => {
|
|
327
|
+
if (keySet != null && !keySet.has(ch.key)) return false;
|
|
328
|
+
if (nameMatchers != null && !nameMatchers.some((m) => m(ch.name))) return false;
|
|
329
|
+
if (primitive.isNonZero(req.nodeKey) && ch.leaseholder !== req.nodeKey)
|
|
330
|
+
return false;
|
|
331
|
+
// The server's virtual bucket excludes calculated channels even though
|
|
332
|
+
// they are stored with virtual=true.
|
|
333
|
+
if (req.virtual != null && (ch.virtual && !ch.isCalculated) !== req.virtual)
|
|
334
|
+
return false;
|
|
335
|
+
if (req.isIndex != null && ch.isIndex !== req.isIndex) return false;
|
|
336
|
+
if (req.internal != null && ch.internal !== req.internal) return false;
|
|
337
|
+
if (
|
|
338
|
+
primitive.isNonZero(req.dataTypes) &&
|
|
339
|
+
!req.dataTypes.some((dt) => dt.equals(ch.dataType))
|
|
340
|
+
)
|
|
341
|
+
return false;
|
|
342
|
+
if (
|
|
343
|
+
primitive.isNonZero(req.notDataTypes) &&
|
|
344
|
+
req.notDataTypes.some((dt) => dt.equals(ch.dataType))
|
|
345
|
+
)
|
|
346
|
+
return false;
|
|
347
|
+
return true;
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
// Channel statuses live in the status table under the "channel:<key>" status key.
|
|
352
|
+
const affectedChannelKeys = (
|
|
353
|
+
event: query.TableEvent<status.Key, status.Status>,
|
|
354
|
+
): Key[] | null => {
|
|
355
|
+
const [type, key] = event.key.split(":");
|
|
356
|
+
if (type !== "channel" || !primitive.isNonZero(key)) return null;
|
|
357
|
+
const parsed = keyZ.safeParse(key);
|
|
358
|
+
return parsed.success ? [parsed.data] : null;
|
|
359
|
+
};
|
|
360
|
+
|
|
223
361
|
/**
|
|
224
362
|
* The main client class for executing channel operations against a Synnax Core. This
|
|
225
363
|
* class should not be instantiated directly, and instead should be used through the
|
|
226
364
|
* `channels` property of an {@link Synnax} client.
|
|
227
365
|
*/
|
|
228
|
-
export
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
366
|
+
export interface ClientConfig {
|
|
367
|
+
framer: framer.Client;
|
|
368
|
+
unary: UnaryClient;
|
|
369
|
+
writer: Writer;
|
|
370
|
+
statuses: status.Client;
|
|
371
|
+
ranges: ranger.Client;
|
|
372
|
+
cache: query.Cache;
|
|
373
|
+
ontology: ontology.Client;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Creates, reads, and deletes channels on a Core. Reach it through `client.channels`.
|
|
378
|
+
* Retrievals are served from a cache that a change stream keeps current, so a repeated
|
|
379
|
+
* read costs nothing.
|
|
380
|
+
*/
|
|
381
|
+
export class Client extends query.Retriever<
|
|
382
|
+
typeof retrieveRequestZ,
|
|
383
|
+
Key,
|
|
384
|
+
Channel,
|
|
385
|
+
Channel,
|
|
386
|
+
RetrieveSingleParams,
|
|
387
|
+
RetrieveSingleParams
|
|
388
|
+
> {
|
|
389
|
+
private readonly cfg: ClientConfig;
|
|
232
390
|
readonly writer: Writer;
|
|
391
|
+
readonly store: query.Table<Key, Channel>;
|
|
233
392
|
|
|
234
|
-
constructor(
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
393
|
+
constructor(cfg: ClientConfig) {
|
|
394
|
+
const { writer, statuses, ranges, cache } = cfg;
|
|
395
|
+
const statusStore = statuses.store;
|
|
396
|
+
const aliasStore = ranges.aliases;
|
|
397
|
+
const sugar = (payload: Payload): Channel => this.sugar(payload);
|
|
398
|
+
const store = cache.createTable<Key, Channel>({
|
|
399
|
+
name: "channels",
|
|
400
|
+
equal: (a, b) => deep.equal(a.payload, b.payload),
|
|
401
|
+
fetch: async (keys) =>
|
|
402
|
+
(await this.execRetrieve(keys)).map((p) => sugar(stripComposed(p))),
|
|
403
|
+
listen: [
|
|
404
|
+
query.createSetListener(SET_CHANNEL_NAME, payloadZ, {
|
|
405
|
+
value: (changed) => sugar(stripComposed(changed)),
|
|
406
|
+
}),
|
|
407
|
+
query.createDeleteListener(DELETE_CHANNEL_NAME, keyZ),
|
|
408
|
+
],
|
|
409
|
+
});
|
|
410
|
+
const composed = cache.derive<Key, Channel, Channel>({
|
|
411
|
+
name: "channel.composed",
|
|
412
|
+
source: store,
|
|
413
|
+
compose: (record) => this.compose(record.payload),
|
|
414
|
+
equal: (a, b) => deep.equal(a.payload, b.payload),
|
|
415
|
+
watch: [query.deriveWatch(statusStore, (event) => affectedChannelKeys(event))],
|
|
416
|
+
});
|
|
417
|
+
const single = cache.queries<RetrieveSingleParams, Channel, Key, Channel>({
|
|
418
|
+
name: "channel",
|
|
419
|
+
table: composed,
|
|
420
|
+
fetch: async (query) => [(await this.fetchSingle(query)).key],
|
|
421
|
+
// Composed rows carry status; the read-time step only glues the alias.
|
|
422
|
+
compose: (records, query) =>
|
|
423
|
+
query.rangeKey == null
|
|
424
|
+
? records[0]
|
|
425
|
+
: this.composeAlias(records[0].payload, query.rangeKey),
|
|
426
|
+
keyOf: (query) => query.key,
|
|
427
|
+
single: true,
|
|
428
|
+
watch: [
|
|
429
|
+
query.watch(aliasStore, (event, query: RetrieveSingleParams) => {
|
|
430
|
+
if (query.rangeKey == null) return null;
|
|
431
|
+
const aliasKey = createKey({ range: query.rangeKey, channel: query.key });
|
|
432
|
+
return event.key === aliasKey ? [query.key] : null;
|
|
433
|
+
}),
|
|
434
|
+
],
|
|
435
|
+
});
|
|
436
|
+
super(cache, {
|
|
437
|
+
name: "channel",
|
|
438
|
+
table: store,
|
|
439
|
+
request: {
|
|
440
|
+
schema: retrieveRequestZ,
|
|
441
|
+
fetch: async (query) => await this.fetchRequest(query),
|
|
442
|
+
matches: (ch, query) => requestFilter(query)(ch),
|
|
443
|
+
watch: [
|
|
444
|
+
query.watch(aliasStore, (event, query: NormalizedRequest) => {
|
|
445
|
+
if (query.rangeKey == null) return null;
|
|
446
|
+
if (event.variant === "set")
|
|
447
|
+
return event.value.range === query.rangeKey
|
|
448
|
+
? [event.value.channel]
|
|
449
|
+
: null;
|
|
450
|
+
const decoded = decodeDeleteChange(event.key);
|
|
451
|
+
return decoded.range === query.rangeKey ? [decoded.channel] : null;
|
|
452
|
+
}),
|
|
453
|
+
],
|
|
454
|
+
},
|
|
455
|
+
compose: (ch, query) => {
|
|
456
|
+
const { rangeKey } = query as NormalizedRequest;
|
|
457
|
+
return rangeKey == null ? ch : this.composeAlias(ch.payload, rangeKey);
|
|
458
|
+
},
|
|
459
|
+
single: { schema: singleParamsZ, space: single },
|
|
460
|
+
});
|
|
461
|
+
this.cfg = cfg;
|
|
243
462
|
this.writer = writer;
|
|
463
|
+
this.store = store;
|
|
244
464
|
}
|
|
245
465
|
|
|
246
466
|
/**
|
|
247
467
|
* Creates a single channel with the given properties.
|
|
248
|
-
*
|
|
249
468
|
* @param name - A human-readable name for the channel.
|
|
250
469
|
* @param rate - The rate of the channel. This only applies to fixed rate channels.
|
|
251
470
|
* @param dataType - The data type for the samples stored in the channel.
|
|
@@ -283,25 +502,21 @@ export class Client {
|
|
|
283
502
|
/**
|
|
284
503
|
* Creates multiple channels with the given properties. The order of the channels
|
|
285
504
|
* returned is guaranteed to match the order of the channels passed in.
|
|
286
|
-
*
|
|
287
|
-
*
|
|
288
|
-
* For each channel, the following properties should be considered:
|
|
289
|
-
*
|
|
505
|
+
* @param channels - An array of channel properties to create. For each channel, the
|
|
506
|
+
* following properties should be considered:
|
|
290
507
|
* @param name - A human-readable name for the channel.
|
|
291
508
|
* @param rate - The rate of the channel. This only applies to fixed rate channels. If
|
|
292
509
|
* the 'index' parameter is specified or 'isIndex' is set to true, this parameter will
|
|
293
510
|
* be ignored.
|
|
294
511
|
* @param dataType - The data type for the samples stored in the channel.
|
|
295
512
|
* @param index - The key of the index channel that this channel should be associated
|
|
296
|
-
* with. An 'index' channel is a channel that stores timestamps for other channels.
|
|
297
|
-
* to the Synnax documentation (https://docs.synnaxlabs.com) for more
|
|
298
|
-
* index channel must have already been created. This field does not
|
|
299
|
-
* if the channel is an index channel, or the channel is a fixed
|
|
300
|
-
* value is specified, the 'rate' parameter will be ignored.
|
|
301
|
-
* @param isIndex - Set to true if the channel is an index channel, and false
|
|
302
|
-
* Index channels must have a data type of `DataType.TIMESTAMP`.
|
|
303
|
-
*
|
|
304
|
-
* @param channels
|
|
513
|
+
* with. An 'index' channel is a channel that stores timestamps for other channels.
|
|
514
|
+
* Refer to the Synnax documentation (https://docs.synnaxlabs.com) for more
|
|
515
|
+
* information. The index channel must have already been created. This field does not
|
|
516
|
+
* need to be specified if the channel is an index channel, or the channel is a fixed
|
|
517
|
+
* rate channel. If this value is specified, the 'rate' parameter will be ignored.
|
|
518
|
+
* @param isIndex - Set to true if the channel is an index channel, and false
|
|
519
|
+
* otherwise. Index channels must have a data type of `DataType.TIMESTAMP`.
|
|
305
520
|
*/
|
|
306
521
|
async create(channels: New[], options?: CreateOptions): Promise<Channel[]>;
|
|
307
522
|
|
|
@@ -314,25 +529,23 @@ export class Client {
|
|
|
314
529
|
let toCreate = array.toArray(channels);
|
|
315
530
|
let created: Channel[] = [];
|
|
316
531
|
if (retrieveIfNameExists) {
|
|
317
|
-
const res = await this.
|
|
532
|
+
const res = await this.execRetrieve(toCreate.map((c) => c.name));
|
|
318
533
|
const existingNames = new Set(res.map((c) => c.name));
|
|
319
534
|
toCreate = toCreate.filter((c) => !existingNames.has(c.name));
|
|
320
535
|
created = this.sugar(res);
|
|
321
536
|
}
|
|
322
537
|
created = created.concat(this.sugar(await this.writer.create(toCreate)));
|
|
538
|
+
this.store.set(created.map((ch) => this.sugar(stripComposed(ch.payload))));
|
|
323
539
|
return single ? created[0] : created;
|
|
324
540
|
}
|
|
325
541
|
|
|
326
542
|
/**
|
|
327
543
|
* Retrieves a channel from the database using the given key or name.
|
|
328
|
-
*
|
|
329
|
-
* @param params - The key or name of the channel to retrieve.
|
|
330
544
|
* @param options - Optional parameters to control the retrieval process.
|
|
331
|
-
* @param options.dataTypes - Limits the query to only channels with the specified
|
|
332
|
-
* type.
|
|
333
|
-
* @param options.notDataTypes - Limits the query to only channels without the specified
|
|
545
|
+
* @param options.dataTypes - Limits the query to only channels with the specified
|
|
334
546
|
* data type.
|
|
335
|
-
*
|
|
547
|
+
* @param options.notDataTypes - Limits the query to only channels without the
|
|
548
|
+
* specified data type.
|
|
336
549
|
* @returns The retrieved channel.
|
|
337
550
|
* @throws {NotFoundError} if the channel does not exist in the cluster.
|
|
338
551
|
* @throws {MultipleFoundError} is only thrown if the channel is retrieved by name,
|
|
@@ -350,16 +563,22 @@ export class Client {
|
|
|
350
563
|
/**
|
|
351
564
|
* Retrieves multiple channels from the database using the provided keys or the
|
|
352
565
|
* provided names.
|
|
353
|
-
*
|
|
354
|
-
*
|
|
355
|
-
* this method does not support mixing keys and names in the same call.
|
|
566
|
+
* @param params - The keys or the names of the channels to retrieve. Note that this
|
|
567
|
+
* method does not support mixing keys and names in the same call.
|
|
356
568
|
* @param options - Optional parameters to control the retrieval process.
|
|
357
|
-
* @param options.dataTypes - Limits the query to only channels with the specified
|
|
358
|
-
* type.
|
|
359
|
-
* @param options.notDataTypes - Limits the query to only channels without the
|
|
360
|
-
*
|
|
569
|
+
* @param options.dataTypes - Limits the query to only channels with the specified
|
|
570
|
+
* data type.
|
|
571
|
+
* @param options.notDataTypes - Limits the query to only channels without the
|
|
572
|
+
* specified
|
|
361
573
|
*/
|
|
362
|
-
async retrieve(params:
|
|
574
|
+
async retrieve(params: Key | string, options?: RetrieveOptions): Promise<Channel>;
|
|
575
|
+
|
|
576
|
+
async retrieve(
|
|
577
|
+
params: PrimitiveParams | Payload[],
|
|
578
|
+
options?: RetrieveOptions,
|
|
579
|
+
): Promise<Channel[]>;
|
|
580
|
+
|
|
581
|
+
async retrieve(params: RetrieveSingleParams): Promise<Channel>;
|
|
363
582
|
|
|
364
583
|
async retrieve(params: RetrieveRequest): Promise<Channel[]>;
|
|
365
584
|
|
|
@@ -371,53 +590,103 @@ export class Client {
|
|
|
371
590
|
* @raises {QueryError} If the channel does not exist or if multiple results are returned.
|
|
372
591
|
*/
|
|
373
592
|
async retrieve(
|
|
374
|
-
params:
|
|
593
|
+
params: PrimitiveParams | Payload[] | RetrieveSingleParams | RetrieveRequest,
|
|
375
594
|
options?: RetrieveOptions,
|
|
376
595
|
): Promise<Channel | Channel[]> {
|
|
377
596
|
if (typeof params === "object" && !Array.isArray(params))
|
|
378
|
-
return
|
|
379
|
-
|
|
597
|
+
return await super.retrieve(params);
|
|
380
598
|
const isSingle = !Array.isArray(params);
|
|
381
|
-
const
|
|
599
|
+
const { variant, normalized: rawNormalized } = analyzeParams(params);
|
|
600
|
+
const normalized =
|
|
601
|
+
variant === "keys" ? rawNormalized.filter((k) => k !== 0) : rawNormalized;
|
|
602
|
+
if (normalized.length === 0) {
|
|
603
|
+
checkForMultipleOrNoResults<Params, Channel>("channel", params, [], isSingle);
|
|
604
|
+
return [];
|
|
605
|
+
}
|
|
606
|
+
if (isSingle && variant === "keys" && onlyRangeKey(options))
|
|
607
|
+
return await super.retrieve({
|
|
608
|
+
key: normalized[0] as Key,
|
|
609
|
+
rangeKey: options?.rangeKey,
|
|
610
|
+
});
|
|
611
|
+
const res = await super.retrieve(
|
|
612
|
+
zod.parse(
|
|
613
|
+
retrieveRequestZ,
|
|
614
|
+
{ [variant]: normalized, ...options },
|
|
615
|
+
{ label: "channel retrieve request" },
|
|
616
|
+
),
|
|
617
|
+
);
|
|
382
618
|
checkForMultipleOrNoResults<Params, Channel>("channel", params, res, isSingle);
|
|
383
619
|
return isSingle ? res[0] : res;
|
|
384
620
|
}
|
|
385
621
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
* @param params - The keys or names of the channels to delete.
|
|
389
|
-
*/
|
|
390
|
-
async delete(params: Params): Promise<void> {
|
|
622
|
+
/** * Deletes channels from the database using the given keys or names. */
|
|
623
|
+
async delete(params: Params, opts: query.WriteOptions = {}): Promise<void> {
|
|
391
624
|
const { normalized, variant } = analyzeParams(params);
|
|
392
|
-
if (variant === "keys")
|
|
393
|
-
|
|
625
|
+
if (variant === "keys") {
|
|
626
|
+
const keys = normalized;
|
|
627
|
+
const ids = ontologyID(keys);
|
|
628
|
+
const drop = () => [
|
|
629
|
+
this.cfg.ontology.cache.deleteRelationships(ids),
|
|
630
|
+
this.store.delete(keys),
|
|
631
|
+
this.cfg.ontology.cache.resources.delete(ontology.idToString(ids)),
|
|
632
|
+
];
|
|
633
|
+
await query.optimistic({
|
|
634
|
+
rollbacks: drop(),
|
|
635
|
+
onOptimistic: opts.onOptimistic,
|
|
636
|
+
commit: async () => await this.writer.delete({ keys }),
|
|
637
|
+
});
|
|
638
|
+
drop();
|
|
639
|
+
return;
|
|
640
|
+
}
|
|
641
|
+
const names = normalized;
|
|
642
|
+
await this.writer.delete({ names });
|
|
643
|
+
const cached = this.store.get((ch) => names.includes(ch.name));
|
|
644
|
+
if (cached.length > 0) this.store.delete(cached.map((ch) => ch.key));
|
|
394
645
|
}
|
|
395
646
|
|
|
396
|
-
async rename(key: Key, name: string): Promise<void>;
|
|
397
|
-
async rename(keys: Key[], names: string[]): Promise<void>;
|
|
398
|
-
async rename(
|
|
399
|
-
|
|
647
|
+
async rename(key: Key, name: string, opts?: query.WriteOptions): Promise<void>;
|
|
648
|
+
async rename(keys: Key[], names: string[], opts?: query.WriteOptions): Promise<void>;
|
|
649
|
+
async rename(
|
|
650
|
+
keys: Key | Key[],
|
|
651
|
+
names: string | string[],
|
|
652
|
+
opts: query.WriteOptions = {},
|
|
653
|
+
): Promise<void> {
|
|
654
|
+
const keysArr = array.toArray(keys);
|
|
655
|
+
const namesArr = array.toArray(names);
|
|
656
|
+
const rename = () =>
|
|
657
|
+
keysArr.flatMap((key, i) => {
|
|
658
|
+
const name = namesArr[i];
|
|
659
|
+
return [
|
|
660
|
+
this.renameThrough(key, name),
|
|
661
|
+
this.cfg.ontology.cache.renameResource(ontologyID(key), name),
|
|
662
|
+
];
|
|
663
|
+
});
|
|
664
|
+
await query.optimistic({
|
|
665
|
+
rollbacks: rename(),
|
|
666
|
+
onOptimistic: opts.onOptimistic,
|
|
667
|
+
commit: async () => await this.writer.rename(keysArr, namesArr),
|
|
668
|
+
});
|
|
669
|
+
rename();
|
|
400
670
|
}
|
|
401
671
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
new DebouncedBatchRetriever(new ClusterRetriever(this.client), deb),
|
|
672
|
+
/** Renames the cached channel, skipping when absent. Returns a rollback. */
|
|
673
|
+
private renameThrough(key: Key, name: string): destructor.Destructor {
|
|
674
|
+
return this.store.set(key, (p) =>
|
|
675
|
+
p == null ? undefined : this.sugar({ ...p.payload, name }),
|
|
407
676
|
);
|
|
408
677
|
}
|
|
409
678
|
|
|
410
679
|
sugar(payload: Payload): Channel;
|
|
411
680
|
sugar(payloads: Payload[]): Channel[];
|
|
412
681
|
sugar(payloads: Payload | Payload[]): Channel | Channel[] {
|
|
413
|
-
const { frameClient } = this;
|
|
682
|
+
const { framer: frameClient } = this.cfg;
|
|
414
683
|
if (Array.isArray(payloads))
|
|
415
684
|
return payloads.map((p) => new Channel({ ...p, frameClient }));
|
|
416
685
|
return new Channel({ ...payloads, frameClient });
|
|
417
686
|
}
|
|
418
687
|
|
|
419
688
|
async retrieveGroup(): Promise<group.Group> {
|
|
420
|
-
const res = await this.
|
|
689
|
+
const res = await this.cfg.unary.send(
|
|
421
690
|
"/channel/retrieve-group",
|
|
422
691
|
{},
|
|
423
692
|
retrieveGroupReqZ,
|
|
@@ -425,7 +694,135 @@ export class Client {
|
|
|
425
694
|
);
|
|
426
695
|
return res.group;
|
|
427
696
|
}
|
|
697
|
+
|
|
698
|
+
/** Rebuilds a cached channel with its cached status attached. */
|
|
699
|
+
private compose(payload: Payload): Channel {
|
|
700
|
+
const next: Payload = { ...payload, status: undefined, alias: undefined };
|
|
701
|
+
if (isCalculated(payload)) {
|
|
702
|
+
const parsed = statusZ.safeParse(
|
|
703
|
+
this.cfg.statuses.store.get(statusKey(payload.key)),
|
|
704
|
+
);
|
|
705
|
+
if (parsed.success) next.status = parsed.data;
|
|
706
|
+
}
|
|
707
|
+
return this.sugar(next);
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
private composeAlias(payload: Payload, rangeKey: ranger.Key): Channel {
|
|
711
|
+
return this.sugar({
|
|
712
|
+
...payload,
|
|
713
|
+
alias: this.cfg.ranges.aliases.get(
|
|
714
|
+
createKey({ range: rangeKey, channel: payload.key }),
|
|
715
|
+
)?.alias,
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/** Fetches aliases under the range for keys the alias store has no entry for. */
|
|
720
|
+
private async ensureAliases(rangeKey: ranger.Key, keys: Key[]): Promise<void> {
|
|
721
|
+
const missing = keys.filter(
|
|
722
|
+
(key) =>
|
|
723
|
+
!this.cfg.ranges.aliases.has(createKey({ range: rangeKey, channel: key })),
|
|
724
|
+
);
|
|
725
|
+
if (missing.length === 0) return;
|
|
726
|
+
const fetched = await this.cfg.ranges.retrieveAliases(rangeKey, missing);
|
|
727
|
+
Object.entries(fetched).forEach(([channel, alias]) => {
|
|
728
|
+
const entry: ranger.alias.Alias = {
|
|
729
|
+
range: rangeKey,
|
|
730
|
+
channel: Number(channel),
|
|
731
|
+
alias,
|
|
732
|
+
};
|
|
733
|
+
this.cfg.ranges.aliases.set(createKey(entry), entry);
|
|
734
|
+
});
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
/** Fetches channel payloads. Missing channels are omitted, not thrown. */
|
|
738
|
+
private async execRetrieve(
|
|
739
|
+
channels: Params | RetrieveRequest,
|
|
740
|
+
options?: RetrieveOptions,
|
|
741
|
+
): Promise<Payload[]> {
|
|
742
|
+
let request: RetrieveRequest;
|
|
743
|
+
if (
|
|
744
|
+
!Array.isArray(channels) &&
|
|
745
|
+
typeof channels === "object" &&
|
|
746
|
+
!("key" in channels)
|
|
747
|
+
)
|
|
748
|
+
request = channels;
|
|
749
|
+
else {
|
|
750
|
+
const { variant, normalized: raw } = analyzeParams(channels);
|
|
751
|
+
const normalized = raw.filter((k) => k !== 0);
|
|
752
|
+
if (normalized.length === 0) return [];
|
|
753
|
+
request = { [variant]: normalized, ...options };
|
|
754
|
+
}
|
|
755
|
+
const res = await this.cfg.unary.send(
|
|
756
|
+
"/channel/retrieve",
|
|
757
|
+
request,
|
|
758
|
+
retrieveRequestZ,
|
|
759
|
+
retrieveResZ,
|
|
760
|
+
);
|
|
761
|
+
return res.channels;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
private async fetchSingle(query: RetrieveSingleParams): Promise<Channel> {
|
|
765
|
+
const { key, rangeKey } = query;
|
|
766
|
+
let ch = this.store.get(key);
|
|
767
|
+
if (ch == null) {
|
|
768
|
+
const payloads = await this.execRetrieve([key]);
|
|
769
|
+
checkForMultipleOrNoResults("channel", key, payloads, true);
|
|
770
|
+
ch = this.sugar(stripComposed(payloads[0]));
|
|
771
|
+
this.store.set(key, ch);
|
|
772
|
+
}
|
|
773
|
+
// A cached calculated channel without a cached status is ambiguous: the
|
|
774
|
+
// status may not exist, or may simply never have been fetched.
|
|
775
|
+
if (ch.isCalculated && !this.cfg.statuses.store.has(statusKey(key)))
|
|
776
|
+
try {
|
|
777
|
+
await this.cfg.statuses.retrieve(statusKey(key));
|
|
778
|
+
} catch (e) {
|
|
779
|
+
if (!NotFoundError.matches(e)) throw errors.fromUnknown(e);
|
|
780
|
+
}
|
|
781
|
+
if (rangeKey != null) await this.ensureAliases(rangeKey, [key]);
|
|
782
|
+
return ch;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
* Resolves literal names against the record store, fetching only the names it
|
|
787
|
+
* cannot resolve. A name matching two stored channels is ambiguous, which only
|
|
788
|
+
* a cluster running without name validation can produce, so the whole request
|
|
789
|
+
* falls through to the cluster. Returns null when the store cannot be trusted
|
|
790
|
+
* to answer any part of the request.
|
|
791
|
+
*/
|
|
792
|
+
private async resolveNames(names: string[]): Promise<Channel[] | null> {
|
|
793
|
+
if (!names.every((name) => NAME_LITERAL_PATTERN.test(name))) return null;
|
|
794
|
+
const resolved: Channel[] = [];
|
|
795
|
+
const missing: string[] = [];
|
|
796
|
+
for (const name of new Set(names)) {
|
|
797
|
+
const matches = this.store.get((ch) => ch.name === name);
|
|
798
|
+
if (matches.length > 1) return null;
|
|
799
|
+
if (matches.length === 0) missing.push(name);
|
|
800
|
+
else resolved.push(matches[0]);
|
|
801
|
+
}
|
|
802
|
+
if (missing.length === 0) return resolved;
|
|
803
|
+
const fetched = (await this.execRetrieve({ names: missing })).map((p) =>
|
|
804
|
+
this.sugar(stripComposed(p)),
|
|
805
|
+
);
|
|
806
|
+
return [...resolved, ...fetched];
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
private async fetchRequest(query: NormalizedRequest): Promise<Channel[]> {
|
|
810
|
+
const { rangeKey } = query;
|
|
811
|
+
let channels: Channel[] | null = null;
|
|
812
|
+
if (isKeysOnly(query)) channels = await this.store.retrieve(query.keys);
|
|
813
|
+
else if (isNamesOnly(query)) channels = await this.resolveNames(query.names);
|
|
814
|
+
channels ??= (await this.execRetrieve(query)).map((p) =>
|
|
815
|
+
this.sugar(stripComposed(p)),
|
|
816
|
+
);
|
|
817
|
+
if (rangeKey != null)
|
|
818
|
+
await this.ensureAliases(
|
|
819
|
+
rangeKey,
|
|
820
|
+
channels.map((ch) => ch.key),
|
|
821
|
+
);
|
|
822
|
+
return channels;
|
|
823
|
+
}
|
|
428
824
|
}
|
|
429
825
|
|
|
826
|
+
/** @returns whether the channel computes its samples from an expression. */
|
|
430
827
|
export const isCalculated = ({ virtual, expression }: Payload): boolean =>
|
|
431
828
|
virtual && expression !== "";
|