@synnaxlabs/client 0.56.2 → 0.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-DDACDVZ-.js +14505 -0
- package/dist/client-DDACDVZ-.js.map +1 -0
- package/dist/client.js +1128 -14876
- package/dist/client.js.map +1 -0
- package/dist/src/access/client.d.ts +10 -1
- package/dist/src/access/client.d.ts.map +1 -1
- package/dist/src/access/enforce.d.ts.map +1 -1
- package/dist/src/access/external.d.ts +1 -0
- package/dist/src/access/external.d.ts.map +1 -1
- package/dist/src/access/granted.d.ts +39 -0
- package/dist/src/access/granted.d.ts.map +1 -0
- package/dist/src/access/policy/client.d.ts +136 -147
- package/dist/src/access/policy/client.d.ts.map +1 -1
- package/dist/src/access/policy/types.gen.d.ts +15 -68
- package/dist/src/access/policy/types.gen.d.ts.map +1 -1
- package/dist/src/access/role/client.d.ts +77 -58
- package/dist/src/access/role/client.d.ts.map +1 -1
- package/dist/src/access/role/types.gen.d.ts +8 -14
- package/dist/src/access/role/types.gen.d.ts.map +1 -1
- package/dist/src/actions/actions.d.ts +5 -6
- package/dist/src/actions/actions.d.ts.map +1 -1
- package/dist/src/actions/controller.d.ts +194 -0
- package/dist/src/actions/controller.d.ts.map +1 -0
- package/dist/src/actions/external.d.ts +1 -0
- package/dist/src/actions/external.d.ts.map +1 -1
- package/dist/src/arc/actions.d.ts +575 -0
- package/dist/src/arc/actions.d.ts.map +1 -0
- package/dist/src/arc/actions.gen.d.ts +1439 -0
- package/dist/src/arc/actions.gen.d.ts.map +1 -0
- package/dist/src/arc/client.d.ts +97 -13
- package/dist/src/arc/client.d.ts.map +1 -1
- package/dist/src/arc/compiler/types.gen.d.ts +3 -3
- package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
- package/dist/src/arc/external.d.ts +2 -0
- package/dist/src/arc/external.d.ts.map +1 -1
- package/dist/src/arc/graph/types.gen.d.ts +45 -597
- package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
- package/dist/src/arc/ir/index.d.ts +1 -1
- package/dist/src/arc/ir/index.d.ts.map +1 -1
- package/dist/src/arc/ir/ir.d.ts +2 -0
- package/dist/src/arc/ir/ir.d.ts.map +1 -0
- package/dist/src/arc/ir/types.gen.d.ts +58 -2807
- package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
- package/dist/src/arc/module/types.gen.d.ts +18 -1090
- package/dist/src/arc/module/types.gen.d.ts.map +1 -1
- package/dist/src/arc/program/types.gen.d.ts +18 -1090
- package/dist/src/arc/program/types.gen.d.ts.map +1 -1
- package/dist/src/arc/text/types.gen.d.ts +54 -1
- package/dist/src/arc/text/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types/types.gen.d.ts +35 -153
- package/dist/src/arc/types/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types.gen.d.ts +98 -2278
- package/dist/src/arc/types.gen.d.ts.map +1 -1
- package/dist/src/auth/auth.d.ts +14 -2
- package/dist/src/auth/auth.d.ts.map +1 -1
- package/dist/src/channel/client.d.ts +113 -75
- package/dist/src/channel/client.d.ts.map +1 -1
- package/dist/src/channel/external.d.ts +0 -1
- package/dist/src/channel/external.d.ts.map +1 -1
- package/dist/src/channel/payload.d.ts +65 -56
- package/dist/src/channel/payload.d.ts.map +1 -1
- package/dist/src/channel/types.gen.d.ts +26 -73
- package/dist/src/channel/types.gen.d.ts.map +1 -1
- package/dist/src/channel/writer.d.ts +1 -3
- package/dist/src/channel/writer.d.ts.map +1 -1
- package/dist/src/client.d.ts +55 -27
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/connection/client.d.ts +146 -0
- package/dist/src/connection/client.d.ts.map +1 -0
- package/dist/src/connection/external.d.ts +3 -0
- package/dist/src/connection/external.d.ts.map +1 -0
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/status.d.ts +252 -0
- package/dist/src/connection/status.d.ts.map +1 -0
- package/dist/src/control/client.d.ts +31 -7
- package/dist/src/control/client.d.ts.map +1 -1
- package/dist/src/control/state.d.ts +47 -16
- package/dist/src/control/state.d.ts.map +1 -1
- package/dist/src/device/client.d.ts +59 -17
- package/dist/src/device/client.d.ts.map +1 -1
- package/dist/src/device/types.gen.d.ts +17 -67
- package/dist/src/device/types.gen.d.ts.map +1 -1
- package/dist/src/errors.d.ts +17 -20
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/ethercat/external.d.ts +2 -0
- package/dist/src/ethercat/external.d.ts.map +1 -0
- package/dist/src/ethercat/index.d.ts +2 -0
- package/dist/src/ethercat/index.d.ts.map +1 -0
- package/dist/src/ethercat/types.gen.d.ts +243 -0
- package/dist/src/ethercat/types.gen.d.ts.map +1 -0
- package/dist/src/framer/adapter.d.ts +8 -5
- package/dist/src/framer/adapter.d.ts.map +1 -1
- package/dist/src/framer/benchutil.d.ts +19 -0
- package/dist/src/framer/benchutil.d.ts.map +1 -0
- package/dist/src/framer/cache/cache.d.ts +38 -0
- package/dist/src/framer/cache/cache.d.ts.map +1 -0
- package/dist/src/framer/cache/dynamic.d.ts +91 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +57 -0
- package/dist/src/framer/cache/reader.d.ts.map +1 -0
- package/dist/src/framer/cache/static.d.ts +66 -0
- package/dist/src/framer/cache/static.d.ts.map +1 -0
- package/dist/src/framer/cache/streamer.d.ts +86 -0
- package/dist/src/framer/cache/streamer.d.ts.map +1 -0
- package/dist/src/framer/cache/transform.d.ts +18 -0
- package/dist/src/framer/cache/transform.d.ts.map +1 -0
- package/dist/src/framer/cache/unary.d.ts +39 -0
- package/dist/src/framer/cache/unary.d.ts.map +1 -0
- package/dist/src/framer/client.d.ts +35 -14
- package/dist/src/framer/client.d.ts.map +1 -1
- package/dist/src/framer/codec.d.ts.map +1 -1
- package/dist/src/framer/deleter.d.ts +3 -2
- package/dist/src/framer/deleter.d.ts.map +1 -1
- package/dist/src/framer/external.d.ts +6 -0
- package/dist/src/framer/external.d.ts.map +1 -1
- package/dist/src/framer/feed.d.ts +40 -0
- package/dist/src/framer/feed.d.ts.map +1 -0
- package/dist/src/framer/frame.d.ts +16 -20
- package/dist/src/framer/frame.d.ts.map +1 -1
- package/dist/src/framer/hardened.d.ts +70 -0
- package/dist/src/framer/hardened.d.ts.map +1 -0
- package/dist/src/framer/iterator.d.ts +36 -43
- package/dist/src/framer/iterator.d.ts.map +1 -1
- package/dist/src/framer/reader.d.ts +3 -2
- package/dist/src/framer/reader.d.ts.map +1 -1
- package/dist/src/framer/streamer.d.ts +132 -205
- package/dist/src/framer/streamer.d.ts.map +1 -1
- package/dist/src/framer/writer.d.ts +130 -161
- package/dist/src/framer/writer.d.ts.map +1 -1
- package/dist/src/group/client.d.ts +66 -9
- package/dist/src/group/client.d.ts.map +1 -1
- package/dist/src/group/types.gen.d.ts +2 -2
- package/dist/src/http/external.d.ts +2 -0
- package/dist/src/http/external.d.ts.map +1 -0
- package/dist/src/http/index.d.ts +2 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/types.gen.d.ts +451 -0
- package/dist/src/http/types.gen.d.ts.map +1 -0
- package/dist/src/imex/client.d.ts +88 -0
- package/dist/src/imex/client.d.ts.map +1 -0
- package/dist/src/imex/index.d.ts +2 -0
- package/dist/src/imex/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +18 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/label/client.d.ts +55 -36
- package/dist/src/label/client.d.ts.map +1 -1
- package/dist/src/label/external.d.ts +2 -0
- package/dist/src/label/external.d.ts.map +1 -1
- package/dist/src/label/payload.d.ts +4 -46
- package/dist/src/label/payload.d.ts.map +1 -1
- package/dist/src/label/store.d.ts +8 -0
- package/dist/src/label/store.d.ts.map +1 -0
- package/dist/src/label/types.gen.d.ts +45 -0
- package/dist/src/label/types.gen.d.ts.map +1 -0
- package/dist/src/labjack/external.d.ts +2 -0
- package/dist/src/labjack/external.d.ts.map +1 -0
- package/dist/src/labjack/index.d.ts +2 -0
- package/dist/src/labjack/index.d.ts.map +1 -0
- package/dist/src/labjack/types.gen.d.ts +442 -0
- package/dist/src/labjack/types.gen.d.ts.map +1 -0
- package/dist/src/lineplot/actions.d.ts +914 -0
- package/dist/src/lineplot/actions.d.ts.map +1 -0
- package/dist/src/lineplot/actions.gen.d.ts +4208 -0
- package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
- package/dist/src/lineplot/client.d.ts +66 -16
- package/dist/src/lineplot/client.d.ts.map +1 -1
- package/dist/src/lineplot/external.d.ts +3 -0
- package/dist/src/lineplot/external.d.ts.map +1 -1
- package/dist/src/lineplot/line.d.ts +16 -0
- package/dist/src/lineplot/line.d.ts.map +1 -0
- package/dist/src/lineplot/types.gen.d.ts +837 -14
- package/dist/src/lineplot/types.gen.d.ts.map +1 -1
- package/dist/src/log/actions.d.ts +271 -0
- package/dist/src/log/actions.d.ts.map +1 -0
- package/dist/src/log/actions.gen.d.ts +1529 -0
- package/dist/src/log/actions.gen.d.ts.map +1 -0
- package/dist/src/log/client.d.ts +66 -16
- package/dist/src/log/client.d.ts.map +1 -1
- package/dist/src/log/external.d.ts +2 -0
- package/dist/src/log/external.d.ts.map +1 -1
- package/dist/src/log/types.gen.d.ts +139 -14
- package/dist/src/log/types.gen.d.ts.map +1 -1
- package/dist/src/modbus/external.d.ts +2 -0
- package/dist/src/modbus/external.d.ts.map +1 -0
- package/dist/src/modbus/index.d.ts +2 -0
- package/dist/src/modbus/index.d.ts.map +1 -0
- package/dist/src/modbus/types.gen.d.ts +280 -0
- package/dist/src/modbus/types.gen.d.ts.map +1 -0
- package/dist/src/ni/external.d.ts +2 -0
- package/dist/src/ni/external.d.ts.map +1 -0
- package/dist/src/ni/index.d.ts +2 -0
- package/dist/src/ni/index.d.ts.map +1 -0
- package/dist/src/ni/types.gen.d.ts +21029 -0
- package/dist/src/ni/types.gen.d.ts.map +1 -0
- package/dist/src/node/index.d.ts +2 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/types.gen.d.ts +4 -0
- package/dist/src/node/types.gen.d.ts.map +1 -0
- package/dist/src/ontology/client.d.ts +314 -67
- package/dist/src/ontology/client.d.ts.map +1 -1
- package/dist/src/ontology/external.d.ts +1 -0
- package/dist/src/ontology/external.d.ts.map +1 -1
- package/dist/src/ontology/payload.d.ts +60 -18
- package/dist/src/ontology/payload.d.ts.map +1 -1
- package/dist/src/ontology/store.d.ts +32 -0
- package/dist/src/ontology/store.d.ts.map +1 -0
- package/dist/src/ontology/types.gen.d.ts +3 -2
- package/dist/src/ontology/types.gen.d.ts.map +1 -1
- package/dist/src/ontology/writer.d.ts +16 -10
- package/dist/src/ontology/writer.d.ts.map +1 -1
- package/dist/src/opcua/external.d.ts +2 -0
- package/dist/src/opcua/external.d.ts.map +1 -0
- package/dist/src/opcua/index.d.ts +2 -0
- package/dist/src/opcua/index.d.ts.map +1 -0
- package/dist/src/opcua/types.gen.d.ts +82 -0
- package/dist/src/opcua/types.gen.d.ts.map +1 -0
- package/dist/src/pagerduty/external.d.ts +2 -0
- package/dist/src/pagerduty/external.d.ts.map +1 -0
- package/dist/src/pagerduty/index.d.ts +2 -0
- package/dist/src/pagerduty/index.d.ts.map +1 -0
- package/dist/src/pagerduty/types.gen.d.ts +30 -0
- package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
- package/dist/src/panel/actions.d.ts +273 -0
- package/dist/src/panel/actions.d.ts.map +1 -0
- package/dist/src/panel/actions.gen.d.ts +1255 -0
- package/dist/src/panel/actions.gen.d.ts.map +1 -0
- package/dist/src/panel/client.d.ts +148 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/external.d.ts +6 -0
- package/dist/src/panel/external.d.ts.map +1 -0
- package/dist/src/panel/index.d.ts +2 -0
- package/dist/src/panel/index.d.ts.map +1 -0
- package/dist/src/panel/tree.d.ts +50 -0
- package/dist/src/panel/tree.d.ts.map +1 -0
- package/dist/src/panel/types.gen.d.ts +370 -0
- package/dist/src/panel/types.gen.d.ts.map +1 -0
- package/dist/src/project/client.d.ts +89 -0
- package/dist/src/project/client.d.ts.map +1 -0
- package/dist/src/project/external.d.ts.map +1 -0
- package/dist/src/project/index.d.ts +2 -0
- package/dist/src/project/index.d.ts.map +1 -0
- package/dist/src/project/types.gen.d.ts +27 -0
- package/dist/src/project/types.gen.d.ts.map +1 -0
- package/dist/src/query/cache.d.ts +132 -0
- package/dist/src/query/cache.d.ts.map +1 -0
- package/dist/src/query/deleted.d.ts +20 -0
- package/dist/src/query/deleted.d.ts.map +1 -0
- package/dist/src/query/derived.d.ts +33 -0
- package/dist/src/query/derived.d.ts.map +1 -0
- package/dist/src/query/external.d.ts +10 -0
- package/dist/src/query/external.d.ts.map +1 -0
- package/dist/src/query/index.d.ts +2 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/query.d.ts +235 -0
- package/dist/src/query/query.d.ts.map +1 -0
- package/dist/src/query/retriever.d.ts +135 -0
- package/dist/src/query/retriever.d.ts.map +1 -0
- package/dist/src/query/streamer.d.ts +67 -0
- package/dist/src/query/streamer.d.ts.map +1 -0
- package/dist/src/query/table.d.ts +219 -0
- package/dist/src/query/table.d.ts.map +1 -0
- package/dist/src/query/types.d.ts +35 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/write.d.ts +21 -0
- package/dist/src/query/write.d.ts.map +1 -0
- package/dist/src/rack/client.d.ts +58 -20
- package/dist/src/rack/client.d.ts.map +1 -1
- package/dist/src/rack/types.gen.d.ts +11 -12
- package/dist/src/rack/types.gen.d.ts.map +1 -1
- package/dist/src/range/alias/types.gen.d.ts +2 -3
- package/dist/src/range/alias/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/client.d.ts +138 -27
- package/dist/src/ranger/client.d.ts.map +1 -1
- package/dist/src/ranger/kv/client.d.ts +7 -4
- package/dist/src/ranger/kv/client.d.ts.map +1 -1
- package/dist/src/ranger/payload.d.ts +3 -0
- package/dist/src/ranger/payload.d.ts.map +1 -1
- package/dist/src/ranger/types.gen.d.ts +45 -101
- package/dist/src/ranger/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/writer.d.ts +2 -74
- package/dist/src/ranger/writer.d.ts.map +1 -1
- package/dist/src/schematic/actions.d.ts +90 -33
- package/dist/src/schematic/actions.d.ts.map +1 -1
- package/dist/src/schematic/actions.gen.d.ts +207 -114
- package/dist/src/schematic/actions.gen.d.ts.map +1 -1
- package/dist/src/schematic/client.d.ts +70 -68
- package/dist/src/schematic/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/client.d.ts +133 -27
- package/dist/src/schematic/symbol/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
- package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
- package/dist/src/schematic/types.gen.d.ts +17 -96
- package/dist/src/schematic/types.gen.d.ts.map +1 -1
- package/dist/src/status/client.d.ts +69 -14
- package/dist/src/status/client.d.ts.map +1 -1
- package/dist/src/status/external.d.ts +2 -0
- package/dist/src/status/external.d.ts.map +1 -1
- package/dist/src/status/payload.d.ts +2 -36
- package/dist/src/status/payload.d.ts.map +1 -1
- package/dist/src/status/status.d.ts +65 -0
- package/dist/src/status/status.d.ts.map +1 -0
- package/dist/src/status/types.gen.d.ts +58 -0
- package/dist/src/status/types.gen.d.ts.map +1 -0
- package/dist/src/table/actions.d.ts +72 -13
- package/dist/src/table/actions.d.ts.map +1 -1
- package/dist/src/table/actions.gen.d.ts +221 -137
- package/dist/src/table/actions.gen.d.ts.map +1 -1
- package/dist/src/table/client.d.ts +64 -40
- package/dist/src/table/client.d.ts.map +1 -1
- package/dist/src/table/types.gen.d.ts +20 -55
- package/dist/src/table/types.gen.d.ts.map +1 -1
- package/dist/src/task/client.d.ts +149 -28
- package/dist/src/task/client.d.ts.map +1 -1
- package/dist/src/task/types.gen.d.ts +71 -89
- package/dist/src/task/types.gen.d.ts.map +1 -1
- package/dist/src/testutil/access.d.ts +27 -1
- package/dist/src/testutil/access.d.ts.map +1 -1
- package/dist/src/testutil/channels.d.ts +2 -0
- package/dist/src/testutil/channels.d.ts.map +1 -1
- package/dist/src/testutil/client.d.ts +5 -0
- package/dist/src/testutil/client.d.ts.map +1 -1
- package/dist/src/testutil/connection.d.ts +10 -0
- package/dist/src/testutil/connection.d.ts.map +1 -0
- package/dist/src/testutil/index.d.ts +9 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/panels.d.ts +8 -0
- package/dist/src/testutil/panels.d.ts.map +1 -0
- package/dist/src/testutil/proxy.d.ts +29 -0
- package/dist/src/testutil/proxy.d.ts.map +1 -0
- package/dist/src/testutil/query.d.ts +7 -0
- package/dist/src/testutil/query.d.ts.map +1 -0
- package/dist/src/testutil/telem.d.ts +4 -0
- package/dist/src/testutil/telem.d.ts.map +1 -1
- package/dist/src/transport.d.ts +10 -4
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/user/client.d.ts +29 -28
- package/dist/src/user/client.d.ts.map +1 -1
- package/dist/src/user/external.d.ts +1 -1
- package/dist/src/user/external.d.ts.map +1 -1
- package/dist/src/user/types.gen.d.ts +4 -4
- package/dist/src/util/retrieve.d.ts +2 -2
- package/dist/src/util/retrieve.d.ts.map +1 -1
- package/dist/src/util/telem.d.ts.map +1 -1
- package/dist/src/view/client.d.ts +30 -14
- package/dist/src/view/client.d.ts.map +1 -1
- package/dist/src/view/types.gen.d.ts +7 -15
- package/dist/src/view/types.gen.d.ts.map +1 -1
- package/dist/testutil.js +189 -0
- package/dist/testutil.js.map +1 -0
- package/package.json +39 -16
- package/src/access/client.ts +14 -3
- package/src/access/enforce.ts +0 -3
- package/src/access/external.ts +1 -0
- package/src/access/granted.ts +114 -0
- package/src/access/policy/client.ts +135 -43
- package/src/access/policy/types.gen.ts +9 -11
- package/src/access/role/client.ts +160 -38
- package/src/access/role/types.gen.ts +8 -12
- package/src/actions/actions.ts +5 -6
- package/src/actions/controller.ts +626 -0
- package/src/actions/external.ts +11 -0
- package/src/arc/actions.gen.ts +313 -0
- package/src/arc/actions.ts +192 -0
- package/src/arc/client.ts +424 -41
- package/src/arc/compiler/types.gen.ts +5 -6
- package/src/arc/external.ts +2 -0
- package/src/arc/graph/types.gen.ts +24 -22
- package/src/arc/ir/index.ts +1 -1
- package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
- package/src/arc/ir/types.gen.ts +42 -41
- package/src/arc/text/types.gen.ts +21 -2
- package/src/arc/types/types.gen.ts +40 -32
- package/src/arc/types.gen.ts +31 -29
- package/src/auth/auth.ts +40 -8
- package/src/channel/client.ts +529 -132
- package/src/channel/external.ts +0 -1
- package/src/channel/payload.ts +30 -3
- package/src/channel/types.gen.ts +37 -48
- package/src/channel/writer.ts +2 -11
- package/src/client.ts +215 -91
- package/src/connection/client.ts +495 -0
- package/src/connection/external.ts +34 -0
- package/src/connection/index.ts +1 -1
- package/src/connection/status.ts +442 -0
- package/src/control/client.ts +84 -12
- package/src/control/state.ts +17 -36
- package/src/device/client.ts +293 -41
- package/src/device/types.gen.ts +15 -26
- package/src/errors.ts +45 -22
- package/src/{workspace → ethercat}/external.ts +1 -2
- package/src/{workspace → ethercat}/index.ts +1 -1
- package/src/ethercat/types.gen.ts +151 -0
- package/src/framer/adapter.ts +60 -37
- package/src/framer/benchutil.ts +67 -0
- package/src/framer/cache/cache.ts +115 -0
- package/src/framer/cache/dynamic.ts +340 -0
- package/src/framer/cache/reader.ts +231 -0
- package/src/framer/cache/static.ts +215 -0
- package/src/framer/cache/streamer.ts +391 -0
- package/src/framer/cache/transform.ts +31 -0
- package/src/framer/cache/unary.ts +108 -0
- package/src/framer/client.ts +71 -43
- package/src/framer/codec.ts +55 -18
- package/src/framer/deleter.ts +4 -6
- package/src/framer/external.ts +10 -0
- package/src/framer/feed.ts +108 -0
- package/src/framer/frame.ts +13 -23
- package/src/framer/hardened.ts +283 -0
- package/src/framer/iterator.ts +31 -42
- package/src/framer/reader.ts +11 -11
- package/src/framer/streamer.ts +18 -178
- package/src/framer/writer.ts +39 -59
- package/src/group/client.ts +158 -23
- package/src/http/external.ts +10 -0
- package/src/{cluster → http}/index.ts +1 -1
- package/src/http/types.gen.ts +245 -0
- package/src/imex/client.ts +125 -0
- package/src/imex/index.ts +10 -0
- package/src/index.ts +19 -6
- package/src/label/client.ts +193 -54
- package/src/label/external.ts +2 -0
- package/src/label/payload.ts +4 -9
- package/src/label/store.ts +28 -0
- package/src/label/types.gen.ts +31 -0
- package/src/labjack/external.ts +10 -0
- package/src/labjack/index.ts +10 -0
- package/src/labjack/types.gen.ts +251 -0
- package/src/lineplot/actions.gen.ts +880 -0
- package/src/lineplot/actions.ts +535 -0
- package/src/lineplot/client.ts +224 -52
- package/src/lineplot/external.ts +3 -0
- package/src/lineplot/line.ts +80 -0
- package/src/lineplot/types.gen.ts +225 -12
- package/src/log/actions.gen.ts +474 -0
- package/src/log/actions.ts +242 -0
- package/src/log/client.ts +223 -52
- package/src/log/external.ts +2 -0
- package/src/log/types.gen.ts +45 -14
- package/src/modbus/external.ts +10 -0
- package/src/modbus/index.ts +10 -0
- package/src/modbus/types.gen.ts +185 -0
- package/src/ni/external.ts +10 -0
- package/src/ni/index.ts +10 -0
- package/src/ni/types.gen.ts +1632 -0
- package/src/node/index.ts +10 -0
- package/src/{cluster → node}/types.gen.ts +2 -2
- package/src/ontology/client.ts +408 -99
- package/src/ontology/external.ts +7 -0
- package/src/ontology/payload.ts +48 -7
- package/src/ontology/store.ts +83 -0
- package/src/ontology/types.gen.ts +2 -1
- package/src/ontology/writer.ts +1 -0
- package/src/opcua/external.ts +10 -0
- package/src/opcua/index.ts +10 -0
- package/src/opcua/types.gen.ts +65 -0
- package/src/pagerduty/external.ts +10 -0
- package/src/pagerduty/index.ts +10 -0
- package/src/pagerduty/types.gen.ts +41 -0
- package/src/panel/actions.gen.ts +267 -0
- package/src/panel/actions.ts +357 -0
- package/src/panel/client.ts +327 -0
- package/src/panel/external.ts +14 -0
- package/src/panel/index.ts +10 -0
- package/src/panel/tree.ts +163 -0
- package/src/panel/types.gen.ts +164 -0
- package/src/project/client.ts +273 -0
- package/src/project/external.ts +11 -0
- package/src/project/index.ts +10 -0
- package/src/project/types.gen.ts +40 -0
- package/src/query/cache.ts +326 -0
- package/src/query/deleted.ts +38 -0
- package/src/query/derived.ts +101 -0
- package/src/query/external.ts +51 -0
- package/src/query/index.ts +10 -0
- package/src/query/query.ts +865 -0
- package/src/query/retriever.ts +308 -0
- package/src/query/streamer.ts +207 -0
- package/src/query/table.ts +625 -0
- package/src/query/types.ts +54 -0
- package/src/query/write.ts +42 -0
- package/src/rack/client.ts +233 -45
- package/src/rack/types.gen.ts +15 -16
- package/src/range/alias/types.gen.ts +2 -3
- package/src/ranger/client.ts +581 -70
- package/src/ranger/kv/client.ts +52 -21
- package/src/ranger/payload.ts +3 -0
- package/src/ranger/types.gen.ts +21 -23
- package/src/ranger/writer.ts +4 -8
- package/src/schematic/actions.gen.ts +62 -53
- package/src/schematic/actions.ts +44 -42
- package/src/schematic/client.ts +226 -70
- package/src/schematic/symbol/client.ts +277 -48
- package/src/schematic/symbol/types.gen.ts +22 -34
- package/src/schematic/types.gen.ts +22 -29
- package/src/status/client.ts +321 -44
- package/src/status/external.ts +2 -0
- package/src/status/payload.ts +1 -23
- package/src/status/status.ts +241 -0
- package/src/status/types.gen.ts +108 -0
- package/src/table/actions.gen.ts +96 -63
- package/src/table/actions.ts +44 -19
- package/src/table/client.ts +220 -56
- package/src/table/types.gen.ts +24 -31
- package/src/task/client.ts +580 -101
- package/src/task/types.gen.ts +68 -75
- package/src/testutil/access.ts +102 -6
- package/src/testutil/channels.ts +29 -0
- package/src/testutil/client.ts +27 -2
- package/src/testutil/connection.ts +47 -0
- package/src/testutil/index.ts +17 -0
- package/src/testutil/panels.ts +26 -0
- package/src/testutil/proxy.ts +106 -0
- package/src/testutil/query.ts +28 -0
- package/src/testutil/telem.ts +17 -1
- package/src/transport.ts +18 -7
- package/src/user/client.ts +165 -64
- package/src/user/external.ts +1 -1
- package/src/user/types.gen.ts +5 -5
- package/src/util/retrieve.ts +4 -4
- package/src/util/telem.ts +0 -1
- package/src/view/client.ts +120 -37
- package/src/view/types.gen.ts +8 -11
- package/.turbo/turbo-build.log +0 -20
- package/.vscode/settings.json +0 -3
- package/CONTRIBUTING.md +0 -47
- package/dist/client.cjs +0 -118
- package/dist/eslint.config.d.ts +0 -4
- package/dist/eslint.config.d.ts.map +0 -1
- package/dist/src/access/enforce.spec.d.ts +0 -2
- package/dist/src/access/enforce.spec.d.ts.map +0 -1
- package/dist/src/access/policy/access.spec.d.ts +0 -2
- package/dist/src/access/policy/access.spec.d.ts.map +0 -1
- package/dist/src/access/role/role.spec.d.ts +0 -2
- package/dist/src/access/role/role.spec.d.ts.map +0 -1
- package/dist/src/actions/actions.spec.d.ts +0 -2
- package/dist/src/actions/actions.spec.d.ts.map +0 -1
- package/dist/src/arc/access.spec.d.ts +0 -2
- package/dist/src/arc/access.spec.d.ts.map +0 -1
- package/dist/src/arc/arc.spec.d.ts +0 -2
- package/dist/src/arc/arc.spec.d.ts.map +0 -1
- package/dist/src/arc/lsp.spec.d.ts +0 -2
- package/dist/src/arc/lsp.spec.d.ts.map +0 -1
- package/dist/src/auth/auth.spec.d.ts +0 -2
- package/dist/src/auth/auth.spec.d.ts.map +0 -1
- package/dist/src/channel/access.spec.d.ts +0 -2
- package/dist/src/channel/access.spec.d.ts.map +0 -1
- package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
- package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
- package/dist/src/channel/channel.spec.d.ts +0 -2
- package/dist/src/channel/channel.spec.d.ts.map +0 -1
- package/dist/src/channel/payload.spec.d.ts +0 -2
- package/dist/src/channel/payload.spec.d.ts.map +0 -1
- package/dist/src/channel/retriever.d.ts +0 -64
- package/dist/src/channel/retriever.d.ts.map +0 -1
- package/dist/src/cluster/index.d.ts +0 -2
- package/dist/src/cluster/index.d.ts.map +0 -1
- package/dist/src/cluster/types.gen.d.ts +0 -4
- package/dist/src/cluster/types.gen.d.ts.map +0 -1
- package/dist/src/connection/checker.d.ts +0 -86
- package/dist/src/connection/checker.d.ts.map +0 -1
- package/dist/src/connection/connection.spec.d.ts +0 -2
- package/dist/src/connection/connection.spec.d.ts.map +0 -1
- package/dist/src/connection.spec.d.ts +0 -2
- package/dist/src/connection.spec.d.ts.map +0 -1
- package/dist/src/control/state.spec.d.ts +0 -2
- package/dist/src/control/state.spec.d.ts.map +0 -1
- package/dist/src/device/access.spec.d.ts +0 -2
- package/dist/src/device/access.spec.d.ts.map +0 -1
- package/dist/src/device/device.spec.d.ts +0 -2
- package/dist/src/device/device.spec.d.ts.map +0 -1
- package/dist/src/device/payload.spec.d.ts +0 -2
- package/dist/src/device/payload.spec.d.ts.map +0 -1
- package/dist/src/errors.spec.d.ts +0 -2
- package/dist/src/errors.spec.d.ts.map +0 -1
- package/dist/src/framer/adapter.spec.d.ts +0 -2
- package/dist/src/framer/adapter.spec.d.ts.map +0 -1
- package/dist/src/framer/client.spec.d.ts +0 -2
- package/dist/src/framer/client.spec.d.ts.map +0 -1
- package/dist/src/framer/codec.spec.d.ts +0 -2
- package/dist/src/framer/codec.spec.d.ts.map +0 -1
- package/dist/src/framer/deleter.spec.d.ts +0 -2
- package/dist/src/framer/deleter.spec.d.ts.map +0 -1
- package/dist/src/framer/frame.spec.d.ts +0 -2
- package/dist/src/framer/frame.spec.d.ts.map +0 -1
- package/dist/src/framer/iterator.spec.d.ts +0 -2
- package/dist/src/framer/iterator.spec.d.ts.map +0 -1
- package/dist/src/framer/reader.spec.d.ts +0 -2
- package/dist/src/framer/reader.spec.d.ts.map +0 -1
- package/dist/src/framer/streamer.spec.d.ts +0 -2
- package/dist/src/framer/streamer.spec.d.ts.map +0 -1
- package/dist/src/framer/writer.spec.d.ts +0 -2
- package/dist/src/framer/writer.spec.d.ts.map +0 -1
- package/dist/src/group/access.spec.d.ts +0 -2
- package/dist/src/group/access.spec.d.ts.map +0 -1
- package/dist/src/group/group.spec.d.ts +0 -2
- package/dist/src/group/group.spec.d.ts.map +0 -1
- package/dist/src/label/access.spec.d.ts +0 -2
- package/dist/src/label/access.spec.d.ts.map +0 -1
- package/dist/src/label/label.spec.d.ts +0 -2
- package/dist/src/label/label.spec.d.ts.map +0 -1
- package/dist/src/lineplot/access.spec.d.ts +0 -2
- package/dist/src/lineplot/access.spec.d.ts.map +0 -1
- package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
- package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
- package/dist/src/log/access.spec.d.ts +0 -2
- package/dist/src/log/access.spec.d.ts.map +0 -1
- package/dist/src/log/log.spec.d.ts +0 -2
- package/dist/src/log/log.spec.d.ts.map +0 -1
- package/dist/src/ontology/ontology.spec.d.ts +0 -2
- package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
- package/dist/src/rack/access.spec.d.ts +0 -2
- package/dist/src/rack/access.spec.d.ts.map +0 -1
- package/dist/src/rack/rack.spec.d.ts +0 -2
- package/dist/src/rack/rack.spec.d.ts.map +0 -1
- package/dist/src/ranger/access.spec.d.ts +0 -2
- package/dist/src/ranger/access.spec.d.ts.map +0 -1
- package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
- package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
- package/dist/src/ranger/ranger.spec.d.ts +0 -2
- package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
- package/dist/src/schematic/access.spec.d.ts +0 -2
- package/dist/src/schematic/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/actions.spec.d.ts +0 -2
- package/dist/src/schematic/actions.spec.d.ts.map +0 -1
- package/dist/src/schematic/schematic.spec.d.ts +0 -2
- package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
- package/dist/src/status/access.spec.d.ts +0 -2
- package/dist/src/status/access.spec.d.ts.map +0 -1
- package/dist/src/status/status.spec.d.ts +0 -2
- package/dist/src/status/status.spec.d.ts.map +0 -1
- package/dist/src/table/access.spec.d.ts +0 -2
- package/dist/src/table/access.spec.d.ts.map +0 -1
- package/dist/src/table/table.spec.d.ts +0 -2
- package/dist/src/table/table.spec.d.ts.map +0 -1
- package/dist/src/task/access.spec.d.ts +0 -2
- package/dist/src/task/access.spec.d.ts.map +0 -1
- package/dist/src/task/payload.spec.d.ts +0 -2
- package/dist/src/task/payload.spec.d.ts.map +0 -1
- package/dist/src/task/task.spec.d.ts +0 -2
- package/dist/src/task/task.spec.d.ts.map +0 -1
- package/dist/src/user/access.spec.d.ts +0 -2
- package/dist/src/user/access.spec.d.ts.map +0 -1
- package/dist/src/user/user.spec.d.ts +0 -2
- package/dist/src/user/user.spec.d.ts.map +0 -1
- package/dist/src/util/retrieve.spec.d.ts +0 -2
- package/dist/src/util/retrieve.spec.d.ts.map +0 -1
- package/dist/src/view/view.spec.d.ts +0 -2
- package/dist/src/view/view.spec.d.ts.map +0 -1
- package/dist/src/workspace/access.spec.d.ts +0 -2
- package/dist/src/workspace/access.spec.d.ts.map +0 -1
- package/dist/src/workspace/client.d.ts +0 -36
- package/dist/src/workspace/client.d.ts.map +0 -1
- package/dist/src/workspace/external.d.ts.map +0 -1
- package/dist/src/workspace/index.d.ts +0 -2
- package/dist/src/workspace/index.d.ts.map +0 -1
- package/dist/src/workspace/types.gen.d.ts +0 -34
- package/dist/src/workspace/types.gen.d.ts.map +0 -1
- package/dist/src/workspace/workspace.spec.d.ts +0 -2
- package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
- package/examples/node/basicReadWrite.js +0 -86
- package/examples/node/createChannels.js +0 -50
- package/examples/node/createRange.js +0 -67
- package/examples/node/package-lock.json +0 -133
- package/examples/node/package.json +0 -17
- package/examples/node/readLatest.js +0 -76
- package/examples/node/seriesAndFrames.js +0 -173
- package/examples/node/streamRead.js +0 -50
- package/examples/node/streamWrite.js +0 -87
- package/src/access/enforce.spec.ts +0 -188
- package/src/access/policy/access.spec.ts +0 -147
- package/src/access/role/role.spec.ts +0 -95
- package/src/actions/actions.spec.ts +0 -229
- package/src/arc/access.spec.ts +0 -149
- package/src/arc/arc.spec.ts +0 -44
- package/src/arc/lsp.spec.ts +0 -717
- package/src/auth/auth.spec.ts +0 -101
- package/src/channel/access.spec.ts +0 -116
- package/src/channel/batchRetriever.spec.ts +0 -115
- package/src/channel/channel.spec.ts +0 -352
- package/src/channel/payload.spec.ts +0 -117
- package/src/channel/retriever.ts +0 -252
- package/src/connection/checker.ts +0 -203
- package/src/connection/connection.spec.ts +0 -152
- package/src/connection.spec.ts +0 -145
- package/src/control/state.spec.ts +0 -22
- package/src/device/access.spec.ts +0 -159
- package/src/device/device.spec.ts +0 -461
- package/src/device/payload.spec.ts +0 -142
- package/src/errors.spec.ts +0 -71
- package/src/framer/adapter.spec.ts +0 -620
- package/src/framer/client.spec.ts +0 -180
- package/src/framer/codec.spec.ts +0 -383
- package/src/framer/deleter.spec.ts +0 -103
- package/src/framer/frame.spec.ts +0 -973
- package/src/framer/iterator.spec.ts +0 -169
- package/src/framer/reader.spec.ts +0 -865
- package/src/framer/streamer.spec.ts +0 -871
- package/src/framer/writer.spec.ts +0 -486
- package/src/group/access.spec.ts +0 -77
- package/src/group/group.spec.ts +0 -65
- package/src/label/access.spec.ts +0 -109
- package/src/label/label.spec.ts +0 -83
- package/src/lineplot/access.spec.ts +0 -134
- package/src/lineplot/lineplot.spec.ts +0 -120
- package/src/log/access.spec.ts +0 -132
- package/src/log/log.spec.ts +0 -106
- package/src/ontology/ontology.spec.ts +0 -521
- package/src/rack/access.spec.ts +0 -102
- package/src/rack/rack.spec.ts +0 -171
- package/src/ranger/access.spec.ts +0 -115
- package/src/ranger/alias/payload.spec.ts +0 -52
- package/src/ranger/ranger.spec.ts +0 -343
- package/src/schematic/access.spec.ts +0 -134
- package/src/schematic/actions.spec.ts +0 -699
- package/src/schematic/schematic.spec.ts +0 -340
- package/src/schematic/symbol/access.spec.ts +0 -172
- package/src/schematic/symbol/client.spec.ts +0 -160
- package/src/status/access.spec.ts +0 -129
- package/src/status/status.spec.ts +0 -448
- package/src/table/access.spec.ts +0 -128
- package/src/table/table.spec.ts +0 -651
- package/src/task/access.spec.ts +0 -131
- package/src/task/payload.spec.ts +0 -113
- package/src/task/task.spec.ts +0 -657
- package/src/user/access.spec.ts +0 -107
- package/src/user/user.spec.ts +0 -290
- package/src/util/retrieve.spec.ts +0 -49
- package/src/view/view.spec.ts +0 -165
- package/src/workspace/access.spec.ts +0 -108
- package/src/workspace/client.ts +0 -112
- package/src/workspace/types.gen.ts +0 -46
- package/src/workspace/workspace.spec.ts +0 -111
- package/tsconfig.json +0 -5
- package/tsconfig.vite.json +0 -4
- package/vite.config.ts +0 -29
- /package/dist/src/{workspace → project}/external.d.ts +0 -0
package/src/task/types.gen.ts
CHANGED
|
@@ -9,20 +9,41 @@
|
|
|
9
9
|
|
|
10
10
|
// Code generated by Oracle. DO NOT EDIT.
|
|
11
11
|
|
|
12
|
-
import { caseconv, type optional, record,
|
|
12
|
+
import { caseconv, type optional, record, uuid } from "@synnaxlabs/x";
|
|
13
13
|
import { z } from "zod";
|
|
14
14
|
|
|
15
|
+
import { device } from "@/device";
|
|
15
16
|
import { ontology } from "@/ontology";
|
|
17
|
+
import { rack } from "@/rack";
|
|
18
|
+
import { status } from "@/status";
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
.
|
|
20
|
+
/** KeyedConfig is the base for every stored task configuration record. */
|
|
21
|
+
export const keyedConfigZ = z.object({
|
|
22
|
+
/** key is the unique identifier for the stored configuration record. */
|
|
23
|
+
key: z.uuid().default(uuid.create),
|
|
24
|
+
});
|
|
25
|
+
export interface KeyedConfig extends z.infer<typeof keyedConfigZ> {}
|
|
26
|
+
|
|
27
|
+
export const keyZ = z.uuid();
|
|
20
28
|
export type Key = z.infer<typeof keyZ>;
|
|
21
29
|
|
|
30
|
+
export const startConfigZ = keyedConfigZ.extend({
|
|
31
|
+
autoStart: z.boolean().default(false),
|
|
32
|
+
});
|
|
33
|
+
export interface StartConfig extends z.infer<typeof startConfigZ> {}
|
|
34
|
+
|
|
35
|
+
export const scanConfigZ = keyedConfigZ.extend({
|
|
36
|
+
rate: z.number().default(0.2),
|
|
37
|
+
disabled: z.boolean().default(false),
|
|
38
|
+
});
|
|
39
|
+
export interface ScanConfig extends z.infer<typeof scanConfigZ> {}
|
|
40
|
+
|
|
22
41
|
export type StatusDetailsZodObject<Data extends z.ZodType = z.ZodNever> = z.ZodObject<{
|
|
23
42
|
task: typeof keyZ;
|
|
24
43
|
running: z.ZodBoolean;
|
|
25
|
-
cmd: z.
|
|
44
|
+
cmd: z.ZodDefault<z.ZodString>;
|
|
45
|
+
configHash: z.ZodDefault<z.ZodString>;
|
|
46
|
+
rack: z.ZodDefault<typeof rack.keyZ>;
|
|
26
47
|
data: [Data] extends [z.ZodNever] ? z.ZodOptional<z.ZodUnknown> : z.ZodOptional<Data>;
|
|
27
48
|
}>;
|
|
28
49
|
|
|
@@ -37,43 +58,17 @@ export const statusDetailsZ: StatusDetailsZFunction = <Data extends z.ZodType>(
|
|
|
37
58
|
z.object({
|
|
38
59
|
task: keyZ,
|
|
39
60
|
running: z.boolean(),
|
|
40
|
-
cmd: z.string().
|
|
61
|
+
cmd: z.string().default(""),
|
|
62
|
+
configHash: z.string().default(""),
|
|
63
|
+
rack: rack.keyZ.default(0),
|
|
41
64
|
data: (data ?? z.unknown()).optional(),
|
|
42
65
|
});
|
|
43
66
|
export type StatusDetails<Data extends z.ZodType = z.ZodNever> = {
|
|
44
67
|
task: Key;
|
|
45
68
|
running: boolean;
|
|
46
|
-
cmd
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
export type NewStatusDetailsZodObject<Data extends z.ZodType = z.ZodNever> =
|
|
50
|
-
z.ZodObject<{
|
|
51
|
-
task: z.ZodOptional<typeof keyZ>;
|
|
52
|
-
running: z.ZodBoolean;
|
|
53
|
-
cmd: z.ZodOptional<z.ZodString>;
|
|
54
|
-
data: [Data] extends [z.ZodNever]
|
|
55
|
-
? z.ZodOptional<z.ZodUnknown>
|
|
56
|
-
: z.ZodOptional<Data>;
|
|
57
|
-
}>;
|
|
58
|
-
|
|
59
|
-
export interface NewStatusDetailsZFunction {
|
|
60
|
-
<Data extends z.ZodType>(data: Data): NewStatusDetailsZodObject<Data>;
|
|
61
|
-
<Data extends z.ZodType = z.ZodNever>(data?: Data): NewStatusDetailsZodObject<Data>;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export const newStatusDetailsZ: NewStatusDetailsZFunction = <Data extends z.ZodType>(
|
|
65
|
-
data?: Data,
|
|
66
|
-
) =>
|
|
67
|
-
z.object({
|
|
68
|
-
task: keyZ.optional(),
|
|
69
|
-
running: z.boolean(),
|
|
70
|
-
cmd: z.string().optional(),
|
|
71
|
-
data: (data ?? z.unknown()).optional(),
|
|
72
|
-
});
|
|
73
|
-
export type NewStatusDetails<Data extends z.ZodType = z.ZodNever> = {
|
|
74
|
-
task?: Key;
|
|
75
|
-
running: boolean;
|
|
76
|
-
cmd?: string;
|
|
69
|
+
cmd: string;
|
|
70
|
+
configHash: string;
|
|
71
|
+
rack: rack.Key;
|
|
77
72
|
} & ([Data] extends [z.ZodNever] ? {} : { data?: z.infer<Data> });
|
|
78
73
|
|
|
79
74
|
/** Command is a command to execute on a task in the Driver system. */
|
|
@@ -84,22 +79,38 @@ export const commandZ = z.object({
|
|
|
84
79
|
type: z.string(),
|
|
85
80
|
/** key is a unique identifier for this command instance. */
|
|
86
81
|
key: z.string(),
|
|
82
|
+
/**
|
|
83
|
+
* configHash is the config hash the sender wants running. Empty when the sender does
|
|
84
|
+
* not know it. The Driver reuses its live instance when the hash matches and
|
|
85
|
+
* redeploys when it differs.
|
|
86
|
+
*/
|
|
87
|
+
configHash: z.string().default(""),
|
|
87
88
|
/** args contains optional arguments for the command. */
|
|
88
|
-
args: caseconv.preserveCase(
|
|
89
|
+
args: caseconv.preserveCase(record.unknownZ().default(() => ({}))),
|
|
89
90
|
});
|
|
90
91
|
export interface Command extends z.infer<typeof commandZ> {}
|
|
91
92
|
|
|
93
|
+
export const persistConfigZ = startConfigZ.extend({
|
|
94
|
+
dataSavingDisabled: z.boolean().default(false),
|
|
95
|
+
});
|
|
96
|
+
export interface PersistConfig extends z.infer<typeof persistConfigZ> {}
|
|
97
|
+
|
|
92
98
|
export const statusZ = <Data extends z.ZodType = z.ZodNever>(data?: Data) =>
|
|
93
99
|
status.statusZ({ details: statusDetailsZ(data) });
|
|
94
100
|
export type Status<Data extends z.ZodType = z.ZodNever> = z.infer<
|
|
95
101
|
ReturnType<typeof statusZ<Data>>
|
|
96
102
|
>;
|
|
97
103
|
|
|
98
|
-
export const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
export const readConfigZ = persistConfigZ.extend({
|
|
105
|
+
sampleRate: z.number().default(10),
|
|
106
|
+
streamRate: z.number().default(5),
|
|
107
|
+
});
|
|
108
|
+
export interface ReadConfig extends z.infer<typeof readConfigZ> {}
|
|
109
|
+
|
|
110
|
+
export const writeConfigZ = persistConfigZ.extend({
|
|
111
|
+
device: device.keyZ.default(""),
|
|
112
|
+
});
|
|
113
|
+
export interface WriteConfig extends z.infer<typeof writeConfigZ> {}
|
|
103
114
|
|
|
104
115
|
export interface PayloadSchemas<
|
|
105
116
|
Type extends z.ZodType<string> = z.ZodType<string>,
|
|
@@ -121,50 +132,32 @@ export const payloadZ = <
|
|
|
121
132
|
statusData,
|
|
122
133
|
}: Partial<PayloadSchemas<Type, Config, StatusData>> = {}) =>
|
|
123
134
|
z.object({
|
|
124
|
-
key: keyZ,
|
|
135
|
+
key: keyZ.default(uuid.create),
|
|
136
|
+
rack: rack.keyZ.default(0),
|
|
125
137
|
name: z.string(),
|
|
126
138
|
type: type ?? z.string(),
|
|
127
|
-
config: config ?? record.
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
config: config ?? record.unknownZ().default(() => ({})),
|
|
140
|
+
configHash: z.string().default(""),
|
|
141
|
+
internal: z.boolean().default(false),
|
|
142
|
+
snapshot: z.boolean().default(false),
|
|
130
143
|
status: status.statusZ({ details: statusDetailsZ(statusData) }).optional(),
|
|
131
144
|
});
|
|
132
145
|
export interface Payload<S extends PayloadSchemas = PayloadSchemas> {
|
|
133
146
|
key: Key;
|
|
147
|
+
rack: rack.Key;
|
|
134
148
|
name: string;
|
|
135
149
|
type: z.infer<S["type"]>;
|
|
136
150
|
config: z.infer<S["config"]>;
|
|
137
|
-
|
|
138
|
-
|
|
151
|
+
configHash: string;
|
|
152
|
+
internal: boolean;
|
|
153
|
+
snapshot: boolean;
|
|
139
154
|
status?: Status<S["statusData"]>;
|
|
140
155
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
Config extends z.ZodType<record.Unknown> = z.ZodType<record.Unknown>,
|
|
145
|
-
StatusData extends z.ZodType = z.ZodType,
|
|
146
|
-
> {
|
|
147
|
-
type: Type;
|
|
148
|
-
config: Config;
|
|
149
|
-
statusData: StatusData;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export const newZ = <
|
|
153
|
-
Type extends z.ZodType<string> = z.ZodString,
|
|
154
|
-
Config extends z.ZodType<record.Unknown> = z.ZodType<record.Unknown>,
|
|
155
|
-
StatusData extends z.ZodType = z.ZodNever,
|
|
156
|
-
>({ type, config, statusData }: Partial<NewSchemas<Type, Config, StatusData>> = {}) =>
|
|
157
|
-
payloadZ({ type, config, statusData })
|
|
158
|
-
.omit({ internal: true, snapshot: true, status: true })
|
|
159
|
-
.partial({ key: true })
|
|
160
|
-
.extend({
|
|
161
|
-
status: status.newZ({ details: newStatusDetailsZ(statusData) }).optional(),
|
|
162
|
-
});
|
|
163
|
-
export type New<S extends NewSchemas = NewSchemas> = optional.Optional<
|
|
164
|
-
Omit<Payload<S>, "internal" | "snapshot" | "status">,
|
|
165
|
-
"key"
|
|
156
|
+
export type New<S extends PayloadSchemas = PayloadSchemas> = optional.Optional<
|
|
157
|
+
Omit<Payload<S>, "status">,
|
|
158
|
+
"key" | "rack" | "configHash" | "internal" | "snapshot"
|
|
166
159
|
> & {
|
|
167
|
-
status?:
|
|
160
|
+
status?: status.New<ReturnType<typeof statusDetailsZ>>;
|
|
168
161
|
};
|
|
169
162
|
|
|
170
163
|
export const ontologyID = ontology.createIDFactory<Key>("task");
|
package/src/testutil/access.ts
CHANGED
|
@@ -7,14 +7,42 @@
|
|
|
7
7
|
// License, use of this software will be governed by the Apache License, Version 2.0,
|
|
8
8
|
// included in the file licenses/APL.txt.
|
|
9
9
|
|
|
10
|
-
import { id } from "@synnaxlabs/x";
|
|
10
|
+
import { array, errors, id } from "@synnaxlabs/x";
|
|
11
11
|
|
|
12
12
|
import { policy } from "@/access/policy";
|
|
13
13
|
import { role } from "@/access/role";
|
|
14
14
|
import type Synnax from "@/client";
|
|
15
|
+
import { AccessDeniedError, NotFoundError } from "@/errors";
|
|
15
16
|
import { createTestClient } from "@/testutil/client";
|
|
17
|
+
import { user } from "@/user";
|
|
16
18
|
|
|
17
|
-
|
|
19
|
+
/** Reports whether the error, or any error in its cause chain, is an access denial. */
|
|
20
|
+
const isDenial = (err: unknown): boolean =>
|
|
21
|
+
AccessDeniedError.matches(err) ||
|
|
22
|
+
(err instanceof Error && err.cause != null && isDenial(err.cause));
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Connects as a new user and primes its policy cache. Denials are tolerated: the Core
|
|
26
|
+
* refuses restricted subjects by design, and the change-stream refusal logs after
|
|
27
|
+
* teardown, which vitest counts as an unhandled error.
|
|
28
|
+
*/
|
|
29
|
+
const connectAs = async (username: string, key: user.Key) => {
|
|
30
|
+
const client = createTestClient({
|
|
31
|
+
username,
|
|
32
|
+
password: "test",
|
|
33
|
+
onInternalError: (err) => {
|
|
34
|
+
if (!isDenial(err)) console.error(err);
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
try {
|
|
38
|
+
await client.access.policies.retrieveForSubject(user.ontologyID(key));
|
|
39
|
+
} catch (err) {
|
|
40
|
+
if (!isDenial(err)) throw errors.fromUnknown(err);
|
|
41
|
+
}
|
|
42
|
+
return client;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const createUser = async (client: Synnax) => {
|
|
18
46
|
const username = id.create();
|
|
19
47
|
const u = await client.users.create({
|
|
20
48
|
username,
|
|
@@ -22,13 +50,81 @@ export const createTestClientWithPolicy = async (client: Synnax, pol: policy.New
|
|
|
22
50
|
firstName: "test",
|
|
23
51
|
lastName: "test",
|
|
24
52
|
});
|
|
25
|
-
|
|
53
|
+
return { username, key: u.key };
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Creates a client authenticated as a new user holding a role that carries the
|
|
58
|
+
* policies. Pass several to grant different actions on different objects, which one
|
|
59
|
+
* policy cannot express.
|
|
60
|
+
*/
|
|
61
|
+
export const createTestClientWithPolicy = async (
|
|
62
|
+
client: Synnax,
|
|
63
|
+
pol: policy.New | policy.New[],
|
|
64
|
+
) => {
|
|
65
|
+
const u = await createUser(client);
|
|
66
|
+
const policies = await Promise.all(
|
|
67
|
+
array.toArray(pol).map(async (p) => await client.access.policies.create(p)),
|
|
68
|
+
);
|
|
26
69
|
const r = await client.access.roles.create({
|
|
27
70
|
name: "test",
|
|
28
71
|
description: "test",
|
|
29
72
|
});
|
|
30
|
-
await client.ontology.addChildren(
|
|
73
|
+
await client.ontology.addChildren(
|
|
74
|
+
role.ontologyID(r.key),
|
|
75
|
+
...policies.map(({ key }) => policy.ontologyID(key)),
|
|
76
|
+
);
|
|
31
77
|
await client.access.roles.assign({ user: u.key, role: r.key });
|
|
32
|
-
|
|
33
|
-
return userClient;
|
|
78
|
+
return await connectAs(u.username, u.key);
|
|
34
79
|
};
|
|
80
|
+
|
|
81
|
+
/** The roles the Core provisions on startup. */
|
|
82
|
+
export const BUILT_IN_ROLES = [
|
|
83
|
+
"Owner",
|
|
84
|
+
"Engineer",
|
|
85
|
+
"Host",
|
|
86
|
+
"Operator",
|
|
87
|
+
"Viewer",
|
|
88
|
+
] as const;
|
|
89
|
+
|
|
90
|
+
export type BuiltInRole = (typeof BUILT_IN_ROLES)[number];
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Creates a client authenticated as a new user holding one of the Core's built-in
|
|
94
|
+
* roles, for exercising a real role's permission set instead of a synthetic policy.
|
|
95
|
+
* @param name - The built-in role to assign.
|
|
96
|
+
* @throws {NotFoundError} if the Core provisions no role under the name.
|
|
97
|
+
*/
|
|
98
|
+
export const createTestClientWithRole = async (
|
|
99
|
+
client: Synnax,
|
|
100
|
+
name: BuiltInRole,
|
|
101
|
+
): Promise<Synnax> => {
|
|
102
|
+
const roles = await client.access.roles.retrieve({});
|
|
103
|
+
const r = roles.find((r) => r.name === name);
|
|
104
|
+
if (r == null) throw new NotFoundError(`no built-in role named ${name}`);
|
|
105
|
+
const u = await createUser(client);
|
|
106
|
+
await client.access.roles.assign({ user: u.key, role: r.key });
|
|
107
|
+
return await connectAs(u.username, u.key);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Caches one client per built-in role, so a spec covering many roles pays the user
|
|
112
|
+
* creation cost once each. Construct one per spec file.
|
|
113
|
+
*/
|
|
114
|
+
export class RoleClients {
|
|
115
|
+
private readonly client: Synnax;
|
|
116
|
+
private readonly byRole = new Map<BuiltInRole, Promise<Synnax>>();
|
|
117
|
+
|
|
118
|
+
constructor(client: Synnax) {
|
|
119
|
+
this.client = client;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Returns a client authenticated as a user holding the role. */
|
|
123
|
+
async get(name: BuiltInRole): Promise<Synnax> {
|
|
124
|
+
const existing = this.byRole.get(name);
|
|
125
|
+
if (existing != null) return await existing;
|
|
126
|
+
const created = createTestClientWithRole(this.client, name);
|
|
127
|
+
this.byRole.set(name, created);
|
|
128
|
+
return await created;
|
|
129
|
+
}
|
|
130
|
+
}
|
package/src/testutil/channels.ts
CHANGED
|
@@ -30,6 +30,24 @@ export const newIndexedPair = async (
|
|
|
30
30
|
return [index, data];
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
export const newIndexedBoolPair = async (
|
|
34
|
+
client: Synnax,
|
|
35
|
+
): Promise<[channel.Channel, channel.Channel]> => {
|
|
36
|
+
const index = await client.channels.create({
|
|
37
|
+
leaseholder: 1,
|
|
38
|
+
name: id.create(),
|
|
39
|
+
dataType: DataType.TIMESTAMP,
|
|
40
|
+
isIndex: true,
|
|
41
|
+
});
|
|
42
|
+
const data = await client.channels.create({
|
|
43
|
+
leaseholder: 1,
|
|
44
|
+
name: id.create(),
|
|
45
|
+
dataType: DataType.BOOLEAN,
|
|
46
|
+
index: index.key,
|
|
47
|
+
});
|
|
48
|
+
return [index, data];
|
|
49
|
+
};
|
|
50
|
+
|
|
33
51
|
export const newVirtualChannel = async (client: Synnax): Promise<channel.Channel> => {
|
|
34
52
|
const ch = await client.channels.create({
|
|
35
53
|
name: id.create(),
|
|
@@ -38,3 +56,14 @@ export const newVirtualChannel = async (client: Synnax): Promise<channel.Channel
|
|
|
38
56
|
});
|
|
39
57
|
return ch;
|
|
40
58
|
};
|
|
59
|
+
|
|
60
|
+
export const newVirtualBoolChannel = async (
|
|
61
|
+
client: Synnax,
|
|
62
|
+
): Promise<channel.Channel> => {
|
|
63
|
+
const ch = await client.channels.create({
|
|
64
|
+
name: id.create(),
|
|
65
|
+
dataType: DataType.BOOLEAN,
|
|
66
|
+
virtual: true,
|
|
67
|
+
});
|
|
68
|
+
return ch;
|
|
69
|
+
};
|
package/src/testutil/client.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
// included in the file licenses/APL.txt.
|
|
9
9
|
|
|
10
10
|
import { TimeSpan } from "@synnaxlabs/x";
|
|
11
|
+
import { afterAll } from "vitest";
|
|
11
12
|
|
|
12
13
|
import Synnax, { type SynnaxParams } from "@/client";
|
|
13
14
|
|
|
@@ -23,5 +24,29 @@ export const TEST_CLIENT_PARAMS: SynnaxParams = {
|
|
|
23
24
|
},
|
|
24
25
|
};
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
// A hook registered mid-test is silently dropped by vitest, so per-client afterAll
|
|
28
|
+
// calls leak clients created inside test bodies. This module-level hook registers
|
|
29
|
+
// during spec collection (import time) and covers every call site.
|
|
30
|
+
const openClients: Synnax[] = [];
|
|
31
|
+
// Awaited so every close finishes before vitest tears down the worker; a close
|
|
32
|
+
// still in flight at teardown races its logging against the closing RPC channel.
|
|
33
|
+
afterAll(async () => {
|
|
34
|
+
const results = await Promise.allSettled(openClients.map((client) => client.close()));
|
|
35
|
+
const failures = results.filter((result) => result.status === "rejected");
|
|
36
|
+
if (failures.length > 0)
|
|
37
|
+
throw new AggregateError(
|
|
38
|
+
failures.map((failure) => failure.reason),
|
|
39
|
+
"failed to close test clients",
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Creates a client connected to the local test cluster. The client is closed
|
|
45
|
+
* automatically once every test in the current spec file has finished, so callers do
|
|
46
|
+
* not need to close it themselves.
|
|
47
|
+
*/
|
|
48
|
+
export const createTestClient = (params?: Partial<SynnaxParams>): Synnax => {
|
|
49
|
+
const client = new Synnax({ ...TEST_CLIENT_PARAMS, ...params });
|
|
50
|
+
openClients.push(client);
|
|
51
|
+
return client;
|
|
52
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
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 { TimeSpan } from "@synnaxlabs/x";
|
|
11
|
+
|
|
12
|
+
import { type connection } from "@/connection";
|
|
13
|
+
|
|
14
|
+
/** Resolves once the handle's status satisfies the predicate. */
|
|
15
|
+
export const waitForStatus = async (
|
|
16
|
+
handle: connection.Handle,
|
|
17
|
+
predicate: (status: connection.Status) => boolean,
|
|
18
|
+
timeout: TimeSpan = TimeSpan.seconds(5),
|
|
19
|
+
): Promise<connection.Status> => {
|
|
20
|
+
if (predicate(handle.status)) return handle.status;
|
|
21
|
+
return await new Promise<connection.Status>((resolve, reject) => {
|
|
22
|
+
const timer = setTimeout(() => {
|
|
23
|
+
detach();
|
|
24
|
+
reject(new Error("timed out waiting for connection status"));
|
|
25
|
+
}, timeout.milliseconds);
|
|
26
|
+
const detach = handle.onChange((status) => {
|
|
27
|
+
if (!predicate(status)) return;
|
|
28
|
+
clearTimeout(timer);
|
|
29
|
+
detach();
|
|
30
|
+
resolve(status);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Resolves once the handle's change stream is live, so every later cluster write
|
|
37
|
+
* reaches the client's cache.
|
|
38
|
+
*/
|
|
39
|
+
export const waitForStreamLive = async (
|
|
40
|
+
handle: connection.Handle,
|
|
41
|
+
timeout?: TimeSpan,
|
|
42
|
+
): Promise<connection.Status> =>
|
|
43
|
+
await waitForStatus(
|
|
44
|
+
handle,
|
|
45
|
+
({ variant, details }) => variant === "success" && details.streamLive,
|
|
46
|
+
timeout,
|
|
47
|
+
);
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
export * from "@/testutil/access";
|
|
11
|
+
export * from "@/testutil/channels";
|
|
12
|
+
export * from "@/testutil/client";
|
|
13
|
+
export * from "@/testutil/connection";
|
|
14
|
+
export * from "@/testutil/panels";
|
|
15
|
+
export * from "@/testutil/proxy";
|
|
16
|
+
export * from "@/testutil/query";
|
|
17
|
+
export * from "@/testutil/telem";
|
|
@@ -0,0 +1,26 @@
|
|
|
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 { id } from "@synnaxlabs/x";
|
|
11
|
+
|
|
12
|
+
import type Synnax from "@/client";
|
|
13
|
+
import { type ontology } from "@/ontology";
|
|
14
|
+
import { project } from "@/project";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Creates a throwaway project and returns its ontology ID. Panel creation requires a
|
|
18
|
+
* parent, so tests that mint panels directly parent them here.
|
|
19
|
+
*/
|
|
20
|
+
export const createPanelParent = async (client: Synnax): Promise<ontology.ID> => {
|
|
21
|
+
const proj = await client.projects.create({
|
|
22
|
+
name: `project-${id.create()}`,
|
|
23
|
+
layout: {},
|
|
24
|
+
});
|
|
25
|
+
return project.ontologyID(proj.key);
|
|
26
|
+
};
|
|
@@ -0,0 +1,106 @@
|
|
|
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 { connect, createServer, type Socket } from "node:net";
|
|
11
|
+
|
|
12
|
+
import { type breaker, TimeSpan } from "@synnaxlabs/x";
|
|
13
|
+
|
|
14
|
+
const DEFAULT_TARGET = { host: "localhost", port: 9090 };
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Retry policy for a client pointed at a severable proxy. A spec drives its own
|
|
18
|
+
* retries, so the client's must finish well inside one assertion budget: the
|
|
19
|
+
* default policy waits seconds per request and outlasts a single `expect.poll`
|
|
20
|
+
* attempt, which reports as a timeout rather than the real answer.
|
|
21
|
+
*/
|
|
22
|
+
export const FAST_RETRY: breaker.Config = {
|
|
23
|
+
baseInterval: TimeSpan.milliseconds(10),
|
|
24
|
+
maxInterval: TimeSpan.milliseconds(50),
|
|
25
|
+
scale: 1.5,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export interface SeverableProxyTarget {
|
|
29
|
+
host?: string;
|
|
30
|
+
port?: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface SeverableProxy {
|
|
34
|
+
/** Port the proxy accepts connections on. Point the client here. */
|
|
35
|
+
port: number;
|
|
36
|
+
/** Drops every live connection and refuses new ones, as if the cluster died. */
|
|
37
|
+
sever: () => Promise<void>;
|
|
38
|
+
/** Accepts connections again on the same port. */
|
|
39
|
+
restore: () => Promise<void>;
|
|
40
|
+
/** Shuts the proxy down for good. */
|
|
41
|
+
close: () => Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Creates a TCP proxy in front of the live test cluster so specs can simulate
|
|
46
|
+
* cluster downtime without touching the cluster itself. Connect a client to
|
|
47
|
+
* the returned port, then sever() and restore() the link.
|
|
48
|
+
*/
|
|
49
|
+
export const createSeverableProxy = async (
|
|
50
|
+
target: SeverableProxyTarget = {},
|
|
51
|
+
): Promise<SeverableProxy> => {
|
|
52
|
+
const { host, port } = { ...DEFAULT_TARGET, ...target };
|
|
53
|
+
const sockets = new Set<Socket>();
|
|
54
|
+
let severed = false;
|
|
55
|
+
const server = createServer((downstream) => {
|
|
56
|
+
// A connection the kernel accepted before the sever is still delivered after it,
|
|
57
|
+
// and forwarding it would let a request through a severed link.
|
|
58
|
+
if (severed) {
|
|
59
|
+
downstream.destroy();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const upstream = connect(port, host);
|
|
63
|
+
sockets.add(downstream).add(upstream);
|
|
64
|
+
const destroy = (): void => {
|
|
65
|
+
sockets.delete(downstream);
|
|
66
|
+
sockets.delete(upstream);
|
|
67
|
+
downstream.destroy();
|
|
68
|
+
upstream.destroy();
|
|
69
|
+
};
|
|
70
|
+
downstream.on("error", destroy);
|
|
71
|
+
upstream.on("error", destroy);
|
|
72
|
+
downstream.on("close", destroy);
|
|
73
|
+
upstream.on("close", destroy);
|
|
74
|
+
downstream.pipe(upstream);
|
|
75
|
+
upstream.pipe(downstream);
|
|
76
|
+
});
|
|
77
|
+
const listen = async (listenPort: number): Promise<void> =>
|
|
78
|
+
await new Promise((resolve, reject) => {
|
|
79
|
+
server.once("error", reject);
|
|
80
|
+
server.listen(listenPort, () => {
|
|
81
|
+
server.removeListener("error", reject);
|
|
82
|
+
resolve();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
await listen(0);
|
|
86
|
+
const address = server.address();
|
|
87
|
+
if (address == null || typeof address === "string")
|
|
88
|
+
throw new Error("proxy failed to bind a port");
|
|
89
|
+
const boundPort = address.port;
|
|
90
|
+
const sever = async (): Promise<void> => {
|
|
91
|
+
severed = true;
|
|
92
|
+
const closed = new Promise<void>((resolve) => server.close(() => resolve()));
|
|
93
|
+
sockets.forEach((socket) => socket.destroy());
|
|
94
|
+
sockets.clear();
|
|
95
|
+
await closed;
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
port: boundPort,
|
|
99
|
+
sever,
|
|
100
|
+
restore: async () => {
|
|
101
|
+
severed = false;
|
|
102
|
+
await listen(boundPort);
|
|
103
|
+
},
|
|
104
|
+
close: sever,
|
|
105
|
+
};
|
|
106
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
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 { query } from "@/query";
|
|
11
|
+
|
|
12
|
+
export { isLive } from "@/query/query";
|
|
13
|
+
|
|
14
|
+
/** Asserts the cached answer is live (present and not deleted) and returns it. */
|
|
15
|
+
export const expectLive = <D extends query.Data>(
|
|
16
|
+
value: query.Cached<D> | undefined,
|
|
17
|
+
): D => {
|
|
18
|
+
if (!query.isLive<D>(value)) throw new Error("expected a live cached answer");
|
|
19
|
+
return value;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** Asserts the cached answer is a deletion and returns it. */
|
|
23
|
+
export const expectDeleted = <D extends query.Data>(
|
|
24
|
+
value: query.Cached<D> | undefined,
|
|
25
|
+
): query.Deleted<D> => {
|
|
26
|
+
if (!query.Deleted.matches<D>(value)) throw new Error("expected a deleted answer");
|
|
27
|
+
return value;
|
|
28
|
+
};
|
package/src/testutil/telem.ts
CHANGED
|
@@ -7,7 +7,23 @@
|
|
|
7
7
|
// License, use of this software will be governed by the Apache License, Version 2.0,
|
|
8
8
|
// included in the file licenses/APL.txt.
|
|
9
9
|
|
|
10
|
-
import { TimeStamp } from "@synnaxlabs/x";
|
|
10
|
+
import { DataType, type Series, TimeStamp } from "@synnaxlabs/x";
|
|
11
|
+
|
|
12
|
+
import { type framer } from "@/framer";
|
|
11
13
|
|
|
12
14
|
export const secondsLinspace = (start: number, n: number): TimeStamp[] =>
|
|
13
15
|
Array.from({ length: n }, (_, i) => start + i).map((n) => TimeStamp.seconds(n));
|
|
16
|
+
|
|
17
|
+
const isRaw = (dt: DataType): boolean => dt.isVariable || dt.equals(DataType.UINT8);
|
|
18
|
+
|
|
19
|
+
/** Narrows every numeric series to float32, anchoring bigints on an offset. Mirrors
|
|
20
|
+
* the transform the visualization layer injects for WebGL rendering. */
|
|
21
|
+
export const glTransform: framer.Transform = {
|
|
22
|
+
resolveDataType: (dt: DataType) => (isRaw(dt) ? dt : DataType.FLOAT32),
|
|
23
|
+
convert: (series: Series, offset) => {
|
|
24
|
+
if (isRaw(series.dataType)) return series;
|
|
25
|
+
if (offset == null && series.dataType.usesBigInt && series.length > 0)
|
|
26
|
+
offset = BigInt(series.data[0]);
|
|
27
|
+
return series.convert(DataType.FLOAT32, offset);
|
|
28
|
+
},
|
|
29
|
+
};
|