@synnaxlabs/client 0.56.2 → 0.57.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-DDACDVZ-.js +14505 -0
- package/dist/client-DDACDVZ-.js.map +1 -0
- package/dist/client.js +1128 -14876
- package/dist/client.js.map +1 -0
- package/dist/src/access/client.d.ts +10 -1
- package/dist/src/access/client.d.ts.map +1 -1
- package/dist/src/access/enforce.d.ts.map +1 -1
- package/dist/src/access/external.d.ts +1 -0
- package/dist/src/access/external.d.ts.map +1 -1
- package/dist/src/access/granted.d.ts +39 -0
- package/dist/src/access/granted.d.ts.map +1 -0
- package/dist/src/access/policy/client.d.ts +136 -147
- package/dist/src/access/policy/client.d.ts.map +1 -1
- package/dist/src/access/policy/types.gen.d.ts +15 -68
- package/dist/src/access/policy/types.gen.d.ts.map +1 -1
- package/dist/src/access/role/client.d.ts +77 -58
- package/dist/src/access/role/client.d.ts.map +1 -1
- package/dist/src/access/role/types.gen.d.ts +8 -14
- package/dist/src/access/role/types.gen.d.ts.map +1 -1
- package/dist/src/actions/actions.d.ts +5 -6
- package/dist/src/actions/actions.d.ts.map +1 -1
- package/dist/src/actions/controller.d.ts +194 -0
- package/dist/src/actions/controller.d.ts.map +1 -0
- package/dist/src/actions/external.d.ts +1 -0
- package/dist/src/actions/external.d.ts.map +1 -1
- package/dist/src/arc/actions.d.ts +575 -0
- package/dist/src/arc/actions.d.ts.map +1 -0
- package/dist/src/arc/actions.gen.d.ts +1439 -0
- package/dist/src/arc/actions.gen.d.ts.map +1 -0
- package/dist/src/arc/client.d.ts +97 -13
- package/dist/src/arc/client.d.ts.map +1 -1
- package/dist/src/arc/compiler/types.gen.d.ts +3 -3
- package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
- package/dist/src/arc/external.d.ts +2 -0
- package/dist/src/arc/external.d.ts.map +1 -1
- package/dist/src/arc/graph/types.gen.d.ts +45 -597
- package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
- package/dist/src/arc/ir/index.d.ts +1 -1
- package/dist/src/arc/ir/index.d.ts.map +1 -1
- package/dist/src/arc/ir/ir.d.ts +2 -0
- package/dist/src/arc/ir/ir.d.ts.map +1 -0
- package/dist/src/arc/ir/types.gen.d.ts +58 -2807
- package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
- package/dist/src/arc/module/types.gen.d.ts +18 -1090
- package/dist/src/arc/module/types.gen.d.ts.map +1 -1
- package/dist/src/arc/program/types.gen.d.ts +18 -1090
- package/dist/src/arc/program/types.gen.d.ts.map +1 -1
- package/dist/src/arc/text/types.gen.d.ts +54 -1
- package/dist/src/arc/text/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types/types.gen.d.ts +35 -153
- package/dist/src/arc/types/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types.gen.d.ts +98 -2278
- package/dist/src/arc/types.gen.d.ts.map +1 -1
- package/dist/src/auth/auth.d.ts +14 -2
- package/dist/src/auth/auth.d.ts.map +1 -1
- package/dist/src/channel/client.d.ts +113 -75
- package/dist/src/channel/client.d.ts.map +1 -1
- package/dist/src/channel/external.d.ts +0 -1
- package/dist/src/channel/external.d.ts.map +1 -1
- package/dist/src/channel/payload.d.ts +65 -56
- package/dist/src/channel/payload.d.ts.map +1 -1
- package/dist/src/channel/types.gen.d.ts +26 -73
- package/dist/src/channel/types.gen.d.ts.map +1 -1
- package/dist/src/channel/writer.d.ts +1 -3
- package/dist/src/channel/writer.d.ts.map +1 -1
- package/dist/src/client.d.ts +55 -27
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/connection/client.d.ts +146 -0
- package/dist/src/connection/client.d.ts.map +1 -0
- package/dist/src/connection/external.d.ts +3 -0
- package/dist/src/connection/external.d.ts.map +1 -0
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/status.d.ts +252 -0
- package/dist/src/connection/status.d.ts.map +1 -0
- package/dist/src/control/client.d.ts +31 -7
- package/dist/src/control/client.d.ts.map +1 -1
- package/dist/src/control/state.d.ts +47 -16
- package/dist/src/control/state.d.ts.map +1 -1
- package/dist/src/device/client.d.ts +59 -17
- package/dist/src/device/client.d.ts.map +1 -1
- package/dist/src/device/types.gen.d.ts +17 -67
- package/dist/src/device/types.gen.d.ts.map +1 -1
- package/dist/src/errors.d.ts +17 -20
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/ethercat/external.d.ts +2 -0
- package/dist/src/ethercat/external.d.ts.map +1 -0
- package/dist/src/ethercat/index.d.ts +2 -0
- package/dist/src/ethercat/index.d.ts.map +1 -0
- package/dist/src/ethercat/types.gen.d.ts +243 -0
- package/dist/src/ethercat/types.gen.d.ts.map +1 -0
- package/dist/src/framer/adapter.d.ts +8 -5
- package/dist/src/framer/adapter.d.ts.map +1 -1
- package/dist/src/framer/benchutil.d.ts +19 -0
- package/dist/src/framer/benchutil.d.ts.map +1 -0
- package/dist/src/framer/cache/cache.d.ts +38 -0
- package/dist/src/framer/cache/cache.d.ts.map +1 -0
- package/dist/src/framer/cache/dynamic.d.ts +91 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +57 -0
- package/dist/src/framer/cache/reader.d.ts.map +1 -0
- package/dist/src/framer/cache/static.d.ts +66 -0
- package/dist/src/framer/cache/static.d.ts.map +1 -0
- package/dist/src/framer/cache/streamer.d.ts +86 -0
- package/dist/src/framer/cache/streamer.d.ts.map +1 -0
- package/dist/src/framer/cache/transform.d.ts +18 -0
- package/dist/src/framer/cache/transform.d.ts.map +1 -0
- package/dist/src/framer/cache/unary.d.ts +39 -0
- package/dist/src/framer/cache/unary.d.ts.map +1 -0
- package/dist/src/framer/client.d.ts +35 -14
- package/dist/src/framer/client.d.ts.map +1 -1
- package/dist/src/framer/codec.d.ts.map +1 -1
- package/dist/src/framer/deleter.d.ts +3 -2
- package/dist/src/framer/deleter.d.ts.map +1 -1
- package/dist/src/framer/external.d.ts +6 -0
- package/dist/src/framer/external.d.ts.map +1 -1
- package/dist/src/framer/feed.d.ts +40 -0
- package/dist/src/framer/feed.d.ts.map +1 -0
- package/dist/src/framer/frame.d.ts +16 -20
- package/dist/src/framer/frame.d.ts.map +1 -1
- package/dist/src/framer/hardened.d.ts +70 -0
- package/dist/src/framer/hardened.d.ts.map +1 -0
- package/dist/src/framer/iterator.d.ts +36 -43
- package/dist/src/framer/iterator.d.ts.map +1 -1
- package/dist/src/framer/reader.d.ts +3 -2
- package/dist/src/framer/reader.d.ts.map +1 -1
- package/dist/src/framer/streamer.d.ts +132 -205
- package/dist/src/framer/streamer.d.ts.map +1 -1
- package/dist/src/framer/writer.d.ts +130 -161
- package/dist/src/framer/writer.d.ts.map +1 -1
- package/dist/src/group/client.d.ts +66 -9
- package/dist/src/group/client.d.ts.map +1 -1
- package/dist/src/group/types.gen.d.ts +2 -2
- package/dist/src/http/external.d.ts +2 -0
- package/dist/src/http/external.d.ts.map +1 -0
- package/dist/src/http/index.d.ts +2 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/types.gen.d.ts +451 -0
- package/dist/src/http/types.gen.d.ts.map +1 -0
- package/dist/src/imex/client.d.ts +88 -0
- package/dist/src/imex/client.d.ts.map +1 -0
- package/dist/src/imex/index.d.ts +2 -0
- package/dist/src/imex/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +18 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/label/client.d.ts +55 -36
- package/dist/src/label/client.d.ts.map +1 -1
- package/dist/src/label/external.d.ts +2 -0
- package/dist/src/label/external.d.ts.map +1 -1
- package/dist/src/label/payload.d.ts +4 -46
- package/dist/src/label/payload.d.ts.map +1 -1
- package/dist/src/label/store.d.ts +8 -0
- package/dist/src/label/store.d.ts.map +1 -0
- package/dist/src/label/types.gen.d.ts +45 -0
- package/dist/src/label/types.gen.d.ts.map +1 -0
- package/dist/src/labjack/external.d.ts +2 -0
- package/dist/src/labjack/external.d.ts.map +1 -0
- package/dist/src/labjack/index.d.ts +2 -0
- package/dist/src/labjack/index.d.ts.map +1 -0
- package/dist/src/labjack/types.gen.d.ts +442 -0
- package/dist/src/labjack/types.gen.d.ts.map +1 -0
- package/dist/src/lineplot/actions.d.ts +914 -0
- package/dist/src/lineplot/actions.d.ts.map +1 -0
- package/dist/src/lineplot/actions.gen.d.ts +4208 -0
- package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
- package/dist/src/lineplot/client.d.ts +66 -16
- package/dist/src/lineplot/client.d.ts.map +1 -1
- package/dist/src/lineplot/external.d.ts +3 -0
- package/dist/src/lineplot/external.d.ts.map +1 -1
- package/dist/src/lineplot/line.d.ts +16 -0
- package/dist/src/lineplot/line.d.ts.map +1 -0
- package/dist/src/lineplot/types.gen.d.ts +837 -14
- package/dist/src/lineplot/types.gen.d.ts.map +1 -1
- package/dist/src/log/actions.d.ts +271 -0
- package/dist/src/log/actions.d.ts.map +1 -0
- package/dist/src/log/actions.gen.d.ts +1529 -0
- package/dist/src/log/actions.gen.d.ts.map +1 -0
- package/dist/src/log/client.d.ts +66 -16
- package/dist/src/log/client.d.ts.map +1 -1
- package/dist/src/log/external.d.ts +2 -0
- package/dist/src/log/external.d.ts.map +1 -1
- package/dist/src/log/types.gen.d.ts +139 -14
- package/dist/src/log/types.gen.d.ts.map +1 -1
- package/dist/src/modbus/external.d.ts +2 -0
- package/dist/src/modbus/external.d.ts.map +1 -0
- package/dist/src/modbus/index.d.ts +2 -0
- package/dist/src/modbus/index.d.ts.map +1 -0
- package/dist/src/modbus/types.gen.d.ts +280 -0
- package/dist/src/modbus/types.gen.d.ts.map +1 -0
- package/dist/src/ni/external.d.ts +2 -0
- package/dist/src/ni/external.d.ts.map +1 -0
- package/dist/src/ni/index.d.ts +2 -0
- package/dist/src/ni/index.d.ts.map +1 -0
- package/dist/src/ni/types.gen.d.ts +21029 -0
- package/dist/src/ni/types.gen.d.ts.map +1 -0
- package/dist/src/node/index.d.ts +2 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/types.gen.d.ts +4 -0
- package/dist/src/node/types.gen.d.ts.map +1 -0
- package/dist/src/ontology/client.d.ts +314 -67
- package/dist/src/ontology/client.d.ts.map +1 -1
- package/dist/src/ontology/external.d.ts +1 -0
- package/dist/src/ontology/external.d.ts.map +1 -1
- package/dist/src/ontology/payload.d.ts +60 -18
- package/dist/src/ontology/payload.d.ts.map +1 -1
- package/dist/src/ontology/store.d.ts +32 -0
- package/dist/src/ontology/store.d.ts.map +1 -0
- package/dist/src/ontology/types.gen.d.ts +3 -2
- package/dist/src/ontology/types.gen.d.ts.map +1 -1
- package/dist/src/ontology/writer.d.ts +16 -10
- package/dist/src/ontology/writer.d.ts.map +1 -1
- package/dist/src/opcua/external.d.ts +2 -0
- package/dist/src/opcua/external.d.ts.map +1 -0
- package/dist/src/opcua/index.d.ts +2 -0
- package/dist/src/opcua/index.d.ts.map +1 -0
- package/dist/src/opcua/types.gen.d.ts +82 -0
- package/dist/src/opcua/types.gen.d.ts.map +1 -0
- package/dist/src/pagerduty/external.d.ts +2 -0
- package/dist/src/pagerduty/external.d.ts.map +1 -0
- package/dist/src/pagerduty/index.d.ts +2 -0
- package/dist/src/pagerduty/index.d.ts.map +1 -0
- package/dist/src/pagerduty/types.gen.d.ts +30 -0
- package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
- package/dist/src/panel/actions.d.ts +273 -0
- package/dist/src/panel/actions.d.ts.map +1 -0
- package/dist/src/panel/actions.gen.d.ts +1255 -0
- package/dist/src/panel/actions.gen.d.ts.map +1 -0
- package/dist/src/panel/client.d.ts +148 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/external.d.ts +6 -0
- package/dist/src/panel/external.d.ts.map +1 -0
- package/dist/src/panel/index.d.ts +2 -0
- package/dist/src/panel/index.d.ts.map +1 -0
- package/dist/src/panel/tree.d.ts +50 -0
- package/dist/src/panel/tree.d.ts.map +1 -0
- package/dist/src/panel/types.gen.d.ts +370 -0
- package/dist/src/panel/types.gen.d.ts.map +1 -0
- package/dist/src/project/client.d.ts +89 -0
- package/dist/src/project/client.d.ts.map +1 -0
- package/dist/src/project/external.d.ts.map +1 -0
- package/dist/src/project/index.d.ts +2 -0
- package/dist/src/project/index.d.ts.map +1 -0
- package/dist/src/project/types.gen.d.ts +27 -0
- package/dist/src/project/types.gen.d.ts.map +1 -0
- package/dist/src/query/cache.d.ts +132 -0
- package/dist/src/query/cache.d.ts.map +1 -0
- package/dist/src/query/deleted.d.ts +20 -0
- package/dist/src/query/deleted.d.ts.map +1 -0
- package/dist/src/query/derived.d.ts +33 -0
- package/dist/src/query/derived.d.ts.map +1 -0
- package/dist/src/query/external.d.ts +10 -0
- package/dist/src/query/external.d.ts.map +1 -0
- package/dist/src/query/index.d.ts +2 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/query.d.ts +235 -0
- package/dist/src/query/query.d.ts.map +1 -0
- package/dist/src/query/retriever.d.ts +135 -0
- package/dist/src/query/retriever.d.ts.map +1 -0
- package/dist/src/query/streamer.d.ts +67 -0
- package/dist/src/query/streamer.d.ts.map +1 -0
- package/dist/src/query/table.d.ts +219 -0
- package/dist/src/query/table.d.ts.map +1 -0
- package/dist/src/query/types.d.ts +35 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/write.d.ts +21 -0
- package/dist/src/query/write.d.ts.map +1 -0
- package/dist/src/rack/client.d.ts +58 -20
- package/dist/src/rack/client.d.ts.map +1 -1
- package/dist/src/rack/types.gen.d.ts +11 -12
- package/dist/src/rack/types.gen.d.ts.map +1 -1
- package/dist/src/range/alias/types.gen.d.ts +2 -3
- package/dist/src/range/alias/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/client.d.ts +138 -27
- package/dist/src/ranger/client.d.ts.map +1 -1
- package/dist/src/ranger/kv/client.d.ts +7 -4
- package/dist/src/ranger/kv/client.d.ts.map +1 -1
- package/dist/src/ranger/payload.d.ts +3 -0
- package/dist/src/ranger/payload.d.ts.map +1 -1
- package/dist/src/ranger/types.gen.d.ts +45 -101
- package/dist/src/ranger/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/writer.d.ts +2 -74
- package/dist/src/ranger/writer.d.ts.map +1 -1
- package/dist/src/schematic/actions.d.ts +90 -33
- package/dist/src/schematic/actions.d.ts.map +1 -1
- package/dist/src/schematic/actions.gen.d.ts +207 -114
- package/dist/src/schematic/actions.gen.d.ts.map +1 -1
- package/dist/src/schematic/client.d.ts +70 -68
- package/dist/src/schematic/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/client.d.ts +133 -27
- package/dist/src/schematic/symbol/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
- package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
- package/dist/src/schematic/types.gen.d.ts +17 -96
- package/dist/src/schematic/types.gen.d.ts.map +1 -1
- package/dist/src/status/client.d.ts +69 -14
- package/dist/src/status/client.d.ts.map +1 -1
- package/dist/src/status/external.d.ts +2 -0
- package/dist/src/status/external.d.ts.map +1 -1
- package/dist/src/status/payload.d.ts +2 -36
- package/dist/src/status/payload.d.ts.map +1 -1
- package/dist/src/status/status.d.ts +65 -0
- package/dist/src/status/status.d.ts.map +1 -0
- package/dist/src/status/types.gen.d.ts +58 -0
- package/dist/src/status/types.gen.d.ts.map +1 -0
- package/dist/src/table/actions.d.ts +72 -13
- package/dist/src/table/actions.d.ts.map +1 -1
- package/dist/src/table/actions.gen.d.ts +221 -137
- package/dist/src/table/actions.gen.d.ts.map +1 -1
- package/dist/src/table/client.d.ts +64 -40
- package/dist/src/table/client.d.ts.map +1 -1
- package/dist/src/table/types.gen.d.ts +20 -55
- package/dist/src/table/types.gen.d.ts.map +1 -1
- package/dist/src/task/client.d.ts +149 -28
- package/dist/src/task/client.d.ts.map +1 -1
- package/dist/src/task/types.gen.d.ts +71 -89
- package/dist/src/task/types.gen.d.ts.map +1 -1
- package/dist/src/testutil/access.d.ts +27 -1
- package/dist/src/testutil/access.d.ts.map +1 -1
- package/dist/src/testutil/channels.d.ts +2 -0
- package/dist/src/testutil/channels.d.ts.map +1 -1
- package/dist/src/testutil/client.d.ts +5 -0
- package/dist/src/testutil/client.d.ts.map +1 -1
- package/dist/src/testutil/connection.d.ts +10 -0
- package/dist/src/testutil/connection.d.ts.map +1 -0
- package/dist/src/testutil/index.d.ts +9 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/panels.d.ts +8 -0
- package/dist/src/testutil/panels.d.ts.map +1 -0
- package/dist/src/testutil/proxy.d.ts +29 -0
- package/dist/src/testutil/proxy.d.ts.map +1 -0
- package/dist/src/testutil/query.d.ts +7 -0
- package/dist/src/testutil/query.d.ts.map +1 -0
- package/dist/src/testutil/telem.d.ts +4 -0
- package/dist/src/testutil/telem.d.ts.map +1 -1
- package/dist/src/transport.d.ts +10 -4
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/user/client.d.ts +29 -28
- package/dist/src/user/client.d.ts.map +1 -1
- package/dist/src/user/external.d.ts +1 -1
- package/dist/src/user/external.d.ts.map +1 -1
- package/dist/src/user/types.gen.d.ts +4 -4
- package/dist/src/util/retrieve.d.ts +2 -2
- package/dist/src/util/retrieve.d.ts.map +1 -1
- package/dist/src/util/telem.d.ts.map +1 -1
- package/dist/src/view/client.d.ts +30 -14
- package/dist/src/view/client.d.ts.map +1 -1
- package/dist/src/view/types.gen.d.ts +7 -15
- package/dist/src/view/types.gen.d.ts.map +1 -1
- package/dist/testutil.js +189 -0
- package/dist/testutil.js.map +1 -0
- package/package.json +39 -16
- package/src/access/client.ts +14 -3
- package/src/access/enforce.ts +0 -3
- package/src/access/external.ts +1 -0
- package/src/access/granted.ts +114 -0
- package/src/access/policy/client.ts +135 -43
- package/src/access/policy/types.gen.ts +9 -11
- package/src/access/role/client.ts +160 -38
- package/src/access/role/types.gen.ts +8 -12
- package/src/actions/actions.ts +5 -6
- package/src/actions/controller.ts +626 -0
- package/src/actions/external.ts +11 -0
- package/src/arc/actions.gen.ts +313 -0
- package/src/arc/actions.ts +192 -0
- package/src/arc/client.ts +424 -41
- package/src/arc/compiler/types.gen.ts +5 -6
- package/src/arc/external.ts +2 -0
- package/src/arc/graph/types.gen.ts +24 -22
- package/src/arc/ir/index.ts +1 -1
- package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
- package/src/arc/ir/types.gen.ts +42 -41
- package/src/arc/text/types.gen.ts +21 -2
- package/src/arc/types/types.gen.ts +40 -32
- package/src/arc/types.gen.ts +31 -29
- package/src/auth/auth.ts +40 -8
- package/src/channel/client.ts +529 -132
- package/src/channel/external.ts +0 -1
- package/src/channel/payload.ts +30 -3
- package/src/channel/types.gen.ts +37 -48
- package/src/channel/writer.ts +2 -11
- package/src/client.ts +215 -91
- package/src/connection/client.ts +495 -0
- package/src/connection/external.ts +34 -0
- package/src/connection/index.ts +1 -1
- package/src/connection/status.ts +442 -0
- package/src/control/client.ts +84 -12
- package/src/control/state.ts +17 -36
- package/src/device/client.ts +293 -41
- package/src/device/types.gen.ts +15 -26
- package/src/errors.ts +45 -22
- package/src/{workspace → ethercat}/external.ts +1 -2
- package/src/{workspace → ethercat}/index.ts +1 -1
- package/src/ethercat/types.gen.ts +151 -0
- package/src/framer/adapter.ts +60 -37
- package/src/framer/benchutil.ts +67 -0
- package/src/framer/cache/cache.ts +115 -0
- package/src/framer/cache/dynamic.ts +340 -0
- package/src/framer/cache/reader.ts +231 -0
- package/src/framer/cache/static.ts +215 -0
- package/src/framer/cache/streamer.ts +391 -0
- package/src/framer/cache/transform.ts +31 -0
- package/src/framer/cache/unary.ts +108 -0
- package/src/framer/client.ts +71 -43
- package/src/framer/codec.ts +55 -18
- package/src/framer/deleter.ts +4 -6
- package/src/framer/external.ts +10 -0
- package/src/framer/feed.ts +108 -0
- package/src/framer/frame.ts +13 -23
- package/src/framer/hardened.ts +283 -0
- package/src/framer/iterator.ts +31 -42
- package/src/framer/reader.ts +11 -11
- package/src/framer/streamer.ts +18 -178
- package/src/framer/writer.ts +39 -59
- package/src/group/client.ts +158 -23
- package/src/http/external.ts +10 -0
- package/src/{cluster → http}/index.ts +1 -1
- package/src/http/types.gen.ts +245 -0
- package/src/imex/client.ts +125 -0
- package/src/imex/index.ts +10 -0
- package/src/index.ts +19 -6
- package/src/label/client.ts +193 -54
- package/src/label/external.ts +2 -0
- package/src/label/payload.ts +4 -9
- package/src/label/store.ts +28 -0
- package/src/label/types.gen.ts +31 -0
- package/src/labjack/external.ts +10 -0
- package/src/labjack/index.ts +10 -0
- package/src/labjack/types.gen.ts +251 -0
- package/src/lineplot/actions.gen.ts +880 -0
- package/src/lineplot/actions.ts +535 -0
- package/src/lineplot/client.ts +224 -52
- package/src/lineplot/external.ts +3 -0
- package/src/lineplot/line.ts +80 -0
- package/src/lineplot/types.gen.ts +225 -12
- package/src/log/actions.gen.ts +474 -0
- package/src/log/actions.ts +242 -0
- package/src/log/client.ts +223 -52
- package/src/log/external.ts +2 -0
- package/src/log/types.gen.ts +45 -14
- package/src/modbus/external.ts +10 -0
- package/src/modbus/index.ts +10 -0
- package/src/modbus/types.gen.ts +185 -0
- package/src/ni/external.ts +10 -0
- package/src/ni/index.ts +10 -0
- package/src/ni/types.gen.ts +1632 -0
- package/src/node/index.ts +10 -0
- package/src/{cluster → node}/types.gen.ts +2 -2
- package/src/ontology/client.ts +408 -99
- package/src/ontology/external.ts +7 -0
- package/src/ontology/payload.ts +48 -7
- package/src/ontology/store.ts +83 -0
- package/src/ontology/types.gen.ts +2 -1
- package/src/ontology/writer.ts +1 -0
- package/src/opcua/external.ts +10 -0
- package/src/opcua/index.ts +10 -0
- package/src/opcua/types.gen.ts +65 -0
- package/src/pagerduty/external.ts +10 -0
- package/src/pagerduty/index.ts +10 -0
- package/src/pagerduty/types.gen.ts +41 -0
- package/src/panel/actions.gen.ts +267 -0
- package/src/panel/actions.ts +357 -0
- package/src/panel/client.ts +327 -0
- package/src/panel/external.ts +14 -0
- package/src/panel/index.ts +10 -0
- package/src/panel/tree.ts +163 -0
- package/src/panel/types.gen.ts +164 -0
- package/src/project/client.ts +273 -0
- package/src/project/external.ts +11 -0
- package/src/project/index.ts +10 -0
- package/src/project/types.gen.ts +40 -0
- package/src/query/cache.ts +326 -0
- package/src/query/deleted.ts +38 -0
- package/src/query/derived.ts +101 -0
- package/src/query/external.ts +51 -0
- package/src/query/index.ts +10 -0
- package/src/query/query.ts +865 -0
- package/src/query/retriever.ts +308 -0
- package/src/query/streamer.ts +207 -0
- package/src/query/table.ts +625 -0
- package/src/query/types.ts +54 -0
- package/src/query/write.ts +42 -0
- package/src/rack/client.ts +233 -45
- package/src/rack/types.gen.ts +15 -16
- package/src/range/alias/types.gen.ts +2 -3
- package/src/ranger/client.ts +581 -70
- package/src/ranger/kv/client.ts +52 -21
- package/src/ranger/payload.ts +3 -0
- package/src/ranger/types.gen.ts +21 -23
- package/src/ranger/writer.ts +4 -8
- package/src/schematic/actions.gen.ts +62 -53
- package/src/schematic/actions.ts +44 -42
- package/src/schematic/client.ts +226 -70
- package/src/schematic/symbol/client.ts +277 -48
- package/src/schematic/symbol/types.gen.ts +22 -34
- package/src/schematic/types.gen.ts +22 -29
- package/src/status/client.ts +321 -44
- package/src/status/external.ts +2 -0
- package/src/status/payload.ts +1 -23
- package/src/status/status.ts +241 -0
- package/src/status/types.gen.ts +108 -0
- package/src/table/actions.gen.ts +96 -63
- package/src/table/actions.ts +44 -19
- package/src/table/client.ts +220 -56
- package/src/table/types.gen.ts +24 -31
- package/src/task/client.ts +580 -101
- package/src/task/types.gen.ts +68 -75
- package/src/testutil/access.ts +102 -6
- package/src/testutil/channels.ts +29 -0
- package/src/testutil/client.ts +27 -2
- package/src/testutil/connection.ts +47 -0
- package/src/testutil/index.ts +17 -0
- package/src/testutil/panels.ts +26 -0
- package/src/testutil/proxy.ts +106 -0
- package/src/testutil/query.ts +28 -0
- package/src/testutil/telem.ts +17 -1
- package/src/transport.ts +18 -7
- package/src/user/client.ts +165 -64
- package/src/user/external.ts +1 -1
- package/src/user/types.gen.ts +5 -5
- package/src/util/retrieve.ts +4 -4
- package/src/util/telem.ts +0 -1
- package/src/view/client.ts +120 -37
- package/src/view/types.gen.ts +8 -11
- package/.turbo/turbo-build.log +0 -20
- package/.vscode/settings.json +0 -3
- package/CONTRIBUTING.md +0 -47
- package/dist/client.cjs +0 -118
- package/dist/eslint.config.d.ts +0 -4
- package/dist/eslint.config.d.ts.map +0 -1
- package/dist/src/access/enforce.spec.d.ts +0 -2
- package/dist/src/access/enforce.spec.d.ts.map +0 -1
- package/dist/src/access/policy/access.spec.d.ts +0 -2
- package/dist/src/access/policy/access.spec.d.ts.map +0 -1
- package/dist/src/access/role/role.spec.d.ts +0 -2
- package/dist/src/access/role/role.spec.d.ts.map +0 -1
- package/dist/src/actions/actions.spec.d.ts +0 -2
- package/dist/src/actions/actions.spec.d.ts.map +0 -1
- package/dist/src/arc/access.spec.d.ts +0 -2
- package/dist/src/arc/access.spec.d.ts.map +0 -1
- package/dist/src/arc/arc.spec.d.ts +0 -2
- package/dist/src/arc/arc.spec.d.ts.map +0 -1
- package/dist/src/arc/lsp.spec.d.ts +0 -2
- package/dist/src/arc/lsp.spec.d.ts.map +0 -1
- package/dist/src/auth/auth.spec.d.ts +0 -2
- package/dist/src/auth/auth.spec.d.ts.map +0 -1
- package/dist/src/channel/access.spec.d.ts +0 -2
- package/dist/src/channel/access.spec.d.ts.map +0 -1
- package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
- package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
- package/dist/src/channel/channel.spec.d.ts +0 -2
- package/dist/src/channel/channel.spec.d.ts.map +0 -1
- package/dist/src/channel/payload.spec.d.ts +0 -2
- package/dist/src/channel/payload.spec.d.ts.map +0 -1
- package/dist/src/channel/retriever.d.ts +0 -64
- package/dist/src/channel/retriever.d.ts.map +0 -1
- package/dist/src/cluster/index.d.ts +0 -2
- package/dist/src/cluster/index.d.ts.map +0 -1
- package/dist/src/cluster/types.gen.d.ts +0 -4
- package/dist/src/cluster/types.gen.d.ts.map +0 -1
- package/dist/src/connection/checker.d.ts +0 -86
- package/dist/src/connection/checker.d.ts.map +0 -1
- package/dist/src/connection/connection.spec.d.ts +0 -2
- package/dist/src/connection/connection.spec.d.ts.map +0 -1
- package/dist/src/connection.spec.d.ts +0 -2
- package/dist/src/connection.spec.d.ts.map +0 -1
- package/dist/src/control/state.spec.d.ts +0 -2
- package/dist/src/control/state.spec.d.ts.map +0 -1
- package/dist/src/device/access.spec.d.ts +0 -2
- package/dist/src/device/access.spec.d.ts.map +0 -1
- package/dist/src/device/device.spec.d.ts +0 -2
- package/dist/src/device/device.spec.d.ts.map +0 -1
- package/dist/src/device/payload.spec.d.ts +0 -2
- package/dist/src/device/payload.spec.d.ts.map +0 -1
- package/dist/src/errors.spec.d.ts +0 -2
- package/dist/src/errors.spec.d.ts.map +0 -1
- package/dist/src/framer/adapter.spec.d.ts +0 -2
- package/dist/src/framer/adapter.spec.d.ts.map +0 -1
- package/dist/src/framer/client.spec.d.ts +0 -2
- package/dist/src/framer/client.spec.d.ts.map +0 -1
- package/dist/src/framer/codec.spec.d.ts +0 -2
- package/dist/src/framer/codec.spec.d.ts.map +0 -1
- package/dist/src/framer/deleter.spec.d.ts +0 -2
- package/dist/src/framer/deleter.spec.d.ts.map +0 -1
- package/dist/src/framer/frame.spec.d.ts +0 -2
- package/dist/src/framer/frame.spec.d.ts.map +0 -1
- package/dist/src/framer/iterator.spec.d.ts +0 -2
- package/dist/src/framer/iterator.spec.d.ts.map +0 -1
- package/dist/src/framer/reader.spec.d.ts +0 -2
- package/dist/src/framer/reader.spec.d.ts.map +0 -1
- package/dist/src/framer/streamer.spec.d.ts +0 -2
- package/dist/src/framer/streamer.spec.d.ts.map +0 -1
- package/dist/src/framer/writer.spec.d.ts +0 -2
- package/dist/src/framer/writer.spec.d.ts.map +0 -1
- package/dist/src/group/access.spec.d.ts +0 -2
- package/dist/src/group/access.spec.d.ts.map +0 -1
- package/dist/src/group/group.spec.d.ts +0 -2
- package/dist/src/group/group.spec.d.ts.map +0 -1
- package/dist/src/label/access.spec.d.ts +0 -2
- package/dist/src/label/access.spec.d.ts.map +0 -1
- package/dist/src/label/label.spec.d.ts +0 -2
- package/dist/src/label/label.spec.d.ts.map +0 -1
- package/dist/src/lineplot/access.spec.d.ts +0 -2
- package/dist/src/lineplot/access.spec.d.ts.map +0 -1
- package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
- package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
- package/dist/src/log/access.spec.d.ts +0 -2
- package/dist/src/log/access.spec.d.ts.map +0 -1
- package/dist/src/log/log.spec.d.ts +0 -2
- package/dist/src/log/log.spec.d.ts.map +0 -1
- package/dist/src/ontology/ontology.spec.d.ts +0 -2
- package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
- package/dist/src/rack/access.spec.d.ts +0 -2
- package/dist/src/rack/access.spec.d.ts.map +0 -1
- package/dist/src/rack/rack.spec.d.ts +0 -2
- package/dist/src/rack/rack.spec.d.ts.map +0 -1
- package/dist/src/ranger/access.spec.d.ts +0 -2
- package/dist/src/ranger/access.spec.d.ts.map +0 -1
- package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
- package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
- package/dist/src/ranger/ranger.spec.d.ts +0 -2
- package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
- package/dist/src/schematic/access.spec.d.ts +0 -2
- package/dist/src/schematic/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/actions.spec.d.ts +0 -2
- package/dist/src/schematic/actions.spec.d.ts.map +0 -1
- package/dist/src/schematic/schematic.spec.d.ts +0 -2
- package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
- package/dist/src/status/access.spec.d.ts +0 -2
- package/dist/src/status/access.spec.d.ts.map +0 -1
- package/dist/src/status/status.spec.d.ts +0 -2
- package/dist/src/status/status.spec.d.ts.map +0 -1
- package/dist/src/table/access.spec.d.ts +0 -2
- package/dist/src/table/access.spec.d.ts.map +0 -1
- package/dist/src/table/table.spec.d.ts +0 -2
- package/dist/src/table/table.spec.d.ts.map +0 -1
- package/dist/src/task/access.spec.d.ts +0 -2
- package/dist/src/task/access.spec.d.ts.map +0 -1
- package/dist/src/task/payload.spec.d.ts +0 -2
- package/dist/src/task/payload.spec.d.ts.map +0 -1
- package/dist/src/task/task.spec.d.ts +0 -2
- package/dist/src/task/task.spec.d.ts.map +0 -1
- package/dist/src/user/access.spec.d.ts +0 -2
- package/dist/src/user/access.spec.d.ts.map +0 -1
- package/dist/src/user/user.spec.d.ts +0 -2
- package/dist/src/user/user.spec.d.ts.map +0 -1
- package/dist/src/util/retrieve.spec.d.ts +0 -2
- package/dist/src/util/retrieve.spec.d.ts.map +0 -1
- package/dist/src/view/view.spec.d.ts +0 -2
- package/dist/src/view/view.spec.d.ts.map +0 -1
- package/dist/src/workspace/access.spec.d.ts +0 -2
- package/dist/src/workspace/access.spec.d.ts.map +0 -1
- package/dist/src/workspace/client.d.ts +0 -36
- package/dist/src/workspace/client.d.ts.map +0 -1
- package/dist/src/workspace/external.d.ts.map +0 -1
- package/dist/src/workspace/index.d.ts +0 -2
- package/dist/src/workspace/index.d.ts.map +0 -1
- package/dist/src/workspace/types.gen.d.ts +0 -34
- package/dist/src/workspace/types.gen.d.ts.map +0 -1
- package/dist/src/workspace/workspace.spec.d.ts +0 -2
- package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
- package/examples/node/basicReadWrite.js +0 -86
- package/examples/node/createChannels.js +0 -50
- package/examples/node/createRange.js +0 -67
- package/examples/node/package-lock.json +0 -133
- package/examples/node/package.json +0 -17
- package/examples/node/readLatest.js +0 -76
- package/examples/node/seriesAndFrames.js +0 -173
- package/examples/node/streamRead.js +0 -50
- package/examples/node/streamWrite.js +0 -87
- package/src/access/enforce.spec.ts +0 -188
- package/src/access/policy/access.spec.ts +0 -147
- package/src/access/role/role.spec.ts +0 -95
- package/src/actions/actions.spec.ts +0 -229
- package/src/arc/access.spec.ts +0 -149
- package/src/arc/arc.spec.ts +0 -44
- package/src/arc/lsp.spec.ts +0 -717
- package/src/auth/auth.spec.ts +0 -101
- package/src/channel/access.spec.ts +0 -116
- package/src/channel/batchRetriever.spec.ts +0 -115
- package/src/channel/channel.spec.ts +0 -352
- package/src/channel/payload.spec.ts +0 -117
- package/src/channel/retriever.ts +0 -252
- package/src/connection/checker.ts +0 -203
- package/src/connection/connection.spec.ts +0 -152
- package/src/connection.spec.ts +0 -145
- package/src/control/state.spec.ts +0 -22
- package/src/device/access.spec.ts +0 -159
- package/src/device/device.spec.ts +0 -461
- package/src/device/payload.spec.ts +0 -142
- package/src/errors.spec.ts +0 -71
- package/src/framer/adapter.spec.ts +0 -620
- package/src/framer/client.spec.ts +0 -180
- package/src/framer/codec.spec.ts +0 -383
- package/src/framer/deleter.spec.ts +0 -103
- package/src/framer/frame.spec.ts +0 -973
- package/src/framer/iterator.spec.ts +0 -169
- package/src/framer/reader.spec.ts +0 -865
- package/src/framer/streamer.spec.ts +0 -871
- package/src/framer/writer.spec.ts +0 -486
- package/src/group/access.spec.ts +0 -77
- package/src/group/group.spec.ts +0 -65
- package/src/label/access.spec.ts +0 -109
- package/src/label/label.spec.ts +0 -83
- package/src/lineplot/access.spec.ts +0 -134
- package/src/lineplot/lineplot.spec.ts +0 -120
- package/src/log/access.spec.ts +0 -132
- package/src/log/log.spec.ts +0 -106
- package/src/ontology/ontology.spec.ts +0 -521
- package/src/rack/access.spec.ts +0 -102
- package/src/rack/rack.spec.ts +0 -171
- package/src/ranger/access.spec.ts +0 -115
- package/src/ranger/alias/payload.spec.ts +0 -52
- package/src/ranger/ranger.spec.ts +0 -343
- package/src/schematic/access.spec.ts +0 -134
- package/src/schematic/actions.spec.ts +0 -699
- package/src/schematic/schematic.spec.ts +0 -340
- package/src/schematic/symbol/access.spec.ts +0 -172
- package/src/schematic/symbol/client.spec.ts +0 -160
- package/src/status/access.spec.ts +0 -129
- package/src/status/status.spec.ts +0 -448
- package/src/table/access.spec.ts +0 -128
- package/src/table/table.spec.ts +0 -651
- package/src/task/access.spec.ts +0 -131
- package/src/task/payload.spec.ts +0 -113
- package/src/task/task.spec.ts +0 -657
- package/src/user/access.spec.ts +0 -107
- package/src/user/user.spec.ts +0 -290
- package/src/util/retrieve.spec.ts +0 -49
- package/src/view/view.spec.ts +0 -165
- package/src/workspace/access.spec.ts +0 -108
- package/src/workspace/client.ts +0 -112
- package/src/workspace/types.gen.ts +0 -46
- package/src/workspace/workspace.spec.ts +0 -111
- package/tsconfig.json +0 -5
- package/tsconfig.vite.json +0 -4
- package/vite.config.ts +0 -29
- /package/dist/src/{workspace → project}/external.d.ts +0 -0
package/src/framer/frame.ts
CHANGED
|
@@ -26,6 +26,7 @@ import { UnexpectedError, ValidationError } from "@/errors";
|
|
|
26
26
|
|
|
27
27
|
type ColumnType = "key" | "name" | null;
|
|
28
28
|
|
|
29
|
+
/** A frame's shape without its samples, for logging and debugging. */
|
|
29
30
|
export interface Digest extends Record<channel.Key | channel.Name, SeriesDigest[]> {}
|
|
30
31
|
|
|
31
32
|
const columnType = (columns: channel.PrimitiveParams): ColumnType => {
|
|
@@ -53,6 +54,7 @@ const validateMatchedColsAndSeries = (
|
|
|
53
54
|
);
|
|
54
55
|
};
|
|
55
56
|
|
|
57
|
+
/** Anything {@link Frame}'s constructor accepts. */
|
|
56
58
|
export type CrudeFrame =
|
|
57
59
|
| Frame
|
|
58
60
|
| CrudePayload
|
|
@@ -108,7 +110,6 @@ export class Frame {
|
|
|
108
110
|
return;
|
|
109
111
|
}
|
|
110
112
|
|
|
111
|
-
// Construction from a map.
|
|
112
113
|
if (columnsOrData instanceof Map) {
|
|
113
114
|
columnsOrData.forEach((v, k) => this.push(k, ...array.toArray(v)));
|
|
114
115
|
return;
|
|
@@ -116,7 +117,6 @@ export class Frame {
|
|
|
116
117
|
|
|
117
118
|
const isObject = typeof columnsOrData === "object" && !Array.isArray(columnsOrData);
|
|
118
119
|
|
|
119
|
-
// Construction from a payload.
|
|
120
120
|
if (isObject) {
|
|
121
121
|
if ("keys" in columnsOrData && "series" in columnsOrData) {
|
|
122
122
|
const data_ = columnsOrData as Payload;
|
|
@@ -124,7 +124,8 @@ export class Frame {
|
|
|
124
124
|
data_.keys ??= [];
|
|
125
125
|
const series = data_.series.map((a) => seriesFromPayload(a));
|
|
126
126
|
validateMatchedColsAndSeries(data_.keys, series);
|
|
127
|
-
data_.keys.
|
|
127
|
+
this.columns = data_.keys.slice();
|
|
128
|
+
this.series = series;
|
|
128
129
|
} else
|
|
129
130
|
Object.entries(columnsOrData).forEach(([k, v]) => {
|
|
130
131
|
const key = parseInt(k, 10);
|
|
@@ -134,7 +135,6 @@ export class Frame {
|
|
|
134
135
|
return;
|
|
135
136
|
}
|
|
136
137
|
|
|
137
|
-
// Construction from a set of series and columns.
|
|
138
138
|
if (
|
|
139
139
|
Array.isArray(columnsOrData) ||
|
|
140
140
|
["string", "number"].includes(typeof columnsOrData)
|
|
@@ -197,9 +197,7 @@ export class Frame {
|
|
|
197
197
|
return unique.unique(this.names);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
/**
|
|
201
|
-
* @returns the unique columns in the frame.
|
|
202
|
-
*/
|
|
200
|
+
/** @returns the unique columns in the frame. */
|
|
203
201
|
get uniqueColumns(): channel.Key[] | channel.Name[] {
|
|
204
202
|
return this.colType === "key" ? this.uniqueKeys : this.uniqueNames;
|
|
205
203
|
}
|
|
@@ -246,8 +244,8 @@ export class Frame {
|
|
|
246
244
|
*/
|
|
247
245
|
get isWeaklyAligned(): boolean {
|
|
248
246
|
if (this.columns.length <= 1) return true;
|
|
249
|
-
const
|
|
250
|
-
return
|
|
247
|
+
const { timeRanges } = this;
|
|
248
|
+
return timeRanges.every((tr) => tr.equals(timeRanges[0]));
|
|
251
249
|
}
|
|
252
250
|
|
|
253
251
|
timeRange(col?: channel.Key | channel.Name): TimeRange {
|
|
@@ -288,19 +286,10 @@ export class Frame {
|
|
|
288
286
|
return new MultiSeries(this.series.filter((_, i) => this.columns[i] === key));
|
|
289
287
|
}
|
|
290
288
|
|
|
291
|
-
/**
|
|
292
|
-
* Pushes a set of series for the given channel onto the frame.
|
|
293
|
-
*
|
|
294
|
-
* @param key the channel key or name;
|
|
295
|
-
* @param v the series to push.
|
|
296
|
-
*/
|
|
289
|
+
/** Pushes a set of series for the given channel onto the frame. */
|
|
297
290
|
push(key: channel.Key | channel.Name, ...v: Series[]): void;
|
|
298
291
|
|
|
299
|
-
/**
|
|
300
|
-
* Pushes the frame onto the current frame.
|
|
301
|
-
*
|
|
302
|
-
* @param frame - the frame to push.
|
|
303
|
-
*/
|
|
292
|
+
/** Pushes the frame onto the current frame. */
|
|
304
293
|
push(frame: Frame): void;
|
|
305
294
|
|
|
306
295
|
push(keyOrFrame: channel.Key | channel.Name | Frame, ...v: Series[]): void {
|
|
@@ -348,8 +337,7 @@ export class Frame {
|
|
|
348
337
|
|
|
349
338
|
/**
|
|
350
339
|
* @returns a new frame containing the mapped output of the provided function.
|
|
351
|
-
* @param fn a function that takes a channel key and series and returns a
|
|
352
|
-
* boolean.
|
|
340
|
+
* @param fn a function that takes a channel key and series and returns a boolean.
|
|
353
341
|
*/
|
|
354
342
|
map(
|
|
355
343
|
fn: (
|
|
@@ -380,7 +368,6 @@ export class Frame {
|
|
|
380
368
|
|
|
381
369
|
/**
|
|
382
370
|
* Iterates over all series in the current frame.
|
|
383
|
-
*
|
|
384
371
|
* @param fn a function that takes a channel key and series.
|
|
385
372
|
*/
|
|
386
373
|
forEach(fn: (k: channel.Key | channel.Name, arr: Series, i: number) => void): void {
|
|
@@ -470,6 +457,7 @@ export class Frame {
|
|
|
470
457
|
}
|
|
471
458
|
}
|
|
472
459
|
|
|
460
|
+
/** Zod schema for a frame on the wire. */
|
|
473
461
|
export const frameZ = z.object({
|
|
474
462
|
keys: z.union([
|
|
475
463
|
z.null().transform<number[]>(() => []),
|
|
@@ -485,11 +473,13 @@ export interface Payload extends z.infer<typeof frameZ> {}
|
|
|
485
473
|
|
|
486
474
|
export interface CrudePayload extends z.input<typeof frameZ> {}
|
|
487
475
|
|
|
476
|
+
/** Rebuilds a {@link Series} from its wire form. */
|
|
488
477
|
export const seriesFromPayload = (series: SeriesPayload): Series => {
|
|
489
478
|
const { dataType, data, timeRange, alignment } = series;
|
|
490
479
|
return new Series({ data, dataType, timeRange, glBufferUsage: "static", alignment });
|
|
491
480
|
};
|
|
492
481
|
|
|
482
|
+
/** Reduces a {@link Series} to its wire form. */
|
|
493
483
|
export const seriesToPayload = (series: Series): SeriesPayload => ({
|
|
494
484
|
timeRange: series.timeRange,
|
|
495
485
|
dataType: series.dataType,
|
|
@@ -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(
|