@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,283 @@
|
|
|
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
|
+
// The query cache value-imports this module, so a runtime edge back into
|
|
11
|
+
// channel or ontology re-creates the import cycle this file exists to break.
|
|
12
|
+
// Runtime imports must stay on leaf modules (external packages, @/errors).
|
|
13
|
+
|
|
14
|
+
import { EOF } from "@synnaxlabs/freighter";
|
|
15
|
+
import { breaker, errors, observe, sync, TimeSpan, TimeStamp } from "@synnaxlabs/x";
|
|
16
|
+
|
|
17
|
+
import { type channel } from "@/channel";
|
|
18
|
+
import { AccessDeniedError, NotFoundError, ValidationError } from "@/errors";
|
|
19
|
+
import { type Frame } from "@/framer/frame";
|
|
20
|
+
import {
|
|
21
|
+
type Streamer,
|
|
22
|
+
type StreamerConfig,
|
|
23
|
+
type StreamOpener,
|
|
24
|
+
} from "@/framer/streamer";
|
|
25
|
+
|
|
26
|
+
type NormalizedStreamerConfig = Extract<StreamerConfig, { channels: unknown }>;
|
|
27
|
+
|
|
28
|
+
// Copies object configs: update() reassigns channels, and the caller's config must
|
|
29
|
+
// not observe that.
|
|
30
|
+
const normalizeConfig = (config: StreamerConfig): NormalizedStreamerConfig =>
|
|
31
|
+
typeof config === "object" && !Array.isArray(config) && "channels" in config
|
|
32
|
+
? { ...config }
|
|
33
|
+
: { channels: config };
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A hardened streamer that automatically reconnects on failure.
|
|
37
|
+
* This streamer wraps a regular streamer and adds automatic reconnection
|
|
38
|
+
* logic when the connection is lost or errors occur.
|
|
39
|
+
*/
|
|
40
|
+
export class HardenedStreamer implements Streamer {
|
|
41
|
+
private current: Streamer | null = null;
|
|
42
|
+
private readonly breaker: breaker.Breaker;
|
|
43
|
+
private readonly opener: StreamOpener;
|
|
44
|
+
private readonly config: NormalizedStreamerConfig;
|
|
45
|
+
private readonly onReopen?: () => void;
|
|
46
|
+
private readonly onDrop?: (error: Error) => void;
|
|
47
|
+
private readonly closeNotifier = new sync.Notifier();
|
|
48
|
+
// A stream that outlives this span proves the incident over; a shorter
|
|
49
|
+
// life keeps the reconnect backoff escalating.
|
|
50
|
+
private readonly stableAfter: TimeSpan;
|
|
51
|
+
private openedAt = TimeStamp.now();
|
|
52
|
+
private closed = false;
|
|
53
|
+
private reconnecting: Promise<void> | null = null;
|
|
54
|
+
|
|
55
|
+
constructor(
|
|
56
|
+
opener: StreamOpener,
|
|
57
|
+
config: StreamerConfig,
|
|
58
|
+
breakerConfig: breaker.Config = {},
|
|
59
|
+
onReopen?: () => void,
|
|
60
|
+
onDrop?: (error: Error) => void,
|
|
61
|
+
) {
|
|
62
|
+
this.opener = opener;
|
|
63
|
+
this.config = normalizeConfig(config);
|
|
64
|
+
const {
|
|
65
|
+
maxRetries = Infinity,
|
|
66
|
+
baseInterval = TimeSpan.seconds(1),
|
|
67
|
+
// reconnect attempts are cheap: a low cap bounds how long a returned
|
|
68
|
+
// cluster goes unnoticed while backoff is escalated
|
|
69
|
+
maxInterval = TimeSpan.seconds(5),
|
|
70
|
+
scale = 2,
|
|
71
|
+
jitter = 0.25,
|
|
72
|
+
} = breakerConfig ?? {};
|
|
73
|
+
this.breaker = new breaker.Breaker({
|
|
74
|
+
maxRetries,
|
|
75
|
+
baseInterval,
|
|
76
|
+
maxInterval,
|
|
77
|
+
scale,
|
|
78
|
+
jitter,
|
|
79
|
+
// close() interrupts a pending backoff so a retired streamer's
|
|
80
|
+
// reconnect loop ends promptly instead of sleeping through it
|
|
81
|
+
sleepFn: async (duration) => {
|
|
82
|
+
await this.closeNotifier.wait(duration);
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
this.stableAfter = new TimeSpan(maxInterval);
|
|
86
|
+
this.onReopen = onReopen;
|
|
87
|
+
this.onDrop = onDrop;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Opens a new hardened streamer with the given configuration.
|
|
92
|
+
* @param breakerConfig - Retry behavior for reconnect attempts. Defaults to retrying
|
|
93
|
+
* forever on capped, jittered exponential backoff.
|
|
94
|
+
* @param onReopen - Called after every successful reconnect (not the initial open).
|
|
95
|
+
* Frames may have been dropped between the failure and the reopen.
|
|
96
|
+
* @param onDrop - Called when the stream fails and reconnection begins.
|
|
97
|
+
* @returns A promise that resolves to a new hardened streamer
|
|
98
|
+
*/
|
|
99
|
+
static async open(
|
|
100
|
+
opener: StreamOpener,
|
|
101
|
+
config: StreamerConfig,
|
|
102
|
+
breakerConfig?: breaker.Config,
|
|
103
|
+
onReopen?: () => void,
|
|
104
|
+
onDrop?: (error: Error) => void,
|
|
105
|
+
): Promise<HardenedStreamer> {
|
|
106
|
+
const h = new HardenedStreamer(opener, config, breakerConfig, onReopen, onDrop);
|
|
107
|
+
await h.start();
|
|
108
|
+
return h;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Opens the underlying stream, retrying connectivity failures under the breaker.
|
|
113
|
+
* Call once after construction; {@link open} does both.
|
|
114
|
+
* @throws the open failure when it is not retriable or the breaker is exhausted.
|
|
115
|
+
*/
|
|
116
|
+
async start(): Promise<void> {
|
|
117
|
+
await this.runStreamer(false);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private async runStreamer(notifyReopen: boolean = true): Promise<void> {
|
|
121
|
+
// A long-lived stream that dropped is a fresh incident: reconnect immediately. A
|
|
122
|
+
// short-lived one is a failing cycle (e.g. a server that accepts streams and
|
|
123
|
+
// instantly ends them): keep backing off, or the loop dials hot.
|
|
124
|
+
if (notifyReopen)
|
|
125
|
+
if (TimeStamp.since(this.openedAt).greaterThan(this.stableAfter))
|
|
126
|
+
this.breaker.reset();
|
|
127
|
+
else if (!(await this.breaker.wait())) throw new EOF();
|
|
128
|
+
while (!this.closed)
|
|
129
|
+
try {
|
|
130
|
+
if (this.current != null) this.current.close();
|
|
131
|
+
this.current = null;
|
|
132
|
+
const next = await this.opener(this.config);
|
|
133
|
+
// closed while the open was in flight: the fresh stream is already
|
|
134
|
+
// retired and must not be handed to callers
|
|
135
|
+
if (this.closed) {
|
|
136
|
+
next.close();
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
this.current = next;
|
|
140
|
+
this.openedAt = TimeStamp.now();
|
|
141
|
+
if (notifyReopen) this.onReopen?.();
|
|
142
|
+
return;
|
|
143
|
+
} catch (e) {
|
|
144
|
+
this.current = null;
|
|
145
|
+
if (this.closed) break;
|
|
146
|
+
const err = errors.fromUnknown(e);
|
|
147
|
+
// Retrying only fixes connectivity; a definitive rejection recurs on every
|
|
148
|
+
// attempt. Expired and invalid tokens are not definitive: the auth
|
|
149
|
+
// middleware refreshes them, and a later attempt gets a fresh budget.
|
|
150
|
+
if (
|
|
151
|
+
AccessDeniedError.matches(err) ||
|
|
152
|
+
ValidationError.matches(err) ||
|
|
153
|
+
NotFoundError.matches(err)
|
|
154
|
+
)
|
|
155
|
+
throw err;
|
|
156
|
+
if (!(await this.breaker.wait())) throw err;
|
|
157
|
+
// close() interrupts the backoff above, so re-check: a retired
|
|
158
|
+
// streamer's failed reconnect is expected, not a fault to report.
|
|
159
|
+
if (this.closed) break;
|
|
160
|
+
console.error("failed to open streamer", e);
|
|
161
|
+
}
|
|
162
|
+
throw new EOF();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private get wrapped(): Streamer {
|
|
166
|
+
if (this.current == null) throw new Error("stream closed");
|
|
167
|
+
return this.current;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// A failure during an in-flight reconnect joins it; a second run would open a
|
|
171
|
+
// competing stream and leak the loser.
|
|
172
|
+
private async reconnect(error: Error): Promise<void> {
|
|
173
|
+
if (this.reconnecting == null) {
|
|
174
|
+
this.onDrop?.(error);
|
|
175
|
+
this.reconnecting = this.runStreamer().finally(() => {
|
|
176
|
+
this.reconnecting = null;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
await this.reconnecting;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
async update(channels: channel.Params): Promise<void> {
|
|
183
|
+
if (this.closed) throw new EOF();
|
|
184
|
+
this.config.channels = channels;
|
|
185
|
+
try {
|
|
186
|
+
await this.wrapped.update(channels);
|
|
187
|
+
} catch (e) {
|
|
188
|
+
if (this.closed || EOF.matches(e)) throw errors.fromUnknown(e);
|
|
189
|
+
await this.reconnect(errors.fromUnknown(e));
|
|
190
|
+
return await this.update(channels);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
async next(): Promise<IteratorResult<Frame>> {
|
|
195
|
+
try {
|
|
196
|
+
return { done: false, value: await this.read() };
|
|
197
|
+
} catch (e) {
|
|
198
|
+
if (EOF.matches(e)) return { done: true, value: undefined };
|
|
199
|
+
throw errors.fromUnknown(e);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async read(): Promise<Frame> {
|
|
204
|
+
if (this.closed) throw new EOF();
|
|
205
|
+
try {
|
|
206
|
+
return await this.wrapped.read();
|
|
207
|
+
} catch (e) {
|
|
208
|
+
if (this.closed) throw new EOF();
|
|
209
|
+
// an EOF the client did not ask for is a drop: the server ended the
|
|
210
|
+
// stream, so reconnect like any other failure
|
|
211
|
+
await this.reconnect(errors.fromUnknown(e));
|
|
212
|
+
return await this.read();
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/** Stops reconnecting and closes the stream. Idempotent; never throws. */
|
|
217
|
+
close(): void {
|
|
218
|
+
if (this.closed) return;
|
|
219
|
+
this.closed = true;
|
|
220
|
+
this.closeNotifier.notify();
|
|
221
|
+
this.current?.close();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
get keys(): channel.Key[] {
|
|
225
|
+
return this.wrapped.keys;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
[Symbol.asyncIterator](): AsyncIterator<Frame> {
|
|
229
|
+
return this;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Wraps a standard streamer to implement an observable interface for handling changes
|
|
235
|
+
* to channel values through an onChange handler.
|
|
236
|
+
*/
|
|
237
|
+
export class ObservableStreamer<V = Frame>
|
|
238
|
+
extends observe.Observer<Frame, V>
|
|
239
|
+
implements observe.ObservableAsyncCloseable<V>
|
|
240
|
+
{
|
|
241
|
+
private readonly streamer: Streamer;
|
|
242
|
+
private readonly closePromise: Promise<void>;
|
|
243
|
+
private readonly onDead?: (error: Error) => void;
|
|
244
|
+
private closeRequested = false;
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Creates a new observable streamer.
|
|
248
|
+
* @param transform - An optional transform function to apply to each frame
|
|
249
|
+
* @param onDead - Called when the stream ends on a failure the wrapped streamer will
|
|
250
|
+
* not recover from. No frames follow.
|
|
251
|
+
*/
|
|
252
|
+
constructor(
|
|
253
|
+
streamer: Streamer,
|
|
254
|
+
transform?: observe.Transform<Frame, V>,
|
|
255
|
+
onDead?: (error: Error) => void,
|
|
256
|
+
) {
|
|
257
|
+
super(transform);
|
|
258
|
+
this.streamer = streamer;
|
|
259
|
+
this.onDead = onDead;
|
|
260
|
+
// Nothing awaits closePromise until close(), so a failure would go unhandled.
|
|
261
|
+
this.closePromise = this.stream().catch(console.error);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
async update(channels: channel.Params): Promise<void> {
|
|
265
|
+
await this.streamer.update(channels);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async close(): Promise<void> {
|
|
269
|
+
this.closeRequested = true;
|
|
270
|
+
this.streamer.close();
|
|
271
|
+
await this.closePromise;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
private async stream(): Promise<void> {
|
|
275
|
+
try {
|
|
276
|
+
for await (const frame of this.streamer) this.notify(frame);
|
|
277
|
+
} catch (exc) {
|
|
278
|
+
this.onDead?.(errors.fromUnknown(exc));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
if (!this.closeRequested) this.onDead?.(new EOF());
|
|
282
|
+
}
|
|
283
|
+
}
|
package/src/framer/iterator.ts
CHANGED
|
@@ -19,13 +19,15 @@ import {
|
|
|
19
19
|
} from "@synnaxlabs/x";
|
|
20
20
|
import { z } from "zod";
|
|
21
21
|
|
|
22
|
-
import { channel } from "@/channel";
|
|
23
|
-
import {
|
|
22
|
+
import { type channel } from "@/channel";
|
|
23
|
+
import { keyZ } from "@/channel/types.gen";
|
|
24
|
+
import { type ChannelRetriever, ReadAdapter } from "@/framer/adapter";
|
|
24
25
|
import { WSIteratorCodec } from "@/framer/codec";
|
|
25
26
|
import { Frame, frameZ } from "@/framer/frame";
|
|
26
27
|
import { StreamProxy } from "@/framer/streamProxy";
|
|
27
28
|
import { IteratorCommand, IteratorResponseVariant } from "@/framer/types.gen";
|
|
28
29
|
|
|
30
|
+
/** Span that makes an iterator step by its chunk size instead of a fixed duration. */
|
|
29
31
|
export const AUTO_SPAN = new TimeSpan(-1);
|
|
30
32
|
|
|
31
33
|
export const iteratorReqZ = z.object({
|
|
@@ -33,7 +35,7 @@ export const iteratorReqZ = z.object({
|
|
|
33
35
|
span: TimeSpan.z.optional(),
|
|
34
36
|
bounds: TimeRange.z.optional(),
|
|
35
37
|
stamp: TimeStamp.z.optional(),
|
|
36
|
-
keys:
|
|
38
|
+
keys: keyZ.array().optional(),
|
|
37
39
|
chunkSize: z.number().optional(),
|
|
38
40
|
downsampleFactor: z.int().optional(),
|
|
39
41
|
});
|
|
@@ -50,6 +52,7 @@ export const iteratorResZ = z.object({
|
|
|
50
52
|
|
|
51
53
|
export interface IteratorResponse extends z.infer<typeof iteratorResZ> {}
|
|
52
54
|
|
|
55
|
+
/** Config for an iterator. Pass it to `client.telem.openIterator`. */
|
|
53
56
|
export interface IteratorConfig {
|
|
54
57
|
/** chunkSize is the maximum number of samples contained per channel in the frame
|
|
55
58
|
* resulting from a call to next with {@link AUTO_SPAN}.
|
|
@@ -63,12 +66,9 @@ export interface IteratorConfig {
|
|
|
63
66
|
}
|
|
64
67
|
|
|
65
68
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* Using an iterator is ideal when querying/processing large ranges of data, but
|
|
70
|
-
* is relatively complex and difficult to use. If you're looking to retrieve
|
|
71
|
-
* telemetry between two timestamps, see the SegmentClient.read method.
|
|
69
|
+
* Iterates over a cluster's telemetry in time order. Open one through the segment
|
|
70
|
+
* client, never directly. Suited to large ranges; to read between two timestamps, use
|
|
71
|
+
* the segment client's read method instead.
|
|
72
72
|
*/
|
|
73
73
|
export class Iterator {
|
|
74
74
|
private readonly stream: StreamProxy<typeof iteratorReqZ, typeof iteratorResZ>;
|
|
@@ -85,24 +85,20 @@ export class Iterator {
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
|
-
* Opens the iterator, configuring it to iterate over the telemetry in the
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
* @param tr - The time range to iterate over.
|
|
92
|
-
* @param channels - The channels for the iterator to iterate over (can be provided
|
|
93
|
-
* in keys or names).
|
|
94
|
-
* @param retriever - Retriever used to retrieve channel keys from names.
|
|
88
|
+
* Opens the iterator, configuring it to iterate over the telemetry in the channels
|
|
89
|
+
* with the given keys within the provided time range.
|
|
90
|
+
* @param retrieveChannels - Resolves channel names to keys and data types.
|
|
95
91
|
* @param client - The stream client allowing streaming of iterated data.
|
|
96
92
|
* @param opts - See {@link IteratorConfig}.
|
|
97
93
|
*/
|
|
98
94
|
static async _open(
|
|
99
95
|
tr: CrudeTimeRange,
|
|
100
96
|
channels: channel.Params,
|
|
101
|
-
|
|
97
|
+
retrieveChannels: ChannelRetriever,
|
|
102
98
|
client: WebSocketClient,
|
|
103
99
|
opts: IteratorConfig = {},
|
|
104
100
|
): Promise<Iterator> {
|
|
105
|
-
const adapter = await ReadAdapter.open(
|
|
101
|
+
const adapter = await ReadAdapter.open(retrieveChannels, channels);
|
|
106
102
|
client = client.withCodec(new WSIteratorCodec(adapter.codec));
|
|
107
103
|
const stream = await client.stream("/frame/iterate", iteratorReqZ, iteratorResZ);
|
|
108
104
|
const iter = new Iterator(stream, adapter);
|
|
@@ -118,14 +114,12 @@ export class Iterator {
|
|
|
118
114
|
|
|
119
115
|
/**
|
|
120
116
|
* Reads the next time span of telemetry for each channel in the iterator.
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
126
|
-
*
|
|
127
|
-
* @returns false if a segment satisfying the request can't be found for a
|
|
128
|
-
* particular channel or the iterator has accumulated an error.
|
|
117
|
+
* @param span - The time span to read. A negative span is equivalent to calling prev
|
|
118
|
+
* with the absolute value of the span. If the span is AUTO_SPAN, the iterator will
|
|
119
|
+
* automatically determine the span to read. This is useful for iterating over an
|
|
120
|
+
* entire range efficiently.
|
|
121
|
+
* @returns false if a segment satisfying the request can't be found for a particular
|
|
122
|
+
* channel or the iterator has accumulated an error.
|
|
129
123
|
*/
|
|
130
124
|
async next(span: CrudeTimeSpan = AUTO_SPAN): Promise<boolean> {
|
|
131
125
|
return await this.execute({
|
|
@@ -136,12 +130,10 @@ export class Iterator {
|
|
|
136
130
|
|
|
137
131
|
/**
|
|
138
132
|
* Reads the previous time span of telemetry for each channel in the iterator.
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
* This is useful for iterating over an entire range efficiently.
|
|
144
|
-
*
|
|
133
|
+
* @param span - The time span to read. A negative span is equivalent to calling next
|
|
134
|
+
* with the absolute value of the span. If the span is AUTO_SPAN, the iterator will
|
|
135
|
+
* automatically determine the span to read. This is useful for iterating over an
|
|
136
|
+
* entire range efficiently.
|
|
145
137
|
* @returns false if a segment satisfying the request can't be found for a particular
|
|
146
138
|
* channel or the iterator has accumulated an error.
|
|
147
139
|
*/
|
|
@@ -153,10 +145,9 @@ export class Iterator {
|
|
|
153
145
|
}
|
|
154
146
|
|
|
155
147
|
/**
|
|
156
|
-
* Seeks the iterator to the first segment in the time range, but does not read
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
*
|
|
148
|
+
* Seeks the iterator to the first segment in the time range, but does not read it.
|
|
149
|
+
* Also invalidates the iterator. The iterator will not be considered valid until a
|
|
150
|
+
* call to next or prev.
|
|
160
151
|
* @returns false if the iterator is not pointing to a valid segment for a particular
|
|
161
152
|
* channel or has accumulated an error.
|
|
162
153
|
*/
|
|
@@ -176,10 +167,9 @@ export class Iterator {
|
|
|
176
167
|
}
|
|
177
168
|
|
|
178
169
|
/**
|
|
179
|
-
* Seeks the iterator to the first segment whose start is less than or equal to
|
|
180
|
-
*
|
|
170
|
+
* Seeks the iterator to the first segment whose start is less than or equal to the
|
|
171
|
+
* provided timestamp. Also invalidates the iterator. The iterator will not be
|
|
181
172
|
* considered valid until a call to next or prev.
|
|
182
|
-
*
|
|
183
173
|
* @returns false if the iterator is not pointing to a valid segment for a particular
|
|
184
174
|
* channel or has accumulated an error.
|
|
185
175
|
*/
|
|
@@ -191,10 +181,9 @@ export class Iterator {
|
|
|
191
181
|
}
|
|
192
182
|
|
|
193
183
|
/**
|
|
194
|
-
* Seeks the iterator to the first segment whose start is greater than or equal to
|
|
195
|
-
*
|
|
184
|
+
* Seeks the iterator to the first segment whose start is greater than or equal to the
|
|
185
|
+
* provided timestamp. Also invalidates the iterator. The iterator will not be
|
|
196
186
|
* considered valid until a call to next or prev.
|
|
197
|
-
*
|
|
198
187
|
* @returns false if the iterator is not pointing to a valid segment for a particular
|
|
199
188
|
* channel or has accumulated an error.
|
|
200
189
|
*/
|
package/src/framer/reader.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { type CrudeTimeRange, csv, runtime } from "@synnaxlabs/x";
|
|
|
12
12
|
|
|
13
13
|
import { type channel } from "@/channel";
|
|
14
14
|
import { UnexpectedError } from "@/errors";
|
|
15
|
+
import { type ChannelRetriever } from "@/framer/adapter";
|
|
15
16
|
import { type Frame } from "@/framer/frame";
|
|
16
17
|
import { Iterator, type IteratorConfig } from "@/framer/iterator";
|
|
17
18
|
|
|
@@ -24,11 +25,11 @@ export interface ReadRequest {
|
|
|
24
25
|
}
|
|
25
26
|
|
|
26
27
|
export class Reader {
|
|
27
|
-
private readonly
|
|
28
|
+
private readonly retrieveChannels: ChannelRetriever;
|
|
28
29
|
private readonly streamClient: WebSocketClient;
|
|
29
30
|
|
|
30
|
-
constructor(
|
|
31
|
-
this.
|
|
31
|
+
constructor(retrieveChannels: ChannelRetriever, streamClient: WebSocketClient) {
|
|
32
|
+
this.retrieveChannels = retrieveChannels;
|
|
32
33
|
this.streamClient = streamClient;
|
|
33
34
|
}
|
|
34
35
|
|
|
@@ -39,23 +40,23 @@ export class Reader {
|
|
|
39
40
|
channelNames,
|
|
40
41
|
iteratorConfig,
|
|
41
42
|
} = request;
|
|
42
|
-
const channelPayloads = await this.
|
|
43
|
+
const channelPayloads = await this.retrieveChannels(channelParams);
|
|
43
44
|
const allKeys = new Set<channel.Key>();
|
|
45
|
+
const payloadKeys = new Set<channel.Key>();
|
|
44
46
|
channelPayloads.forEach((ch) => {
|
|
45
47
|
allKeys.add(ch.key);
|
|
48
|
+
payloadKeys.add(ch.key);
|
|
46
49
|
if (ch.index !== 0) allKeys.add(ch.index);
|
|
47
50
|
});
|
|
48
|
-
const missingIndexKeys =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (missingIndexKeys.length > 0) {
|
|
52
|
-
const indexChannels = await this.retriever.retrieve(missingIndexKeys);
|
|
51
|
+
const missingIndexKeys = allKeys.difference(payloadKeys);
|
|
52
|
+
if (missingIndexKeys.size > 0) {
|
|
53
|
+
const indexChannels = await this.retrieveChannels(Array.from(missingIndexKeys));
|
|
53
54
|
channelPayloads.push(...indexChannels);
|
|
54
55
|
}
|
|
55
56
|
const iterator = await Iterator._open(
|
|
56
57
|
timeRange,
|
|
57
58
|
Array.from(allKeys),
|
|
58
|
-
this.
|
|
59
|
+
this.retrieveChannels,
|
|
59
60
|
this.streamClient,
|
|
60
61
|
iteratorConfig,
|
|
61
62
|
);
|
|
@@ -172,7 +173,6 @@ const createCSVReadableStream = ({
|
|
|
172
173
|
if (remainingPending === 0 || stagedRecords.length === 0) {
|
|
173
174
|
const hasMore = await iterator.next();
|
|
174
175
|
if (!hasMore) {
|
|
175
|
-
// Flush remaining records
|
|
176
176
|
const finalRows = buildCSVRows(Infinity, true);
|
|
177
177
|
if (finalRows.length > 0)
|
|
178
178
|
controller.enqueue(
|