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