@synnaxlabs/client 0.56.2 → 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,495 @@
|
|
|
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 Middleware, type UnaryClient } from "@synnaxlabs/freighter";
|
|
11
|
+
import {
|
|
12
|
+
breaker,
|
|
13
|
+
ClockSkewCalculator,
|
|
14
|
+
type CrudeTimeSpan,
|
|
15
|
+
type destructor,
|
|
16
|
+
errors,
|
|
17
|
+
migrate,
|
|
18
|
+
observe,
|
|
19
|
+
sync,
|
|
20
|
+
TimeSpan,
|
|
21
|
+
TimeStamp,
|
|
22
|
+
url,
|
|
23
|
+
} from "@synnaxlabs/x";
|
|
24
|
+
import { z } from "zod";
|
|
25
|
+
|
|
26
|
+
import { auth } from "@/auth";
|
|
27
|
+
import {
|
|
28
|
+
advance,
|
|
29
|
+
awaitConnected,
|
|
30
|
+
type Config,
|
|
31
|
+
createInitialStatus,
|
|
32
|
+
DEFAULT_ESCALATE_AFTER,
|
|
33
|
+
type Event,
|
|
34
|
+
type Handle,
|
|
35
|
+
type Info,
|
|
36
|
+
reduce,
|
|
37
|
+
type Status,
|
|
38
|
+
} from "@/connection/status";
|
|
39
|
+
import { AccessDeniedError, DisconnectedError, errorsMiddleware } from "@/errors";
|
|
40
|
+
import { Transport } from "@/transport";
|
|
41
|
+
|
|
42
|
+
const CHECK_ENDPOINT = "/connectivity/check";
|
|
43
|
+
|
|
44
|
+
const checkResZ = z.object({
|
|
45
|
+
clusterKey: z.string(),
|
|
46
|
+
nodeVersion: z.string(),
|
|
47
|
+
nodeTime: TimeStamp.z,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Runs a single connectivity check, measuring clock skew across the round trip.
|
|
52
|
+
* The transport must carry the full middleware chain, auth included, so that a
|
|
53
|
+
* response proves authentication.
|
|
54
|
+
* @throws {AuthError} if the cluster rejects the client's credentials.
|
|
55
|
+
* @throws {Unreachable} if the cluster cannot be reached.
|
|
56
|
+
*/
|
|
57
|
+
export const sendCheck = async (unary: UnaryClient): Promise<Info> => {
|
|
58
|
+
const skew = new ClockSkewCalculator();
|
|
59
|
+
skew.start();
|
|
60
|
+
const res = await unary.send(CHECK_ENDPOINT, undefined, z.void(), checkResZ);
|
|
61
|
+
skew.end(res.nodeTime);
|
|
62
|
+
return {
|
|
63
|
+
clusterKey: res.clusterKey,
|
|
64
|
+
nodeVersion: res.nodeVersion,
|
|
65
|
+
clockSkew: skew.skew,
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/** Address parameters for a one-shot connectivity check. */
|
|
70
|
+
export interface CheckParams {
|
|
71
|
+
host: string;
|
|
72
|
+
port: number | string;
|
|
73
|
+
secure?: boolean;
|
|
74
|
+
/** Human-readable cluster name for status messages. */
|
|
75
|
+
name?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Runs a one-shot connectivity check against the given cluster address and folds the
|
|
80
|
+
* result into a status. Never throws: failures land in the returned status.
|
|
81
|
+
*/
|
|
82
|
+
export const check = async (params: CheckParams): Promise<Status> => {
|
|
83
|
+
const { host, port, secure = false, name } = params;
|
|
84
|
+
const endpoint = new url.URL({ host, port: Number(port) });
|
|
85
|
+
const transport = new Transport(endpoint, {}, secure);
|
|
86
|
+
transport.use(errorsMiddleware);
|
|
87
|
+
const cfg: Config = {
|
|
88
|
+
clientVersion: __VERSION__,
|
|
89
|
+
escalateAfter: 1,
|
|
90
|
+
clockSkewThreshold: TimeSpan.seconds(1),
|
|
91
|
+
requiresStream: false,
|
|
92
|
+
name,
|
|
93
|
+
};
|
|
94
|
+
const initial = createInitialStatus(cfg);
|
|
95
|
+
try {
|
|
96
|
+
const info = await sendCheck(transport.unaryNoRetry);
|
|
97
|
+
return reduce(initial, { type: "check.success", info }, cfg);
|
|
98
|
+
} catch (err) {
|
|
99
|
+
const error = errors.fromUnknown(err);
|
|
100
|
+
return reduce(initial, { type: "check.failure", error, attempt: 1 }, cfg);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/** How hard the check loop is working. */
|
|
105
|
+
export type Mode = "checking" | "heartbeat" | "idle";
|
|
106
|
+
|
|
107
|
+
/** The mode a given connection status calls for. */
|
|
108
|
+
export const modeFor = ({ variant, details }: Status): Mode => {
|
|
109
|
+
switch (variant) {
|
|
110
|
+
// warning is settled, not in progress: a denied stream checks on the
|
|
111
|
+
// slow cadence like a healthy one
|
|
112
|
+
case "success":
|
|
113
|
+
case "warning":
|
|
114
|
+
return "heartbeat";
|
|
115
|
+
case "disabled":
|
|
116
|
+
return "idle";
|
|
117
|
+
case "error":
|
|
118
|
+
// unreachable keeps checking beneath the error and self-heals; auth and
|
|
119
|
+
// incompatibility rest until the user acts
|
|
120
|
+
return details.reason === "unreachable" ? "checking" : "idle";
|
|
121
|
+
default:
|
|
122
|
+
return "checking";
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const DEFAULT_RETRY: breaker.Config = {
|
|
127
|
+
baseInterval: TimeSpan.seconds(1),
|
|
128
|
+
// checks are one cheap request: a low cap keeps a returned cluster from
|
|
129
|
+
// going unnoticed while backoff is escalated
|
|
130
|
+
maxInterval: TimeSpan.seconds(5),
|
|
131
|
+
maxRetries: Infinity,
|
|
132
|
+
scale: 2,
|
|
133
|
+
jitter: 0.25,
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The outside facts that can move the connection. Everything else that moves it
|
|
138
|
+
* (check results, retry scheduling) the client observes itself.
|
|
139
|
+
*/
|
|
140
|
+
export type FactEvent = Extract<
|
|
141
|
+
Event,
|
|
142
|
+
{
|
|
143
|
+
type:
|
|
144
|
+
| "auth.success"
|
|
145
|
+
| "auth.failure"
|
|
146
|
+
| "stream.live"
|
|
147
|
+
| "stream.drop"
|
|
148
|
+
| "stream.denied"
|
|
149
|
+
| "credentials.replaced"
|
|
150
|
+
| "epoch.advanced";
|
|
151
|
+
}
|
|
152
|
+
>;
|
|
153
|
+
|
|
154
|
+
/** Heartbeats between re-probes of a denied change stream. */
|
|
155
|
+
const DEFAULT_DENIED_STREAM_PROBE_AFTER = 10;
|
|
156
|
+
|
|
157
|
+
const STREAM_DENIED = "cannot stream changes: live updates are unavailable";
|
|
158
|
+
|
|
159
|
+
export interface ClientParams {
|
|
160
|
+
/**
|
|
161
|
+
* Check transport. Must carry the full middleware chain, auth included, so
|
|
162
|
+
* that a check response proves authentication.
|
|
163
|
+
*/
|
|
164
|
+
unary: UnaryClient;
|
|
165
|
+
/** Cluster address, used in error messages. */
|
|
166
|
+
address: string;
|
|
167
|
+
/** Human-readable cluster name for status messages. */
|
|
168
|
+
name?: string;
|
|
169
|
+
/** Consecutive check failures before escalating to error(unreachable). */
|
|
170
|
+
escalateAfter?: number;
|
|
171
|
+
clockSkewThreshold?: TimeSpan;
|
|
172
|
+
/** Whether success requires a live change stream. */
|
|
173
|
+
requiresStream?: boolean;
|
|
174
|
+
/**
|
|
175
|
+
* Degraded-check policy. `maxRetries` defaults to Infinity (never give up);
|
|
176
|
+
* a finite value parks the loop once exhausted, until {@link Client.retryNow}.
|
|
177
|
+
*/
|
|
178
|
+
retry?: breaker.Config;
|
|
179
|
+
/** Check cadence while connected. Defaults to 30 seconds. */
|
|
180
|
+
heartbeatInterval?: CrudeTimeSpan;
|
|
181
|
+
/**
|
|
182
|
+
* Heartbeats between re-probes of a denied change stream. Only a policy
|
|
183
|
+
* change lifts a denial, and the client cannot hear about one. Defaults to 10.
|
|
184
|
+
*/
|
|
185
|
+
deniedStreamProbeAfter?: number;
|
|
186
|
+
/** Levers on the change stream, pulled when transitions demand it. */
|
|
187
|
+
stream?: {
|
|
188
|
+
/** Tears down cached state after a cluster replacement. */
|
|
189
|
+
reset: () => Promise<void>;
|
|
190
|
+
/** (Re)demands a live change stream. */
|
|
191
|
+
ensure: () => Promise<void>;
|
|
192
|
+
};
|
|
193
|
+
/** Receives errors with no caller to throw to. Defaults to console logging. */
|
|
194
|
+
onInternalError?: (error: Error) => void;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Owns a cluster connection's status: checks on a cadence, backs off while degraded,
|
|
199
|
+
* folds outside facts ({@link Client.notify}) into the status, and notifies observers
|
|
200
|
+
* on material changes. The check loop starts on construction, deferred one microtask so
|
|
201
|
+
* callers can finish synchronous wiring (middleware installation) first.
|
|
202
|
+
*/
|
|
203
|
+
export class Client implements Handle {
|
|
204
|
+
private readonly unary: UnaryClient;
|
|
205
|
+
private readonly address: string;
|
|
206
|
+
private readonly config: Config;
|
|
207
|
+
private readonly retry: breaker.Config;
|
|
208
|
+
private readonly heartbeatInterval: TimeSpan;
|
|
209
|
+
private readonly deniedStreamProbeAfter: number;
|
|
210
|
+
private readonly stream?: ClientParams["stream"];
|
|
211
|
+
private readonly onInternalError: (error: Error) => void;
|
|
212
|
+
private readonly observer = new observe.Observer<Status>();
|
|
213
|
+
private readonly notifier = new sync.Notifier();
|
|
214
|
+
private readonly loop: Promise<void>;
|
|
215
|
+
private current: Status;
|
|
216
|
+
private mode: Mode = "checking";
|
|
217
|
+
private closed = false;
|
|
218
|
+
private attempts = 0;
|
|
219
|
+
private generation = 0;
|
|
220
|
+
private probeCountdown = 0;
|
|
221
|
+
private brk: breaker.Breaker | null = null;
|
|
222
|
+
private versionWarned = false;
|
|
223
|
+
|
|
224
|
+
constructor({
|
|
225
|
+
unary,
|
|
226
|
+
address,
|
|
227
|
+
name,
|
|
228
|
+
escalateAfter = DEFAULT_ESCALATE_AFTER,
|
|
229
|
+
clockSkewThreshold = TimeSpan.seconds(1),
|
|
230
|
+
requiresStream = false,
|
|
231
|
+
retry,
|
|
232
|
+
heartbeatInterval = TimeSpan.seconds(30),
|
|
233
|
+
deniedStreamProbeAfter = DEFAULT_DENIED_STREAM_PROBE_AFTER,
|
|
234
|
+
stream,
|
|
235
|
+
onInternalError = console.error,
|
|
236
|
+
}: ClientParams) {
|
|
237
|
+
this.unary = unary;
|
|
238
|
+
this.address = address;
|
|
239
|
+
this.config = {
|
|
240
|
+
clientVersion: __VERSION__,
|
|
241
|
+
name,
|
|
242
|
+
escalateAfter,
|
|
243
|
+
clockSkewThreshold,
|
|
244
|
+
requiresStream,
|
|
245
|
+
};
|
|
246
|
+
this.retry = { ...DEFAULT_RETRY, ...retry };
|
|
247
|
+
this.heartbeatInterval = new TimeSpan(heartbeatInterval);
|
|
248
|
+
this.deniedStreamProbeAfter = deniedStreamProbeAfter;
|
|
249
|
+
this.stream = stream;
|
|
250
|
+
this.onInternalError = onInternalError;
|
|
251
|
+
this.current = createInitialStatus(this.config);
|
|
252
|
+
this.loop = this.run().catch((err: unknown) =>
|
|
253
|
+
this.onInternalError(new Error("connection check loop failed", { cause: err })),
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** The current connection status. */
|
|
258
|
+
get status(): Status {
|
|
259
|
+
return this.current;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** Subscribes to material status changes. Returns an unsubscribe destructor. */
|
|
263
|
+
onChange(callback: (status: Status) => void): destructor.Destructor {
|
|
264
|
+
return this.observer.onChange(callback);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Resets the retry backoff and checks immediately. Auth and incompatibility
|
|
269
|
+
* errors are not cleared: those rest until the user supplies something new.
|
|
270
|
+
*/
|
|
271
|
+
retryNow(): void {
|
|
272
|
+
this.dispatch({ type: "retry.requested" });
|
|
273
|
+
this.wake();
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Resolves once the connection is usable: success, or warning when the cluster
|
|
278
|
+
* refuses live updates. Rejects with the stored failure when it settles on an error
|
|
279
|
+
* variant or is closed. An already-connected client resolves without waiting.
|
|
280
|
+
* @throws {Error} if the timeout elapses first.
|
|
281
|
+
*/
|
|
282
|
+
async connect(timeout?: CrudeTimeSpan): Promise<Status> {
|
|
283
|
+
return await awaitConnected(this, timeout);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** Folds an outside fact into the connection status. */
|
|
287
|
+
notify(event: FactEvent): void {
|
|
288
|
+
const wasDenied = this.current.details.streamDenied;
|
|
289
|
+
this.dispatch(event);
|
|
290
|
+
if (event.type === "stream.denied") {
|
|
291
|
+
this.probeCountdown = this.deniedStreamProbeAfter;
|
|
292
|
+
// every probe hits the same refusal; only the first is news
|
|
293
|
+
if (!wasDenied)
|
|
294
|
+
this.onInternalError(
|
|
295
|
+
new AccessDeniedError(STREAM_DENIED, { cause: event.error }),
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
// a reopened stream may lead to a replaced cluster, and new credentials
|
|
299
|
+
// deserve an immediate verdict: both check right away
|
|
300
|
+
if (event.type === "stream.live" || event.type === "credentials.replaced")
|
|
301
|
+
this.wake();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Rejects unary requests instantly while the cluster is known unreachable,
|
|
306
|
+
* instead of burning the transport's retry budget per call. The check and
|
|
307
|
+
* login targets are exempt so the connection can heal.
|
|
308
|
+
*/
|
|
309
|
+
middleware(): Middleware {
|
|
310
|
+
const EXEMPT = [CHECK_ENDPOINT, auth.LOGIN_ENDPOINT];
|
|
311
|
+
return async (ctx, next) => {
|
|
312
|
+
const { variant, details } = this.current;
|
|
313
|
+
if (
|
|
314
|
+
variant === "error" &&
|
|
315
|
+
details.reason === "unreachable" &&
|
|
316
|
+
!EXEMPT.some((target) => ctx.target.endsWith(target))
|
|
317
|
+
)
|
|
318
|
+
throw new DisconnectedError(`Cannot reach cluster at ${this.address}`);
|
|
319
|
+
return await next(ctx);
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/** Stops the check loop and settles the status on disabled. Terminal. */
|
|
324
|
+
async close(): Promise<void> {
|
|
325
|
+
if (this.closed) return;
|
|
326
|
+
this.dispatch({ type: "closed" });
|
|
327
|
+
this.closed = true;
|
|
328
|
+
this.notifier.notify();
|
|
329
|
+
await this.loop;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Folds the event into the status, notifies observers, and applies the
|
|
334
|
+
* transition's side effects.
|
|
335
|
+
*/
|
|
336
|
+
private dispatch(event: Event): void {
|
|
337
|
+
if (this.closed) return;
|
|
338
|
+
const prev = this.current;
|
|
339
|
+
const [next, changed] = advance(prev, event, this.config);
|
|
340
|
+
this.current = next;
|
|
341
|
+
if (changed) this.observer.notify(next);
|
|
342
|
+
// a new cluster at the connection's address voids everything learned from
|
|
343
|
+
// the old one: drop cached state, then bring the stream back up
|
|
344
|
+
if (
|
|
345
|
+
prev.details.clusterKey !== "" &&
|
|
346
|
+
next.details.clusterKey !== prev.details.clusterKey
|
|
347
|
+
)
|
|
348
|
+
this.resetStream().catch((err: unknown) =>
|
|
349
|
+
this.onInternalError(
|
|
350
|
+
new Error("failed to reset cache after cluster replacement", { cause: err }),
|
|
351
|
+
),
|
|
352
|
+
);
|
|
353
|
+
this.setMode(modeFor(next));
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/** Drops everything cached from the replaced cluster, then brings the stream up. */
|
|
357
|
+
private async resetStream(): Promise<void> {
|
|
358
|
+
await this.stream?.reset();
|
|
359
|
+
await this.stream?.ensure();
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/** Discards in-flight checks and wakes the loop for an immediate check. */
|
|
363
|
+
private wake(): void {
|
|
364
|
+
if (this.closed) return;
|
|
365
|
+
this.generation += 1;
|
|
366
|
+
this.attempts = 0;
|
|
367
|
+
this.brk?.reset();
|
|
368
|
+
this.notifier.notify();
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
private setMode(mode: Mode): void {
|
|
372
|
+
if (this.closed || this.mode === mode) return;
|
|
373
|
+
this.mode = mode;
|
|
374
|
+
// in-flight checks were aimed at the state the old mode ran under; their
|
|
375
|
+
// late results must not degrade the new one
|
|
376
|
+
this.generation += 1;
|
|
377
|
+
if (mode !== "checking") this.attempts = 0;
|
|
378
|
+
this.brk?.reset();
|
|
379
|
+
this.notifier.notify();
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Consumes this check's turn at re-demanding a dark stream, returning whether it gets
|
|
384
|
+
* one. A denied stream probes on a slow cadence: every probe costs an open the
|
|
385
|
+
* cluster refuses until an administrator changes the caller's policies.
|
|
386
|
+
*/
|
|
387
|
+
private takeStreamProbe(): boolean {
|
|
388
|
+
if (!this.current.details.streamDenied) return true;
|
|
389
|
+
if (this.probeCountdown > 0) {
|
|
390
|
+
this.probeCountdown -= 1;
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
this.probeCountdown = this.deniedStreamProbeAfter;
|
|
394
|
+
return true;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
private async runCheck(): Promise<void> {
|
|
398
|
+
const generation = this.generation;
|
|
399
|
+
const prevKey = this.current.details.clusterKey;
|
|
400
|
+
this.dispatch({ type: "check.started" });
|
|
401
|
+
try {
|
|
402
|
+
const info = await sendCheck(this.unary);
|
|
403
|
+
if (generation !== this.generation || this.closed) return;
|
|
404
|
+
this.attempts = 0;
|
|
405
|
+
this.dispatch({ type: "check.success", info });
|
|
406
|
+
this.warn(this.current.details);
|
|
407
|
+
const replaced = prevKey !== "" && info.clusterKey !== prevKey;
|
|
408
|
+
// reachable but the stream is still dark: re-demand it, in case its own
|
|
409
|
+
// retry budget was exhausted. Replacement already brings it up.
|
|
410
|
+
if (
|
|
411
|
+
!replaced &&
|
|
412
|
+
this.config.requiresStream &&
|
|
413
|
+
!this.current.details.streamLive &&
|
|
414
|
+
this.takeStreamProbe()
|
|
415
|
+
)
|
|
416
|
+
this.stream?.ensure().catch((err: unknown) => {
|
|
417
|
+
// the transition into denied already reported it
|
|
418
|
+
if (AccessDeniedError.matches(err)) return;
|
|
419
|
+
this.onInternalError(
|
|
420
|
+
new Error("failed to bring up change stream", { cause: err }),
|
|
421
|
+
);
|
|
422
|
+
});
|
|
423
|
+
} catch (err) {
|
|
424
|
+
if (generation !== this.generation || this.closed) return;
|
|
425
|
+
this.attempts += 1;
|
|
426
|
+
this.dispatch({
|
|
427
|
+
type: "check.failure",
|
|
428
|
+
error: errors.fromUnknown(err),
|
|
429
|
+
attempt: this.attempts,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
private async run(): Promise<void> {
|
|
435
|
+
// defer the first check so the caller can finish synchronous wiring
|
|
436
|
+
// (middleware installation) after construction
|
|
437
|
+
await Promise.resolve();
|
|
438
|
+
const brk = new breaker.Breaker({
|
|
439
|
+
...this.retry,
|
|
440
|
+
sleepFn: async (duration) => {
|
|
441
|
+
this.dispatch({
|
|
442
|
+
type: "retry.scheduled",
|
|
443
|
+
attempt: this.attempts,
|
|
444
|
+
nextAt: TimeStamp.now().add(duration),
|
|
445
|
+
});
|
|
446
|
+
await this.notifier.wait(duration);
|
|
447
|
+
},
|
|
448
|
+
});
|
|
449
|
+
this.brk = brk;
|
|
450
|
+
while (!this.closed)
|
|
451
|
+
if (this.mode === "checking") {
|
|
452
|
+
await this.runCheck();
|
|
453
|
+
if (this.closed) return;
|
|
454
|
+
if (this.mode !== "checking") continue;
|
|
455
|
+
if (await brk.wait()) continue;
|
|
456
|
+
// finite budget exhausted: park until retryNow or a mode change
|
|
457
|
+
this.dispatch({ type: "retry.exhausted" });
|
|
458
|
+
if (this.closed) return;
|
|
459
|
+
await this.notifier.wait(null);
|
|
460
|
+
brk.reset();
|
|
461
|
+
} else if (this.mode === "heartbeat") {
|
|
462
|
+
await this.notifier.wait(this.heartbeatInterval);
|
|
463
|
+
if (this.closed) return;
|
|
464
|
+
if (this.mode === "heartbeat") await this.runCheck();
|
|
465
|
+
} else await this.notifier.wait(null);
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
private warn({
|
|
469
|
+
clockSkew,
|
|
470
|
+
clockSkewExceeded,
|
|
471
|
+
clientServerCompatible,
|
|
472
|
+
clientVersion,
|
|
473
|
+
nodeVersion,
|
|
474
|
+
}: Status["details"]): void {
|
|
475
|
+
if (clockSkewExceeded) {
|
|
476
|
+
const direction = clockSkew.valueOf() > 0n ? "ahead of" : "behind";
|
|
477
|
+
console.warn(
|
|
478
|
+
`Measured excessive clock skew between this host and the Synnax Core. ` +
|
|
479
|
+
`This host is ${direction} the Synnax Core by approximately ` +
|
|
480
|
+
`${clockSkew.abs().toString()}.`,
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
if (clientServerCompatible || this.versionWarned) return;
|
|
484
|
+
this.versionWarned = true;
|
|
485
|
+
const clientIsNewer =
|
|
486
|
+
nodeVersion == null || migrate.semVerNewer(clientVersion, nodeVersion);
|
|
487
|
+
const toUpgrade = clientIsNewer ? "Core" : "client";
|
|
488
|
+
console.warn(
|
|
489
|
+
`The Synnax Core version ${nodeVersion != null ? `${nodeVersion} ` : ""}is too ` +
|
|
490
|
+
`${clientIsNewer ? "old" : "new"} for client version ${clientVersion}.\n` +
|
|
491
|
+
` This may cause compatibility issues. We recommend updating the ${toUpgrade}. For more information, see\n` +
|
|
492
|
+
` https://docs.synnaxlabs.com/reference/client/resources/troubleshooting#old-${toUpgrade.toLowerCase()}-version`,
|
|
493
|
+
);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
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 {
|
|
11
|
+
check,
|
|
12
|
+
type CheckParams,
|
|
13
|
+
Client,
|
|
14
|
+
type ClientParams,
|
|
15
|
+
type FactEvent,
|
|
16
|
+
} from "@/connection/client";
|
|
17
|
+
export {
|
|
18
|
+
type Config,
|
|
19
|
+
DEFAULT_STATUS,
|
|
20
|
+
type ErrorStatus,
|
|
21
|
+
type ErrorStatusDetails,
|
|
22
|
+
errorStatusDetailsZ,
|
|
23
|
+
type Handle,
|
|
24
|
+
type Info,
|
|
25
|
+
type NonErrorStatus,
|
|
26
|
+
nonErrorVariantZ,
|
|
27
|
+
type Reason,
|
|
28
|
+
REASONS,
|
|
29
|
+
reasonZ,
|
|
30
|
+
type Status,
|
|
31
|
+
type StatusDetails,
|
|
32
|
+
statusDetailsZ,
|
|
33
|
+
statusZ,
|
|
34
|
+
} from "@/connection/status";
|
package/src/connection/index.ts
CHANGED