@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
|
@@ -0,0 +1,340 @@
|
|
|
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
|
+
DataType,
|
|
13
|
+
math,
|
|
14
|
+
MultiSeries,
|
|
15
|
+
Series,
|
|
16
|
+
Size,
|
|
17
|
+
TimeRange,
|
|
18
|
+
type TimeSpan,
|
|
19
|
+
TimeStamp,
|
|
20
|
+
} from "@synnaxlabs/x";
|
|
21
|
+
|
|
22
|
+
import { IDENTITY_TRANSFORM, type Transform } from "@/framer/cache/transform";
|
|
23
|
+
|
|
24
|
+
/** Response from a write to the {@link Dynamic} cache. */
|
|
25
|
+
export interface WriteResponse {
|
|
26
|
+
/** Series flushed because the write did not fit in the current buffer. */
|
|
27
|
+
flushed: MultiSeries;
|
|
28
|
+
/** A list of series that were allocated during the write. */
|
|
29
|
+
allocated: MultiSeries;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Props for the {@link Dynamic} cache. */
|
|
33
|
+
export interface DynamicProps {
|
|
34
|
+
/**
|
|
35
|
+
* Sets the maximum size of the buffer that the cache will maintain before flushing
|
|
36
|
+
* data out to the caller.
|
|
37
|
+
*/
|
|
38
|
+
dynamicBufferSize: number | TimeSpan;
|
|
39
|
+
/** Applied to every series before it enters a buffer. Defaults to identity. */
|
|
40
|
+
transform?: Transform;
|
|
41
|
+
/** Used for logging. */
|
|
42
|
+
instrumentation?: alamos.Instrumentation;
|
|
43
|
+
/** Pulls the current time. */
|
|
44
|
+
now?: () => TimeStamp;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Bounds for dynamically calculated buffer sizes.
|
|
48
|
+
const MIN_SIZE = 100;
|
|
49
|
+
const MAX_SIZE = 1e6;
|
|
50
|
+
// Size used until enough writes have arrived to estimate a rate.
|
|
51
|
+
const DEF_SIZE = 1e4;
|
|
52
|
+
const MAX_DEF_WRITES = 100;
|
|
53
|
+
|
|
54
|
+
// Variable-rate types allocate bytes, not samples. Rough bytes-per-sample estimate.
|
|
55
|
+
const VARIABLE_DT_MULTIPLIER = 40;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @returns true when every byte of the series fits in the buffer's free space. Measured
|
|
59
|
+
* in bytes because a variable-length buffer counts its capacity that way.
|
|
60
|
+
*/
|
|
61
|
+
const fits = (buffer: Series, series: Series): boolean =>
|
|
62
|
+
series.byteLength.valueOf() <=
|
|
63
|
+
buffer.byteCapacity.valueOf() - buffer.byteLength.valueOf();
|
|
64
|
+
|
|
65
|
+
// Bounds on compacting a buffer that rotated early. Both have to trip: the fraction
|
|
66
|
+
// spares a nearly full buffer, the floor one whose waste is not worth a copy.
|
|
67
|
+
const COMPACT_MAX_FILL = 0.25;
|
|
68
|
+
const COMPACT_MIN_WASTE = Size.kilobytes(256);
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @returns true when copying the buffer's samples into a right-sized series is worth
|
|
72
|
+
* the copy. A held buffer never qualifies: the holder keeps the original alive, so a
|
|
73
|
+
* copy would only add a second allocation, and it would break the object identity a
|
|
74
|
+
* consumer that both reads and streams deduplicates on.
|
|
75
|
+
*/
|
|
76
|
+
const shouldCompact = (buffer: Series): boolean => {
|
|
77
|
+
if (buffer.refCount > 0 || buffer.length === 0) return false;
|
|
78
|
+
const used = buffer.byteLength.valueOf();
|
|
79
|
+
const capacity = buffer.byteCapacity.valueOf();
|
|
80
|
+
return (
|
|
81
|
+
capacity - used > COMPACT_MIN_WASTE.valueOf() && used < capacity * COMPACT_MAX_FILL
|
|
82
|
+
);
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* A cache for channel data that maintains a single, rolling Series as a buffer
|
|
87
|
+
* for channel data. The buffer's data type is derived from the first written series,
|
|
88
|
+
* so the cache needs no channel metadata.
|
|
89
|
+
*/
|
|
90
|
+
export class Dynamic {
|
|
91
|
+
private readonly props: Required<Omit<DynamicProps, "now">>;
|
|
92
|
+
|
|
93
|
+
private counter = 0;
|
|
94
|
+
private curr: Series | null = null;
|
|
95
|
+
/** End timestamp of the last fully written stamped series in the current buffer.
|
|
96
|
+
* Null when the buffer holds unstamped or partially written data, in which case
|
|
97
|
+
* the flush falls back to the wall clock. */
|
|
98
|
+
private currDataEnd: TimeStamp | null = null;
|
|
99
|
+
private avgRate: number = 0;
|
|
100
|
+
private timeOfLastWrite: TimeStamp;
|
|
101
|
+
private totalWrites: number = 0;
|
|
102
|
+
private readonly now: () => TimeStamp;
|
|
103
|
+
|
|
104
|
+
constructor(props: DynamicProps) {
|
|
105
|
+
const {
|
|
106
|
+
dynamicBufferSize,
|
|
107
|
+
transform = IDENTITY_TRANSFORM,
|
|
108
|
+
instrumentation = alamos.NOOP,
|
|
109
|
+
now = () => TimeStamp.now(),
|
|
110
|
+
} = props;
|
|
111
|
+
this.props = { dynamicBufferSize, transform, instrumentation };
|
|
112
|
+
this.now = now;
|
|
113
|
+
this.timeOfLastWrite = this.now();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** @returns the number of samples currently held in the cache. */
|
|
117
|
+
get length(): number {
|
|
118
|
+
return this.curr?.length ?? 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @returns the current buffer being written to by the cache. Under no circumstances
|
|
123
|
+
* should this be modified by the caller.
|
|
124
|
+
*/
|
|
125
|
+
get leadingBuffer(): Series | null {
|
|
126
|
+
return this.curr;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @returns the time range the buffer's samples actually cover: its start to the last
|
|
131
|
+
* stamped write, or the wall clock when the buffer holds unstamped data. Unlike the
|
|
132
|
+
* buffer's provisional time range, the end never claims future time. Null when there
|
|
133
|
+
* is no buffer.
|
|
134
|
+
*/
|
|
135
|
+
get dataTimeRange(): TimeRange | null {
|
|
136
|
+
if (this.curr == null) return null;
|
|
137
|
+
return new TimeRange(this.curr.timeRange.start, this.currDataEnd ?? this.now());
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* @returns a list of buffers that were filled by the cache during the write. If the
|
|
142
|
+
* current buffer is able to fit all writes, no buffers will be returned.
|
|
143
|
+
*/
|
|
144
|
+
write(series: MultiSeries): WriteResponse {
|
|
145
|
+
const res: WriteResponse = {
|
|
146
|
+
flushed: new MultiSeries([]),
|
|
147
|
+
allocated: new MultiSeries([]),
|
|
148
|
+
};
|
|
149
|
+
const list = series.series;
|
|
150
|
+
for (let i = 0; i < list.length; i++) this._write(list[i], res);
|
|
151
|
+
return res;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private allocate(
|
|
155
|
+
capacity: number,
|
|
156
|
+
alignment: bigint,
|
|
157
|
+
start: TimeStamp,
|
|
158
|
+
source: Series,
|
|
159
|
+
): Series {
|
|
160
|
+
this.counter++;
|
|
161
|
+
const dt = this.props.transform.resolveDataType(source.dataType);
|
|
162
|
+
// Bigint series narrowed to a non-bigint buffer store each value as a small delta
|
|
163
|
+
// off a per-buffer anchor to avoid losing precision. For timestamps, now() is
|
|
164
|
+
// close enough to the values being written. For int64 and uint64 the values can
|
|
165
|
+
// be anything, so the first sample we see is used as the anchor.
|
|
166
|
+
const narrowing = source.dataType.usesBigInt && !dt.usesBigInt;
|
|
167
|
+
let sampleOffset: math.Numeric = 0;
|
|
168
|
+
if (narrowing)
|
|
169
|
+
if (source.dataType.equals(DataType.TIMESTAMP)) sampleOffset = start.valueOf();
|
|
170
|
+
else if (source.length > 0) sampleOffset = BigInt(source.data[0].valueOf());
|
|
171
|
+
return Series.alloc({
|
|
172
|
+
capacity: dt.isVariable ? capacity * VARIABLE_DT_MULTIPLIER : capacity,
|
|
173
|
+
dataType: dt,
|
|
174
|
+
timeRange: start.range(TimeStamp.MAX),
|
|
175
|
+
sampleOffset,
|
|
176
|
+
glBufferUsage: "dynamic",
|
|
177
|
+
alignment,
|
|
178
|
+
key: `dynamic-${this.counter}`,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* @returns the sample capacity for a buffer that must hold the given series whole:
|
|
184
|
+
* the configured size, or the series' own size when that is larger.
|
|
185
|
+
*/
|
|
186
|
+
private capacityFor(source: Series): number {
|
|
187
|
+
const dt = this.props.transform.resolveDataType(source.dataType);
|
|
188
|
+
const required = dt.isVariable
|
|
189
|
+
? Math.ceil(source.byteLength.valueOf() / VARIABLE_DT_MULTIPLIER)
|
|
190
|
+
: source.length;
|
|
191
|
+
return Math.max(this.nextBufferSize(), required);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Unstamped series (virtual channels, writes without an in-frame index) fall back
|
|
195
|
+
// to the wall clock.
|
|
196
|
+
private allocStart(series: Series): TimeStamp {
|
|
197
|
+
return series.timeRange.isZero ? this.now() : series.timeRange.start;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private allocCurr(
|
|
201
|
+
res: WriteResponse,
|
|
202
|
+
source: Series,
|
|
203
|
+
start: TimeStamp | null,
|
|
204
|
+
): Series {
|
|
205
|
+
this.curr = this.allocate(
|
|
206
|
+
this.capacityFor(source),
|
|
207
|
+
source.alignment,
|
|
208
|
+
start ?? this.allocStart(source),
|
|
209
|
+
source,
|
|
210
|
+
);
|
|
211
|
+
res.allocated.push(this.curr);
|
|
212
|
+
return this.curr;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** @returns the timestamp the flushed buffer's end was stamped with, or null when
|
|
216
|
+
* there was no buffer. */
|
|
217
|
+
private flushCurr(res: WriteResponse): TimeStamp | null {
|
|
218
|
+
if (this.curr == null) return null;
|
|
219
|
+
const end = this.currDataEnd ?? this.now();
|
|
220
|
+
this.curr.timeRange.end = end;
|
|
221
|
+
this.currDataEnd = null;
|
|
222
|
+
res.flushed.push(this.compacted(this.curr, res));
|
|
223
|
+
this.curr = null;
|
|
224
|
+
return end;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* @returns a right-sized copy of a buffer that rotated with most of its space
|
|
229
|
+
* unused, or the buffer itself. A rotated buffer holds its whole allocation until
|
|
230
|
+
* it is collected, which is wasteful when an oversized series ended it early.
|
|
231
|
+
*/
|
|
232
|
+
private compacted(buffer: Series, res: WriteResponse): Series {
|
|
233
|
+
// A buffer allocated during this same write has not reached its subscribers yet,
|
|
234
|
+
// so its reference count cannot yet report who is about to hold it.
|
|
235
|
+
if (!shouldCompact(buffer) || res.allocated.series.includes(buffer)) return buffer;
|
|
236
|
+
return buffer.compact();
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
private _write(series: Series, res: WriteResponse): void {
|
|
240
|
+
const { transform, instrumentation: ins } = this.props;
|
|
241
|
+
if (this.curr != null) {
|
|
242
|
+
const resolved = transform.resolveDataType(series.dataType);
|
|
243
|
+
if (!this.curr.dataType.equals(resolved)) {
|
|
244
|
+
// The channel's data type changed (e.g. a calculated channel was reconfigured).
|
|
245
|
+
ins.L.warn("buffer data type changed, resetting", {
|
|
246
|
+
prev: this.curr.dataType.toString(),
|
|
247
|
+
next: resolved.toString(),
|
|
248
|
+
});
|
|
249
|
+
this.flushCurr(res);
|
|
250
|
+
} else if (series.alignment < this.curr.alignment) {
|
|
251
|
+
// The alignment counter rewound (e.g. the Core restarted and reset its
|
|
252
|
+
// in-memory counter).
|
|
253
|
+
ins.L.warn("alignment regressed, resetting buffer", {
|
|
254
|
+
buffer: this.curr.alignment.toString(),
|
|
255
|
+
incoming: series.alignment.toString(),
|
|
256
|
+
});
|
|
257
|
+
this.flushCurr(res);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
let curr = this.curr;
|
|
261
|
+
let trimmed = false;
|
|
262
|
+
if (curr != null) {
|
|
263
|
+
// overlap > 0: the incoming series steps back into samples the current buffer
|
|
264
|
+
// already holds. overlap < 0: there is a gap between the buffer and the series.
|
|
265
|
+
const overlap = Number(curr.alignment + BigInt(curr.length) - series.alignment);
|
|
266
|
+
if (overlap > 0) {
|
|
267
|
+
// Drop the re-sent leading samples; a fresh allocation here would fragment
|
|
268
|
+
// the cache with overlapping series. sub() is zero-copy.
|
|
269
|
+
if (overlap >= series.length) return;
|
|
270
|
+
series = series.sub(overlap);
|
|
271
|
+
trimmed = true;
|
|
272
|
+
} else if (overlap < 0) {
|
|
273
|
+
this.flushCurr(res);
|
|
274
|
+
curr = null;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const convert = (buffer: Series): Series =>
|
|
278
|
+
transform.convert(series, buffer.sampleOffset);
|
|
279
|
+
let rotationStart: TimeStamp | null = null;
|
|
280
|
+
if (curr != null) {
|
|
281
|
+
const converted = convert(curr);
|
|
282
|
+
// A series never splits across two buffers. The timestamp where a split falls is
|
|
283
|
+
// not in the data, so both sides would have to guess the boundary they share, and
|
|
284
|
+
// a guess lands outside the data whenever samples are irregular.
|
|
285
|
+
if (fits(curr, converted)) curr.write(converted);
|
|
286
|
+
else {
|
|
287
|
+
const end = this.flushCurr(res);
|
|
288
|
+
// A trimmed series keeps the whole frame's start, which is earlier than the
|
|
289
|
+
// samples it still holds. Those samples begin where the buffer they were
|
|
290
|
+
// trimmed against ends, so the next buffer starts there.
|
|
291
|
+
if (trimmed) rotationStart = end;
|
|
292
|
+
curr = null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (curr == null) {
|
|
296
|
+
curr = this.allocCurr(res, series, rotationStart);
|
|
297
|
+
curr.write(convert(curr));
|
|
298
|
+
}
|
|
299
|
+
this.currDataEnd = series.timeRange.isZero ? null : series.timeRange.end;
|
|
300
|
+
this.updateAvgRate(series);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
private updateAvgRate(series: Series): void {
|
|
304
|
+
if (typeof this.props.dynamicBufferSize === "number") return;
|
|
305
|
+
const now = this.now();
|
|
306
|
+
const newRate = series.length / now.span(this.timeOfLastWrite).seconds;
|
|
307
|
+
if (this.totalWrites > 0 && isFinite(newRate) && newRate > 0)
|
|
308
|
+
this.avgRate =
|
|
309
|
+
(this.avgRate * (this.totalWrites - 1) + newRate) / this.totalWrites;
|
|
310
|
+
this.totalWrites++;
|
|
311
|
+
this.timeOfLastWrite = now;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
private nextBufferSize(): number {
|
|
315
|
+
const { dynamicBufferSize } = this.props;
|
|
316
|
+
if (typeof dynamicBufferSize === "number") return dynamicBufferSize;
|
|
317
|
+
if (this.totalWrites < MAX_DEF_WRITES) return DEF_SIZE;
|
|
318
|
+
const size = math.roundToNearestMagnitude(this.avgRate * dynamicBufferSize.seconds);
|
|
319
|
+
return Math.round(Math.max(Math.min(size, MAX_SIZE), MIN_SIZE));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Flushes the leading buffer, stamping its end with the last stamped write or
|
|
324
|
+
* the wall clock.
|
|
325
|
+
* @returns the flushed buffer, or null when there is none.
|
|
326
|
+
*/
|
|
327
|
+
flush(): Series | null {
|
|
328
|
+
const res: WriteResponse = {
|
|
329
|
+
flushed: new MultiSeries([]),
|
|
330
|
+
allocated: new MultiSeries([]),
|
|
331
|
+
};
|
|
332
|
+
this.flushCurr(res);
|
|
333
|
+
return res.flushed.series[0] ?? null;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** Closes the cache. It must not be used afterwards. */
|
|
337
|
+
close(): void {
|
|
338
|
+
this.curr = null;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
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 { Unreachable } from "@synnaxlabs/freighter";
|
|
11
|
+
import {
|
|
12
|
+
debounce,
|
|
13
|
+
errors,
|
|
14
|
+
MultiSeries,
|
|
15
|
+
type Series,
|
|
16
|
+
TimeRange,
|
|
17
|
+
TimeSpan,
|
|
18
|
+
} from "@synnaxlabs/x";
|
|
19
|
+
|
|
20
|
+
import { type channel } from "@/channel";
|
|
21
|
+
import { UnexpectedError } from "@/errors";
|
|
22
|
+
import { type Cache } from "@/framer/cache/cache";
|
|
23
|
+
import { type Frame } from "@/framer/frame";
|
|
24
|
+
|
|
25
|
+
/** A function that reads a telemetry frame from the Synnax cluster. */
|
|
26
|
+
export interface RemoteReader {
|
|
27
|
+
(tr: TimeRange, keys: channel.Key[]): Promise<Frame>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface ReadRequest {
|
|
31
|
+
channel: channel.Key;
|
|
32
|
+
gaps: TimeRange[];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Tracks one read's outstanding fetches, so the read settles when its last fetch lands.
|
|
36
|
+
// The first failure among them wins.
|
|
37
|
+
interface Tracker {
|
|
38
|
+
entry: debounce.Entry<ReadRequest>;
|
|
39
|
+
remaining: number;
|
|
40
|
+
failure?: unknown;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface BatchFetch {
|
|
44
|
+
gap: TimeRange;
|
|
45
|
+
channels: Set<channel.Key>;
|
|
46
|
+
trackers: Set<Tracker>;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ReaderProps {
|
|
50
|
+
/** Function used to read remote data from the server. */
|
|
51
|
+
readRemote: RemoteReader;
|
|
52
|
+
/** Will read from and populate the given cache with fetched data. */
|
|
53
|
+
cache: Cache;
|
|
54
|
+
/**
|
|
55
|
+
* Used to batch read requests to the server to minimize traffic. The window is not
|
|
56
|
+
* extended by later reads, so it is also the maximum wait before a batch fires.
|
|
57
|
+
* @default TimeSpan.milliseconds(50)
|
|
58
|
+
*/
|
|
59
|
+
batchDebounce?: TimeSpan;
|
|
60
|
+
/**
|
|
61
|
+
* Reads whose gap time ranges are within this threshold merge into one request.
|
|
62
|
+
* @default TimeSpan.milliseconds(5)
|
|
63
|
+
*/
|
|
64
|
+
overlapThreshold?: TimeSpan;
|
|
65
|
+
/**
|
|
66
|
+
* Deadline for a single remote fetch. A fetch that does not settle within it rejects
|
|
67
|
+
* the reads it serves with an Unreachable error.
|
|
68
|
+
* @default TimeSpan.seconds(30)
|
|
69
|
+
*/
|
|
70
|
+
fetchTimeout?: TimeSpan;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Reads historical telemetry, serving from the cache and batch-filling gaps from the
|
|
75
|
+
* server. A fetch failure rejects only the reads whose gaps were in the failed fetch.
|
|
76
|
+
*/
|
|
77
|
+
export class Reader {
|
|
78
|
+
private readonly props: Required<Omit<ReaderProps, "batchDebounce">>;
|
|
79
|
+
private readonly batcher: debounce.Batcher<ReadRequest>;
|
|
80
|
+
private closed = false;
|
|
81
|
+
// Reads whose fetches are in flight, so close can reject them without waiting on the
|
|
82
|
+
// fetches themselves.
|
|
83
|
+
private readonly inFlight = new Set<Tracker>();
|
|
84
|
+
|
|
85
|
+
constructor(props: ReaderProps) {
|
|
86
|
+
const {
|
|
87
|
+
readRemote,
|
|
88
|
+
cache,
|
|
89
|
+
batchDebounce = TimeSpan.milliseconds(50),
|
|
90
|
+
overlapThreshold = TimeSpan.milliseconds(5),
|
|
91
|
+
fetchTimeout = TimeSpan.seconds(30),
|
|
92
|
+
} = props;
|
|
93
|
+
this.props = { readRemote, cache, overlapThreshold, fetchTimeout };
|
|
94
|
+
this.batcher = new debounce.Batcher({
|
|
95
|
+
interval: batchDebounce,
|
|
96
|
+
exec: async (entries) => {
|
|
97
|
+
if (this.closed) throw new UnexpectedError("telemetry reader is closed");
|
|
98
|
+
await this.batchRead(entries);
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Reads the given time range for the given channel.
|
|
105
|
+
* @throws {UnexpectedError} if the reader is closed while the read is pending.
|
|
106
|
+
* @throws {Unreachable} if a fetch serving the read exceeds the fetch timeout.
|
|
107
|
+
*/
|
|
108
|
+
async read(tr: TimeRange, channel: channel.Key): Promise<MultiSeries> {
|
|
109
|
+
const { cache } = this.props;
|
|
110
|
+
const unary = cache.get(channel);
|
|
111
|
+
const { series, gaps } = unary.read(tr);
|
|
112
|
+
if (gaps.length === 0) return series;
|
|
113
|
+
if (this.closed) throw new UnexpectedError("telemetry reader is closed");
|
|
114
|
+
await this.batcher.enqueue({ channel, gaps });
|
|
115
|
+
return unary.read(tr).series;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private async batchRead(entries: Array<debounce.Entry<ReadRequest>>): Promise<void> {
|
|
119
|
+
const { cache, overlapThreshold } = this.props;
|
|
120
|
+
const batched: BatchFetch[] = [];
|
|
121
|
+
const trackers = new Map<debounce.Entry<ReadRequest>, Tracker>();
|
|
122
|
+
entries.forEach((entry) => {
|
|
123
|
+
const unary = cache.get(entry.req.channel);
|
|
124
|
+
entry.req.gaps.forEach((rawGap) => {
|
|
125
|
+
// An earlier batch or a streaming write may have filled part of the gap while
|
|
126
|
+
// this entry sat in the debounce window.
|
|
127
|
+
unary.read(rawGap).gaps.forEach((gap) => {
|
|
128
|
+
let tracker = trackers.get(entry);
|
|
129
|
+
if (tracker == null) {
|
|
130
|
+
tracker = { entry, remaining: 0 };
|
|
131
|
+
trackers.set(entry, tracker);
|
|
132
|
+
this.inFlight.add(tracker);
|
|
133
|
+
}
|
|
134
|
+
const g = batched.find((r) => r.gap.equals(gap, overlapThreshold));
|
|
135
|
+
if (g == null) {
|
|
136
|
+
batched.push({
|
|
137
|
+
gap,
|
|
138
|
+
channels: new Set([entry.req.channel]),
|
|
139
|
+
trackers: new Set([tracker]),
|
|
140
|
+
});
|
|
141
|
+
tracker.remaining++;
|
|
142
|
+
} else {
|
|
143
|
+
g.channels.add(entry.req.channel);
|
|
144
|
+
g.gap = TimeRange.max(g.gap, gap);
|
|
145
|
+
if (!g.trackers.has(tracker)) {
|
|
146
|
+
g.trackers.add(tracker);
|
|
147
|
+
tracker.remaining++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
entries.forEach((entry) => {
|
|
154
|
+
if (!trackers.has(entry)) entry.resolve();
|
|
155
|
+
});
|
|
156
|
+
await Promise.all(batched.map(async (b) => await this.fetchGap(b)));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Never throws: every outcome, including a deadline expiry and a post-close arrival,
|
|
160
|
+
// settles through the trackers.
|
|
161
|
+
private async fetchGap({ gap, channels, trackers }: BatchFetch): Promise<void> {
|
|
162
|
+
const { cache } = this.props;
|
|
163
|
+
let failure: unknown;
|
|
164
|
+
try {
|
|
165
|
+
const frame = await this.fetchWithDeadline(gap, Array.from(channels));
|
|
166
|
+
if (!this.closed) {
|
|
167
|
+
// Group series by key in one pass; per-key get() scans the whole frame.
|
|
168
|
+
const grouped = new Map<channel.Key, Series[]>();
|
|
169
|
+
frame.forEach((k, s) => {
|
|
170
|
+
const key = k as channel.Key;
|
|
171
|
+
const existing = grouped.get(key);
|
|
172
|
+
if (existing == null) grouped.set(key, [s]);
|
|
173
|
+
else existing.push(s);
|
|
174
|
+
});
|
|
175
|
+
channels.forEach((key) =>
|
|
176
|
+
cache.get(key).writeStatic(new MultiSeries(grouped.get(key) ?? [])),
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
} catch (err) {
|
|
180
|
+
failure = err;
|
|
181
|
+
}
|
|
182
|
+
trackers.forEach((tracker) => {
|
|
183
|
+
// close() already settled it.
|
|
184
|
+
if (!this.inFlight.has(tracker)) return;
|
|
185
|
+
if (failure != null) tracker.failure ??= failure;
|
|
186
|
+
tracker.remaining--;
|
|
187
|
+
if (tracker.remaining > 0) return;
|
|
188
|
+
this.inFlight.delete(tracker);
|
|
189
|
+
if (tracker.failure == null) tracker.entry.resolve();
|
|
190
|
+
else tracker.entry.reject(tracker.failure);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private async fetchWithDeadline(
|
|
195
|
+
gap: TimeRange,
|
|
196
|
+
channels: channel.Key[],
|
|
197
|
+
): Promise<Frame> {
|
|
198
|
+
const { readRemote, fetchTimeout } = this.props;
|
|
199
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
200
|
+
const deadline = new Promise<never>((_, reject) => {
|
|
201
|
+
timer = setTimeout(() => {
|
|
202
|
+
const timeout = fetchTimeout.toString();
|
|
203
|
+
const message = `gap read for ${gap.toString()} timed out after ${timeout}`;
|
|
204
|
+
reject(new Unreachable({ message }));
|
|
205
|
+
}, fetchTimeout.milliseconds);
|
|
206
|
+
});
|
|
207
|
+
const fetched = readRemote(gap, channels);
|
|
208
|
+
try {
|
|
209
|
+
return await Promise.race([fetched, deadline]);
|
|
210
|
+
} catch (err) {
|
|
211
|
+
// The read already failed for its callers; a late settle of the losing fetch must
|
|
212
|
+
// not surface as an unhandled rejection.
|
|
213
|
+
fetched.catch(() => {});
|
|
214
|
+
throw errors.fromUnknown(err);
|
|
215
|
+
} finally {
|
|
216
|
+
clearTimeout(timer);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Closes the reader, rejecting every pending read with an UnexpectedError. In-flight
|
|
222
|
+
* fetch results are discarded when they arrive.
|
|
223
|
+
*/
|
|
224
|
+
async close(): Promise<void> {
|
|
225
|
+
this.closed = true;
|
|
226
|
+
const err = new UnexpectedError("telemetry reader is closed");
|
|
227
|
+
this.batcher.close(err);
|
|
228
|
+
this.inFlight.forEach(({ entry }) => entry.reject(err));
|
|
229
|
+
this.inFlight.clear();
|
|
230
|
+
}
|
|
231
|
+
}
|