@synnaxlabs/client 0.56.1 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-B08VDLSA.js +14463 -0
- package/dist/client-B08VDLSA.js.map +1 -0
- package/dist/client.js +1128 -14876
- package/dist/client.js.map +1 -0
- package/dist/src/access/client.d.ts +10 -1
- package/dist/src/access/client.d.ts.map +1 -1
- package/dist/src/access/enforce.d.ts.map +1 -1
- package/dist/src/access/external.d.ts +1 -0
- package/dist/src/access/external.d.ts.map +1 -1
- package/dist/src/access/granted.d.ts +39 -0
- package/dist/src/access/granted.d.ts.map +1 -0
- package/dist/src/access/policy/client.d.ts +136 -147
- package/dist/src/access/policy/client.d.ts.map +1 -1
- package/dist/src/access/policy/types.gen.d.ts +15 -68
- package/dist/src/access/policy/types.gen.d.ts.map +1 -1
- package/dist/src/access/role/client.d.ts +77 -58
- package/dist/src/access/role/client.d.ts.map +1 -1
- package/dist/src/access/role/types.gen.d.ts +8 -14
- package/dist/src/access/role/types.gen.d.ts.map +1 -1
- package/dist/src/actions/actions.d.ts +5 -6
- package/dist/src/actions/actions.d.ts.map +1 -1
- package/dist/src/actions/controller.d.ts +194 -0
- package/dist/src/actions/controller.d.ts.map +1 -0
- package/dist/src/actions/external.d.ts +1 -0
- package/dist/src/actions/external.d.ts.map +1 -1
- package/dist/src/arc/actions.d.ts +575 -0
- package/dist/src/arc/actions.d.ts.map +1 -0
- package/dist/src/arc/actions.gen.d.ts +1439 -0
- package/dist/src/arc/actions.gen.d.ts.map +1 -0
- package/dist/src/arc/client.d.ts +97 -13
- package/dist/src/arc/client.d.ts.map +1 -1
- package/dist/src/arc/compiler/types.gen.d.ts +3 -3
- package/dist/src/arc/compiler/types.gen.d.ts.map +1 -1
- package/dist/src/arc/external.d.ts +2 -0
- package/dist/src/arc/external.d.ts.map +1 -1
- package/dist/src/arc/graph/types.gen.d.ts +45 -597
- package/dist/src/arc/graph/types.gen.d.ts.map +1 -1
- package/dist/src/arc/ir/index.d.ts +1 -1
- package/dist/src/arc/ir/index.d.ts.map +1 -1
- package/dist/src/arc/ir/ir.d.ts +2 -0
- package/dist/src/arc/ir/ir.d.ts.map +1 -0
- package/dist/src/arc/ir/types.gen.d.ts +58 -2807
- package/dist/src/arc/ir/types.gen.d.ts.map +1 -1
- package/dist/src/arc/module/types.gen.d.ts +18 -1090
- package/dist/src/arc/module/types.gen.d.ts.map +1 -1
- package/dist/src/arc/program/types.gen.d.ts +18 -1090
- package/dist/src/arc/program/types.gen.d.ts.map +1 -1
- package/dist/src/arc/text/types.gen.d.ts +54 -1
- package/dist/src/arc/text/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types/types.gen.d.ts +35 -153
- package/dist/src/arc/types/types.gen.d.ts.map +1 -1
- package/dist/src/arc/types.gen.d.ts +98 -2278
- package/dist/src/arc/types.gen.d.ts.map +1 -1
- package/dist/src/auth/auth.d.ts +14 -2
- package/dist/src/auth/auth.d.ts.map +1 -1
- package/dist/src/channel/client.d.ts +113 -75
- package/dist/src/channel/client.d.ts.map +1 -1
- package/dist/src/channel/external.d.ts +0 -1
- package/dist/src/channel/external.d.ts.map +1 -1
- package/dist/src/channel/payload.d.ts +65 -56
- package/dist/src/channel/payload.d.ts.map +1 -1
- package/dist/src/channel/types.gen.d.ts +26 -73
- package/dist/src/channel/types.gen.d.ts.map +1 -1
- package/dist/src/channel/writer.d.ts +1 -3
- package/dist/src/channel/writer.d.ts.map +1 -1
- package/dist/src/client.d.ts +55 -27
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/connection/client.d.ts +146 -0
- package/dist/src/connection/client.d.ts.map +1 -0
- package/dist/src/connection/external.d.ts +3 -0
- package/dist/src/connection/external.d.ts.map +1 -0
- package/dist/src/connection/index.d.ts +1 -1
- package/dist/src/connection/index.d.ts.map +1 -1
- package/dist/src/connection/status.d.ts +252 -0
- package/dist/src/connection/status.d.ts.map +1 -0
- package/dist/src/control/client.d.ts +31 -7
- package/dist/src/control/client.d.ts.map +1 -1
- package/dist/src/control/state.d.ts +47 -16
- package/dist/src/control/state.d.ts.map +1 -1
- package/dist/src/device/client.d.ts +59 -17
- package/dist/src/device/client.d.ts.map +1 -1
- package/dist/src/device/types.gen.d.ts +17 -67
- package/dist/src/device/types.gen.d.ts.map +1 -1
- package/dist/src/errors.d.ts +17 -20
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/ethercat/external.d.ts +2 -0
- package/dist/src/ethercat/external.d.ts.map +1 -0
- package/dist/src/ethercat/index.d.ts +2 -0
- package/dist/src/ethercat/index.d.ts.map +1 -0
- package/dist/src/ethercat/types.gen.d.ts +243 -0
- package/dist/src/ethercat/types.gen.d.ts.map +1 -0
- package/dist/src/framer/adapter.d.ts +8 -5
- package/dist/src/framer/adapter.d.ts.map +1 -1
- package/dist/src/framer/benchutil.d.ts +19 -0
- package/dist/src/framer/benchutil.d.ts.map +1 -0
- package/dist/src/framer/cache/cache.d.ts +38 -0
- package/dist/src/framer/cache/cache.d.ts.map +1 -0
- package/dist/src/framer/cache/dynamic.d.ts +71 -0
- package/dist/src/framer/cache/dynamic.d.ts.map +1 -0
- package/dist/src/framer/cache/reader.d.ts +43 -0
- package/dist/src/framer/cache/reader.d.ts.map +1 -0
- package/dist/src/framer/cache/static.d.ts +66 -0
- package/dist/src/framer/cache/static.d.ts.map +1 -0
- package/dist/src/framer/cache/streamer.d.ts +86 -0
- package/dist/src/framer/cache/streamer.d.ts.map +1 -0
- package/dist/src/framer/cache/transform.d.ts +18 -0
- package/dist/src/framer/cache/transform.d.ts.map +1 -0
- package/dist/src/framer/cache/unary.d.ts +37 -0
- package/dist/src/framer/cache/unary.d.ts.map +1 -0
- package/dist/src/framer/client.d.ts +35 -14
- package/dist/src/framer/client.d.ts.map +1 -1
- package/dist/src/framer/codec.d.ts.map +1 -1
- package/dist/src/framer/deleter.d.ts +3 -2
- package/dist/src/framer/deleter.d.ts.map +1 -1
- package/dist/src/framer/external.d.ts +6 -0
- package/dist/src/framer/external.d.ts.map +1 -1
- package/dist/src/framer/feed.d.ts +40 -0
- package/dist/src/framer/feed.d.ts.map +1 -0
- package/dist/src/framer/frame.d.ts +16 -20
- package/dist/src/framer/frame.d.ts.map +1 -1
- package/dist/src/framer/hardened.d.ts +70 -0
- package/dist/src/framer/hardened.d.ts.map +1 -0
- package/dist/src/framer/iterator.d.ts +36 -43
- package/dist/src/framer/iterator.d.ts.map +1 -1
- package/dist/src/framer/reader.d.ts +3 -2
- package/dist/src/framer/reader.d.ts.map +1 -1
- package/dist/src/framer/streamer.d.ts +132 -205
- package/dist/src/framer/streamer.d.ts.map +1 -1
- package/dist/src/framer/writer.d.ts +130 -161
- package/dist/src/framer/writer.d.ts.map +1 -1
- package/dist/src/group/client.d.ts +66 -9
- package/dist/src/group/client.d.ts.map +1 -1
- package/dist/src/group/types.gen.d.ts +2 -2
- package/dist/src/http/external.d.ts +2 -0
- package/dist/src/http/external.d.ts.map +1 -0
- package/dist/src/http/index.d.ts +2 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/types.gen.d.ts +451 -0
- package/dist/src/http/types.gen.d.ts.map +1 -0
- package/dist/src/imex/client.d.ts +88 -0
- package/dist/src/imex/client.d.ts.map +1 -0
- package/dist/src/imex/index.d.ts +2 -0
- package/dist/src/imex/index.d.ts.map +1 -0
- package/dist/src/index.d.ts +18 -5
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/label/client.d.ts +55 -36
- package/dist/src/label/client.d.ts.map +1 -1
- package/dist/src/label/external.d.ts +2 -0
- package/dist/src/label/external.d.ts.map +1 -1
- package/dist/src/label/payload.d.ts +4 -46
- package/dist/src/label/payload.d.ts.map +1 -1
- package/dist/src/label/store.d.ts +8 -0
- package/dist/src/label/store.d.ts.map +1 -0
- package/dist/src/label/types.gen.d.ts +45 -0
- package/dist/src/label/types.gen.d.ts.map +1 -0
- package/dist/src/labjack/external.d.ts +2 -0
- package/dist/src/labjack/external.d.ts.map +1 -0
- package/dist/src/labjack/index.d.ts +2 -0
- package/dist/src/labjack/index.d.ts.map +1 -0
- package/dist/src/labjack/types.gen.d.ts +442 -0
- package/dist/src/labjack/types.gen.d.ts.map +1 -0
- package/dist/src/lineplot/actions.d.ts +914 -0
- package/dist/src/lineplot/actions.d.ts.map +1 -0
- package/dist/src/lineplot/actions.gen.d.ts +4208 -0
- package/dist/src/lineplot/actions.gen.d.ts.map +1 -0
- package/dist/src/lineplot/client.d.ts +66 -16
- package/dist/src/lineplot/client.d.ts.map +1 -1
- package/dist/src/lineplot/external.d.ts +3 -0
- package/dist/src/lineplot/external.d.ts.map +1 -1
- package/dist/src/lineplot/line.d.ts +16 -0
- package/dist/src/lineplot/line.d.ts.map +1 -0
- package/dist/src/lineplot/types.gen.d.ts +837 -14
- package/dist/src/lineplot/types.gen.d.ts.map +1 -1
- package/dist/src/log/actions.d.ts +271 -0
- package/dist/src/log/actions.d.ts.map +1 -0
- package/dist/src/log/actions.gen.d.ts +1529 -0
- package/dist/src/log/actions.gen.d.ts.map +1 -0
- package/dist/src/log/client.d.ts +66 -16
- package/dist/src/log/client.d.ts.map +1 -1
- package/dist/src/log/external.d.ts +2 -0
- package/dist/src/log/external.d.ts.map +1 -1
- package/dist/src/log/types.gen.d.ts +139 -14
- package/dist/src/log/types.gen.d.ts.map +1 -1
- package/dist/src/modbus/external.d.ts +2 -0
- package/dist/src/modbus/external.d.ts.map +1 -0
- package/dist/src/modbus/index.d.ts +2 -0
- package/dist/src/modbus/index.d.ts.map +1 -0
- package/dist/src/modbus/types.gen.d.ts +280 -0
- package/dist/src/modbus/types.gen.d.ts.map +1 -0
- package/dist/src/ni/external.d.ts +2 -0
- package/dist/src/ni/external.d.ts.map +1 -0
- package/dist/src/ni/index.d.ts +2 -0
- package/dist/src/ni/index.d.ts.map +1 -0
- package/dist/src/ni/types.gen.d.ts +21029 -0
- package/dist/src/ni/types.gen.d.ts.map +1 -0
- package/dist/src/node/index.d.ts +2 -0
- package/dist/src/node/index.d.ts.map +1 -0
- package/dist/src/node/types.gen.d.ts +4 -0
- package/dist/src/node/types.gen.d.ts.map +1 -0
- package/dist/src/ontology/client.d.ts +314 -67
- package/dist/src/ontology/client.d.ts.map +1 -1
- package/dist/src/ontology/external.d.ts +1 -0
- package/dist/src/ontology/external.d.ts.map +1 -1
- package/dist/src/ontology/payload.d.ts +60 -18
- package/dist/src/ontology/payload.d.ts.map +1 -1
- package/dist/src/ontology/store.d.ts +32 -0
- package/dist/src/ontology/store.d.ts.map +1 -0
- package/dist/src/ontology/types.gen.d.ts +3 -2
- package/dist/src/ontology/types.gen.d.ts.map +1 -1
- package/dist/src/ontology/writer.d.ts +16 -10
- package/dist/src/ontology/writer.d.ts.map +1 -1
- package/dist/src/opcua/external.d.ts +2 -0
- package/dist/src/opcua/external.d.ts.map +1 -0
- package/dist/src/opcua/index.d.ts +2 -0
- package/dist/src/opcua/index.d.ts.map +1 -0
- package/dist/src/opcua/types.gen.d.ts +82 -0
- package/dist/src/opcua/types.gen.d.ts.map +1 -0
- package/dist/src/pagerduty/external.d.ts +2 -0
- package/dist/src/pagerduty/external.d.ts.map +1 -0
- package/dist/src/pagerduty/index.d.ts +2 -0
- package/dist/src/pagerduty/index.d.ts.map +1 -0
- package/dist/src/pagerduty/types.gen.d.ts +30 -0
- package/dist/src/pagerduty/types.gen.d.ts.map +1 -0
- package/dist/src/panel/actions.d.ts +273 -0
- package/dist/src/panel/actions.d.ts.map +1 -0
- package/dist/src/panel/actions.gen.d.ts +1255 -0
- package/dist/src/panel/actions.gen.d.ts.map +1 -0
- package/dist/src/panel/client.d.ts +148 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/external.d.ts +6 -0
- package/dist/src/panel/external.d.ts.map +1 -0
- package/dist/src/panel/index.d.ts +2 -0
- package/dist/src/panel/index.d.ts.map +1 -0
- package/dist/src/panel/tree.d.ts +50 -0
- package/dist/src/panel/tree.d.ts.map +1 -0
- package/dist/src/panel/types.gen.d.ts +370 -0
- package/dist/src/panel/types.gen.d.ts.map +1 -0
- package/dist/src/project/client.d.ts +89 -0
- package/dist/src/project/client.d.ts.map +1 -0
- package/dist/src/project/external.d.ts.map +1 -0
- package/dist/src/project/index.d.ts +2 -0
- package/dist/src/project/index.d.ts.map +1 -0
- package/dist/src/project/types.gen.d.ts +27 -0
- package/dist/src/project/types.gen.d.ts.map +1 -0
- package/dist/src/query/cache.d.ts +132 -0
- package/dist/src/query/cache.d.ts.map +1 -0
- package/dist/src/query/deleted.d.ts +20 -0
- package/dist/src/query/deleted.d.ts.map +1 -0
- package/dist/src/query/derived.d.ts +33 -0
- package/dist/src/query/derived.d.ts.map +1 -0
- package/dist/src/query/external.d.ts +10 -0
- package/dist/src/query/external.d.ts.map +1 -0
- package/dist/src/query/index.d.ts +2 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/query.d.ts +235 -0
- package/dist/src/query/query.d.ts.map +1 -0
- package/dist/src/query/retriever.d.ts +135 -0
- package/dist/src/query/retriever.d.ts.map +1 -0
- package/dist/src/query/streamer.d.ts +67 -0
- package/dist/src/query/streamer.d.ts.map +1 -0
- package/dist/src/query/table.d.ts +219 -0
- package/dist/src/query/table.d.ts.map +1 -0
- package/dist/src/query/types.d.ts +35 -0
- package/dist/src/query/types.d.ts.map +1 -0
- package/dist/src/query/write.d.ts +21 -0
- package/dist/src/query/write.d.ts.map +1 -0
- package/dist/src/rack/client.d.ts +58 -20
- package/dist/src/rack/client.d.ts.map +1 -1
- package/dist/src/rack/types.gen.d.ts +11 -12
- package/dist/src/rack/types.gen.d.ts.map +1 -1
- package/dist/src/range/alias/types.gen.d.ts +2 -3
- package/dist/src/range/alias/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/client.d.ts +138 -27
- package/dist/src/ranger/client.d.ts.map +1 -1
- package/dist/src/ranger/kv/client.d.ts +7 -4
- package/dist/src/ranger/kv/client.d.ts.map +1 -1
- package/dist/src/ranger/payload.d.ts +3 -0
- package/dist/src/ranger/payload.d.ts.map +1 -1
- package/dist/src/ranger/types.gen.d.ts +45 -101
- package/dist/src/ranger/types.gen.d.ts.map +1 -1
- package/dist/src/ranger/writer.d.ts +2 -74
- package/dist/src/ranger/writer.d.ts.map +1 -1
- package/dist/src/schematic/actions.d.ts +90 -33
- package/dist/src/schematic/actions.d.ts.map +1 -1
- package/dist/src/schematic/actions.gen.d.ts +207 -114
- package/dist/src/schematic/actions.gen.d.ts.map +1 -1
- package/dist/src/schematic/client.d.ts +70 -68
- package/dist/src/schematic/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/client.d.ts +133 -27
- package/dist/src/schematic/symbol/client.d.ts.map +1 -1
- package/dist/src/schematic/symbol/types.gen.d.ts +258 -153
- package/dist/src/schematic/symbol/types.gen.d.ts.map +1 -1
- package/dist/src/schematic/types.gen.d.ts +17 -96
- package/dist/src/schematic/types.gen.d.ts.map +1 -1
- package/dist/src/status/client.d.ts +69 -14
- package/dist/src/status/client.d.ts.map +1 -1
- package/dist/src/status/external.d.ts +2 -0
- package/dist/src/status/external.d.ts.map +1 -1
- package/dist/src/status/payload.d.ts +2 -36
- package/dist/src/status/payload.d.ts.map +1 -1
- package/dist/src/status/status.d.ts +65 -0
- package/dist/src/status/status.d.ts.map +1 -0
- package/dist/src/status/types.gen.d.ts +58 -0
- package/dist/src/status/types.gen.d.ts.map +1 -0
- package/dist/src/table/actions.d.ts +72 -13
- package/dist/src/table/actions.d.ts.map +1 -1
- package/dist/src/table/actions.gen.d.ts +221 -137
- package/dist/src/table/actions.gen.d.ts.map +1 -1
- package/dist/src/table/client.d.ts +64 -40
- package/dist/src/table/client.d.ts.map +1 -1
- package/dist/src/table/types.gen.d.ts +20 -55
- package/dist/src/table/types.gen.d.ts.map +1 -1
- package/dist/src/task/client.d.ts +149 -28
- package/dist/src/task/client.d.ts.map +1 -1
- package/dist/src/task/types.gen.d.ts +71 -89
- package/dist/src/task/types.gen.d.ts.map +1 -1
- package/dist/src/testutil/access.d.ts +27 -1
- package/dist/src/testutil/access.d.ts.map +1 -1
- package/dist/src/testutil/channels.d.ts +2 -0
- package/dist/src/testutil/channels.d.ts.map +1 -1
- package/dist/src/testutil/client.d.ts +5 -0
- package/dist/src/testutil/client.d.ts.map +1 -1
- package/dist/src/testutil/connection.d.ts +10 -0
- package/dist/src/testutil/connection.d.ts.map +1 -0
- package/dist/src/testutil/index.d.ts +9 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/panels.d.ts +8 -0
- package/dist/src/testutil/panels.d.ts.map +1 -0
- package/dist/src/testutil/proxy.d.ts +29 -0
- package/dist/src/testutil/proxy.d.ts.map +1 -0
- package/dist/src/testutil/query.d.ts +7 -0
- package/dist/src/testutil/query.d.ts.map +1 -0
- package/dist/src/testutil/telem.d.ts +4 -0
- package/dist/src/testutil/telem.d.ts.map +1 -1
- package/dist/src/transport.d.ts +10 -4
- package/dist/src/transport.d.ts.map +1 -1
- package/dist/src/user/client.d.ts +29 -28
- package/dist/src/user/client.d.ts.map +1 -1
- package/dist/src/user/external.d.ts +1 -1
- package/dist/src/user/external.d.ts.map +1 -1
- package/dist/src/user/types.gen.d.ts +4 -4
- package/dist/src/util/retrieve.d.ts +2 -2
- package/dist/src/util/retrieve.d.ts.map +1 -1
- package/dist/src/util/telem.d.ts.map +1 -1
- package/dist/src/view/client.d.ts +30 -14
- package/dist/src/view/client.d.ts.map +1 -1
- package/dist/src/view/types.gen.d.ts +7 -15
- package/dist/src/view/types.gen.d.ts.map +1 -1
- package/dist/testutil.js +189 -0
- package/dist/testutil.js.map +1 -0
- package/package.json +40 -17
- package/src/access/client.ts +14 -3
- package/src/access/enforce.ts +0 -3
- package/src/access/external.ts +1 -0
- package/src/access/granted.ts +114 -0
- package/src/access/policy/client.ts +135 -43
- package/src/access/policy/types.gen.ts +9 -11
- package/src/access/role/client.ts +160 -38
- package/src/access/role/types.gen.ts +8 -12
- package/src/actions/actions.ts +5 -6
- package/src/actions/controller.ts +626 -0
- package/src/actions/external.ts +11 -0
- package/src/arc/actions.gen.ts +313 -0
- package/src/arc/actions.ts +192 -0
- package/src/arc/client.ts +424 -41
- package/src/arc/compiler/types.gen.ts +5 -6
- package/src/arc/external.ts +2 -0
- package/src/arc/graph/types.gen.ts +24 -22
- package/src/arc/ir/index.ts +1 -1
- package/{eslint.config.ts → src/arc/ir/ir.ts} +1 -4
- package/src/arc/ir/types.gen.ts +42 -41
- package/src/arc/text/types.gen.ts +21 -2
- package/src/arc/types/types.gen.ts +40 -32
- package/src/arc/types.gen.ts +31 -29
- package/src/auth/auth.ts +40 -8
- package/src/channel/client.ts +529 -132
- package/src/channel/external.ts +0 -1
- package/src/channel/payload.ts +30 -3
- package/src/channel/types.gen.ts +37 -48
- package/src/channel/writer.ts +2 -11
- package/src/client.ts +215 -91
- package/src/connection/client.ts +495 -0
- package/src/connection/external.ts +34 -0
- package/src/connection/index.ts +1 -1
- package/src/connection/status.ts +442 -0
- package/src/control/client.ts +84 -12
- package/src/control/state.ts +17 -36
- package/src/device/client.ts +293 -41
- package/src/device/types.gen.ts +15 -26
- package/src/errors.ts +45 -22
- package/src/{workspace → ethercat}/external.ts +1 -2
- package/src/{workspace → ethercat}/index.ts +1 -1
- package/src/ethercat/types.gen.ts +151 -0
- package/src/framer/adapter.ts +60 -37
- package/src/framer/benchutil.ts +67 -0
- package/src/framer/cache/cache.ts +115 -0
- package/src/framer/cache/dynamic.ts +279 -0
- package/src/framer/cache/reader.ts +160 -0
- package/src/framer/cache/static.ts +215 -0
- package/src/framer/cache/streamer.ts +391 -0
- package/src/framer/cache/transform.ts +31 -0
- package/src/framer/cache/unary.ts +104 -0
- package/src/framer/client.ts +71 -43
- package/src/framer/codec.ts +55 -18
- package/src/framer/deleter.ts +4 -6
- package/src/framer/external.ts +10 -0
- package/src/framer/feed.ts +108 -0
- package/src/framer/frame.ts +13 -23
- package/src/framer/hardened.ts +283 -0
- package/src/framer/iterator.ts +31 -42
- package/src/framer/reader.ts +11 -11
- package/src/framer/streamer.ts +18 -178
- package/src/framer/writer.ts +39 -59
- package/src/group/client.ts +158 -23
- package/src/http/external.ts +10 -0
- package/src/{cluster → http}/index.ts +1 -1
- package/src/http/types.gen.ts +245 -0
- package/src/imex/client.ts +125 -0
- package/src/imex/index.ts +10 -0
- package/src/index.ts +18 -6
- package/src/label/client.ts +193 -54
- package/src/label/external.ts +2 -0
- package/src/label/payload.ts +4 -9
- package/src/label/store.ts +28 -0
- package/src/label/types.gen.ts +31 -0
- package/src/labjack/external.ts +10 -0
- package/src/labjack/index.ts +10 -0
- package/src/labjack/types.gen.ts +251 -0
- package/src/lineplot/actions.gen.ts +880 -0
- package/src/lineplot/actions.ts +535 -0
- package/src/lineplot/client.ts +224 -52
- package/src/lineplot/external.ts +3 -0
- package/src/lineplot/line.ts +80 -0
- package/src/lineplot/types.gen.ts +225 -12
- package/src/log/actions.gen.ts +474 -0
- package/src/log/actions.ts +242 -0
- package/src/log/client.ts +223 -52
- package/src/log/external.ts +2 -0
- package/src/log/types.gen.ts +45 -14
- package/src/modbus/external.ts +10 -0
- package/src/modbus/index.ts +10 -0
- package/src/modbus/types.gen.ts +185 -0
- package/src/ni/external.ts +10 -0
- package/src/ni/index.ts +10 -0
- package/src/ni/types.gen.ts +1632 -0
- package/src/node/index.ts +10 -0
- package/src/{cluster → node}/types.gen.ts +2 -2
- package/src/ontology/client.ts +408 -99
- package/src/ontology/external.ts +7 -0
- package/src/ontology/payload.ts +48 -7
- package/src/ontology/store.ts +83 -0
- package/src/ontology/types.gen.ts +2 -1
- package/src/ontology/writer.ts +1 -0
- package/src/opcua/external.ts +10 -0
- package/src/opcua/index.ts +10 -0
- package/src/opcua/types.gen.ts +65 -0
- package/src/pagerduty/external.ts +10 -0
- package/src/pagerduty/index.ts +10 -0
- package/src/pagerduty/types.gen.ts +41 -0
- package/src/panel/actions.gen.ts +267 -0
- package/src/panel/actions.ts +357 -0
- package/src/panel/client.ts +327 -0
- package/src/panel/external.ts +14 -0
- package/src/panel/index.ts +10 -0
- package/src/panel/tree.ts +163 -0
- package/src/panel/types.gen.ts +164 -0
- package/src/project/client.ts +273 -0
- package/src/project/external.ts +11 -0
- package/src/project/index.ts +10 -0
- package/src/project/types.gen.ts +40 -0
- package/src/query/cache.ts +326 -0
- package/src/query/deleted.ts +38 -0
- package/src/query/derived.ts +101 -0
- package/src/query/external.ts +51 -0
- package/src/query/index.ts +10 -0
- package/src/query/query.ts +865 -0
- package/src/query/retriever.ts +308 -0
- package/src/query/streamer.ts +207 -0
- package/src/query/table.ts +625 -0
- package/src/query/types.ts +54 -0
- package/src/query/write.ts +42 -0
- package/src/rack/client.ts +233 -45
- package/src/rack/types.gen.ts +15 -16
- package/src/range/alias/types.gen.ts +2 -3
- package/src/ranger/client.ts +581 -70
- package/src/ranger/kv/client.ts +52 -21
- package/src/ranger/payload.ts +3 -0
- package/src/ranger/types.gen.ts +21 -23
- package/src/ranger/writer.ts +4 -8
- package/src/schematic/actions.gen.ts +62 -53
- package/src/schematic/actions.ts +44 -42
- package/src/schematic/client.ts +226 -70
- package/src/schematic/symbol/client.ts +277 -48
- package/src/schematic/symbol/types.gen.ts +22 -34
- package/src/schematic/types.gen.ts +22 -29
- package/src/status/client.ts +321 -44
- package/src/status/external.ts +2 -0
- package/src/status/payload.ts +1 -23
- package/src/status/status.ts +241 -0
- package/src/status/types.gen.ts +108 -0
- package/src/table/actions.gen.ts +96 -63
- package/src/table/actions.ts +44 -19
- package/src/table/client.ts +220 -56
- package/src/table/types.gen.ts +24 -31
- package/src/task/client.ts +580 -101
- package/src/task/types.gen.ts +68 -75
- package/src/testutil/access.ts +102 -6
- package/src/testutil/channels.ts +29 -0
- package/src/testutil/client.ts +27 -2
- package/src/testutil/connection.ts +47 -0
- package/src/testutil/index.ts +17 -0
- package/src/testutil/panels.ts +26 -0
- package/src/testutil/proxy.ts +106 -0
- package/src/testutil/query.ts +28 -0
- package/src/testutil/telem.ts +17 -1
- package/src/transport.ts +18 -7
- package/src/user/client.ts +165 -64
- package/src/user/external.ts +1 -1
- package/src/user/types.gen.ts +5 -5
- package/src/util/retrieve.ts +4 -4
- package/src/util/telem.ts +0 -1
- package/src/view/client.ts +120 -37
- package/src/view/types.gen.ts +8 -11
- package/.turbo/turbo-build.log +0 -20
- package/.vscode/settings.json +0 -3
- package/CONTRIBUTING.md +0 -47
- package/dist/client.cjs +0 -118
- package/dist/eslint.config.d.ts +0 -4
- package/dist/eslint.config.d.ts.map +0 -1
- package/dist/src/access/enforce.spec.d.ts +0 -2
- package/dist/src/access/enforce.spec.d.ts.map +0 -1
- package/dist/src/access/policy/access.spec.d.ts +0 -2
- package/dist/src/access/policy/access.spec.d.ts.map +0 -1
- package/dist/src/access/role/role.spec.d.ts +0 -2
- package/dist/src/access/role/role.spec.d.ts.map +0 -1
- package/dist/src/actions/actions.spec.d.ts +0 -2
- package/dist/src/actions/actions.spec.d.ts.map +0 -1
- package/dist/src/arc/access.spec.d.ts +0 -2
- package/dist/src/arc/access.spec.d.ts.map +0 -1
- package/dist/src/arc/arc.spec.d.ts +0 -2
- package/dist/src/arc/arc.spec.d.ts.map +0 -1
- package/dist/src/arc/lsp.spec.d.ts +0 -2
- package/dist/src/arc/lsp.spec.d.ts.map +0 -1
- package/dist/src/auth/auth.spec.d.ts +0 -2
- package/dist/src/auth/auth.spec.d.ts.map +0 -1
- package/dist/src/channel/access.spec.d.ts +0 -2
- package/dist/src/channel/access.spec.d.ts.map +0 -1
- package/dist/src/channel/batchRetriever.spec.d.ts +0 -2
- package/dist/src/channel/batchRetriever.spec.d.ts.map +0 -1
- package/dist/src/channel/channel.spec.d.ts +0 -2
- package/dist/src/channel/channel.spec.d.ts.map +0 -1
- package/dist/src/channel/payload.spec.d.ts +0 -2
- package/dist/src/channel/payload.spec.d.ts.map +0 -1
- package/dist/src/channel/retriever.d.ts +0 -64
- package/dist/src/channel/retriever.d.ts.map +0 -1
- package/dist/src/cluster/index.d.ts +0 -2
- package/dist/src/cluster/index.d.ts.map +0 -1
- package/dist/src/cluster/types.gen.d.ts +0 -4
- package/dist/src/cluster/types.gen.d.ts.map +0 -1
- package/dist/src/connection/checker.d.ts +0 -86
- package/dist/src/connection/checker.d.ts.map +0 -1
- package/dist/src/connection/connection.spec.d.ts +0 -2
- package/dist/src/connection/connection.spec.d.ts.map +0 -1
- package/dist/src/connection.spec.d.ts +0 -2
- package/dist/src/connection.spec.d.ts.map +0 -1
- package/dist/src/control/state.spec.d.ts +0 -2
- package/dist/src/control/state.spec.d.ts.map +0 -1
- package/dist/src/device/access.spec.d.ts +0 -2
- package/dist/src/device/access.spec.d.ts.map +0 -1
- package/dist/src/device/device.spec.d.ts +0 -2
- package/dist/src/device/device.spec.d.ts.map +0 -1
- package/dist/src/device/payload.spec.d.ts +0 -2
- package/dist/src/device/payload.spec.d.ts.map +0 -1
- package/dist/src/errors.spec.d.ts +0 -2
- package/dist/src/errors.spec.d.ts.map +0 -1
- package/dist/src/framer/adapter.spec.d.ts +0 -2
- package/dist/src/framer/adapter.spec.d.ts.map +0 -1
- package/dist/src/framer/client.spec.d.ts +0 -2
- package/dist/src/framer/client.spec.d.ts.map +0 -1
- package/dist/src/framer/codec.spec.d.ts +0 -2
- package/dist/src/framer/codec.spec.d.ts.map +0 -1
- package/dist/src/framer/deleter.spec.d.ts +0 -2
- package/dist/src/framer/deleter.spec.d.ts.map +0 -1
- package/dist/src/framer/frame.spec.d.ts +0 -2
- package/dist/src/framer/frame.spec.d.ts.map +0 -1
- package/dist/src/framer/iterator.spec.d.ts +0 -2
- package/dist/src/framer/iterator.spec.d.ts.map +0 -1
- package/dist/src/framer/reader.spec.d.ts +0 -2
- package/dist/src/framer/reader.spec.d.ts.map +0 -1
- package/dist/src/framer/streamer.spec.d.ts +0 -2
- package/dist/src/framer/streamer.spec.d.ts.map +0 -1
- package/dist/src/framer/writer.spec.d.ts +0 -2
- package/dist/src/framer/writer.spec.d.ts.map +0 -1
- package/dist/src/group/access.spec.d.ts +0 -2
- package/dist/src/group/access.spec.d.ts.map +0 -1
- package/dist/src/group/group.spec.d.ts +0 -2
- package/dist/src/group/group.spec.d.ts.map +0 -1
- package/dist/src/label/access.spec.d.ts +0 -2
- package/dist/src/label/access.spec.d.ts.map +0 -1
- package/dist/src/label/label.spec.d.ts +0 -2
- package/dist/src/label/label.spec.d.ts.map +0 -1
- package/dist/src/lineplot/access.spec.d.ts +0 -2
- package/dist/src/lineplot/access.spec.d.ts.map +0 -1
- package/dist/src/lineplot/lineplot.spec.d.ts +0 -2
- package/dist/src/lineplot/lineplot.spec.d.ts.map +0 -1
- package/dist/src/log/access.spec.d.ts +0 -2
- package/dist/src/log/access.spec.d.ts.map +0 -1
- package/dist/src/log/log.spec.d.ts +0 -2
- package/dist/src/log/log.spec.d.ts.map +0 -1
- package/dist/src/ontology/ontology.spec.d.ts +0 -2
- package/dist/src/ontology/ontology.spec.d.ts.map +0 -1
- package/dist/src/rack/access.spec.d.ts +0 -2
- package/dist/src/rack/access.spec.d.ts.map +0 -1
- package/dist/src/rack/rack.spec.d.ts +0 -2
- package/dist/src/rack/rack.spec.d.ts.map +0 -1
- package/dist/src/ranger/access.spec.d.ts +0 -2
- package/dist/src/ranger/access.spec.d.ts.map +0 -1
- package/dist/src/ranger/alias/payload.spec.d.ts +0 -2
- package/dist/src/ranger/alias/payload.spec.d.ts.map +0 -1
- package/dist/src/ranger/ranger.spec.d.ts +0 -2
- package/dist/src/ranger/ranger.spec.d.ts.map +0 -1
- package/dist/src/schematic/access.spec.d.ts +0 -2
- package/dist/src/schematic/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/actions.spec.d.ts +0 -2
- package/dist/src/schematic/actions.spec.d.ts.map +0 -1
- package/dist/src/schematic/schematic.spec.d.ts +0 -2
- package/dist/src/schematic/schematic.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/access.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/access.spec.d.ts.map +0 -1
- package/dist/src/schematic/symbol/client.spec.d.ts +0 -2
- package/dist/src/schematic/symbol/client.spec.d.ts.map +0 -1
- package/dist/src/status/access.spec.d.ts +0 -2
- package/dist/src/status/access.spec.d.ts.map +0 -1
- package/dist/src/status/status.spec.d.ts +0 -2
- package/dist/src/status/status.spec.d.ts.map +0 -1
- package/dist/src/table/access.spec.d.ts +0 -2
- package/dist/src/table/access.spec.d.ts.map +0 -1
- package/dist/src/table/table.spec.d.ts +0 -2
- package/dist/src/table/table.spec.d.ts.map +0 -1
- package/dist/src/task/access.spec.d.ts +0 -2
- package/dist/src/task/access.spec.d.ts.map +0 -1
- package/dist/src/task/payload.spec.d.ts +0 -2
- package/dist/src/task/payload.spec.d.ts.map +0 -1
- package/dist/src/task/task.spec.d.ts +0 -2
- package/dist/src/task/task.spec.d.ts.map +0 -1
- package/dist/src/user/access.spec.d.ts +0 -2
- package/dist/src/user/access.spec.d.ts.map +0 -1
- package/dist/src/user/user.spec.d.ts +0 -2
- package/dist/src/user/user.spec.d.ts.map +0 -1
- package/dist/src/util/retrieve.spec.d.ts +0 -2
- package/dist/src/util/retrieve.spec.d.ts.map +0 -1
- package/dist/src/view/view.spec.d.ts +0 -2
- package/dist/src/view/view.spec.d.ts.map +0 -1
- package/dist/src/workspace/access.spec.d.ts +0 -2
- package/dist/src/workspace/access.spec.d.ts.map +0 -1
- package/dist/src/workspace/client.d.ts +0 -36
- package/dist/src/workspace/client.d.ts.map +0 -1
- package/dist/src/workspace/external.d.ts.map +0 -1
- package/dist/src/workspace/index.d.ts +0 -2
- package/dist/src/workspace/index.d.ts.map +0 -1
- package/dist/src/workspace/types.gen.d.ts +0 -34
- package/dist/src/workspace/types.gen.d.ts.map +0 -1
- package/dist/src/workspace/workspace.spec.d.ts +0 -2
- package/dist/src/workspace/workspace.spec.d.ts.map +0 -1
- package/examples/node/basicReadWrite.js +0 -86
- package/examples/node/createChannels.js +0 -50
- package/examples/node/createRange.js +0 -67
- package/examples/node/package-lock.json +0 -133
- package/examples/node/package.json +0 -17
- package/examples/node/readLatest.js +0 -76
- package/examples/node/seriesAndFrames.js +0 -173
- package/examples/node/streamRead.js +0 -50
- package/examples/node/streamWrite.js +0 -87
- package/src/access/enforce.spec.ts +0 -188
- package/src/access/policy/access.spec.ts +0 -147
- package/src/access/role/role.spec.ts +0 -95
- package/src/actions/actions.spec.ts +0 -229
- package/src/arc/access.spec.ts +0 -149
- package/src/arc/arc.spec.ts +0 -44
- package/src/arc/lsp.spec.ts +0 -717
- package/src/auth/auth.spec.ts +0 -101
- package/src/channel/access.spec.ts +0 -116
- package/src/channel/batchRetriever.spec.ts +0 -115
- package/src/channel/channel.spec.ts +0 -352
- package/src/channel/payload.spec.ts +0 -117
- package/src/channel/retriever.ts +0 -252
- package/src/connection/checker.ts +0 -203
- package/src/connection/connection.spec.ts +0 -152
- package/src/connection.spec.ts +0 -145
- package/src/control/state.spec.ts +0 -22
- package/src/device/access.spec.ts +0 -159
- package/src/device/device.spec.ts +0 -461
- package/src/device/payload.spec.ts +0 -142
- package/src/errors.spec.ts +0 -71
- package/src/framer/adapter.spec.ts +0 -620
- package/src/framer/client.spec.ts +0 -180
- package/src/framer/codec.spec.ts +0 -383
- package/src/framer/deleter.spec.ts +0 -103
- package/src/framer/frame.spec.ts +0 -973
- package/src/framer/iterator.spec.ts +0 -169
- package/src/framer/reader.spec.ts +0 -865
- package/src/framer/streamer.spec.ts +0 -871
- package/src/framer/writer.spec.ts +0 -486
- package/src/group/access.spec.ts +0 -77
- package/src/group/group.spec.ts +0 -65
- package/src/label/access.spec.ts +0 -109
- package/src/label/label.spec.ts +0 -83
- package/src/lineplot/access.spec.ts +0 -134
- package/src/lineplot/lineplot.spec.ts +0 -120
- package/src/log/access.spec.ts +0 -132
- package/src/log/log.spec.ts +0 -106
- package/src/ontology/ontology.spec.ts +0 -521
- package/src/rack/access.spec.ts +0 -102
- package/src/rack/rack.spec.ts +0 -171
- package/src/ranger/access.spec.ts +0 -115
- package/src/ranger/alias/payload.spec.ts +0 -52
- package/src/ranger/ranger.spec.ts +0 -343
- package/src/schematic/access.spec.ts +0 -134
- package/src/schematic/actions.spec.ts +0 -699
- package/src/schematic/schematic.spec.ts +0 -340
- package/src/schematic/symbol/access.spec.ts +0 -172
- package/src/schematic/symbol/client.spec.ts +0 -160
- package/src/status/access.spec.ts +0 -129
- package/src/status/status.spec.ts +0 -448
- package/src/table/access.spec.ts +0 -128
- package/src/table/table.spec.ts +0 -651
- package/src/task/access.spec.ts +0 -131
- package/src/task/payload.spec.ts +0 -113
- package/src/task/task.spec.ts +0 -657
- package/src/user/access.spec.ts +0 -107
- package/src/user/user.spec.ts +0 -290
- package/src/util/retrieve.spec.ts +0 -49
- package/src/view/view.spec.ts +0 -165
- package/src/workspace/access.spec.ts +0 -108
- package/src/workspace/client.ts +0 -112
- package/src/workspace/types.gen.ts +0 -46
- package/src/workspace/workspace.spec.ts +0 -111
- package/tsconfig.json +0 -5
- package/tsconfig.vite.json +0 -4
- package/vite.config.ts +0 -29
- /package/dist/src/{workspace → project}/external.d.ts +0 -0
|
@@ -1,871 +0,0 @@
|
|
|
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 { EOF, Unreachable } from "@synnaxlabs/freighter";
|
|
11
|
-
import {
|
|
12
|
-
DataType,
|
|
13
|
-
errors,
|
|
14
|
-
id,
|
|
15
|
-
Rate,
|
|
16
|
-
Series,
|
|
17
|
-
sleep,
|
|
18
|
-
TimeSpan,
|
|
19
|
-
TimeStamp,
|
|
20
|
-
} from "@synnaxlabs/x";
|
|
21
|
-
import { describe, expect, it, test, vi } from "vitest";
|
|
22
|
-
|
|
23
|
-
import { type channel } from "@/channel";
|
|
24
|
-
import { Frame } from "@/framer/frame";
|
|
25
|
-
import {
|
|
26
|
-
HardenedStreamer,
|
|
27
|
-
ObservableStreamer,
|
|
28
|
-
type Streamer,
|
|
29
|
-
streamerConfigZ,
|
|
30
|
-
} from "@/framer/streamer";
|
|
31
|
-
import { newVirtualChannel } from "@/testutil/channels";
|
|
32
|
-
import { createTestClient } from "@/testutil/client";
|
|
33
|
-
|
|
34
|
-
const client = createTestClient();
|
|
35
|
-
|
|
36
|
-
describe("Streamer", () => {
|
|
37
|
-
describe("standard", () => {
|
|
38
|
-
test("happy path", async () => {
|
|
39
|
-
const ch = await newVirtualChannel(client);
|
|
40
|
-
const streamer = await client.openStreamer(ch.key);
|
|
41
|
-
const writer = await client.openWriter({
|
|
42
|
-
start: TimeStamp.now(),
|
|
43
|
-
channels: ch.key,
|
|
44
|
-
});
|
|
45
|
-
try {
|
|
46
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3]));
|
|
47
|
-
} finally {
|
|
48
|
-
await writer.close();
|
|
49
|
-
}
|
|
50
|
-
const d = await streamer.read();
|
|
51
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
|
|
52
|
-
});
|
|
53
|
-
test("should preserve non-zero time ranges through codec round-trip", async () => {
|
|
54
|
-
const ch = await newVirtualChannel(client);
|
|
55
|
-
const streamer = await client.openStreamer(ch.key);
|
|
56
|
-
const writer = await client.openWriter({
|
|
57
|
-
start: TimeStamp.now(),
|
|
58
|
-
channels: ch.key,
|
|
59
|
-
});
|
|
60
|
-
const start = new TimeStamp(1000000000n);
|
|
61
|
-
const end = new TimeStamp(6000000000n);
|
|
62
|
-
try {
|
|
63
|
-
const fr = new Frame(
|
|
64
|
-
[ch.key],
|
|
65
|
-
[
|
|
66
|
-
new Series({
|
|
67
|
-
data: new Float64Array([1, 2, 3]),
|
|
68
|
-
dataType: DataType.FLOAT64,
|
|
69
|
-
timeRange: start.spanRange(TimeSpan.seconds(5)),
|
|
70
|
-
}),
|
|
71
|
-
],
|
|
72
|
-
);
|
|
73
|
-
await writer.write(fr);
|
|
74
|
-
} finally {
|
|
75
|
-
await writer.close();
|
|
76
|
-
}
|
|
77
|
-
const d = await streamer.read();
|
|
78
|
-
const series = d.series[0];
|
|
79
|
-
expect(series.timeRange).toBeDefined();
|
|
80
|
-
expect(series.timeRange?.start.valueOf()).toEqual(start.valueOf());
|
|
81
|
-
expect(series.timeRange?.end.valueOf()).toEqual(end.valueOf());
|
|
82
|
-
});
|
|
83
|
-
test("open with config", async () => {
|
|
84
|
-
const ch = await newVirtualChannel(client);
|
|
85
|
-
await expect(client.openStreamer({ channels: ch.key })).resolves.not.toThrow();
|
|
86
|
-
});
|
|
87
|
-
it("should not throw an error when the streamer is opened with zero channels", async () => {
|
|
88
|
-
await expect(
|
|
89
|
-
(async () => {
|
|
90
|
-
const s = await client.openStreamer([]);
|
|
91
|
-
s.close();
|
|
92
|
-
})(),
|
|
93
|
-
).resolves.not.toThrow();
|
|
94
|
-
});
|
|
95
|
-
it("should throw an error when the streamer is opened with a channel that does not exist", async () => {
|
|
96
|
-
await expect(client.openStreamer([5678])).rejects.toThrow("not found");
|
|
97
|
-
});
|
|
98
|
-
describe("excludeGroups", () => {
|
|
99
|
-
test("should filter out frames from a writer whose group matches", async () => {
|
|
100
|
-
const ch = await newVirtualChannel(client);
|
|
101
|
-
const streamer = await client.openStreamer({
|
|
102
|
-
channels: ch.key,
|
|
103
|
-
excludeGroups: [42],
|
|
104
|
-
});
|
|
105
|
-
const writer = await client.openWriter({
|
|
106
|
-
start: TimeStamp.now(),
|
|
107
|
-
channels: ch.key,
|
|
108
|
-
controlSubject: { name: "grouped", key: id.create(), group: 42 },
|
|
109
|
-
});
|
|
110
|
-
try {
|
|
111
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3]));
|
|
112
|
-
const result = await Promise.race([
|
|
113
|
-
streamer.read().then((f) => f),
|
|
114
|
-
sleep.sleep(TimeSpan.milliseconds(500)).then(() => null),
|
|
115
|
-
]);
|
|
116
|
-
expect(result).toBeNull();
|
|
117
|
-
} finally {
|
|
118
|
-
await writer.close();
|
|
119
|
-
streamer.close();
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
test("should deliver frames from a writer whose group does not match", async () => {
|
|
124
|
-
const ch = await newVirtualChannel(client);
|
|
125
|
-
const streamer = await client.openStreamer({
|
|
126
|
-
channels: ch.key,
|
|
127
|
-
excludeGroups: [99],
|
|
128
|
-
});
|
|
129
|
-
const writer = await client.openWriter({
|
|
130
|
-
start: TimeStamp.now(),
|
|
131
|
-
channels: ch.key,
|
|
132
|
-
controlSubject: { name: "grouped", key: id.create(), group: 42 },
|
|
133
|
-
});
|
|
134
|
-
try {
|
|
135
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3]));
|
|
136
|
-
const d = await streamer.read();
|
|
137
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
|
|
138
|
-
} finally {
|
|
139
|
-
await writer.close();
|
|
140
|
-
streamer.close();
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
test("should deliver frames from a writer with group 0 even if 0 is excluded", async () => {
|
|
145
|
-
const ch = await newVirtualChannel(client);
|
|
146
|
-
const streamer = await client.openStreamer({
|
|
147
|
-
channels: ch.key,
|
|
148
|
-
excludeGroups: [0],
|
|
149
|
-
});
|
|
150
|
-
const writer = await client.openWriter({
|
|
151
|
-
start: TimeStamp.now(),
|
|
152
|
-
channels: ch.key,
|
|
153
|
-
});
|
|
154
|
-
try {
|
|
155
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3]));
|
|
156
|
-
const d = await streamer.read();
|
|
157
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
|
|
158
|
-
} finally {
|
|
159
|
-
await writer.close();
|
|
160
|
-
streamer.close();
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
describe("downsampling", () => {
|
|
166
|
-
test("downsample factor of 1", async () => {
|
|
167
|
-
const ch = await newVirtualChannel(client);
|
|
168
|
-
const streamer = await client.openStreamer({
|
|
169
|
-
channels: ch.key,
|
|
170
|
-
downsampleFactor: 1,
|
|
171
|
-
});
|
|
172
|
-
const writer = await client.openWriter({
|
|
173
|
-
start: TimeStamp.now(),
|
|
174
|
-
channels: ch.key,
|
|
175
|
-
});
|
|
176
|
-
try {
|
|
177
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5]));
|
|
178
|
-
} finally {
|
|
179
|
-
await writer.close();
|
|
180
|
-
}
|
|
181
|
-
const d = await streamer.read();
|
|
182
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3, 4, 5]);
|
|
183
|
-
});
|
|
184
|
-
test("downsample factor of 2", async () => {
|
|
185
|
-
const ch = await newVirtualChannel(client);
|
|
186
|
-
const streamer = await client.openStreamer({
|
|
187
|
-
channels: ch.key,
|
|
188
|
-
downsampleFactor: 2,
|
|
189
|
-
});
|
|
190
|
-
const writer = await client.openWriter({
|
|
191
|
-
start: TimeStamp.now(),
|
|
192
|
-
channels: ch.key,
|
|
193
|
-
});
|
|
194
|
-
try {
|
|
195
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
|
|
196
|
-
} finally {
|
|
197
|
-
await writer.close();
|
|
198
|
-
}
|
|
199
|
-
const d = await streamer.read();
|
|
200
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 3, 5, 7, 9]);
|
|
201
|
-
});
|
|
202
|
-
test("downsample factor of 10", async () => {
|
|
203
|
-
const ch = await newVirtualChannel(client);
|
|
204
|
-
const streamer = await client.openStreamer({
|
|
205
|
-
channels: ch.key,
|
|
206
|
-
downsampleFactor: 10,
|
|
207
|
-
});
|
|
208
|
-
const writer = await client.openWriter({
|
|
209
|
-
start: TimeStamp.now(),
|
|
210
|
-
channels: ch.key,
|
|
211
|
-
});
|
|
212
|
-
try {
|
|
213
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));
|
|
214
|
-
} finally {
|
|
215
|
-
await writer.close();
|
|
216
|
-
}
|
|
217
|
-
const d = await streamer.read();
|
|
218
|
-
expect(Array.from(d.get(ch.key))).toEqual([1]);
|
|
219
|
-
});
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
describe("throttling", () => {
|
|
223
|
-
test("throttle at 60Hz", async () => {
|
|
224
|
-
const ch = await newVirtualChannel(client);
|
|
225
|
-
const streamer = await client.openStreamer({
|
|
226
|
-
channels: ch.key,
|
|
227
|
-
throttleRate: 60,
|
|
228
|
-
});
|
|
229
|
-
const writer = await client.openWriter({
|
|
230
|
-
start: TimeStamp.now(),
|
|
231
|
-
channels: ch.key,
|
|
232
|
-
});
|
|
233
|
-
try {
|
|
234
|
-
const startTime = Date.now();
|
|
235
|
-
// Write data rapidly
|
|
236
|
-
for (let i = 0; i < 10; i++) {
|
|
237
|
-
await writer.write(ch.key, new Float64Array([i]));
|
|
238
|
-
await sleep.sleep(TimeSpan.milliseconds(5));
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Read frames - should be throttled
|
|
242
|
-
const receivedFrames: Frame[] = [];
|
|
243
|
-
const timeout = Date.now() + 500;
|
|
244
|
-
while (Date.now() < timeout)
|
|
245
|
-
try {
|
|
246
|
-
const frame = await Promise.race([
|
|
247
|
-
streamer.read(),
|
|
248
|
-
sleep.sleep(TimeSpan.milliseconds(100)).then(() => null),
|
|
249
|
-
]);
|
|
250
|
-
if (frame) receivedFrames.push(frame);
|
|
251
|
-
else break;
|
|
252
|
-
} catch {
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
expect(receivedFrames.length).toBeGreaterThan(0);
|
|
257
|
-
const elapsed = Date.now() - startTime;
|
|
258
|
-
// Should take at least the throttle period
|
|
259
|
-
expect(elapsed).toBeGreaterThanOrEqual(16); // ~1/60Hz
|
|
260
|
-
} finally {
|
|
261
|
-
await writer.close();
|
|
262
|
-
streamer.close();
|
|
263
|
-
}
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
test("no throttling with rate of 0", async () => {
|
|
267
|
-
const ch = await newVirtualChannel(client);
|
|
268
|
-
const streamer = await client.openStreamer({
|
|
269
|
-
channels: ch.key,
|
|
270
|
-
throttleRate: 0,
|
|
271
|
-
});
|
|
272
|
-
const writer = await client.openWriter({
|
|
273
|
-
start: TimeStamp.now(),
|
|
274
|
-
channels: ch.key,
|
|
275
|
-
});
|
|
276
|
-
try {
|
|
277
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3]));
|
|
278
|
-
const d = await streamer.read();
|
|
279
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 2, 3]);
|
|
280
|
-
} finally {
|
|
281
|
-
await writer.close();
|
|
282
|
-
streamer.close();
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
|
|
286
|
-
test("combine throttling and downsampling", async () => {
|
|
287
|
-
const ch = await newVirtualChannel(client);
|
|
288
|
-
const streamer = await client.openStreamer({
|
|
289
|
-
channels: ch.key,
|
|
290
|
-
downsampleFactor: 2,
|
|
291
|
-
throttleRate: 10,
|
|
292
|
-
});
|
|
293
|
-
const writer = await client.openWriter({
|
|
294
|
-
start: TimeStamp.now(),
|
|
295
|
-
channels: ch.key,
|
|
296
|
-
});
|
|
297
|
-
try {
|
|
298
|
-
await writer.write(ch.key, new Float64Array([1, 2, 3, 4, 5, 6]));
|
|
299
|
-
const d = await streamer.read();
|
|
300
|
-
// Should be downsampled to [1, 3, 5] and throttled
|
|
301
|
-
expect(Array.from(d.get(ch.key))).toEqual([1, 3, 5]);
|
|
302
|
-
} finally {
|
|
303
|
-
await writer.close();
|
|
304
|
-
streamer.close();
|
|
305
|
-
}
|
|
306
|
-
});
|
|
307
|
-
});
|
|
308
|
-
|
|
309
|
-
describe("calculations", () => {
|
|
310
|
-
test("basic calculated channel streaming", async () => {
|
|
311
|
-
// Create a timestamp index channel
|
|
312
|
-
const timeChannel = await client.channels.create({
|
|
313
|
-
name: id.create(),
|
|
314
|
-
isIndex: true,
|
|
315
|
-
dataType: DataType.TIMESTAMP,
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
// Create source channels with the timestamp index
|
|
319
|
-
const [channelA, channelB] = await client.channels.create([
|
|
320
|
-
{
|
|
321
|
-
name: id.create(),
|
|
322
|
-
dataType: DataType.FLOAT64,
|
|
323
|
-
index: timeChannel.key,
|
|
324
|
-
},
|
|
325
|
-
{
|
|
326
|
-
name: id.create(),
|
|
327
|
-
dataType: DataType.FLOAT64,
|
|
328
|
-
index: timeChannel.key,
|
|
329
|
-
},
|
|
330
|
-
]);
|
|
331
|
-
|
|
332
|
-
// Create calculated channel that adds the two source channels
|
|
333
|
-
const calcChannel = await client.channels.create({
|
|
334
|
-
name: id.create(),
|
|
335
|
-
dataType: DataType.FLOAT64,
|
|
336
|
-
virtual: true,
|
|
337
|
-
expression: `return ${channelA.name} + ${channelB.name}`,
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
// Set up streamer to listen for calculated results
|
|
341
|
-
const streamer = await client.openStreamer(calcChannel.key);
|
|
342
|
-
await sleep.sleep(TimeSpan.milliseconds(10));
|
|
343
|
-
|
|
344
|
-
// Write test data
|
|
345
|
-
const startTime = TimeStamp.now();
|
|
346
|
-
const writer = await client.openWriter({
|
|
347
|
-
start: startTime,
|
|
348
|
-
channels: [timeChannel.key, channelA.key, channelB.key],
|
|
349
|
-
});
|
|
350
|
-
|
|
351
|
-
try {
|
|
352
|
-
// Write test values - each source gets 2.5 so sum should be 5.0
|
|
353
|
-
await writer.write({
|
|
354
|
-
[timeChannel.key]: [startTime],
|
|
355
|
-
[channelA.key]: new Float64Array([2.5]),
|
|
356
|
-
[channelB.key]: new Float64Array([2.5]),
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
// Read from streamer
|
|
360
|
-
const frame = await streamer.read();
|
|
361
|
-
|
|
362
|
-
// Verify calculated results
|
|
363
|
-
const calcData = Array.from(frame.get(calcChannel.key));
|
|
364
|
-
expect(calcData).toEqual([5.0]);
|
|
365
|
-
} finally {
|
|
366
|
-
await writer.close();
|
|
367
|
-
streamer.close();
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
test("calculated channel with constant", async () => {
|
|
372
|
-
// Create an index channel for timestamps
|
|
373
|
-
const timeChannel = await client.channels.create({
|
|
374
|
-
name: id.create(),
|
|
375
|
-
isIndex: true,
|
|
376
|
-
dataType: DataType.TIMESTAMP,
|
|
377
|
-
});
|
|
378
|
-
|
|
379
|
-
// Create base channel with index
|
|
380
|
-
const baseChannel = await client.channels.create({
|
|
381
|
-
name: id.create(),
|
|
382
|
-
dataType: DataType.FLOAT64,
|
|
383
|
-
index: timeChannel.key,
|
|
384
|
-
});
|
|
385
|
-
|
|
386
|
-
// Create calculated channel that adds 5
|
|
387
|
-
const calcChannel = await client.channels.create({
|
|
388
|
-
name: id.create(),
|
|
389
|
-
dataType: DataType.FLOAT64,
|
|
390
|
-
virtual: true,
|
|
391
|
-
expression: `return ${baseChannel.name} + 5`,
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
const streamer = await client.openStreamer(calcChannel.key);
|
|
395
|
-
await sleep.sleep(TimeSpan.milliseconds(20));
|
|
396
|
-
|
|
397
|
-
const startTime = TimeStamp.now();
|
|
398
|
-
const writer = await client.openWriter({
|
|
399
|
-
start: startTime,
|
|
400
|
-
channels: [timeChannel.key, baseChannel.key],
|
|
401
|
-
});
|
|
402
|
-
|
|
403
|
-
try {
|
|
404
|
-
const timestamps = [
|
|
405
|
-
startTime,
|
|
406
|
-
new TimeStamp(startTime.valueOf() + BigInt(1000000000)),
|
|
407
|
-
new TimeStamp(startTime.valueOf() + BigInt(2000000000)),
|
|
408
|
-
];
|
|
409
|
-
|
|
410
|
-
await writer.write({
|
|
411
|
-
[timeChannel.key]: timestamps,
|
|
412
|
-
[baseChannel.key]: new Float64Array([1, 2, 3]),
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
const frame = await streamer.read();
|
|
416
|
-
const calcData = Array.from(frame.get(calcChannel.key));
|
|
417
|
-
expect(calcData).toEqual([6, 7, 8]); // Original values + 5
|
|
418
|
-
} finally {
|
|
419
|
-
await writer.close();
|
|
420
|
-
streamer.close();
|
|
421
|
-
}
|
|
422
|
-
});
|
|
423
|
-
|
|
424
|
-
test("calculated channel with multiple operations", async () => {
|
|
425
|
-
// Create timestamp channel
|
|
426
|
-
const timeChannel = await client.channels.create({
|
|
427
|
-
name: id.create(),
|
|
428
|
-
isIndex: true,
|
|
429
|
-
dataType: DataType.TIMESTAMP,
|
|
430
|
-
});
|
|
431
|
-
|
|
432
|
-
// Create source channels
|
|
433
|
-
const names = [id.create(), id.create()];
|
|
434
|
-
const [channelA, channelB] = await client.channels.create([
|
|
435
|
-
{ name: names[0], dataType: DataType.FLOAT64, index: timeChannel.key },
|
|
436
|
-
{ name: names[1], dataType: DataType.FLOAT64, index: timeChannel.key },
|
|
437
|
-
]);
|
|
438
|
-
|
|
439
|
-
// Create calculated channel with multiple operations
|
|
440
|
-
const calcChannel = await client.channels.create({
|
|
441
|
-
name: id.create(),
|
|
442
|
-
dataType: DataType.FLOAT64,
|
|
443
|
-
virtual: true,
|
|
444
|
-
expression: `return (${names[0]} * 2) + (${names[1]} / 2)`,
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
const streamer = await client.openStreamer(calcChannel.key);
|
|
448
|
-
await sleep.sleep(TimeSpan.milliseconds(5));
|
|
449
|
-
|
|
450
|
-
const startTime = TimeStamp.now();
|
|
451
|
-
const writer = await client.openWriter({
|
|
452
|
-
start: startTime,
|
|
453
|
-
channels: [timeChannel.key, channelA.key, channelB.key],
|
|
454
|
-
});
|
|
455
|
-
|
|
456
|
-
try {
|
|
457
|
-
await writer.write({
|
|
458
|
-
[timeChannel.key]: [startTime],
|
|
459
|
-
[channelA.key]: new Float64Array([2.0]), // Will be multiplied by 2 = 4.0
|
|
460
|
-
[channelB.key]: new Float64Array([4.0]), // Will be divided by 2 = 2.0
|
|
461
|
-
});
|
|
462
|
-
|
|
463
|
-
const frame = await streamer.read();
|
|
464
|
-
const calcData = Array.from(frame.get(calcChannel.key));
|
|
465
|
-
expect(calcData).toEqual([6.0]); // (2.0 * 2) + (4.0 / 2) = 4.0 + 2.0 = 6.0
|
|
466
|
-
} finally {
|
|
467
|
-
await writer.close();
|
|
468
|
-
streamer.close();
|
|
469
|
-
}
|
|
470
|
-
});
|
|
471
|
-
|
|
472
|
-
describe("legacy calculations", async () => {
|
|
473
|
-
it("should correctly execute a calculation with a requires field", async () => {
|
|
474
|
-
const timeChannel = await client.channels.create({
|
|
475
|
-
name: id.create(),
|
|
476
|
-
isIndex: true,
|
|
477
|
-
dataType: DataType.TIMESTAMP,
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
const [channelA, channelB] = await client.channels.create([
|
|
481
|
-
{
|
|
482
|
-
name: id.create(),
|
|
483
|
-
dataType: DataType.FLOAT64,
|
|
484
|
-
index: timeChannel.key,
|
|
485
|
-
},
|
|
486
|
-
{
|
|
487
|
-
name: id.create(),
|
|
488
|
-
dataType: DataType.FLOAT64,
|
|
489
|
-
index: timeChannel.key,
|
|
490
|
-
},
|
|
491
|
-
]);
|
|
492
|
-
|
|
493
|
-
const calcChannel = await client.channels.create({
|
|
494
|
-
name: id.create(),
|
|
495
|
-
dataType: DataType.FLOAT64,
|
|
496
|
-
virtual: true,
|
|
497
|
-
expression: `return ${channelA.name} + ${channelB.name}`,
|
|
498
|
-
});
|
|
499
|
-
|
|
500
|
-
const streamer = await client.openStreamer(calcChannel.key);
|
|
501
|
-
await sleep.sleep(TimeSpan.milliseconds(10));
|
|
502
|
-
|
|
503
|
-
const startTime = TimeStamp.now();
|
|
504
|
-
const writer = await client.openWriter({
|
|
505
|
-
start: startTime,
|
|
506
|
-
channels: [timeChannel.key, channelA.key, channelB.key],
|
|
507
|
-
});
|
|
508
|
-
|
|
509
|
-
try {
|
|
510
|
-
await writer.write({
|
|
511
|
-
[timeChannel.key]: [startTime],
|
|
512
|
-
[channelA.key]: new Float64Array([2.5]),
|
|
513
|
-
[channelB.key]: new Float64Array([2.5]),
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
const frame = await streamer.read();
|
|
517
|
-
|
|
518
|
-
const calcData = Array.from(frame.get(calcChannel.key));
|
|
519
|
-
expect(calcData).toEqual([5.0]);
|
|
520
|
-
} finally {
|
|
521
|
-
await writer.close();
|
|
522
|
-
streamer.close();
|
|
523
|
-
}
|
|
524
|
-
});
|
|
525
|
-
});
|
|
526
|
-
});
|
|
527
|
-
});
|
|
528
|
-
|
|
529
|
-
class MockStreamer implements Streamer {
|
|
530
|
-
keys: channel.Key[] = [];
|
|
531
|
-
updateMock = vi.fn();
|
|
532
|
-
readMock = vi.fn();
|
|
533
|
-
closeMock = vi.fn();
|
|
534
|
-
responses: [Frame, Error | null][] = [];
|
|
535
|
-
updateErrors: (Error | null)[] = [];
|
|
536
|
-
|
|
537
|
-
update(channels: channel.Params): Promise<void> {
|
|
538
|
-
if (this.updateErrors.length > 0) {
|
|
539
|
-
const err = this.updateErrors.shift()!;
|
|
540
|
-
if (err) throw err;
|
|
541
|
-
}
|
|
542
|
-
this.updateMock(channels);
|
|
543
|
-
return Promise.resolve();
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
close(): void {
|
|
547
|
-
this.closeMock();
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
async read(): Promise<Frame> {
|
|
551
|
-
this.readMock();
|
|
552
|
-
if (this.responses.length === 0) throw new EOF();
|
|
553
|
-
const [frame, err] = this.responses.shift()!;
|
|
554
|
-
if (err) throw err;
|
|
555
|
-
return frame;
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
async next(): Promise<IteratorResult<Frame, any>> {
|
|
559
|
-
try {
|
|
560
|
-
const fr = await this.read();
|
|
561
|
-
return { done: false, value: fr };
|
|
562
|
-
} catch (err) {
|
|
563
|
-
if (EOF.matches(err)) return { done: true, value: undefined };
|
|
564
|
-
throw errors.fromUnknown(err);
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
|
|
568
|
-
[Symbol.asyncIterator](): AsyncIterator<Frame, any, undefined> {
|
|
569
|
-
return this;
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
describe("hardened", () => {
|
|
574
|
-
it("should correctly call the underlying streamer methods", async () => {
|
|
575
|
-
const streamer = new MockStreamer();
|
|
576
|
-
const openMock = vi.fn();
|
|
577
|
-
const config = { channels: [1, 2, 3] };
|
|
578
|
-
const fr = new Frame({ 1: new Series([1]) });
|
|
579
|
-
const hardened = await HardenedStreamer.open(
|
|
580
|
-
async (cfg) => {
|
|
581
|
-
openMock(cfg);
|
|
582
|
-
const cfg_ = streamerConfigZ.parse(cfg);
|
|
583
|
-
streamer.responses = [[fr, null]];
|
|
584
|
-
streamer.keys = cfg_.channels as channel.Key[];
|
|
585
|
-
return streamer;
|
|
586
|
-
},
|
|
587
|
-
{ channels: [1, 2, 3] },
|
|
588
|
-
);
|
|
589
|
-
expect(hardened.keys).toEqual([1, 2, 3]);
|
|
590
|
-
expect(openMock).toHaveBeenCalledWith({
|
|
591
|
-
...config,
|
|
592
|
-
downsampleFactor: 1,
|
|
593
|
-
excludeGroups: [],
|
|
594
|
-
throttleRate: new Rate(0),
|
|
595
|
-
});
|
|
596
|
-
await hardened.update([1, 2, 3]);
|
|
597
|
-
expect(streamer.updateMock).toHaveBeenCalledWith([1, 2, 3]);
|
|
598
|
-
const fr2 = await hardened.read();
|
|
599
|
-
expect(streamer.readMock).toHaveBeenCalled();
|
|
600
|
-
expect(fr2).toEqual(fr);
|
|
601
|
-
hardened.close();
|
|
602
|
-
expect(streamer.closeMock).toHaveBeenCalled();
|
|
603
|
-
});
|
|
604
|
-
|
|
605
|
-
it("should correctly iterate over the streamer", async () => {
|
|
606
|
-
const streamer = new MockStreamer();
|
|
607
|
-
const fr = new Frame({ 1: new Series([1]) });
|
|
608
|
-
const fr2 = new Frame({ 1: new Series([2]) });
|
|
609
|
-
streamer.responses = [
|
|
610
|
-
[fr, null],
|
|
611
|
-
[fr2, null],
|
|
612
|
-
];
|
|
613
|
-
const hardened = await HardenedStreamer.open(async () => streamer, {
|
|
614
|
-
channels: [1],
|
|
615
|
-
});
|
|
616
|
-
const first = await hardened.next();
|
|
617
|
-
expect(first.value).toEqual(fr);
|
|
618
|
-
const second = await hardened.next();
|
|
619
|
-
expect(second.value).toEqual(fr2);
|
|
620
|
-
const third = await hardened.next();
|
|
621
|
-
expect(third.done).toBe(true);
|
|
622
|
-
expect(streamer.readMock).toHaveBeenCalledTimes(3);
|
|
623
|
-
});
|
|
624
|
-
|
|
625
|
-
it("should try to re-open the streamer when read fails", async () => {
|
|
626
|
-
const streamer1 = new MockStreamer();
|
|
627
|
-
const streamer2 = new MockStreamer();
|
|
628
|
-
const fr1 = new Frame({ 1: new Series([1]) });
|
|
629
|
-
const fr2 = new Frame({ 1: new Series([2]) });
|
|
630
|
-
streamer1.responses = [
|
|
631
|
-
[fr1, null],
|
|
632
|
-
[fr2, new Unreachable({ message: "cat" })],
|
|
633
|
-
];
|
|
634
|
-
streamer2.responses = [[fr2, null]];
|
|
635
|
-
let count = 0;
|
|
636
|
-
const openerMock = vi.fn();
|
|
637
|
-
const hardened = await HardenedStreamer.open(
|
|
638
|
-
async () => {
|
|
639
|
-
count++;
|
|
640
|
-
openerMock();
|
|
641
|
-
if (count === 1) return streamer1;
|
|
642
|
-
return streamer2;
|
|
643
|
-
},
|
|
644
|
-
{
|
|
645
|
-
channels: [1],
|
|
646
|
-
},
|
|
647
|
-
);
|
|
648
|
-
const fr = await hardened.read();
|
|
649
|
-
expect(streamer1.readMock).toHaveBeenCalledTimes(1);
|
|
650
|
-
expect(fr).toEqual(fr1);
|
|
651
|
-
const fr3 = await hardened.read();
|
|
652
|
-
expect(fr3).toEqual(fr2);
|
|
653
|
-
expect(streamer2.readMock).toHaveBeenCalledTimes(1);
|
|
654
|
-
expect(openerMock).toHaveBeenCalledTimes(2);
|
|
655
|
-
});
|
|
656
|
-
|
|
657
|
-
it("should repeatedly try re-opening the streamer when read fails", async () => {
|
|
658
|
-
const streamer1 = new MockStreamer();
|
|
659
|
-
const streamer5 = new MockStreamer();
|
|
660
|
-
const fr1 = new Frame({ 1: new Series([1]) });
|
|
661
|
-
const fr5 = new Frame({ 1: new Series([4]) });
|
|
662
|
-
streamer1.responses = [
|
|
663
|
-
[fr1, null],
|
|
664
|
-
[fr5, new Unreachable({ message: "cat" })],
|
|
665
|
-
];
|
|
666
|
-
streamer5.responses = [[fr5, null]];
|
|
667
|
-
const openerMock = vi.fn();
|
|
668
|
-
let count = 0;
|
|
669
|
-
const hardened = await HardenedStreamer.open(
|
|
670
|
-
async () => {
|
|
671
|
-
count++;
|
|
672
|
-
openerMock();
|
|
673
|
-
if (count === 1) return streamer1;
|
|
674
|
-
if (count < 5) throw new Unreachable({ message: "very unreachable" });
|
|
675
|
-
return streamer5;
|
|
676
|
-
},
|
|
677
|
-
{ channels: [1] },
|
|
678
|
-
{ baseInterval: TimeSpan.milliseconds(1) },
|
|
679
|
-
);
|
|
680
|
-
const fr = await hardened.read();
|
|
681
|
-
expect(fr).toEqual(fr1);
|
|
682
|
-
const fr2 = await hardened.read();
|
|
683
|
-
expect(fr2).toEqual(fr5);
|
|
684
|
-
expect(openerMock).toHaveBeenCalledTimes(5);
|
|
685
|
-
});
|
|
686
|
-
|
|
687
|
-
it("should rethrow the error when the breaker exceeds the max retries", async () => {
|
|
688
|
-
const streamer = new MockStreamer();
|
|
689
|
-
const fr = new Frame({ 1: new Series([1]) });
|
|
690
|
-
streamer.responses = [[fr, null]];
|
|
691
|
-
const openerMock = vi.fn();
|
|
692
|
-
await expect(
|
|
693
|
-
HardenedStreamer.open(
|
|
694
|
-
async () => {
|
|
695
|
-
openerMock();
|
|
696
|
-
throw new Unreachable({ message: "very unreachable" });
|
|
697
|
-
},
|
|
698
|
-
{ channels: [1] },
|
|
699
|
-
{ maxRetries: 3, baseInterval: TimeSpan.milliseconds(1) },
|
|
700
|
-
),
|
|
701
|
-
).rejects.toThrow("very unreachable");
|
|
702
|
-
});
|
|
703
|
-
|
|
704
|
-
it("should retry update when the underlying streamer fails", async () => {
|
|
705
|
-
const streamer1 = new MockStreamer();
|
|
706
|
-
streamer1.updateErrors = [null, new Unreachable({ message: "cat" })];
|
|
707
|
-
const streamer2 = new MockStreamer();
|
|
708
|
-
const fr1 = new Frame({ 1: new Series([1]) });
|
|
709
|
-
const fr2 = new Frame({ 1: new Series([2]) });
|
|
710
|
-
streamer1.responses = [[fr1, null]];
|
|
711
|
-
streamer2.responses = [[fr2, null]];
|
|
712
|
-
let count = 0;
|
|
713
|
-
const openerMock = vi.fn();
|
|
714
|
-
const hardened = await HardenedStreamer.open(
|
|
715
|
-
async () => {
|
|
716
|
-
count++;
|
|
717
|
-
openerMock();
|
|
718
|
-
if (count === 1) return streamer1;
|
|
719
|
-
return streamer2;
|
|
720
|
-
},
|
|
721
|
-
{ channels: [1] },
|
|
722
|
-
);
|
|
723
|
-
|
|
724
|
-
await hardened.update([1, 2]);
|
|
725
|
-
expect(streamer1.updateMock).toHaveBeenCalledWith([1, 2]);
|
|
726
|
-
|
|
727
|
-
await hardened.update([2, 3]);
|
|
728
|
-
expect(openerMock).toHaveBeenCalledTimes(2);
|
|
729
|
-
});
|
|
730
|
-
});
|
|
731
|
-
|
|
732
|
-
describe("observable", () => {
|
|
733
|
-
it("should notify observers when frames are received", async () => {
|
|
734
|
-
const mockStreamer = new MockStreamer();
|
|
735
|
-
const frame1 = new Frame({ 1: new Series([1, 2, 3]) });
|
|
736
|
-
const frame2 = new Frame({ 1: new Series([4, 5, 6]) });
|
|
737
|
-
|
|
738
|
-
mockStreamer.responses = [
|
|
739
|
-
[frame1, null],
|
|
740
|
-
[frame2, null],
|
|
741
|
-
];
|
|
742
|
-
mockStreamer.keys = [1];
|
|
743
|
-
|
|
744
|
-
const observable = new ObservableStreamer(mockStreamer);
|
|
745
|
-
|
|
746
|
-
const receivedFrames: Frame[] = [];
|
|
747
|
-
observable.onChange((frame) => {
|
|
748
|
-
receivedFrames.push(frame);
|
|
749
|
-
});
|
|
750
|
-
|
|
751
|
-
await expect.poll(() => receivedFrames.length).toBe(2);
|
|
752
|
-
expect(receivedFrames[0]).toEqual(frame1);
|
|
753
|
-
expect(receivedFrames[1]).toEqual(frame2);
|
|
754
|
-
|
|
755
|
-
await observable.close();
|
|
756
|
-
expect(mockStreamer.closeMock).toHaveBeenCalled();
|
|
757
|
-
});
|
|
758
|
-
|
|
759
|
-
test("should apply transform function to frames", async () => {
|
|
760
|
-
const mockStreamer = new MockStreamer();
|
|
761
|
-
const frame1 = new Frame({ 1: new Series([1, 2, 3]) });
|
|
762
|
-
const frame2 = new Frame({ 1: new Series([4, 5, 6]) });
|
|
763
|
-
|
|
764
|
-
mockStreamer.responses = [
|
|
765
|
-
[frame1, null],
|
|
766
|
-
[frame2, null],
|
|
767
|
-
];
|
|
768
|
-
mockStreamer.keys = [1];
|
|
769
|
-
|
|
770
|
-
const transform = (frame: Frame): [number, true] | [null, false] => {
|
|
771
|
-
try {
|
|
772
|
-
const data = Array.from(frame.get(1));
|
|
773
|
-
const firstValue = data[0] as number;
|
|
774
|
-
return [firstValue, true];
|
|
775
|
-
} catch {
|
|
776
|
-
return [null, false];
|
|
777
|
-
}
|
|
778
|
-
};
|
|
779
|
-
|
|
780
|
-
const observable = new ObservableStreamer(mockStreamer, transform);
|
|
781
|
-
|
|
782
|
-
const receivedValues: number[] = [];
|
|
783
|
-
observable.onChange((value) => {
|
|
784
|
-
if (value !== null) receivedValues.push(value);
|
|
785
|
-
});
|
|
786
|
-
|
|
787
|
-
await expect.poll(() => receivedValues.length).toBe(2);
|
|
788
|
-
expect(receivedValues[0]).toBe(1);
|
|
789
|
-
expect(receivedValues[1]).toBe(4);
|
|
790
|
-
|
|
791
|
-
await observable.close();
|
|
792
|
-
});
|
|
793
|
-
|
|
794
|
-
test("should handle multiple observers", async () => {
|
|
795
|
-
const mockStreamer = new MockStreamer();
|
|
796
|
-
const frame1 = new Frame({ 1: new Series([10, 20]) });
|
|
797
|
-
|
|
798
|
-
mockStreamer.responses = [[frame1, null]];
|
|
799
|
-
mockStreamer.keys = [1];
|
|
800
|
-
|
|
801
|
-
const observable = new ObservableStreamer(mockStreamer);
|
|
802
|
-
|
|
803
|
-
const observer1Results: Frame[] = [];
|
|
804
|
-
const observer2Results: Frame[] = [];
|
|
805
|
-
|
|
806
|
-
observable.onChange((frame) => {
|
|
807
|
-
observer1Results.push(frame);
|
|
808
|
-
});
|
|
809
|
-
|
|
810
|
-
observable.onChange((frame) => {
|
|
811
|
-
observer2Results.push(frame);
|
|
812
|
-
});
|
|
813
|
-
|
|
814
|
-
await expect.poll(() => observer1Results.length).toBe(1);
|
|
815
|
-
expect(observer2Results).toHaveLength(1);
|
|
816
|
-
expect(observer1Results[0]).toEqual(frame1);
|
|
817
|
-
expect(observer2Results[0]).toEqual(frame1);
|
|
818
|
-
|
|
819
|
-
await observable.close();
|
|
820
|
-
});
|
|
821
|
-
|
|
822
|
-
test("should update channels on underlying streamer", async () => {
|
|
823
|
-
const mockStreamer = new MockStreamer();
|
|
824
|
-
mockStreamer.keys = [1, 2];
|
|
825
|
-
|
|
826
|
-
const observable = new ObservableStreamer(mockStreamer);
|
|
827
|
-
|
|
828
|
-
await observable.update([3, 4, 5]);
|
|
829
|
-
|
|
830
|
-
expect(mockStreamer.updateMock).toHaveBeenCalledWith([3, 4, 5]);
|
|
831
|
-
|
|
832
|
-
await observable.close();
|
|
833
|
-
});
|
|
834
|
-
|
|
835
|
-
test("should handle empty frame stream gracefully", async () => {
|
|
836
|
-
const mockStreamer = new MockStreamer();
|
|
837
|
-
mockStreamer.keys = [1];
|
|
838
|
-
|
|
839
|
-
const observable = new ObservableStreamer(mockStreamer);
|
|
840
|
-
|
|
841
|
-
const receivedFrames: Frame[] = [];
|
|
842
|
-
observable.onChange((frame) => {
|
|
843
|
-
receivedFrames.push(frame);
|
|
844
|
-
});
|
|
845
|
-
|
|
846
|
-
await expect.poll(() => receivedFrames.length).toBe(0);
|
|
847
|
-
expect(receivedFrames).toHaveLength(0);
|
|
848
|
-
|
|
849
|
-
await observable.close();
|
|
850
|
-
});
|
|
851
|
-
|
|
852
|
-
test("should properly close and cleanup resources", async () => {
|
|
853
|
-
const mockStreamer = new MockStreamer();
|
|
854
|
-
const frame1 = new Frame({ 1: new Series([1]) });
|
|
855
|
-
|
|
856
|
-
mockStreamer.responses = [[frame1, null]];
|
|
857
|
-
mockStreamer.keys = [1];
|
|
858
|
-
|
|
859
|
-
const observable = new ObservableStreamer(mockStreamer);
|
|
860
|
-
|
|
861
|
-
const receivedFrames: Frame[] = [];
|
|
862
|
-
observable.onChange((frame) => {
|
|
863
|
-
receivedFrames.push(frame);
|
|
864
|
-
});
|
|
865
|
-
|
|
866
|
-
await observable.close();
|
|
867
|
-
|
|
868
|
-
expect(mockStreamer.closeMock).toHaveBeenCalled();
|
|
869
|
-
});
|
|
870
|
-
});
|
|
871
|
-
});
|