@synnaxlabs/client 0.56.1 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-B08VDLSA.js +14463 -0
- package/dist/client-B08VDLSA.js.map +1 -0
- package/dist/client.js +1128 -14876
- package/dist/client.js.map +1 -0
- package/dist/src/access/client.d.ts +10 -1
- package/dist/src/access/client.d.ts.map +1 -1
- package/dist/src/access/enforce.d.ts.map +1 -1
- package/dist/src/access/external.d.ts +1 -0
- package/dist/src/access/external.d.ts.map +1 -1
- package/dist/src/access/granted.d.ts +39 -0
- package/dist/src/access/granted.d.ts.map +1 -0
- package/dist/src/access/policy/client.d.ts +136 -147
- package/dist/src/access/policy/client.d.ts.map +1 -1
- package/dist/src/access/policy/types.gen.d.ts +15 -68
- package/dist/src/access/policy/types.gen.d.ts.map +1 -1
- package/dist/src/access/role/client.d.ts +77 -58
- package/dist/src/access/role/client.d.ts.map +1 -1
- package/dist/src/access/role/types.gen.d.ts +8 -14
- package/dist/src/access/role/types.gen.d.ts.map +1 -1
- package/dist/src/actions/actions.d.ts +5 -6
- package/dist/src/actions/actions.d.ts.map +1 -1
- package/dist/src/actions/controller.d.ts +194 -0
- package/dist/src/actions/controller.d.ts.map +1 -0
- package/dist/src/actions/external.d.ts +1 -0
- package/dist/src/actions/external.d.ts.map +1 -1
- package/dist/src/arc/actions.d.ts +575 -0
- package/dist/src/arc/actions.d.ts.map +1 -0
- package/dist/src/arc/actions.gen.d.ts +1439 -0
- package/dist/src/arc/actions.gen.d.ts.map +1 -0
- package/dist/src/arc/client.d.ts +97 -13
- package/dist/src/arc/client.d.ts.map +1 -1
- package/dist/src/arc/compiler/types.gen.d.ts +3 -3
- package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
- package/dist/src/arc/external.d.ts +2 -0
- package/dist/src/arc/external.d.ts.map +1 -1
- package/dist/src/arc/graph/types.gen.d.ts +45 -597
- package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
- package/dist/src/arc/ir/index.d.ts +1 -1
- package/dist/src/arc/ir/index.d.ts.map +1 -1
- package/dist/src/arc/ir/ir.d.ts +2 -0
- package/dist/src/arc/ir/ir.d.ts.map +1 -0
- package/dist/src/arc/ir/types.gen.d.ts +58 -2807
- package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
- package/dist/src/arc/module/types.gen.d.ts +18 -1090
- package/dist/src/arc/module/types.gen.d.ts.map +1 -1
- package/dist/src/arc/program/types.gen.d.ts +18 -1090
- package/dist/src/arc/program/types.gen.d.ts.map +1 -1
- package/dist/src/arc/text/types.gen.d.ts +54 -1
- package/dist/src/arc/text/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types/types.gen.d.ts +35 -153
- package/dist/src/arc/types/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types.gen.d.ts +98 -2278
- package/dist/src/arc/types.gen.d.ts.map +1 -1
- package/dist/src/auth/auth.d.ts +14 -2
- package/dist/src/auth/auth.d.ts.map +1 -1
- package/dist/src/channel/client.d.ts +113 -75
- package/dist/src/channel/client.d.ts.map +1 -1
- package/dist/src/channel/external.d.ts +0 -1
- package/dist/src/channel/external.d.ts.map +1 -1
- package/dist/src/channel/payload.d.ts +65 -56
- package/dist/src/channel/payload.d.ts.map +1 -1
- package/dist/src/channel/types.gen.d.ts +26 -73
- package/dist/src/channel/types.gen.d.ts.map +1 -1
- package/dist/src/channel/writer.d.ts +1 -3
- package/dist/src/channel/writer.d.ts.map +1 -1
- package/dist/src/client.d.ts +55 -27
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/connection/client.d.ts +146 -0
- package/dist/src/connection/client.d.ts.map +1 -0
- package/dist/src/connection/external.d.ts +3 -0
- package/dist/src/connection/external.d.ts.map +1 -0
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/status.d.ts +252 -0
- package/dist/src/connection/status.d.ts.map +1 -0
- package/dist/src/control/client.d.ts +31 -7
- package/dist/src/control/client.d.ts.map +1 -1
- package/dist/src/control/state.d.ts +47 -16
- package/dist/src/control/state.d.ts.map +1 -1
- package/dist/src/device/client.d.ts +59 -17
- package/dist/src/device/client.d.ts.map +1 -1
- package/dist/src/device/types.gen.d.ts +17 -67
- package/dist/src/device/types.gen.d.ts.map +1 -1
- package/dist/src/errors.d.ts +17 -20
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/ethercat/external.d.ts +2 -0
- package/dist/src/ethercat/external.d.ts.map +1 -0
- package/dist/src/ethercat/index.d.ts +2 -0
- package/dist/src/ethercat/index.d.ts.map +1 -0
- package/dist/src/ethercat/types.gen.d.ts +243 -0
- package/dist/src/ethercat/types.gen.d.ts.map +1 -0
- package/dist/src/framer/adapter.d.ts +8 -5
- package/dist/src/framer/adapter.d.ts.map +1 -1
- package/dist/src/framer/benchutil.d.ts +19 -0
- package/dist/src/framer/benchutil.d.ts.map +1 -0
- package/dist/src/framer/cache/cache.d.ts +38 -0
- package/dist/src/framer/cache/cache.d.ts.map +1 -0
- package/dist/src/framer/cache/dynamic.d.ts +71 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +43 -0
- package/dist/src/framer/cache/reader.d.ts.map +1 -0
- package/dist/src/framer/cache/static.d.ts +66 -0
- package/dist/src/framer/cache/static.d.ts.map +1 -0
- package/dist/src/framer/cache/streamer.d.ts +86 -0
- package/dist/src/framer/cache/streamer.d.ts.map +1 -0
- package/dist/src/framer/cache/transform.d.ts +18 -0
- package/dist/src/framer/cache/transform.d.ts.map +1 -0
- package/dist/src/framer/cache/unary.d.ts +37 -0
- package/dist/src/framer/cache/unary.d.ts.map +1 -0
- package/dist/src/framer/client.d.ts +35 -14
- package/dist/src/framer/client.d.ts.map +1 -1
- package/dist/src/framer/codec.d.ts.map +1 -1
- package/dist/src/framer/deleter.d.ts +3 -2
- package/dist/src/framer/deleter.d.ts.map +1 -1
- package/dist/src/framer/external.d.ts +6 -0
- package/dist/src/framer/external.d.ts.map +1 -1
- package/dist/src/framer/feed.d.ts +40 -0
- package/dist/src/framer/feed.d.ts.map +1 -0
- package/dist/src/framer/frame.d.ts +16 -20
- package/dist/src/framer/frame.d.ts.map +1 -1
- package/dist/src/framer/hardened.d.ts +70 -0
- package/dist/src/framer/hardened.d.ts.map +1 -0
- package/dist/src/framer/iterator.d.ts +36 -43
- package/dist/src/framer/iterator.d.ts.map +1 -1
- package/dist/src/framer/reader.d.ts +3 -2
- package/dist/src/framer/reader.d.ts.map +1 -1
- package/dist/src/framer/streamer.d.ts +132 -205
- package/dist/src/framer/streamer.d.ts.map +1 -1
- package/dist/src/framer/writer.d.ts +130 -161
- package/dist/src/framer/writer.d.ts.map +1 -1
- package/dist/src/group/client.d.ts +66 -9
- package/dist/src/group/client.d.ts.map +1 -1
- package/dist/src/group/types.gen.d.ts +2 -2
- package/dist/src/http/external.d.ts +2 -0
- package/dist/src/http/external.d.ts.map +1 -0
- package/dist/src/http/index.d.ts +2 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/types.gen.d.ts +451 -0
- package/dist/src/http/types.gen.d.ts.map +1 -0
- package/dist/src/imex/client.d.ts +88 -0
- package/dist/src/imex/client.d.ts.map +1 -0
- package/dist/src/imex/index.d.ts +2 -0
- package/dist/src/imex/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +18 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/label/client.d.ts +55 -36
- package/dist/src/label/client.d.ts.map +1 -1
- package/dist/src/label/external.d.ts +2 -0
- package/dist/src/label/external.d.ts.map +1 -1
- package/dist/src/label/payload.d.ts +4 -46
- package/dist/src/label/payload.d.ts.map +1 -1
- package/dist/src/label/store.d.ts +8 -0
- package/dist/src/label/store.d.ts.map +1 -0
- package/dist/src/label/types.gen.d.ts +45 -0
- package/dist/src/label/types.gen.d.ts.map +1 -0
- package/dist/src/labjack/external.d.ts +2 -0
- package/dist/src/labjack/external.d.ts.map +1 -0
- package/dist/src/labjack/index.d.ts +2 -0
- package/dist/src/labjack/index.d.ts.map +1 -0
- package/dist/src/labjack/types.gen.d.ts +442 -0
- package/dist/src/labjack/types.gen.d.ts.map +1 -0
- package/dist/src/lineplot/actions.d.ts +914 -0
- package/dist/src/lineplot/actions.d.ts.map +1 -0
- package/dist/src/lineplot/actions.gen.d.ts +4208 -0
- package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
- package/dist/src/lineplot/client.d.ts +66 -16
- package/dist/src/lineplot/client.d.ts.map +1 -1
- package/dist/src/lineplot/external.d.ts +3 -0
- package/dist/src/lineplot/external.d.ts.map +1 -1
- package/dist/src/lineplot/line.d.ts +16 -0
- package/dist/src/lineplot/line.d.ts.map +1 -0
- package/dist/src/lineplot/types.gen.d.ts +837 -14
- package/dist/src/lineplot/types.gen.d.ts.map +1 -1
- package/dist/src/log/actions.d.ts +271 -0
- package/dist/src/log/actions.d.ts.map +1 -0
- package/dist/src/log/actions.gen.d.ts +1529 -0
- package/dist/src/log/actions.gen.d.ts.map +1 -0
- package/dist/src/log/client.d.ts +66 -16
- package/dist/src/log/client.d.ts.map +1 -1
- package/dist/src/log/external.d.ts +2 -0
- package/dist/src/log/external.d.ts.map +1 -1
- package/dist/src/log/types.gen.d.ts +139 -14
- package/dist/src/log/types.gen.d.ts.map +1 -1
- package/dist/src/modbus/external.d.ts +2 -0
- package/dist/src/modbus/external.d.ts.map +1 -0
- package/dist/src/modbus/index.d.ts +2 -0
- package/dist/src/modbus/index.d.ts.map +1 -0
- package/dist/src/modbus/types.gen.d.ts +280 -0
- package/dist/src/modbus/types.gen.d.ts.map +1 -0
- package/dist/src/ni/external.d.ts +2 -0
- package/dist/src/ni/external.d.ts.map +1 -0
- package/dist/src/ni/index.d.ts +2 -0
- package/dist/src/ni/index.d.ts.map +1 -0
- package/dist/src/ni/types.gen.d.ts +21029 -0
- package/dist/src/ni/types.gen.d.ts.map +1 -0
- package/dist/src/node/index.d.ts +2 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/types.gen.d.ts +4 -0
- package/dist/src/node/types.gen.d.ts.map +1 -0
- package/dist/src/ontology/client.d.ts +314 -67
- package/dist/src/ontology/client.d.ts.map +1 -1
- package/dist/src/ontology/external.d.ts +1 -0
- package/dist/src/ontology/external.d.ts.map +1 -1
- package/dist/src/ontology/payload.d.ts +60 -18
- package/dist/src/ontology/payload.d.ts.map +1 -1
- package/dist/src/ontology/store.d.ts +32 -0
- package/dist/src/ontology/store.d.ts.map +1 -0
- package/dist/src/ontology/types.gen.d.ts +3 -2
- package/dist/src/ontology/types.gen.d.ts.map +1 -1
- package/dist/src/ontology/writer.d.ts +16 -10
- package/dist/src/ontology/writer.d.ts.map +1 -1
- package/dist/src/opcua/external.d.ts +2 -0
- package/dist/src/opcua/external.d.ts.map +1 -0
- package/dist/src/opcua/index.d.ts +2 -0
- package/dist/src/opcua/index.d.ts.map +1 -0
- package/dist/src/opcua/types.gen.d.ts +82 -0
- package/dist/src/opcua/types.gen.d.ts.map +1 -0
- package/dist/src/pagerduty/external.d.ts +2 -0
- package/dist/src/pagerduty/external.d.ts.map +1 -0
- package/dist/src/pagerduty/index.d.ts +2 -0
- package/dist/src/pagerduty/index.d.ts.map +1 -0
- package/dist/src/pagerduty/types.gen.d.ts +30 -0
- package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
- package/dist/src/panel/actions.d.ts +273 -0
- package/dist/src/panel/actions.d.ts.map +1 -0
- package/dist/src/panel/actions.gen.d.ts +1255 -0
- package/dist/src/panel/actions.gen.d.ts.map +1 -0
- package/dist/src/panel/client.d.ts +148 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/external.d.ts +6 -0
- package/dist/src/panel/external.d.ts.map +1 -0
- package/dist/src/panel/index.d.ts +2 -0
- package/dist/src/panel/index.d.ts.map +1 -0
- package/dist/src/panel/tree.d.ts +50 -0
- package/dist/src/panel/tree.d.ts.map +1 -0
- package/dist/src/panel/types.gen.d.ts +370 -0
- package/dist/src/panel/types.gen.d.ts.map +1 -0
- package/dist/src/project/client.d.ts +89 -0
- package/dist/src/project/client.d.ts.map +1 -0
- package/dist/src/project/external.d.ts.map +1 -0
- package/dist/src/project/index.d.ts +2 -0
- package/dist/src/project/index.d.ts.map +1 -0
- package/dist/src/project/types.gen.d.ts +27 -0
- package/dist/src/project/types.gen.d.ts.map +1 -0
- package/dist/src/query/cache.d.ts +132 -0
- package/dist/src/query/cache.d.ts.map +1 -0
- package/dist/src/query/deleted.d.ts +20 -0
- package/dist/src/query/deleted.d.ts.map +1 -0
- package/dist/src/query/derived.d.ts +33 -0
- package/dist/src/query/derived.d.ts.map +1 -0
- package/dist/src/query/external.d.ts +10 -0
- package/dist/src/query/external.d.ts.map +1 -0
- package/dist/src/query/index.d.ts +2 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/query.d.ts +235 -0
- package/dist/src/query/query.d.ts.map +1 -0
- package/dist/src/query/retriever.d.ts +135 -0
- package/dist/src/query/retriever.d.ts.map +1 -0
- package/dist/src/query/streamer.d.ts +67 -0
- package/dist/src/query/streamer.d.ts.map +1 -0
- package/dist/src/query/table.d.ts +219 -0
- package/dist/src/query/table.d.ts.map +1 -0
- package/dist/src/query/types.d.ts +35 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/write.d.ts +21 -0
- package/dist/src/query/write.d.ts.map +1 -0
- package/dist/src/rack/client.d.ts +58 -20
- package/dist/src/rack/client.d.ts.map +1 -1
- package/dist/src/rack/types.gen.d.ts +11 -12
- package/dist/src/rack/types.gen.d.ts.map +1 -1
- package/dist/src/range/alias/types.gen.d.ts +2 -3
- package/dist/src/range/alias/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/client.d.ts +138 -27
- package/dist/src/ranger/client.d.ts.map +1 -1
- package/dist/src/ranger/kv/client.d.ts +7 -4
- package/dist/src/ranger/kv/client.d.ts.map +1 -1
- package/dist/src/ranger/payload.d.ts +3 -0
- package/dist/src/ranger/payload.d.ts.map +1 -1
- package/dist/src/ranger/types.gen.d.ts +45 -101
- package/dist/src/ranger/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/writer.d.ts +2 -74
- package/dist/src/ranger/writer.d.ts.map +1 -1
- package/dist/src/schematic/actions.d.ts +90 -33
- package/dist/src/schematic/actions.d.ts.map +1 -1
- package/dist/src/schematic/actions.gen.d.ts +207 -114
- package/dist/src/schematic/actions.gen.d.ts.map +1 -1
- package/dist/src/schematic/client.d.ts +70 -68
- package/dist/src/schematic/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/client.d.ts +133 -27
- package/dist/src/schematic/symbol/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
- package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
- package/dist/src/schematic/types.gen.d.ts +17 -96
- package/dist/src/schematic/types.gen.d.ts.map +1 -1
- package/dist/src/status/client.d.ts +69 -14
- package/dist/src/status/client.d.ts.map +1 -1
- package/dist/src/status/external.d.ts +2 -0
- package/dist/src/status/external.d.ts.map +1 -1
- package/dist/src/status/payload.d.ts +2 -36
- package/dist/src/status/payload.d.ts.map +1 -1
- package/dist/src/status/status.d.ts +65 -0
- package/dist/src/status/status.d.ts.map +1 -0
- package/dist/src/status/types.gen.d.ts +58 -0
- package/dist/src/status/types.gen.d.ts.map +1 -0
- package/dist/src/table/actions.d.ts +72 -13
- package/dist/src/table/actions.d.ts.map +1 -1
- package/dist/src/table/actions.gen.d.ts +221 -137
- package/dist/src/table/actions.gen.d.ts.map +1 -1
- package/dist/src/table/client.d.ts +64 -40
- package/dist/src/table/client.d.ts.map +1 -1
- package/dist/src/table/types.gen.d.ts +20 -55
- package/dist/src/table/types.gen.d.ts.map +1 -1
- package/dist/src/task/client.d.ts +149 -28
- package/dist/src/task/client.d.ts.map +1 -1
- package/dist/src/task/types.gen.d.ts +71 -89
- package/dist/src/task/types.gen.d.ts.map +1 -1
- package/dist/src/testutil/access.d.ts +27 -1
- package/dist/src/testutil/access.d.ts.map +1 -1
- package/dist/src/testutil/channels.d.ts +2 -0
- package/dist/src/testutil/channels.d.ts.map +1 -1
- package/dist/src/testutil/client.d.ts +5 -0
- package/dist/src/testutil/client.d.ts.map +1 -1
- package/dist/src/testutil/connection.d.ts +10 -0
- package/dist/src/testutil/connection.d.ts.map +1 -0
- package/dist/src/testutil/index.d.ts +9 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/panels.d.ts +8 -0
- package/dist/src/testutil/panels.d.ts.map +1 -0
- package/dist/src/testutil/proxy.d.ts +29 -0
- package/dist/src/testutil/proxy.d.ts.map +1 -0
- package/dist/src/testutil/query.d.ts +7 -0
- package/dist/src/testutil/query.d.ts.map +1 -0
- package/dist/src/testutil/telem.d.ts +4 -0
- package/dist/src/testutil/telem.d.ts.map +1 -1
- package/dist/src/transport.d.ts +10 -4
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/user/client.d.ts +29 -28
- package/dist/src/user/client.d.ts.map +1 -1
- package/dist/src/user/external.d.ts +1 -1
- package/dist/src/user/external.d.ts.map +1 -1
- package/dist/src/user/types.gen.d.ts +4 -4
- package/dist/src/util/retrieve.d.ts +2 -2
- package/dist/src/util/retrieve.d.ts.map +1 -1
- package/dist/src/util/telem.d.ts.map +1 -1
- package/dist/src/view/client.d.ts +30 -14
- package/dist/src/view/client.d.ts.map +1 -1
- package/dist/src/view/types.gen.d.ts +7 -15
- package/dist/src/view/types.gen.d.ts.map +1 -1
- package/dist/testutil.js +189 -0
- package/dist/testutil.js.map +1 -0
- package/package.json +40 -17
- package/src/access/client.ts +14 -3
- package/src/access/enforce.ts +0 -3
- package/src/access/external.ts +1 -0
- package/src/access/granted.ts +114 -0
- package/src/access/policy/client.ts +135 -43
- package/src/access/policy/types.gen.ts +9 -11
- package/src/access/role/client.ts +160 -38
- package/src/access/role/types.gen.ts +8 -12
- package/src/actions/actions.ts +5 -6
- package/src/actions/controller.ts +626 -0
- package/src/actions/external.ts +11 -0
- package/src/arc/actions.gen.ts +313 -0
- package/src/arc/actions.ts +192 -0
- package/src/arc/client.ts +424 -41
- package/src/arc/compiler/types.gen.ts +5 -6
- package/src/arc/external.ts +2 -0
- package/src/arc/graph/types.gen.ts +24 -22
- package/src/arc/ir/index.ts +1 -1
- package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
- package/src/arc/ir/types.gen.ts +42 -41
- package/src/arc/text/types.gen.ts +21 -2
- package/src/arc/types/types.gen.ts +40 -32
- package/src/arc/types.gen.ts +31 -29
- package/src/auth/auth.ts +40 -8
- package/src/channel/client.ts +529 -132
- package/src/channel/external.ts +0 -1
- package/src/channel/payload.ts +30 -3
- package/src/channel/types.gen.ts +37 -48
- package/src/channel/writer.ts +2 -11
- package/src/client.ts +215 -91
- package/src/connection/client.ts +495 -0
- package/src/connection/external.ts +34 -0
- package/src/connection/index.ts +1 -1
- package/src/connection/status.ts +442 -0
- package/src/control/client.ts +84 -12
- package/src/control/state.ts +17 -36
- package/src/device/client.ts +293 -41
- package/src/device/types.gen.ts +15 -26
- package/src/errors.ts +45 -22
- package/src/{workspace → ethercat}/external.ts +1 -2
- package/src/{workspace → ethercat}/index.ts +1 -1
- package/src/ethercat/types.gen.ts +151 -0
- package/src/framer/adapter.ts +60 -37
- package/src/framer/benchutil.ts +67 -0
- package/src/framer/cache/cache.ts +115 -0
- package/src/framer/cache/dynamic.ts +279 -0
- package/src/framer/cache/reader.ts +160 -0
- package/src/framer/cache/static.ts +215 -0
- package/src/framer/cache/streamer.ts +391 -0
- package/src/framer/cache/transform.ts +31 -0
- package/src/framer/cache/unary.ts +104 -0
- package/src/framer/client.ts +71 -43
- package/src/framer/codec.ts +55 -18
- package/src/framer/deleter.ts +4 -6
- package/src/framer/external.ts +10 -0
- package/src/framer/feed.ts +108 -0
- package/src/framer/frame.ts +13 -23
- package/src/framer/hardened.ts +283 -0
- package/src/framer/iterator.ts +31 -42
- package/src/framer/reader.ts +11 -11
- package/src/framer/streamer.ts +18 -178
- package/src/framer/writer.ts +39 -59
- package/src/group/client.ts +158 -23
- package/src/http/external.ts +10 -0
- package/src/{cluster → http}/index.ts +1 -1
- package/src/http/types.gen.ts +245 -0
- package/src/imex/client.ts +125 -0
- package/src/imex/index.ts +10 -0
- package/src/index.ts +18 -6
- package/src/label/client.ts +193 -54
- package/src/label/external.ts +2 -0
- package/src/label/payload.ts +4 -9
- package/src/label/store.ts +28 -0
- package/src/label/types.gen.ts +31 -0
- package/src/labjack/external.ts +10 -0
- package/src/labjack/index.ts +10 -0
- package/src/labjack/types.gen.ts +251 -0
- package/src/lineplot/actions.gen.ts +880 -0
- package/src/lineplot/actions.ts +535 -0
- package/src/lineplot/client.ts +224 -52
- package/src/lineplot/external.ts +3 -0
- package/src/lineplot/line.ts +80 -0
- package/src/lineplot/types.gen.ts +225 -12
- package/src/log/actions.gen.ts +474 -0
- package/src/log/actions.ts +242 -0
- package/src/log/client.ts +223 -52
- package/src/log/external.ts +2 -0
- package/src/log/types.gen.ts +45 -14
- package/src/modbus/external.ts +10 -0
- package/src/modbus/index.ts +10 -0
- package/src/modbus/types.gen.ts +185 -0
- package/src/ni/external.ts +10 -0
- package/src/ni/index.ts +10 -0
- package/src/ni/types.gen.ts +1632 -0
- package/src/node/index.ts +10 -0
- package/src/{cluster → node}/types.gen.ts +2 -2
- package/src/ontology/client.ts +408 -99
- package/src/ontology/external.ts +7 -0
- package/src/ontology/payload.ts +48 -7
- package/src/ontology/store.ts +83 -0
- package/src/ontology/types.gen.ts +2 -1
- package/src/ontology/writer.ts +1 -0
- package/src/opcua/external.ts +10 -0
- package/src/opcua/index.ts +10 -0
- package/src/opcua/types.gen.ts +65 -0
- package/src/pagerduty/external.ts +10 -0
- package/src/pagerduty/index.ts +10 -0
- package/src/pagerduty/types.gen.ts +41 -0
- package/src/panel/actions.gen.ts +267 -0
- package/src/panel/actions.ts +357 -0
- package/src/panel/client.ts +327 -0
- package/src/panel/external.ts +14 -0
- package/src/panel/index.ts +10 -0
- package/src/panel/tree.ts +163 -0
- package/src/panel/types.gen.ts +164 -0
- package/src/project/client.ts +273 -0
- package/src/project/external.ts +11 -0
- package/src/project/index.ts +10 -0
- package/src/project/types.gen.ts +40 -0
- package/src/query/cache.ts +326 -0
- package/src/query/deleted.ts +38 -0
- package/src/query/derived.ts +101 -0
- package/src/query/external.ts +51 -0
- package/src/query/index.ts +10 -0
- package/src/query/query.ts +865 -0
- package/src/query/retriever.ts +308 -0
- package/src/query/streamer.ts +207 -0
- package/src/query/table.ts +625 -0
- package/src/query/types.ts +54 -0
- package/src/query/write.ts +42 -0
- package/src/rack/client.ts +233 -45
- package/src/rack/types.gen.ts +15 -16
- package/src/range/alias/types.gen.ts +2 -3
- package/src/ranger/client.ts +581 -70
- package/src/ranger/kv/client.ts +52 -21
- package/src/ranger/payload.ts +3 -0
- package/src/ranger/types.gen.ts +21 -23
- package/src/ranger/writer.ts +4 -8
- package/src/schematic/actions.gen.ts +62 -53
- package/src/schematic/actions.ts +44 -42
- package/src/schematic/client.ts +226 -70
- package/src/schematic/symbol/client.ts +277 -48
- package/src/schematic/symbol/types.gen.ts +22 -34
- package/src/schematic/types.gen.ts +22 -29
- package/src/status/client.ts +321 -44
- package/src/status/external.ts +2 -0
- package/src/status/payload.ts +1 -23
- package/src/status/status.ts +241 -0
- package/src/status/types.gen.ts +108 -0
- package/src/table/actions.gen.ts +96 -63
- package/src/table/actions.ts +44 -19
- package/src/table/client.ts +220 -56
- package/src/table/types.gen.ts +24 -31
- package/src/task/client.ts +580 -101
- package/src/task/types.gen.ts +68 -75
- package/src/testutil/access.ts +102 -6
- package/src/testutil/channels.ts +29 -0
- package/src/testutil/client.ts +27 -2
- package/src/testutil/connection.ts +47 -0
- package/src/testutil/index.ts +17 -0
- package/src/testutil/panels.ts +26 -0
- package/src/testutil/proxy.ts +106 -0
- package/src/testutil/query.ts +28 -0
- package/src/testutil/telem.ts +17 -1
- package/src/transport.ts +18 -7
- package/src/user/client.ts +165 -64
- package/src/user/external.ts +1 -1
- package/src/user/types.gen.ts +5 -5
- package/src/util/retrieve.ts +4 -4
- package/src/util/telem.ts +0 -1
- package/src/view/client.ts +120 -37
- package/src/view/types.gen.ts +8 -11
- package/.turbo/turbo-build.log +0 -20
- package/.vscode/settings.json +0 -3
- package/CONTRIBUTING.md +0 -47
- package/dist/client.cjs +0 -118
- package/dist/eslint.config.d.ts +0 -4
- package/dist/eslint.config.d.ts.map +0 -1
- package/dist/src/access/enforce.spec.d.ts +0 -2
- package/dist/src/access/enforce.spec.d.ts.map +0 -1
- package/dist/src/access/policy/access.spec.d.ts +0 -2
- package/dist/src/access/policy/access.spec.d.ts.map +0 -1
- package/dist/src/access/role/role.spec.d.ts +0 -2
- package/dist/src/access/role/role.spec.d.ts.map +0 -1
- package/dist/src/actions/actions.spec.d.ts +0 -2
- package/dist/src/actions/actions.spec.d.ts.map +0 -1
- package/dist/src/arc/access.spec.d.ts +0 -2
- package/dist/src/arc/access.spec.d.ts.map +0 -1
- package/dist/src/arc/arc.spec.d.ts +0 -2
- package/dist/src/arc/arc.spec.d.ts.map +0 -1
- package/dist/src/arc/lsp.spec.d.ts +0 -2
- package/dist/src/arc/lsp.spec.d.ts.map +0 -1
- package/dist/src/auth/auth.spec.d.ts +0 -2
- package/dist/src/auth/auth.spec.d.ts.map +0 -1
- package/dist/src/channel/access.spec.d.ts +0 -2
- package/dist/src/channel/access.spec.d.ts.map +0 -1
- package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
- package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
- package/dist/src/channel/channel.spec.d.ts +0 -2
- package/dist/src/channel/channel.spec.d.ts.map +0 -1
- package/dist/src/channel/payload.spec.d.ts +0 -2
- package/dist/src/channel/payload.spec.d.ts.map +0 -1
- package/dist/src/channel/retriever.d.ts +0 -64
- package/dist/src/channel/retriever.d.ts.map +0 -1
- package/dist/src/cluster/index.d.ts +0 -2
- package/dist/src/cluster/index.d.ts.map +0 -1
- package/dist/src/cluster/types.gen.d.ts +0 -4
- package/dist/src/cluster/types.gen.d.ts.map +0 -1
- package/dist/src/connection/checker.d.ts +0 -86
- package/dist/src/connection/checker.d.ts.map +0 -1
- package/dist/src/connection/connection.spec.d.ts +0 -2
- package/dist/src/connection/connection.spec.d.ts.map +0 -1
- package/dist/src/connection.spec.d.ts +0 -2
- package/dist/src/connection.spec.d.ts.map +0 -1
- package/dist/src/control/state.spec.d.ts +0 -2
- package/dist/src/control/state.spec.d.ts.map +0 -1
- package/dist/src/device/access.spec.d.ts +0 -2
- package/dist/src/device/access.spec.d.ts.map +0 -1
- package/dist/src/device/device.spec.d.ts +0 -2
- package/dist/src/device/device.spec.d.ts.map +0 -1
- package/dist/src/device/payload.spec.d.ts +0 -2
- package/dist/src/device/payload.spec.d.ts.map +0 -1
- package/dist/src/errors.spec.d.ts +0 -2
- package/dist/src/errors.spec.d.ts.map +0 -1
- package/dist/src/framer/adapter.spec.d.ts +0 -2
- package/dist/src/framer/adapter.spec.d.ts.map +0 -1
- package/dist/src/framer/client.spec.d.ts +0 -2
- package/dist/src/framer/client.spec.d.ts.map +0 -1
- package/dist/src/framer/codec.spec.d.ts +0 -2
- package/dist/src/framer/codec.spec.d.ts.map +0 -1
- package/dist/src/framer/deleter.spec.d.ts +0 -2
- package/dist/src/framer/deleter.spec.d.ts.map +0 -1
- package/dist/src/framer/frame.spec.d.ts +0 -2
- package/dist/src/framer/frame.spec.d.ts.map +0 -1
- package/dist/src/framer/iterator.spec.d.ts +0 -2
- package/dist/src/framer/iterator.spec.d.ts.map +0 -1
- package/dist/src/framer/reader.spec.d.ts +0 -2
- package/dist/src/framer/reader.spec.d.ts.map +0 -1
- package/dist/src/framer/streamer.spec.d.ts +0 -2
- package/dist/src/framer/streamer.spec.d.ts.map +0 -1
- package/dist/src/framer/writer.spec.d.ts +0 -2
- package/dist/src/framer/writer.spec.d.ts.map +0 -1
- package/dist/src/group/access.spec.d.ts +0 -2
- package/dist/src/group/access.spec.d.ts.map +0 -1
- package/dist/src/group/group.spec.d.ts +0 -2
- package/dist/src/group/group.spec.d.ts.map +0 -1
- package/dist/src/label/access.spec.d.ts +0 -2
- package/dist/src/label/access.spec.d.ts.map +0 -1
- package/dist/src/label/label.spec.d.ts +0 -2
- package/dist/src/label/label.spec.d.ts.map +0 -1
- package/dist/src/lineplot/access.spec.d.ts +0 -2
- package/dist/src/lineplot/access.spec.d.ts.map +0 -1
- package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
- package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
- package/dist/src/log/access.spec.d.ts +0 -2
- package/dist/src/log/access.spec.d.ts.map +0 -1
- package/dist/src/log/log.spec.d.ts +0 -2
- package/dist/src/log/log.spec.d.ts.map +0 -1
- package/dist/src/ontology/ontology.spec.d.ts +0 -2
- package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
- package/dist/src/rack/access.spec.d.ts +0 -2
- package/dist/src/rack/access.spec.d.ts.map +0 -1
- package/dist/src/rack/rack.spec.d.ts +0 -2
- package/dist/src/rack/rack.spec.d.ts.map +0 -1
- package/dist/src/ranger/access.spec.d.ts +0 -2
- package/dist/src/ranger/access.spec.d.ts.map +0 -1
- package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
- package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
- package/dist/src/ranger/ranger.spec.d.ts +0 -2
- package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
- package/dist/src/schematic/access.spec.d.ts +0 -2
- package/dist/src/schematic/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/actions.spec.d.ts +0 -2
- package/dist/src/schematic/actions.spec.d.ts.map +0 -1
- package/dist/src/schematic/schematic.spec.d.ts +0 -2
- package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
- package/dist/src/status/access.spec.d.ts +0 -2
- package/dist/src/status/access.spec.d.ts.map +0 -1
- package/dist/src/status/status.spec.d.ts +0 -2
- package/dist/src/status/status.spec.d.ts.map +0 -1
- package/dist/src/table/access.spec.d.ts +0 -2
- package/dist/src/table/access.spec.d.ts.map +0 -1
- package/dist/src/table/table.spec.d.ts +0 -2
- package/dist/src/table/table.spec.d.ts.map +0 -1
- package/dist/src/task/access.spec.d.ts +0 -2
- package/dist/src/task/access.spec.d.ts.map +0 -1
- package/dist/src/task/payload.spec.d.ts +0 -2
- package/dist/src/task/payload.spec.d.ts.map +0 -1
- package/dist/src/task/task.spec.d.ts +0 -2
- package/dist/src/task/task.spec.d.ts.map +0 -1
- package/dist/src/user/access.spec.d.ts +0 -2
- package/dist/src/user/access.spec.d.ts.map +0 -1
- package/dist/src/user/user.spec.d.ts +0 -2
- package/dist/src/user/user.spec.d.ts.map +0 -1
- package/dist/src/util/retrieve.spec.d.ts +0 -2
- package/dist/src/util/retrieve.spec.d.ts.map +0 -1
- package/dist/src/view/view.spec.d.ts +0 -2
- package/dist/src/view/view.spec.d.ts.map +0 -1
- package/dist/src/workspace/access.spec.d.ts +0 -2
- package/dist/src/workspace/access.spec.d.ts.map +0 -1
- package/dist/src/workspace/client.d.ts +0 -36
- package/dist/src/workspace/client.d.ts.map +0 -1
- package/dist/src/workspace/external.d.ts.map +0 -1
- package/dist/src/workspace/index.d.ts +0 -2
- package/dist/src/workspace/index.d.ts.map +0 -1
- package/dist/src/workspace/types.gen.d.ts +0 -34
- package/dist/src/workspace/types.gen.d.ts.map +0 -1
- package/dist/src/workspace/workspace.spec.d.ts +0 -2
- package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
- package/examples/node/basicReadWrite.js +0 -86
- package/examples/node/createChannels.js +0 -50
- package/examples/node/createRange.js +0 -67
- package/examples/node/package-lock.json +0 -133
- package/examples/node/package.json +0 -17
- package/examples/node/readLatest.js +0 -76
- package/examples/node/seriesAndFrames.js +0 -173
- package/examples/node/streamRead.js +0 -50
- package/examples/node/streamWrite.js +0 -87
- package/src/access/enforce.spec.ts +0 -188
- package/src/access/policy/access.spec.ts +0 -147
- package/src/access/role/role.spec.ts +0 -95
- package/src/actions/actions.spec.ts +0 -229
- package/src/arc/access.spec.ts +0 -149
- package/src/arc/arc.spec.ts +0 -44
- package/src/arc/lsp.spec.ts +0 -717
- package/src/auth/auth.spec.ts +0 -101
- package/src/channel/access.spec.ts +0 -116
- package/src/channel/batchRetriever.spec.ts +0 -115
- package/src/channel/channel.spec.ts +0 -352
- package/src/channel/payload.spec.ts +0 -117
- package/src/channel/retriever.ts +0 -252
- package/src/connection/checker.ts +0 -203
- package/src/connection/connection.spec.ts +0 -152
- package/src/connection.spec.ts +0 -145
- package/src/control/state.spec.ts +0 -22
- package/src/device/access.spec.ts +0 -159
- package/src/device/device.spec.ts +0 -461
- package/src/device/payload.spec.ts +0 -142
- package/src/errors.spec.ts +0 -71
- package/src/framer/adapter.spec.ts +0 -620
- package/src/framer/client.spec.ts +0 -180
- package/src/framer/codec.spec.ts +0 -383
- package/src/framer/deleter.spec.ts +0 -103
- package/src/framer/frame.spec.ts +0 -973
- package/src/framer/iterator.spec.ts +0 -169
- package/src/framer/reader.spec.ts +0 -865
- package/src/framer/streamer.spec.ts +0 -871
- package/src/framer/writer.spec.ts +0 -486
- package/src/group/access.spec.ts +0 -77
- package/src/group/group.spec.ts +0 -65
- package/src/label/access.spec.ts +0 -109
- package/src/label/label.spec.ts +0 -83
- package/src/lineplot/access.spec.ts +0 -134
- package/src/lineplot/lineplot.spec.ts +0 -120
- package/src/log/access.spec.ts +0 -132
- package/src/log/log.spec.ts +0 -106
- package/src/ontology/ontology.spec.ts +0 -521
- package/src/rack/access.spec.ts +0 -102
- package/src/rack/rack.spec.ts +0 -171
- package/src/ranger/access.spec.ts +0 -115
- package/src/ranger/alias/payload.spec.ts +0 -52
- package/src/ranger/ranger.spec.ts +0 -343
- package/src/schematic/access.spec.ts +0 -134
- package/src/schematic/actions.spec.ts +0 -699
- package/src/schematic/schematic.spec.ts +0 -340
- package/src/schematic/symbol/access.spec.ts +0 -172
- package/src/schematic/symbol/client.spec.ts +0 -160
- package/src/status/access.spec.ts +0 -129
- package/src/status/status.spec.ts +0 -448
- package/src/table/access.spec.ts +0 -128
- package/src/table/table.spec.ts +0 -651
- package/src/task/access.spec.ts +0 -131
- package/src/task/payload.spec.ts +0 -113
- package/src/task/task.spec.ts +0 -657
- package/src/user/access.spec.ts +0 -107
- package/src/user/user.spec.ts +0 -290
- package/src/util/retrieve.spec.ts +0 -49
- package/src/view/view.spec.ts +0 -165
- package/src/workspace/access.spec.ts +0 -108
- package/src/workspace/client.ts +0 -112
- package/src/workspace/types.gen.ts +0 -46
- package/src/workspace/workspace.spec.ts +0 -111
- package/tsconfig.json +0 -5
- package/tsconfig.vite.json +0 -4
- package/vite.config.ts +0 -29
- /package/dist/src/{workspace → project}/external.d.ts +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// Copyright 2026 Synnax Labs, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Use of this software is governed by the Business Source License included in the file
|
|
4
|
+
// licenses/BSL.txt.
|
|
5
|
+
//
|
|
6
|
+
// As of the Change Date specified in that file, in accordance with the Business Source
|
|
7
|
+
// License, use of this software will be governed by the Apache License, Version 2.0,
|
|
8
|
+
// included in the file licenses/APL.txt.
|
|
9
|
+
|
|
10
|
+
import { type destructor, type record, zod } from "@synnaxlabs/x";
|
|
11
|
+
import z from "zod";
|
|
12
|
+
|
|
13
|
+
import { NotFoundError, ValidationError } from "@/errors";
|
|
14
|
+
import { type Cache } from "@/query/cache";
|
|
15
|
+
import {
|
|
16
|
+
type Cached,
|
|
17
|
+
type ChangeHandler,
|
|
18
|
+
type Retrieves,
|
|
19
|
+
type Watch,
|
|
20
|
+
} from "@/query/query";
|
|
21
|
+
import { type Keyed, type Table } from "@/query/table";
|
|
22
|
+
import { type Data, type FetchOptions, type Params } from "@/query/types";
|
|
23
|
+
|
|
24
|
+
/** Query fields only the server can evaluate, shared by most request shapes. */
|
|
25
|
+
const DEFAULT_SERVER_FIELDS = ["searchTerm", "limit", "offset"] as const;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Returns the keys of a request that addresses keys and nothing else: a
|
|
29
|
+
* non-empty `keys` field with every other field nullish. Such requests resolve
|
|
30
|
+
* through the table's fetch primitive instead of the request fetch. Returns
|
|
31
|
+
* null for any other request.
|
|
32
|
+
*/
|
|
33
|
+
const keysOnly = (query: unknown): unknown[] | null => {
|
|
34
|
+
if (typeof query !== "object" || query === null || Array.isArray(query)) return null;
|
|
35
|
+
const { keys } = query as { keys?: unknown };
|
|
36
|
+
if (!Array.isArray(keys) || keys.length === 0) return null;
|
|
37
|
+
if (!Object.entries(query).every(([k, v]) => k === "keys" || v == null)) return null;
|
|
38
|
+
return keys;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/** True for params that are a bare record key rather than a query object. */
|
|
42
|
+
const isBareKey = (params: unknown): params is record.Key =>
|
|
43
|
+
typeof params === "string" || typeof params === "number";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Request schema arm reading a bare key list as `{ keys }`. Union it onto a
|
|
47
|
+
* domain's request schema to opt that domain into the shorthand:
|
|
48
|
+
* `retrieveRequestZ.or(keyListZ(keyZ))`.
|
|
49
|
+
*/
|
|
50
|
+
export const keyListZ = <K extends z.ZodType<record.Key>>(key: K) =>
|
|
51
|
+
z.array(key).transform((keys) => ({ keys }));
|
|
52
|
+
|
|
53
|
+
interface ComposeProp<V, D> {
|
|
54
|
+
/**
|
|
55
|
+
* Per-record enrichment applied to every answer, receiving the normalized
|
|
56
|
+
* query the record answers. Defaults to identity.
|
|
57
|
+
*/
|
|
58
|
+
compose: (record: V, query: Params) => D;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Optional only when a record is a valid answer as-is (V assignable to D):
|
|
62
|
+
* the identity default is unsound for any narrower D. */
|
|
63
|
+
type ComposeParam<V, D> = [V] extends [D]
|
|
64
|
+
? Partial<ComposeProp<V, D>>
|
|
65
|
+
: ComposeProp<V, D>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Declaration of a domain client's read surface. The single space is derived
|
|
69
|
+
* from the table and its fetch: `{ key }` params resolve one record, with
|
|
70
|
+
* deletion flipping the answer to deleted. Declare `single` only when the
|
|
71
|
+
* domain's single query is richer than a key.
|
|
72
|
+
*/
|
|
73
|
+
export type RetrieverParams<
|
|
74
|
+
Z extends z.ZodType<Params>,
|
|
75
|
+
K extends record.Key,
|
|
76
|
+
V extends Keyed<K>,
|
|
77
|
+
D extends Data = V,
|
|
78
|
+
SingleInput = { key: K },
|
|
79
|
+
SingleQuery extends Params = K,
|
|
80
|
+
> = ComposeParam<V, D> & {
|
|
81
|
+
/** Resource name used in error messages, e.g. "range". */
|
|
82
|
+
name: string;
|
|
83
|
+
/** The table owning this domain's record content. */
|
|
84
|
+
table: Table<K, V>;
|
|
85
|
+
/** The space answering every non-single query shape. */
|
|
86
|
+
request: {
|
|
87
|
+
/**
|
|
88
|
+
* Parses and canonicalizes request params so equivalent queries hash
|
|
89
|
+
* identically; its output type is the space's query type.
|
|
90
|
+
*/
|
|
91
|
+
schema: Z;
|
|
92
|
+
/**
|
|
93
|
+
* Fetches matching records from the cluster. Keys-only requests never
|
|
94
|
+
* reach it; they resolve through the table's fetch. Results hydrate the
|
|
95
|
+
* table under its declared mode.
|
|
96
|
+
*/
|
|
97
|
+
fetch: (query: z.output<Z>, options?: FetchOptions) => Promise<V[]>;
|
|
98
|
+
/** Rule 2: whether a record satisfies the query. Pure; no network. */
|
|
99
|
+
matches?: (record: V, query: z.output<Z>) => boolean;
|
|
100
|
+
/** Overrides {@link DEFAULT_SERVER_FIELDS} for this request shape. */
|
|
101
|
+
serverFields?: readonly string[];
|
|
102
|
+
/** Foreign tables whose events affect this space's answers. */
|
|
103
|
+
watch?: Array<Watch<z.output<Z>, K>>;
|
|
104
|
+
};
|
|
105
|
+
/** Custom single space for domains whose single query is richer than a key. */
|
|
106
|
+
single?: {
|
|
107
|
+
/**
|
|
108
|
+
* Discriminates and canonicalizes single params: parse success routes the
|
|
109
|
+
* query to the single space, and the output is the space's query. Object
|
|
110
|
+
* schemas must reject unknown keys so request params fall through. Union
|
|
111
|
+
* in a bare-key arm to accept `retrieve(key)`.
|
|
112
|
+
*/
|
|
113
|
+
schema: z.ZodType<SingleQuery, SingleInput | record.Key>;
|
|
114
|
+
/** The space answering single queries, built via the cache. */
|
|
115
|
+
space: Retrieves<SingleQuery, D>;
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* A domain client's cached read surface, routing each query to the single or
|
|
121
|
+
* request answer space. The arity of the result follows the query: params
|
|
122
|
+
* addressing one record yield a record, every other shape yields an array.
|
|
123
|
+
*
|
|
124
|
+
* Extend it and call `super(cache, { ... })`:
|
|
125
|
+
*
|
|
126
|
+
* ```ts
|
|
127
|
+
* export class Client extends query.Retriever<typeof requestZ, Key, Label> {
|
|
128
|
+
* constructor(client: UnaryClient, cache: query.Cache) {
|
|
129
|
+
* const store = cache.createTable({ ... });
|
|
130
|
+
* super(cache, { name: "label", table: store, request: { ... } });
|
|
131
|
+
* }
|
|
132
|
+
* }
|
|
133
|
+
* ```
|
|
134
|
+
*
|
|
135
|
+
* Anything evaluated eagerly inside `super` must come from a local, since
|
|
136
|
+
* `this` is unavailable until it returns. Closures may reference `this`: an
|
|
137
|
+
* arrow captures it lexically and does not read it until called.
|
|
138
|
+
*
|
|
139
|
+
* The read surface is not designed for overriding: a domain with more query
|
|
140
|
+
* kinds exposes them as named {@link Retrieves} members instead.
|
|
141
|
+
*/
|
|
142
|
+
export abstract class Retriever<
|
|
143
|
+
Z extends z.ZodType<Params>,
|
|
144
|
+
K extends record.Key,
|
|
145
|
+
V extends Keyed<K>,
|
|
146
|
+
D extends Data = V,
|
|
147
|
+
SingleInput = { key: K },
|
|
148
|
+
SingleQuery extends Params = K,
|
|
149
|
+
> {
|
|
150
|
+
private readonly singleSpace: Retrieves<Params, D | D[]>;
|
|
151
|
+
private readonly requestSpace: Retrieves<Params, D | D[]>;
|
|
152
|
+
private readonly trySingle: (params: unknown) => { query: SingleQuery } | null;
|
|
153
|
+
private readonly normalizeRequest: (params: unknown) => z.output<Z>;
|
|
154
|
+
private readonly routes = new WeakMap<object, [Retrieves<Params, D | D[]>, Params]>();
|
|
155
|
+
|
|
156
|
+
constructor(
|
|
157
|
+
cache: Cache,
|
|
158
|
+
params: RetrieverParams<Z, K, V, D, SingleInput, SingleQuery>,
|
|
159
|
+
) {
|
|
160
|
+
const {
|
|
161
|
+
name,
|
|
162
|
+
table,
|
|
163
|
+
request,
|
|
164
|
+
compose = (record: V) => record as unknown as D,
|
|
165
|
+
single,
|
|
166
|
+
} = params;
|
|
167
|
+
const {
|
|
168
|
+
schema,
|
|
169
|
+
fetch,
|
|
170
|
+
matches,
|
|
171
|
+
serverFields = DEFAULT_SERVER_FIELDS,
|
|
172
|
+
watch,
|
|
173
|
+
} = request;
|
|
174
|
+
this.requestSpace = cache.queries<z.output<Z>, D[], K, V>({
|
|
175
|
+
name,
|
|
176
|
+
table,
|
|
177
|
+
fetch: async (query, options) => {
|
|
178
|
+
const keys = keysOnly(query);
|
|
179
|
+
if (keys != null) return (await table.retrieve(keys as K[])).map((r) => r.key);
|
|
180
|
+
const records = await fetch(query, options);
|
|
181
|
+
table.ingest(records);
|
|
182
|
+
return records.map((r) => r.key);
|
|
183
|
+
},
|
|
184
|
+
compose: (records, q) => records.map((r) => compose(r, q)),
|
|
185
|
+
keysOf: (query) => keysOnly(query) as K[] | null,
|
|
186
|
+
matches,
|
|
187
|
+
serverFields,
|
|
188
|
+
watch,
|
|
189
|
+
}) as Retrieves<Params, D | D[]>;
|
|
190
|
+
this.normalizeRequest = (p) => zod.parse(schema, p, { label: `${name} query` });
|
|
191
|
+
if (single != null) {
|
|
192
|
+
this.singleSpace = single.space as Retrieves<Params, D | D[]>;
|
|
193
|
+
const singleSchema = single.schema;
|
|
194
|
+
// Params carrying `key` that fail the single schema are malformed
|
|
195
|
+
// single queries; falling through would silently fetch every record.
|
|
196
|
+
this.trySingle = (p) => {
|
|
197
|
+
const res = singleSchema.safeParse(p);
|
|
198
|
+
if (res.success) return { query: res.data };
|
|
199
|
+
if (isBareKey(p) || (typeof p === "object" && p !== null && "key" in p)) {
|
|
200
|
+
const cause = new zod.ParseError({
|
|
201
|
+
issues: res.error.issues,
|
|
202
|
+
input: p,
|
|
203
|
+
label: `${name} single query params`,
|
|
204
|
+
cause: res.error,
|
|
205
|
+
});
|
|
206
|
+
throw new ValidationError(
|
|
207
|
+
`${name} params address a single key but do not match the ` +
|
|
208
|
+
`single-query schema.\n${cause.message}`,
|
|
209
|
+
{ cause },
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
return null;
|
|
213
|
+
};
|
|
214
|
+
} else {
|
|
215
|
+
// The default path binds SingleQuery = K: `{ key }` params resolve through the
|
|
216
|
+
// table's fetch. The casts are the one seam the defaults can't prove.
|
|
217
|
+
this.singleSpace = cache.queries<K, D, K, V>({
|
|
218
|
+
name,
|
|
219
|
+
table,
|
|
220
|
+
fetch: async (key) => {
|
|
221
|
+
const records = await table.retrieve([key]);
|
|
222
|
+
if (records.length === 0)
|
|
223
|
+
throw new NotFoundError(`${name} with key ${key} not found`);
|
|
224
|
+
return [key];
|
|
225
|
+
},
|
|
226
|
+
compose: (records, q) => compose(records[0], q),
|
|
227
|
+
keyOf: (query) => query,
|
|
228
|
+
single: true,
|
|
229
|
+
}) as Retrieves<Params, D | D[]>;
|
|
230
|
+
this.trySingle = (p) => {
|
|
231
|
+
if (isBareKey(p)) return { query: p as Params as SingleQuery };
|
|
232
|
+
return typeof p === "object" && p !== null && "key" in p
|
|
233
|
+
? { query: (p as { key: K }).key as Params as SingleQuery }
|
|
234
|
+
: null;
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Routes params to their answer space, memoized per params object identity.
|
|
241
|
+
* {@link Params} is readonly, so a given object always routes identically;
|
|
242
|
+
* repeat reads of the same object skip schema validation entirely.
|
|
243
|
+
*/
|
|
244
|
+
private route(params: unknown): [Retrieves<Params, D | D[]>, Params] {
|
|
245
|
+
const cacheable = typeof params === "object" && params !== null;
|
|
246
|
+
if (cacheable) {
|
|
247
|
+
const held = this.routes.get(params);
|
|
248
|
+
if (held !== undefined) return held;
|
|
249
|
+
}
|
|
250
|
+
const single = this.trySingle(params);
|
|
251
|
+
const route: [Retrieves<Params, D | D[]>, Params] =
|
|
252
|
+
single != null
|
|
253
|
+
? [this.singleSpace, single.query]
|
|
254
|
+
: [this.requestSpace, this.normalizeRequest(params)];
|
|
255
|
+
if (cacheable) this.routes.set(params, route);
|
|
256
|
+
return route;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Reads the record the params address, or every record matching them.
|
|
261
|
+
* Serves the cache when the answer is fresh, fetching otherwise. A bare key
|
|
262
|
+
* is shorthand for `{ key }`; a bare key list is accepted by domains whose
|
|
263
|
+
* request schema unions in {@link keyListZ}.
|
|
264
|
+
* @throws {NotFoundError} if a single-record query matches nothing or the
|
|
265
|
+
* record was deleted.
|
|
266
|
+
* @throws {ValidationError} if params contain `key` (or are a bare key)
|
|
267
|
+
* but fail the single-query schema.
|
|
268
|
+
*/
|
|
269
|
+
retrieve(params: K | SingleInput, options?: FetchOptions): Promise<D>;
|
|
270
|
+
retrieve(params: K[] | z.input<Z>, options?: FetchOptions): Promise<D[]>;
|
|
271
|
+
async retrieve(
|
|
272
|
+
params: K | K[] | SingleInput | z.input<Z>,
|
|
273
|
+
options?: FetchOptions,
|
|
274
|
+
): Promise<D | D[]> {
|
|
275
|
+
const [space, query] = this.route(params);
|
|
276
|
+
return await space.retrieve(query, options);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Subscribes to changes in the cached answer to the given query. The handler
|
|
281
|
+
* fires on every change or deletion. Returns a destructor that unsubscribes.
|
|
282
|
+
*/
|
|
283
|
+
onChange(params: K | SingleInput, handler: ChangeHandler<D>): destructor.Destructor;
|
|
284
|
+
onChange(
|
|
285
|
+
params: K[] | z.input<Z>,
|
|
286
|
+
handler: ChangeHandler<D[]>,
|
|
287
|
+
): destructor.Destructor;
|
|
288
|
+
onChange(
|
|
289
|
+
params: K | K[] | SingleInput | z.input<Z>,
|
|
290
|
+
handler: ChangeHandler<D> | ChangeHandler<D[]>,
|
|
291
|
+
): destructor.Destructor {
|
|
292
|
+
const [space, query] = this.route(params);
|
|
293
|
+
return space.onChange(query, handler as ChangeHandler<D | D[]>);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Returns the cached answer to the given query without touching the network, or
|
|
298
|
+
* undefined when nothing is cached. May be stale for unsubscribed queries.
|
|
299
|
+
*/
|
|
300
|
+
getCached(params: K | SingleInput): Cached<D> | undefined;
|
|
301
|
+
getCached(params: K[] | z.input<Z>): Cached<D[]> | undefined;
|
|
302
|
+
getCached(
|
|
303
|
+
params: K | K[] | SingleInput | z.input<Z>,
|
|
304
|
+
): Cached<D> | Cached<D[]> | undefined {
|
|
305
|
+
const [space, query] = this.route(params);
|
|
306
|
+
return space.getCached(query) as Cached<D> | Cached<D[]> | undefined;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
// Copyright 2026 Synnax Labs, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Use of this software is governed by the Business Source License included in the file
|
|
4
|
+
// licenses/BSL.txt.
|
|
5
|
+
//
|
|
6
|
+
// As of the Change Date specified in that file, in accordance with the Business Source
|
|
7
|
+
// License, use of this software will be governed by the Apache License, Version 2.0,
|
|
8
|
+
// included in the file licenses/APL.txt.
|
|
9
|
+
|
|
10
|
+
import { EOF } from "@synnaxlabs/freighter";
|
|
11
|
+
import { type breaker, DataType, errors, zod } from "@synnaxlabs/x";
|
|
12
|
+
import type z from "zod";
|
|
13
|
+
|
|
14
|
+
import { isConnectionError, NotFoundError } from "@/errors";
|
|
15
|
+
import { type framer } from "@/framer";
|
|
16
|
+
import { HardenedStreamer, ObservableStreamer } from "@/framer/hardened";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A raw channel reaction: parses frames from the channel with the schema and invokes
|
|
20
|
+
* onChange once per frame with every parsed value, in order. Mirror listeners bind to
|
|
21
|
+
* this shape internally; domains register reactions via the cache's listen.
|
|
22
|
+
*/
|
|
23
|
+
export interface Listener<Z extends z.ZodType = z.ZodType> {
|
|
24
|
+
/** The name of the Synnax channel to listen to */
|
|
25
|
+
channel: string;
|
|
26
|
+
/** Zod schema for parsing and validating channel data */
|
|
27
|
+
schema: Z;
|
|
28
|
+
/** Receives the frame's parsed values for the channel as one batch. */
|
|
29
|
+
onChange(this: void, changed: z.output<Z>[]): Promise<unknown> | unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Sorts channel names to ensure deletions are processed before other changes. This
|
|
34
|
+
* ensures that modifications to things like relationships (delete followed by create)
|
|
35
|
+
* are processed in the correct order.
|
|
36
|
+
* @returns Sort order (-1, 0, or 1)
|
|
37
|
+
*/
|
|
38
|
+
const channelNameSort = (a: string, b: string) => {
|
|
39
|
+
const aHasDelete = a.includes("delete");
|
|
40
|
+
const bHasDelete = b.includes("delete");
|
|
41
|
+
if (aHasDelete && !bHasDelete) return -1;
|
|
42
|
+
if (!aHasDelete && bHasDelete) return 1;
|
|
43
|
+
return 0;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** Arguments for opening a cache streamer. */
|
|
47
|
+
export interface StreamerParams {
|
|
48
|
+
/** Receives frame-handling and listener errors. */
|
|
49
|
+
onError: (error: Error) => void;
|
|
50
|
+
/** The channel listeners to drive with streamed changes. */
|
|
51
|
+
listeners: Listener[];
|
|
52
|
+
/** Opens the raw frame stream; hardening is applied internally. */
|
|
53
|
+
openStreamer: framer.StreamOpener;
|
|
54
|
+
/** Retry behavior for stream reconnect attempts. */
|
|
55
|
+
breaker?: breaker.Config;
|
|
56
|
+
/** Called once when the stream first opens, before any frame is processed. */
|
|
57
|
+
onOpen?: () => void;
|
|
58
|
+
/**
|
|
59
|
+
* Called after every successful reconnect of the underlying stream (not the
|
|
60
|
+
* initial open). Changes may have been missed while disconnected.
|
|
61
|
+
*/
|
|
62
|
+
onReopen?: () => void;
|
|
63
|
+
/**
|
|
64
|
+
* Called whenever the stream goes live: after the initial open and before every
|
|
65
|
+
* onReopen, so reconciliation fetches never race a stale liveness verdict.
|
|
66
|
+
*/
|
|
67
|
+
onLive?: () => void;
|
|
68
|
+
/** Called when the underlying stream fails and reconnection begins. */
|
|
69
|
+
onDrop?: (error: Error) => void;
|
|
70
|
+
/**
|
|
71
|
+
* Called when the stream ends on a failure it cannot recover from. The next
|
|
72
|
+
* demand opens a new stream.
|
|
73
|
+
*/
|
|
74
|
+
onDead?: (error: Error) => void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* A lazily-opened change stream over the channels named in a table config.
|
|
79
|
+
* Construction is synchronous and network-free; the underlying stream opens
|
|
80
|
+
* on the first {@link Streamer.demand} call.
|
|
81
|
+
*/
|
|
82
|
+
export interface Streamer {
|
|
83
|
+
/**
|
|
84
|
+
* Ensures the underlying stream is open, opening it on first call. Resolves
|
|
85
|
+
* once streaming is live. Safe to call concurrently and repeatedly.
|
|
86
|
+
*/
|
|
87
|
+
demand: () => Promise<void>;
|
|
88
|
+
/** Closes the stream. A no-op when the stream was never demanded. */
|
|
89
|
+
close: () => Promise<void>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Creates a lazy streamer that, once demanded, listens to configured channels and
|
|
94
|
+
* invokes the appropriate listeners when data changes.
|
|
95
|
+
* @returns The lazy streamer handle
|
|
96
|
+
*/
|
|
97
|
+
export const createStreamer = ({
|
|
98
|
+
openStreamer,
|
|
99
|
+
breaker: breakerConfig,
|
|
100
|
+
listeners: allListeners,
|
|
101
|
+
onError,
|
|
102
|
+
onOpen,
|
|
103
|
+
onReopen,
|
|
104
|
+
onLive,
|
|
105
|
+
onDrop,
|
|
106
|
+
onDead,
|
|
107
|
+
}: StreamerParams): Streamer => {
|
|
108
|
+
let opened: Promise<ObservableStreamer> | null = null;
|
|
109
|
+
let hardened: HardenedStreamer | null = null;
|
|
110
|
+
let closed = false;
|
|
111
|
+
const report = (exc: unknown, message: string) => {
|
|
112
|
+
if (NotFoundError.matches(exc)) return;
|
|
113
|
+
// A connectivity failure mid-change is repaired by the reconcile that
|
|
114
|
+
// follows the stream's reopen, so it is churn, not a defect.
|
|
115
|
+
if (isConnectionError(exc)) return;
|
|
116
|
+
onError(new Error(message, { cause: exc }));
|
|
117
|
+
};
|
|
118
|
+
const open = async (): Promise<ObservableStreamer> => {
|
|
119
|
+
if (closed) throw new EOF();
|
|
120
|
+
const listenersForChannels = Map.groupBy(allListeners, ({ channel }) => channel);
|
|
121
|
+
const channels = Array.from(listenersForChannels.keys());
|
|
122
|
+
const h = new HardenedStreamer(
|
|
123
|
+
openStreamer,
|
|
124
|
+
{ channels },
|
|
125
|
+
breakerConfig,
|
|
126
|
+
// onLive first: onReopen's reconcile fetches must not hit a stale
|
|
127
|
+
// liveness short circuit
|
|
128
|
+
() => {
|
|
129
|
+
onLive?.();
|
|
130
|
+
onReopen?.();
|
|
131
|
+
},
|
|
132
|
+
onDrop,
|
|
133
|
+
);
|
|
134
|
+
// Held outside so close() can interrupt the retry loop while this call
|
|
135
|
+
// is still waiting on a first successful open.
|
|
136
|
+
hardened = h;
|
|
137
|
+
await h.start();
|
|
138
|
+
// ObservableStreamer construction below starts reads, so onOpen precedes any frame.
|
|
139
|
+
onOpen?.();
|
|
140
|
+
onLive?.();
|
|
141
|
+
const handleChange = (frame: framer.Frame) => {
|
|
142
|
+
const namesInFrame = frame.uniqueNames.sort(channelNameSort);
|
|
143
|
+
void (async () => {
|
|
144
|
+
for (const name of namesInFrame) {
|
|
145
|
+
const series = frame.get(name);
|
|
146
|
+
const listeners = listenersForChannels.get(name);
|
|
147
|
+
if (listeners == null) continue;
|
|
148
|
+
const parseOpts = { label: `${name} sample` };
|
|
149
|
+
for (const { onChange, schema } of listeners) {
|
|
150
|
+
let parsed: z.output<typeof schema>[];
|
|
151
|
+
try {
|
|
152
|
+
if (!series.dataType.equals(DataType.JSON))
|
|
153
|
+
parsed = Array.from(series).map((s) => zod.parse(schema, s, parseOpts));
|
|
154
|
+
else parsed = series.parseJSON(schema);
|
|
155
|
+
} catch (exc) {
|
|
156
|
+
report(exc, `failed to parse streamer change for ${name}`);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (parsed.length === 0) continue;
|
|
160
|
+
try {
|
|
161
|
+
await onChange(parsed);
|
|
162
|
+
} catch (exc) {
|
|
163
|
+
report(exc, `failed to handle streamer change for ${name}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
})();
|
|
168
|
+
};
|
|
169
|
+
const stream = new ObservableStreamer(h, undefined, (error) => {
|
|
170
|
+
// drop the memoized stream so the next demand opens a fresh one
|
|
171
|
+
opened = null;
|
|
172
|
+
onDead?.(error);
|
|
173
|
+
});
|
|
174
|
+
stream.onChange(handleChange);
|
|
175
|
+
return stream;
|
|
176
|
+
};
|
|
177
|
+
return {
|
|
178
|
+
demand: async () => {
|
|
179
|
+
if (opened == null) {
|
|
180
|
+
const { promise, resolve, reject } =
|
|
181
|
+
Promise.withResolvers<ObservableStreamer>();
|
|
182
|
+
// Assigned before open runs: opening resolves channels through the cached
|
|
183
|
+
// read path, which re-enters demand synchronously. An unset memo there
|
|
184
|
+
// recurses instead of joining. Keep these two statements in this order.
|
|
185
|
+
opened = promise;
|
|
186
|
+
open().then(resolve, reject);
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
await opened;
|
|
190
|
+
} catch (exc) {
|
|
191
|
+
// clear the memoized failure so a later demand can retry the open
|
|
192
|
+
opened = null;
|
|
193
|
+
// a close mid-open retires the stream; the demand did not fail
|
|
194
|
+
if (closed) return;
|
|
195
|
+
throw errors.fromUnknown(exc);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
close: async () => {
|
|
199
|
+
closed = true;
|
|
200
|
+
// Interrupts an in-flight open's retry loop; opened then settles.
|
|
201
|
+
hardened?.close();
|
|
202
|
+
if (opened == null) return;
|
|
203
|
+
const streamer = await opened.catch(() => null);
|
|
204
|
+
if (streamer != null) await streamer.close();
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
};
|