@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,391 @@
|
|
|
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 { alamos } from "@synnaxlabs/alamos";
|
|
11
|
+
import {
|
|
12
|
+
array,
|
|
13
|
+
breaker,
|
|
14
|
+
type CrudeTimeSpan,
|
|
15
|
+
type destructor,
|
|
16
|
+
MultiSeries,
|
|
17
|
+
Rate,
|
|
18
|
+
type Series,
|
|
19
|
+
sync,
|
|
20
|
+
TimeSpan,
|
|
21
|
+
} from "@synnaxlabs/x";
|
|
22
|
+
|
|
23
|
+
import { type channel } from "@/channel";
|
|
24
|
+
import { UnexpectedError } from "@/errors";
|
|
25
|
+
import { type Cache } from "@/framer/cache/cache";
|
|
26
|
+
import { type Streamer, type StreamerConfig } from "@/framer/streamer";
|
|
27
|
+
import { status } from "@/status";
|
|
28
|
+
|
|
29
|
+
/** Stream lifecycle hooks the streamer uses to track connection health. */
|
|
30
|
+
export interface StreamHooks {
|
|
31
|
+
/** Called after every successful reconnect of the underlying stream. */
|
|
32
|
+
onReopen: () => void;
|
|
33
|
+
/** Called when the underlying stream fails and reconnection begins. */
|
|
34
|
+
onDrop: (error: Error) => void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Opens the underlying frame stream, hardened against connection loss. */
|
|
38
|
+
export interface HardenedOpener {
|
|
39
|
+
(config: StreamerConfig, hooks: StreamHooks): Promise<Streamer>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Receives every channel that changed on the shared stream, which may include
|
|
44
|
+
* keys the handler did not subscribe to.
|
|
45
|
+
*/
|
|
46
|
+
export type StreamHandler = (data: Map<channel.Key, MultiSeries>) => void;
|
|
47
|
+
|
|
48
|
+
/** Receives per-key data-plane status transitions for subscribed channels. */
|
|
49
|
+
export type StatusHandler = (key: channel.Key, status: status.Status) => void;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A durable handle on streaming demand. Closing it releases the demand; until then
|
|
53
|
+
* the streamer owns converging the underlying stream to it.
|
|
54
|
+
*/
|
|
55
|
+
export interface Subscription {
|
|
56
|
+
/** Releases the subscription's demand. */
|
|
57
|
+
close: () => void;
|
|
58
|
+
/** @returns the current data-plane status for the given key. */
|
|
59
|
+
status: (key: channel.Key) => status.Status;
|
|
60
|
+
/** Registers a handler for status transitions on the subscription's keys. */
|
|
61
|
+
onStatusChange: (handler: StatusHandler) => destructor.Destructor;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
interface Entry {
|
|
65
|
+
handler: StreamHandler;
|
|
66
|
+
keys: Set<channel.Key>;
|
|
67
|
+
statusHandlers: Set<StatusHandler>;
|
|
68
|
+
removed: boolean;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface MultiplexedStreamerProps {
|
|
72
|
+
cache: Cache;
|
|
73
|
+
openStreamer: HardenedOpener;
|
|
74
|
+
instrumentation?: alamos.Instrumentation;
|
|
75
|
+
/**
|
|
76
|
+
* How long a closed subscription's keys stay on the stream, damping churn from
|
|
77
|
+
* rapid unsubscribe and resubscribe cycles.
|
|
78
|
+
* @default TimeSpan.seconds(5)
|
|
79
|
+
*/
|
|
80
|
+
removalDelay?: CrudeTimeSpan;
|
|
81
|
+
/** Retry behavior for stream open and update failures. */
|
|
82
|
+
breaker?: breaker.Config;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Coalesces rapid demand changes into one stream update. The timer is not reset by
|
|
86
|
+
// later calls, so sustained subscribing cannot starve the update.
|
|
87
|
+
const RECONCILE_DELAY = TimeSpan.milliseconds(100);
|
|
88
|
+
|
|
89
|
+
const THROTTLE_RATE = Rate.hz(60).valueOf();
|
|
90
|
+
|
|
91
|
+
const LOADING: status.Crude = { variant: "loading", message: "subscribing" };
|
|
92
|
+
const STREAMING: status.Crude = { variant: "success", message: "streaming" };
|
|
93
|
+
const RECONNECTING: status.Crude = { variant: "warning", message: "reconnecting" };
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Multiplexes durable subscriptions onto one shared frame stream. Demand
|
|
97
|
+
* registration is synchronous and cannot fail per key; all convergence work
|
|
98
|
+
* surfaces as per-key statuses instead of thrown errors.
|
|
99
|
+
*/
|
|
100
|
+
export class MultiplexedStreamer {
|
|
101
|
+
private readonly props: Required<
|
|
102
|
+
Omit<MultiplexedStreamerProps, "removalDelay" | "breaker">
|
|
103
|
+
> & {
|
|
104
|
+
removalDelay: TimeSpan;
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Serializes stream open, update, and close against each other. Never held while
|
|
108
|
+
// waiting on retry backoff so close() stays prompt.
|
|
109
|
+
private readonly connMu = sync.newMutex({ closed: false });
|
|
110
|
+
private readonly breaker: breaker.Breaker;
|
|
111
|
+
private readonly entries = new Set<Entry>();
|
|
112
|
+
private readonly statuses = new Map<channel.Key, status.Status>();
|
|
113
|
+
private reconcileTimer: ReturnType<typeof setTimeout> | null = null;
|
|
114
|
+
private readonly removalTimers = new Set<ReturnType<typeof setTimeout>>();
|
|
115
|
+
private runLoop: Promise<void> | null = null;
|
|
116
|
+
private streamer: Streamer | null = null;
|
|
117
|
+
// The key set last accepted by the stream. Kept separately from the streamer so a
|
|
118
|
+
// mid-reconnect streamer cannot be consulted for it.
|
|
119
|
+
private sentKeys = new Set<channel.Key>();
|
|
120
|
+
|
|
121
|
+
constructor(props: MultiplexedStreamerProps) {
|
|
122
|
+
const {
|
|
123
|
+
cache,
|
|
124
|
+
openStreamer,
|
|
125
|
+
instrumentation = alamos.NOOP,
|
|
126
|
+
removalDelay = TimeSpan.seconds(5),
|
|
127
|
+
} = props;
|
|
128
|
+
this.props = {
|
|
129
|
+
instrumentation,
|
|
130
|
+
cache,
|
|
131
|
+
openStreamer,
|
|
132
|
+
removalDelay: new TimeSpan(removalDelay),
|
|
133
|
+
};
|
|
134
|
+
const {
|
|
135
|
+
maxRetries = Infinity,
|
|
136
|
+
baseInterval = TimeSpan.milliseconds(250),
|
|
137
|
+
maxInterval = TimeSpan.seconds(5),
|
|
138
|
+
scale = 2,
|
|
139
|
+
jitter = 0.25,
|
|
140
|
+
} = props.breaker ?? {};
|
|
141
|
+
this.breaker = new breaker.Breaker({
|
|
142
|
+
maxRetries,
|
|
143
|
+
baseInterval,
|
|
144
|
+
maxInterval,
|
|
145
|
+
scale,
|
|
146
|
+
jitter,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Registers demand for the given keys. Registration is synchronous: the handler
|
|
152
|
+
* is called with any existing leading buffers, and the stream converges to the
|
|
153
|
+
* new demand in the background.
|
|
154
|
+
* @throws {UnexpectedError} if the streamer has been closed.
|
|
155
|
+
*/
|
|
156
|
+
stream(handler: StreamHandler, keys: channel.Key[]): Subscription {
|
|
157
|
+
if (this.connMu.closed)
|
|
158
|
+
throw new UnexpectedError("stream() called on a closed telemetry streamer");
|
|
159
|
+
const { cache, instrumentation: ins } = this.props;
|
|
160
|
+
ins.L.debug("adding stream handler", { keys });
|
|
161
|
+
// Deliver existing buffers before registration so a throwing handler leaves no
|
|
162
|
+
// demand behind.
|
|
163
|
+
const initial: Map<channel.Key, MultiSeries> = new Map(
|
|
164
|
+
keys.map((key) => [
|
|
165
|
+
key,
|
|
166
|
+
new MultiSeries(array.toArray<Series>(cache.get(key).leadingBuffer)),
|
|
167
|
+
]),
|
|
168
|
+
);
|
|
169
|
+
handler(initial);
|
|
170
|
+
const entry: Entry = {
|
|
171
|
+
handler,
|
|
172
|
+
keys: new Set(keys),
|
|
173
|
+
statusHandlers: new Set(),
|
|
174
|
+
removed: false,
|
|
175
|
+
};
|
|
176
|
+
this.entries.add(entry);
|
|
177
|
+
keys.forEach((key) => {
|
|
178
|
+
if (!this.statuses.has(key)) this.statuses.set(key, status.create(LOADING));
|
|
179
|
+
});
|
|
180
|
+
this.scheduleReconcile();
|
|
181
|
+
return {
|
|
182
|
+
close: () => this.remove(entry),
|
|
183
|
+
status: (key) => this.statuses.get(key) ?? status.create(LOADING),
|
|
184
|
+
onStatusChange: (statusHandler) => {
|
|
185
|
+
entry.statusHandlers.add(statusHandler);
|
|
186
|
+
return () => entry.statusHandlers.delete(statusHandler);
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
async close(): Promise<void> {
|
|
192
|
+
const { instrumentation: ins } = this.props;
|
|
193
|
+
if (this.reconcileTimer != null) clearTimeout(this.reconcileTimer);
|
|
194
|
+
this.reconcileTimer = null;
|
|
195
|
+
this.removalTimers.forEach(clearTimeout);
|
|
196
|
+
this.removalTimers.clear();
|
|
197
|
+
await this.connMu.runExclusive(async () => {
|
|
198
|
+
this.connMu.closed = true;
|
|
199
|
+
try {
|
|
200
|
+
await this.releaseStream();
|
|
201
|
+
} catch (e) {
|
|
202
|
+
ins.L.error("failed to close streamer", { error: e });
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
private async releaseStream(): Promise<void> {
|
|
208
|
+
const prev = this.streamer;
|
|
209
|
+
const prevLoop = this.runLoop;
|
|
210
|
+
this.streamer = null;
|
|
211
|
+
this.runLoop = null;
|
|
212
|
+
prev?.close();
|
|
213
|
+
if (prevLoop != null) await prevLoop;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
private remove(entry: Entry): void {
|
|
217
|
+
entry.removed = true;
|
|
218
|
+
const timer = setTimeout(() => {
|
|
219
|
+
this.removalTimers.delete(timer);
|
|
220
|
+
this.entries.delete(entry);
|
|
221
|
+
this.scheduleReconcile();
|
|
222
|
+
}, this.props.removalDelay.milliseconds);
|
|
223
|
+
this.removalTimers.add(timer);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private scheduleReconcile(delay: TimeSpan = RECONCILE_DELAY): void {
|
|
227
|
+
if (this.connMu.closed || this.reconcileTimer != null) return;
|
|
228
|
+
this.reconcileTimer = setTimeout(() => {
|
|
229
|
+
this.reconcileTimer = null;
|
|
230
|
+
void this.reconcile();
|
|
231
|
+
}, delay.milliseconds);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** @returns the union of keys across all entries, including those pending
|
|
235
|
+
* removal, so the stream lags demand only by the removal delay. */
|
|
236
|
+
private desiredKeys(): Set<channel.Key> {
|
|
237
|
+
const keys = new Set<channel.Key>();
|
|
238
|
+
this.entries.forEach((e) => e.keys.forEach((k) => keys.add(k)));
|
|
239
|
+
return keys;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
private setStatus(key: channel.Key, crude: status.Crude): void {
|
|
243
|
+
const prev = this.statuses.get(key);
|
|
244
|
+
if (prev?.variant === crude.variant && prev?.message === crude.message) return;
|
|
245
|
+
const next = status.create(crude);
|
|
246
|
+
this.statuses.set(key, next);
|
|
247
|
+
this.entries.forEach((e) => {
|
|
248
|
+
if (e.removed || !e.keys.has(key)) return;
|
|
249
|
+
e.statusHandlers.forEach((handler) => {
|
|
250
|
+
try {
|
|
251
|
+
handler(key, next);
|
|
252
|
+
} catch (err) {
|
|
253
|
+
this.props.instrumentation.L.error(
|
|
254
|
+
"status handler failed",
|
|
255
|
+
{ error: err },
|
|
256
|
+
true,
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// A flushed buffer stops claiming live coverage, so reads refetch the span the
|
|
264
|
+
// stream will not deliver.
|
|
265
|
+
private flushBuffers(keys: Iterable<channel.Key>): void {
|
|
266
|
+
const { cache } = this.props;
|
|
267
|
+
for (const key of keys) cache.get(key).flushDynamic();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private async reconcile(): Promise<void> {
|
|
271
|
+
const { instrumentation: ins } = this.props;
|
|
272
|
+
let retry = false;
|
|
273
|
+
await this.connMu.runExclusive(async () => {
|
|
274
|
+
if (this.connMu.closed) return;
|
|
275
|
+
const desired = this.desiredKeys();
|
|
276
|
+
try {
|
|
277
|
+
if (desired.size === 0) {
|
|
278
|
+
const removed = this.sentKeys;
|
|
279
|
+
this.sentKeys = new Set();
|
|
280
|
+
this.statuses.clear();
|
|
281
|
+
await this.releaseStream();
|
|
282
|
+
this.flushBuffers(removed);
|
|
283
|
+
this.breaker.reset();
|
|
284
|
+
ins.L.info("streamer closed, no keys to stream");
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (
|
|
288
|
+
this.streamer != null &&
|
|
289
|
+
desired.size === this.sentKeys.size &&
|
|
290
|
+
desired.isSubsetOf(this.sentKeys)
|
|
291
|
+
)
|
|
292
|
+
return;
|
|
293
|
+
const arrKeys = Array.from(desired);
|
|
294
|
+
const fresh = arrKeys.filter((k) => !this.sentKeys.has(k));
|
|
295
|
+
const removed = Array.from(this.sentKeys).filter((k) => !desired.has(k));
|
|
296
|
+
if (this.streamer == null) {
|
|
297
|
+
ins.L.info("creating new streamer", { keys: arrKeys });
|
|
298
|
+
const streamer = await this.props.openStreamer(
|
|
299
|
+
{ channels: arrKeys, throttleRate: THROTTLE_RATE },
|
|
300
|
+
{
|
|
301
|
+
onReopen: () =>
|
|
302
|
+
this.sentKeys.forEach((key) => this.setStatus(key, STREAMING)),
|
|
303
|
+
// Frames may drop until the reopen, so the buffers' live-coverage
|
|
304
|
+
// claims end here.
|
|
305
|
+
onDrop: () => {
|
|
306
|
+
this.flushBuffers(this.sentKeys);
|
|
307
|
+
this.sentKeys.forEach((key) => this.setStatus(key, RECONNECTING));
|
|
308
|
+
},
|
|
309
|
+
},
|
|
310
|
+
);
|
|
311
|
+
this.streamer = streamer;
|
|
312
|
+
this.runLoop = this.run(streamer);
|
|
313
|
+
} else {
|
|
314
|
+
ins.L.debug("updating streamer", () => ({
|
|
315
|
+
prev: Array.from(this.sentKeys),
|
|
316
|
+
next: arrKeys,
|
|
317
|
+
}));
|
|
318
|
+
await this.streamer.update(arrKeys);
|
|
319
|
+
}
|
|
320
|
+
this.sentKeys = desired;
|
|
321
|
+
this.flushBuffers(removed);
|
|
322
|
+
// Existing keys keep their status so a demand change cannot clear a per-key
|
|
323
|
+
// error.
|
|
324
|
+
fresh.forEach((key) => this.setStatus(key, STREAMING));
|
|
325
|
+
this.statuses.forEach((_, key) => {
|
|
326
|
+
if (!desired.has(key)) this.statuses.delete(key);
|
|
327
|
+
});
|
|
328
|
+
this.breaker.reset();
|
|
329
|
+
} catch (e) {
|
|
330
|
+
ins.L.error("failed to update streamer", { error: e });
|
|
331
|
+
const failure = status.fromException(e, "failed to stream channel");
|
|
332
|
+
desired.forEach((key) => {
|
|
333
|
+
if (!this.sentKeys.has(key)) this.setStatus(key, failure);
|
|
334
|
+
});
|
|
335
|
+
retry = true;
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
if (!retry || this.connMu.closed) return;
|
|
339
|
+
if (await this.breaker.wait()) this.scheduleReconcile(TimeSpan.ZERO);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
private async run(streamer: Streamer): Promise<void> {
|
|
343
|
+
const { cache, instrumentation: ins } = this.props;
|
|
344
|
+
try {
|
|
345
|
+
for await (const frame of streamer) {
|
|
346
|
+
// Group series by key in one pass; per-key get() scans the whole frame.
|
|
347
|
+
const grouped: Map<channel.Key, Series[]> = new Map();
|
|
348
|
+
frame.forEach((k, s) => {
|
|
349
|
+
const key = k as channel.Key;
|
|
350
|
+
const existing = grouped.get(key);
|
|
351
|
+
if (existing == null) grouped.set(key, [s]);
|
|
352
|
+
else existing.push(s);
|
|
353
|
+
});
|
|
354
|
+
const changed: Map<channel.Key, MultiSeries> = new Map();
|
|
355
|
+
const demanded = this.desiredKeys();
|
|
356
|
+
grouped.forEach((series, k) => {
|
|
357
|
+
try {
|
|
358
|
+
const unary = cache.get(k);
|
|
359
|
+
changed.set(k, unary.writeDynamic(new MultiSeries(series)));
|
|
360
|
+
// A frame for a key with no remaining demand arrived behind the
|
|
361
|
+
// stream update; its buffer must not claim live coverage.
|
|
362
|
+
if (!demanded.has(k)) unary.flushDynamic();
|
|
363
|
+
this.setStatus(k, STREAMING);
|
|
364
|
+
} catch (e) {
|
|
365
|
+
this.setStatus(k, status.fromException(e, "failed to buffer channel"));
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
if (changed.size !== 0)
|
|
369
|
+
this.entries.forEach((e) => {
|
|
370
|
+
if (e.removed) return;
|
|
371
|
+
try {
|
|
372
|
+
e.handler(changed);
|
|
373
|
+
} catch (err) {
|
|
374
|
+
ins.L.error("stream handler failed", { error: err }, true);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
} catch (e) {
|
|
379
|
+
ins.L.error("streamer run loop failed", { error: e }, true);
|
|
380
|
+
} finally {
|
|
381
|
+
// A loop that ends while demand remains is an outage, not a shutdown.
|
|
382
|
+
if (!this.connMu.closed && this.streamer === streamer) {
|
|
383
|
+
this.streamer = null;
|
|
384
|
+
this.runLoop = null;
|
|
385
|
+
this.flushBuffers(this.sentKeys);
|
|
386
|
+
this.sentKeys = new Set();
|
|
387
|
+
this.scheduleReconcile(TimeSpan.ZERO);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
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 DataType, type math, type Series } from "@synnaxlabs/x";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Converts series into the representation the caller renders from before they enter
|
|
14
|
+
* cache buffers. Injected at construction; the cache applies it to every write.
|
|
15
|
+
*/
|
|
16
|
+
export interface Transform {
|
|
17
|
+
/** @returns the buffer data type used to hold series of the given type. */
|
|
18
|
+
resolveDataType: (dt: DataType) => DataType;
|
|
19
|
+
/**
|
|
20
|
+
* Converts the series to the resolved data type.
|
|
21
|
+
* @param offset - Subtracted from each sample before narrowing conversions to
|
|
22
|
+
* preserve precision. Omitted when the buffer anchors off the first sample.
|
|
23
|
+
*/
|
|
24
|
+
convert: (series: Series, offset?: math.Numeric) => Series;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** A transform that stores every series exactly as it arrives. */
|
|
28
|
+
export const IDENTITY_TRANSFORM: Transform = {
|
|
29
|
+
resolveDataType: (dt) => dt,
|
|
30
|
+
convert: (series) => series,
|
|
31
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
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 { MultiSeries, type Series, type TimeRange } from "@synnaxlabs/x";
|
|
11
|
+
|
|
12
|
+
import { UnexpectedError } from "@/errors";
|
|
13
|
+
import { Dynamic, type DynamicProps } from "@/framer/cache/dynamic";
|
|
14
|
+
import {
|
|
15
|
+
type DirtyReadResult,
|
|
16
|
+
type GCMetrics,
|
|
17
|
+
Static,
|
|
18
|
+
type StaticProps,
|
|
19
|
+
} from "@/framer/cache/static";
|
|
20
|
+
|
|
21
|
+
export interface UnaryProps
|
|
22
|
+
extends StaticProps, Pick<DynamicProps, "dynamicBufferSize"> {}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Caches data for a single channel: a dynamic leading buffer for live writes backed
|
|
26
|
+
* by a static cache for flushed and historical data.
|
|
27
|
+
* @throws {UnexpectedError} from every method after close().
|
|
28
|
+
*/
|
|
29
|
+
export class Unary {
|
|
30
|
+
private closed: boolean = false;
|
|
31
|
+
private readonly static: Static;
|
|
32
|
+
private readonly dynamic: Dynamic;
|
|
33
|
+
|
|
34
|
+
constructor(props: UnaryProps) {
|
|
35
|
+
this.static = new Static(props);
|
|
36
|
+
this.dynamic = new Dynamic({
|
|
37
|
+
dynamicBufferSize: props.dynamicBufferSize,
|
|
38
|
+
transform: props.transform,
|
|
39
|
+
instrumentation: props.instrumentation,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
writeDynamic(series: MultiSeries): MultiSeries {
|
|
44
|
+
this.checkOpen("writeDynamic");
|
|
45
|
+
const { flushed, allocated } = this.dynamic.write(series);
|
|
46
|
+
// Flushed buffers stay streamed until a fetch replaces them.
|
|
47
|
+
if (flushed.length > 0) this.static.write(flushed, true);
|
|
48
|
+
return allocated;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
get leadingBuffer(): Series | null {
|
|
52
|
+
this.checkOpen("leadingBuffer");
|
|
53
|
+
return this.dynamic.leadingBuffer;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Flushes the live leading buffer into the static cache with its real end time,
|
|
58
|
+
* so reads treat the span after it as a gap to fetch. Call when streaming for
|
|
59
|
+
* the channel stops.
|
|
60
|
+
*/
|
|
61
|
+
flushDynamic(): void {
|
|
62
|
+
this.checkOpen("flushDynamic");
|
|
63
|
+
const flushed = this.dynamic.flush();
|
|
64
|
+
if (flushed != null && flushed.length > 0)
|
|
65
|
+
this.static.write(new MultiSeries([flushed]), true);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
writeStatic(series: MultiSeries): void {
|
|
69
|
+
this.checkOpen("writeStatic");
|
|
70
|
+
this.static.write(series);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Reads cached data overlapping the given time range. The result includes the
|
|
75
|
+
* live leading buffer when it overlaps, but the buffer never claims coverage:
|
|
76
|
+
* its samples carry provisional leading alignments that cannot pair with fetched
|
|
77
|
+
* data on another channel, so its span is still reported as a gap to fetch. A
|
|
78
|
+
* span may therefore return in both its streamed and fetched representation.
|
|
79
|
+
*/
|
|
80
|
+
read(tr: TimeRange): DirtyReadResult {
|
|
81
|
+
this.checkOpen("read");
|
|
82
|
+
const res = this.static.dirtyRead(tr);
|
|
83
|
+
const buf = this.dynamic.leadingBuffer;
|
|
84
|
+
if (buf == null || buf.length === 0 || !buf.timeRange.overlapsWith(tr)) return res;
|
|
85
|
+
res.series.push(buf);
|
|
86
|
+
return res;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
gc(): GCMetrics {
|
|
90
|
+
this.checkOpen("gc");
|
|
91
|
+
return this.static.gc();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
close(): void {
|
|
95
|
+
this.closed = true;
|
|
96
|
+
this.dynamic.close();
|
|
97
|
+
this.static.close();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private checkOpen(op: string): void {
|
|
101
|
+
if (this.closed)
|
|
102
|
+
throw new UnexpectedError(`${op} called on a closed telemetry cache entry`);
|
|
103
|
+
}
|
|
104
|
+
}
|