@winkjs/composer 0.0.2 → 0.4.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/LICENSE +1 -1
- package/README.md +106 -80
- package/package.json +56 -28
- package/src/composer.js +75 -0
- package/src/core/batch/aoo-encoder.js +148 -0
- package/src/core/batch/index.js +12 -0
- package/src/core/batch/sliding-window.js +91 -0
- package/src/core/codec/index.js +137 -0
- package/src/core/emitter-manager/mqtt/constants.js +102 -0
- package/src/core/emitter-manager/mqtt/emitter.js +780 -0
- package/src/core/emitter-manager/mqtt/index.js +190 -0
- package/src/core/emitter-manager/mqtt/mqtt-store.js +538 -0
- package/src/core/emitter-manager/terminal/assert-columns.js +98 -0
- package/src/core/emitter-manager/terminal/formatters.js +160 -0
- package/src/core/emitter-manager/terminal/index.js +341 -0
- package/src/core/env-vars.js +245 -0
- package/src/core/mqtt-protocol.js +47 -0
- package/src/core/partition-manager/index.js +7 -0
- package/src/core/partition-manager/init.js +44 -0
- package/src/core/partition-manager/introspect.js +15 -0
- package/src/core/partition-manager/publish-to.js +6 -0
- package/src/core/partition-manager/recompute.js +5 -0
- package/src/core/partition-manager/reset.js +5 -0
- package/src/core/partition-manager/update.js +264 -0
- package/src/core/partition-manager/validate-flow.js +157 -0
- package/src/core/semantics/digest.js +128 -0
- package/src/core/semantics/index.js +83 -0
- package/src/core/semantics/loader.js +571 -0
- package/src/core/semantics/schemas/asset-class-schema.js +218 -0
- package/src/core/semantics/schemas/column-schema.js +651 -0
- package/src/core/semantics/schemas/enum-schema.js +153 -0
- package/src/core/semantics/schemas/index.js +51 -0
- package/src/core/semantics/warnings.js +141 -0
- package/src/core/shutdown-manager/index.js +289 -0
- package/src/core/source-manager/csv/index.js +171 -0
- package/src/core/source-manager/csv/start.js +456 -0
- package/src/core/source-manager/mqtt/client.js +406 -0
- package/src/core/source-manager/mqtt/constants.js +147 -0
- package/src/core/source-manager/mqtt/dedup.js +244 -0
- package/src/core/source-manager/mqtt/index.js +260 -0
- package/src/core/source-manager/mqtt/status.js +546 -0
- package/src/core/source-manager/test-harness/comparator.js +226 -0
- package/src/core/source-manager/test-harness/field-generator.js +85 -0
- package/src/core/source-manager/test-harness/fuzz.js +87 -0
- package/src/core/source-manager/test-harness/index.js +115 -0
- package/src/core/source-manager/test-harness/prng.js +57 -0
- package/src/core/source-manager/test-harness/start.js +232 -0
- package/src/core/source-manager/test-harness/validate.js +213 -0
- package/src/core/storage-manager/questdb/assert-columns.js +120 -0
- package/src/core/storage-manager/questdb/ensure-tables.js +187 -0
- package/src/core/storage-manager/questdb/index.js +1251 -0
- package/src/core/storage-manager/questdb/persist-plan.js +488 -0
- package/src/core/storage-manager/questdb/writers.js +142 -0
- package/src/core/test-utils/sealed-record.js +80 -0
- package/src/core/test-utils/soak-signature.js +149 -0
- package/src/core/test-utils/tcp-proxy.js +106 -0
- package/src/core/tunable/helpers.js +254 -0
- package/src/core/tunable/index.js +87 -0
- package/src/core/utils/console-formatter/index.js +207 -0
- package/src/core/utils/create-smart-store-as/index.js +98 -0
- package/src/core/utils/create-smart-store-as/sanitize-field.js +46 -0
- package/src/core/utils/create-smart-store-as/smart-truncate.js +93 -0
- package/src/core/utils/flow/index.js +5 -0
- package/src/core/utils/flow/make-collision-checker.js +23 -0
- package/src/core/utils/flow/to-kebab.js +20 -0
- package/src/core/utils/half-life/index.js +111 -0
- package/src/core/utils/node/disable.js +11 -0
- package/src/core/utils/node/enable.js +11 -0
- package/src/core/utils/node/execute-triggers.js +40 -0
- package/src/core/utils/node/index.js +10 -0
- package/src/core/utils/node/pause.js +11 -0
- package/src/core/utils/node/populate-predicate-inputs.js +14 -0
- package/src/core/utils/node/publish-nan.js +19 -0
- package/src/core/utils/node/reset-predicate-inputs.js +11 -0
- package/src/core/utils/node/unpause.js +11 -0
- package/src/core/utils/node/validate-spec.js +22 -0
- package/src/core/utils/options/resolve-field-keyed.js +115 -0
- package/src/core/utils/quantize/index.js +75 -0
- package/src/core/utils/stats/formulas.js +67 -0
- package/src/core/utils/stats/index.js +3 -0
- package/src/core/utils/validate/composer-validators.js +141 -0
- package/src/core/utils/validate/helpers.js +206 -0
- package/src/core/utils/validate/index.js +12 -0
- package/src/core/utils/validate/type-validators.js +538 -0
- package/src/core/utils/validate/validate.js +107 -0
- package/src/core/utils/validate/validators.js +177 -0
- package/src/core/wiring/assert-handle.js +57 -0
- package/src/core/wiring/assert-module.js +63 -0
- package/src/core/wiring/index.js +5 -0
- package/src/core/wiring/node-type-to-module.js +17 -0
- package/src/core/wiring/wire-emitters.js +256 -0
- package/src/core/wiring/wire-linear-graph.js +25 -0
- package/src/core/wiring/wire-node.js +157 -0
- package/src/core/wiring/wire-semantics.js +173 -0
- package/src/core/wiring/wire-storages.js +344 -0
- package/src/flow/check-output-collisions.js +93 -0
- package/src/flow/consts.js +9 -0
- package/src/flow/deep-clone-spec.js +64 -0
- package/src/flow/driver.js +171 -0
- package/src/flow/expand-single-input-array.js +76 -0
- package/src/flow/expand-template-spec.js +93 -0
- package/src/flow/flow-api-schemas.js +300 -0
- package/src/flow/flow.js +658 -0
- package/src/flow/for-each.js +225 -0
- package/src/flow/get-signature-pattern.js +31 -0
- package/src/flow/get-target-array.js +46 -0
- package/src/flow/inspect.js +67 -0
- package/src/flow/load-node-module.js +81 -0
- package/src/flow/make-node-method.js +112 -0
- package/src/flow/resolve-pick-by-field.js +77 -0
- package/src/flow/resolve-tunables.js +76 -0
- package/src/flow/run.js +392 -0
- package/src/flow/serialize.js +161 -0
- package/src/flow/signatures-schema.js +222 -0
- package/src/flow/spec-builder.js +65 -0
- package/src/flow/validate-triggers.js +250 -0
- package/src/flow/validate.js +261 -0
- package/src/nodes/accumulate/index.js +21 -0
- package/src/nodes/accumulate/init.js +48 -0
- package/src/nodes/accumulate/introspect.js +123 -0
- package/src/nodes/accumulate/publish-to.js +34 -0
- package/src/nodes/accumulate/recompute.js +27 -0
- package/src/nodes/accumulate/reset.js +25 -0
- package/src/nodes/accumulate/update.js +42 -0
- package/src/nodes/appraise/calibrate.js +64 -0
- package/src/nodes/appraise/decision.js +66 -0
- package/src/nodes/appraise/deviation.js +140 -0
- package/src/nodes/appraise/index.js +23 -0
- package/src/nodes/appraise/init.js +165 -0
- package/src/nodes/appraise/integrate.js +45 -0
- package/src/nodes/appraise/introspect.js +352 -0
- package/src/nodes/appraise/publish-to.js +93 -0
- package/src/nodes/appraise/receptor.js +69 -0
- package/src/nodes/appraise/recompute.js +79 -0
- package/src/nodes/appraise/reset.js +53 -0
- package/src/nodes/appraise/update.js +130 -0
- package/src/nodes/archive/csv/index.js +6 -0
- package/src/nodes/archive/csv/init.js +36 -0
- package/src/nodes/archive/csv/load.js +70 -0
- package/src/nodes/archive/csv/reset.js +14 -0
- package/src/nodes/archive/csv/simple-parser.js +216 -0
- package/src/nodes/archive/csv/test.js +173 -0
- package/src/nodes/archive/csv/update.js +63 -0
- package/src/nodes/butterworth-filter/index.js +18 -0
- package/src/nodes/butterworth-filter/init.js +184 -0
- package/src/nodes/butterworth-filter/introspect.js +228 -0
- package/src/nodes/butterworth-filter/publish-to.js +21 -0
- package/src/nodes/butterworth-filter/recompute.js +13 -0
- package/src/nodes/butterworth-filter/reset.js +30 -0
- package/src/nodes/butterworth-filter/update.js +38 -0
- package/src/nodes/categorize/index.js +19 -0
- package/src/nodes/categorize/init.js +58 -0
- package/src/nodes/categorize/introspect.js +177 -0
- package/src/nodes/categorize/publish-to.js +29 -0
- package/src/nodes/categorize/recompute.js +14 -0
- package/src/nodes/categorize/reset.js +16 -0
- package/src/nodes/categorize/update.js +53 -0
- package/src/nodes/controller/index.js +9 -0
- package/src/nodes/controller/init.js +55 -0
- package/src/nodes/controller/introspect.js +91 -0
- package/src/nodes/controller/publish-to.js +8 -0
- package/src/nodes/controller/recompute.js +9 -0
- package/src/nodes/controller/reset.js +17 -0
- package/src/nodes/controller/update.js +63 -0
- package/src/nodes/diff/index.js +19 -0
- package/src/nodes/diff/init.js +37 -0
- package/src/nodes/diff/introspect.js +132 -0
- package/src/nodes/diff/publish-to.js +21 -0
- package/src/nodes/diff/recompute.js +12 -0
- package/src/nodes/diff/reset.js +12 -0
- package/src/nodes/diff/update.js +37 -0
- package/src/nodes/digest-moments/formulas.js +12 -0
- package/src/nodes/digest-moments/index.js +14 -0
- package/src/nodes/digest-moments/init.js +67 -0
- package/src/nodes/digest-moments/introspect.js +154 -0
- package/src/nodes/digest-moments/publish-to.js +34 -0
- package/src/nodes/digest-moments/recompute.js +14 -0
- package/src/nodes/digest-moments/reset.js +14 -0
- package/src/nodes/digest-moments/update.js +120 -0
- package/src/nodes/dwell-time-tracker/index.js +14 -0
- package/src/nodes/dwell-time-tracker/init.js +59 -0
- package/src/nodes/dwell-time-tracker/introspect.js +137 -0
- package/src/nodes/dwell-time-tracker/publish-to.js +22 -0
- package/src/nodes/dwell-time-tracker/recompute.js +8 -0
- package/src/nodes/dwell-time-tracker/reset.js +23 -0
- package/src/nodes/dwell-time-tracker/update.js +103 -0
- package/src/nodes/emit-if/helpers.js +94 -0
- package/src/nodes/emit-if/index.js +16 -0
- package/src/nodes/emit-if/init.js +67 -0
- package/src/nodes/emit-if/introspect.js +102 -0
- package/src/nodes/emit-if/publish-to.js +13 -0
- package/src/nodes/emit-if/recompute.js +12 -0
- package/src/nodes/emit-if/reset.js +27 -0
- package/src/nodes/emit-if/update.js +93 -0
- package/src/nodes/es-correlation/index.js +19 -0
- package/src/nodes/es-correlation/init.js +73 -0
- package/src/nodes/es-correlation/introspect.js +176 -0
- package/src/nodes/es-correlation/publish-to.js +32 -0
- package/src/nodes/es-correlation/recompute.js +56 -0
- package/src/nodes/es-correlation/reset.js +27 -0
- package/src/nodes/es-correlation/update.js +110 -0
- package/src/nodes/es-mean/index.js +20 -0
- package/src/nodes/es-mean/init.js +58 -0
- package/src/nodes/es-mean/introspect.js +129 -0
- package/src/nodes/es-mean/publish-to.js +19 -0
- package/src/nodes/es-mean/recompute.js +16 -0
- package/src/nodes/es-mean/reset.js +24 -0
- package/src/nodes/es-mean/update.js +69 -0
- package/src/nodes/es-pairwise-correlation/index.js +19 -0
- package/src/nodes/es-pairwise-correlation/init.js +98 -0
- package/src/nodes/es-pairwise-correlation/introspect.js +187 -0
- package/src/nodes/es-pairwise-correlation/publish-to.js +31 -0
- package/src/nodes/es-pairwise-correlation/recompute.js +69 -0
- package/src/nodes/es-pairwise-correlation/reset.js +29 -0
- package/src/nodes/es-pairwise-correlation/update.js +89 -0
- package/src/nodes/es-stats/index.js +21 -0
- package/src/nodes/es-stats/init.js +105 -0
- package/src/nodes/es-stats/introspect.js +157 -0
- package/src/nodes/es-stats/publish-to.js +42 -0
- package/src/nodes/es-stats/recompute.js +74 -0
- package/src/nodes/es-stats/reset.js +49 -0
- package/src/nodes/es-stats/update-envelope.js +44 -0
- package/src/nodes/es-stats/update-welford.js +64 -0
- package/src/nodes/es-stats/update.js +59 -0
- package/src/nodes/index.js +83 -0
- package/src/nodes/invert-flag/index.js +20 -0
- package/src/nodes/invert-flag/init.js +36 -0
- package/src/nodes/invert-flag/introspect.js +115 -0
- package/src/nodes/invert-flag/publish-to.js +23 -0
- package/src/nodes/invert-flag/recompute.js +12 -0
- package/src/nodes/invert-flag/reset.js +12 -0
- package/src/nodes/invert-flag/update.js +32 -0
- package/src/nodes/kalman1d/index.js +20 -0
- package/src/nodes/kalman1d/init.js +103 -0
- package/src/nodes/kalman1d/introspect.js +250 -0
- package/src/nodes/kalman1d/publish-to.js +34 -0
- package/src/nodes/kalman1d/recompute.js +23 -0
- package/src/nodes/kalman1d/reset.js +29 -0
- package/src/nodes/kalman1d/update.js +144 -0
- package/src/nodes/kernel/index.js +18 -0
- package/src/nodes/kernel/init.js +66 -0
- package/src/nodes/kernel/introspect.js +163 -0
- package/src/nodes/kernel/presets.js +74 -0
- package/src/nodes/kernel/publish-to.js +25 -0
- package/src/nodes/kernel/recompute.js +14 -0
- package/src/nodes/kernel/reset.js +20 -0
- package/src/nodes/kernel/update.js +69 -0
- package/src/nodes/lag/index.js +21 -0
- package/src/nodes/lag/init.js +87 -0
- package/src/nodes/lag/introspect.js +202 -0
- package/src/nodes/lag/publish-to.js +64 -0
- package/src/nodes/lag/recompute.js +33 -0
- package/src/nodes/lag/reset.js +49 -0
- package/src/nodes/lag/update.js +133 -0
- package/src/nodes/median3/index.js +19 -0
- package/src/nodes/median3/init.js +40 -0
- package/src/nodes/median3/introspect.js +116 -0
- package/src/nodes/median3/publish-to.js +21 -0
- package/src/nodes/median3/recompute.js +12 -0
- package/src/nodes/median3/reset.js +15 -0
- package/src/nodes/median3/update.js +58 -0
- package/src/nodes/moments-digest/copy-from.js +12 -0
- package/src/nodes/moments-digest/flush.js +17 -0
- package/src/nodes/moments-digest/index.js +132 -0
- package/src/nodes/moments-digest/init.js +84 -0
- package/src/nodes/moments-digest/introspect.js +122 -0
- package/src/nodes/moments-digest/prelude.js +28 -0
- package/src/nodes/moments-digest/publish-to.js +31 -0
- package/src/nodes/moments-digest/recompute.js +9 -0
- package/src/nodes/moments-digest/reset.js +20 -0
- package/src/nodes/moments-digest/update.js +182 -0
- package/src/nodes/node-names.js +67 -0
- package/src/nodes/page-hinkley/index.js +20 -0
- package/src/nodes/page-hinkley/init.js +66 -0
- package/src/nodes/page-hinkley/introspect.js +193 -0
- package/src/nodes/page-hinkley/publish-to.js +28 -0
- package/src/nodes/page-hinkley/recompute.js +14 -0
- package/src/nodes/page-hinkley/reset.js +23 -0
- package/src/nodes/page-hinkley/update.js +105 -0
- package/src/nodes/pass-if/index.js +21 -0
- package/src/nodes/pass-if/init.js +37 -0
- package/src/nodes/pass-if/introspect.js +93 -0
- package/src/nodes/pass-if/publish-to.js +15 -0
- package/src/nodes/pass-if/recompute.js +15 -0
- package/src/nodes/pass-if/reset.js +18 -0
- package/src/nodes/pass-if/update.js +37 -0
- package/src/nodes/persist-if/helpers.js +111 -0
- package/src/nodes/persist-if/index.js +9 -0
- package/src/nodes/persist-if/init.js +98 -0
- package/src/nodes/persist-if/introspect.js +106 -0
- package/src/nodes/persist-if/publish-to.js +21 -0
- package/src/nodes/persist-if/recompute.js +20 -0
- package/src/nodes/persist-if/reset.js +35 -0
- package/src/nodes/persist-if/update.js +112 -0
- package/src/nodes/persistence-check/index.js +14 -0
- package/src/nodes/persistence-check/init.js +38 -0
- package/src/nodes/persistence-check/introspect.js +144 -0
- package/src/nodes/persistence-check/publish-to.js +11 -0
- package/src/nodes/persistence-check/recompute.js +7 -0
- package/src/nodes/persistence-check/reset.js +12 -0
- package/src/nodes/persistence-check/update.js +57 -0
- package/src/nodes/process-index/index.js +15 -0
- package/src/nodes/process-index/init.js +48 -0
- package/src/nodes/process-index/introspect.js +182 -0
- package/src/nodes/process-index/publish-to.js +29 -0
- package/src/nodes/process-index/recompute.js +8 -0
- package/src/nodes/process-index/reset.js +8 -0
- package/src/nodes/process-index/update.js +75 -0
- package/src/nodes/ratio/index.js +14 -0
- package/src/nodes/ratio/init.js +37 -0
- package/src/nodes/ratio/introspect.js +155 -0
- package/src/nodes/ratio/publish-to.js +15 -0
- package/src/nodes/ratio/recompute.js +7 -0
- package/src/nodes/ratio/reset.js +7 -0
- package/src/nodes/ratio/update.js +47 -0
- package/src/nodes/sanitize/index.js +82 -0
- package/src/nodes/sanitize/init.js +82 -0
- package/src/nodes/sanitize/introspect.js +194 -0
- package/src/nodes/sanitize/publish-to.js +15 -0
- package/src/nodes/sanitize/recompute.js +8 -0
- package/src/nodes/sanitize/reset.js +14 -0
- package/src/nodes/sanitize/update.js +102 -0
- package/src/nodes/spike-guard/index.js +14 -0
- package/src/nodes/spike-guard/init.js +47 -0
- package/src/nodes/spike-guard/introspect.js +130 -0
- package/src/nodes/spike-guard/publish-to.js +35 -0
- package/src/nodes/spike-guard/recompute.js +14 -0
- package/src/nodes/spike-guard/reset.js +19 -0
- package/src/nodes/spike-guard/update.js +89 -0
- package/src/nodes/sse-emitter/index.js +7 -0
- package/src/nodes/sse-emitter/init.js +105 -0
- package/src/nodes/sse-emitter/introspect.js +134 -0
- package/src/nodes/sse-emitter/publish-to.js +6 -0
- package/src/nodes/sse-emitter/recompute.js +16 -0
- package/src/nodes/sse-emitter/reset.js +19 -0
- package/src/nodes/sse-emitter/update.js +69 -0
- package/src/nodes/sse-emitter/utils/broadcast-heartbeat.js +36 -0
- package/src/nodes/sse-emitter/utils/build-message.js +31 -0
- package/src/nodes/sse-emitter/utils/connection-manager.js +45 -0
- package/src/nodes/sse-emitter/utils/endpoint-initializer.js +20 -0
- package/src/nodes/sse-emitter/utils/health-monitor.js +38 -0
- package/src/nodes/sse-emitter/utils/qos-handler.js +41 -0
- package/src/nodes/state-change-detector/helpers.js +35 -0
- package/src/nodes/state-change-detector/index.js +12 -0
- package/src/nodes/state-change-detector/init.js +56 -0
- package/src/nodes/state-change-detector/introspect.js +146 -0
- package/src/nodes/state-change-detector/publish-to.js +20 -0
- package/src/nodes/state-change-detector/recompute.js +6 -0
- package/src/nodes/state-change-detector/reset.js +20 -0
- package/src/nodes/state-change-detector/update.js +97 -0
- package/src/nodes/sw-stats/index.js +14 -0
- package/src/nodes/sw-stats/init.js +51 -0
- package/src/nodes/sw-stats/introspect.js +131 -0
- package/src/nodes/sw-stats/publish-to.js +45 -0
- package/src/nodes/sw-stats/recompute.js +33 -0
- package/src/nodes/sw-stats/reset.js +15 -0
- package/src/nodes/sw-stats/update.js +39 -0
- package/src/nodes/swing-watch/index.js +17 -0
- package/src/nodes/swing-watch/init.js +144 -0
- package/src/nodes/swing-watch/introspect.js +188 -0
- package/src/nodes/swing-watch/publish-to.js +53 -0
- package/src/nodes/swing-watch/recompute.js +22 -0
- package/src/nodes/swing-watch/reset.js +55 -0
- package/src/nodes/swing-watch/update.js +767 -0
- package/src/nodes/tally/index.js +15 -0
- package/src/nodes/tally/init.js +32 -0
- package/src/nodes/tally/introspect.js +116 -0
- package/src/nodes/tally/publish-to.js +28 -0
- package/src/nodes/tally/recompute.js +10 -0
- package/src/nodes/tally/reset.js +10 -0
- package/src/nodes/tally/update.js +44 -0
- package/src/nodes/threshold/index.js +14 -0
- package/src/nodes/threshold/init.js +121 -0
- package/src/nodes/threshold/introspect.js +192 -0
- package/src/nodes/threshold/publish-to.js +11 -0
- package/src/nodes/threshold/recompute.js +8 -0
- package/src/nodes/threshold/reset.js +14 -0
- package/src/nodes/threshold/update.js +54 -0
- package/src/nodes/transform/helpers.js +39 -0
- package/src/nodes/transform/index.js +15 -0
- package/src/nodes/transform/init.js +35 -0
- package/src/nodes/transform/introspect.js +118 -0
- package/src/nodes/transform/publish-to.js +23 -0
- package/src/nodes/transform/recompute.js +12 -0
- package/src/nodes/transform/reset.js +11 -0
- package/src/nodes/transform/update.js +32 -0
- package/src/nodes/trend/compute-confidence.js +112 -0
- package/src/nodes/trend/index.js +14 -0
- package/src/nodes/trend/init.js +81 -0
- package/src/nodes/trend/introspect.js +151 -0
- package/src/nodes/trend/publish-to.js +22 -0
- package/src/nodes/trend/recompute.js +15 -0
- package/src/nodes/trend/reset.js +26 -0
- package/src/nodes/trend/update.js +93 -0
- package/src/nodes/tw-stats/copy-from.js +16 -0
- package/src/nodes/tw-stats/flush.js +12 -0
- package/src/nodes/tw-stats/index.js +41 -0
- package/src/nodes/tw-stats/init.js +92 -0
- package/src/nodes/tw-stats/introspect.js +171 -0
- package/src/nodes/tw-stats/publish-to.js +108 -0
- package/src/nodes/tw-stats/recompute.js +9 -0
- package/src/nodes/tw-stats/reset.js +16 -0
- package/src/nodes/tw-stats/update.js +113 -0
- package/src/nodes/unbalance/index.js +15 -0
- package/src/nodes/unbalance/init.js +59 -0
- package/src/nodes/unbalance/introspect.js +167 -0
- package/src/nodes/unbalance/publish-to.js +52 -0
- package/src/nodes/unbalance/recompute.js +11 -0
- package/src/nodes/unbalance/reset.js +10 -0
- package/src/nodes/unbalance/update.js +83 -0
- package/src/nodes/vector-distance/index.js +14 -0
- package/src/nodes/vector-distance/init.js +54 -0
- package/src/nodes/vector-distance/introspect.js +149 -0
- package/src/nodes/vector-distance/publish-to.js +35 -0
- package/src/nodes/vector-distance/recompute.js +11 -0
- package/src/nodes/vector-distance/reset.js +20 -0
- package/src/nodes/vector-distance/update.js +139 -0
- package/src/nodes/winnow/index.js +12 -0
- package/src/nodes/winnow/init.js +82 -0
- package/src/nodes/winnow/introspect.js +253 -0
- package/src/nodes/winnow/publish-to.js +51 -0
- package/src/nodes/winnow/recompute.js +14 -0
- package/src/nodes/winnow/reset.js +34 -0
- package/src/nodes/winnow/update.js +203 -0
- package/src/tools/training/features.js +227 -0
- package/src/tools/training/index.js +21 -0
- package/src/tools/training/logistic.js +238 -0
- package/src/tools/training/metrics.js +126 -0
- package/src/tools/training/scale.js +239 -0
- package/src/tools/training/validate.js +103 -0
- package/src/windowing/count-sliding/create.js +16 -0
- package/src/windowing/count-sliding/get-reverse-chronological-index.js +19 -0
- package/src/windowing/count-sliding/index.js +6 -0
- package/src/windowing/count-sliding/is-not-full.js +5 -0
- package/src/windowing/count-sliding/push.js +15 -0
- package/src/windowing/count-sliding/reset.js +11 -0
- package/src/windowing/count-sliding/size.js +5 -0
- package/src/windowing/time-sliding/create.js +25 -0
- package/src/windowing/time-sliding/push.js +42 -0
- package/CODE_OF_CONDUCT.md +0 -46
- package/CONTRIBUTING.md +0 -132
- package/docs/.nojekyll +0 -0
- package/docs/CONTRIBUTING.md +0 -134
- package/docs/README.md +0 -132
- package/docs/_coverpage.md +0 -26
- package/docs/_media/bg.png +0 -0
- package/docs/_media/wink-logo.png +0 -0
- package/docs/_navbar.md +0 -14
- package/docs/_sidebar.md +0 -2
- package/docs/index.html +0 -44
- package/eslint.config.js +0 -283
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// core/batch/sliding-window.js
|
|
2
|
+
// Purpose:
|
|
3
|
+
// Fixed-capacity sliding window for retaining recent data snapshots.
|
|
4
|
+
// Designed for "first paint" scenarios where new subscribers need recent history.
|
|
5
|
+
// Maintains a circular buffer of rows with stable object shapes.
|
|
6
|
+
|
|
7
|
+
export const createWindow = function ( capacity, fieldOrder ) {
|
|
8
|
+
// Input validation
|
|
9
|
+
if ( !capacity || capacity <= 0 ) {
|
|
10
|
+
throw new Error( 'capacity must be positive integer' );
|
|
11
|
+
}
|
|
12
|
+
if ( !Array.isArray( fieldOrder ) || fieldOrder.length === 0 ) {
|
|
13
|
+
throw new Error( 'fieldOrder must be non-empty array' );
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Pre-allocate all row objects with stable shape
|
|
17
|
+
const rows = new Array( capacity );
|
|
18
|
+
for ( let i = 0; i < capacity; i += 1 ) {
|
|
19
|
+
const r = Object.create( null );
|
|
20
|
+
// Initialize all fields to null for consistent shape
|
|
21
|
+
for ( let k = 0; k < fieldOrder.length; k += 1 ) {
|
|
22
|
+
r[ fieldOrder[ k ] ] = null;
|
|
23
|
+
}
|
|
24
|
+
rows[ i ] = r;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Circular buffer state:
|
|
28
|
+
// - head: next write position [0, capacity)
|
|
29
|
+
// - count: total items in window (capped at capacity)
|
|
30
|
+
let head = 0;
|
|
31
|
+
let count = 0;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Add a new row to the window, evicting oldest if at capacity.
|
|
35
|
+
*/
|
|
36
|
+
const put = function ( src ) {
|
|
37
|
+
// Get pre-allocated row at current position
|
|
38
|
+
const dst = rows[ head ];
|
|
39
|
+
|
|
40
|
+
// Copy only declared fields in order
|
|
41
|
+
for ( let k = 0; k < fieldOrder.length; k += 1 ) {
|
|
42
|
+
const key = fieldOrder[ k ];
|
|
43
|
+
const v = src[ key ];
|
|
44
|
+
// FIXED: Normalize undefined to null for consistent serialization
|
|
45
|
+
dst[ key ] = ( v === undefined ) ? null : v;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Advance head with wraparound
|
|
49
|
+
head = ( head + 1 ) % capacity;
|
|
50
|
+
|
|
51
|
+
// Track fill level (stops growing at capacity)
|
|
52
|
+
if ( count < capacity ) count += 1;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Extract recent rows from window in FIFO order (oldest to newest).
|
|
57
|
+
* Returns the most recent 'max' rows or all available rows if less than max.
|
|
58
|
+
*/
|
|
59
|
+
const toRows = function ( out, max ) {
|
|
60
|
+
// Determine how many rows we can actually provide
|
|
61
|
+
const take = Math.min( count, max );
|
|
62
|
+
|
|
63
|
+
if ( take === 0 ) return 0;
|
|
64
|
+
|
|
65
|
+
// Calculate starting position for oldest data we want to return
|
|
66
|
+
let idx;
|
|
67
|
+
if ( count < capacity ) {
|
|
68
|
+
// Window not full: we have 'count' items starting from 0
|
|
69
|
+
// To get the most recent 'take' items, start from (count - take)
|
|
70
|
+
idx = Math.max( 0, count - take );
|
|
71
|
+
} else {
|
|
72
|
+
// Window full: head points to next write position (oldest data)
|
|
73
|
+
// To get the most recent 'take' items, go back 'take' positions
|
|
74
|
+
idx = ( head - take + capacity ) % capacity;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Copy row references to output array in chronological order
|
|
78
|
+
for ( let i = 0; i < take; i += 1 ) {
|
|
79
|
+
out[ i ] = rows[ idx ];
|
|
80
|
+
idx = ( idx + 1 ) % capacity;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return take;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
// Public API
|
|
87
|
+
return {
|
|
88
|
+
put: put,
|
|
89
|
+
toRows: toRows
|
|
90
|
+
};
|
|
91
|
+
};
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// src/core/codec/index.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Universal codec for WinkComposer and Dashboard
|
|
5
|
+
*
|
|
6
|
+
* Provides efficient message serialization for MQTT transport with support
|
|
7
|
+
* for both MessagePack (binary, efficient) and JSON (text, debuggable).
|
|
8
|
+
* Works identically in Node.js (WinkComposer) and browsers (Dashboard).
|
|
9
|
+
*
|
|
10
|
+
* Design principles:
|
|
11
|
+
* - Zero dependencies on Node.js-specific APIs
|
|
12
|
+
* - Minimal allocations in hot path
|
|
13
|
+
* - Consistent Uint8Array return type
|
|
14
|
+
* - Frozen objects to prevent accidental mutation
|
|
15
|
+
*
|
|
16
|
+
* @module codec
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { Packr, Unpackr } from 'msgpackr';
|
|
20
|
+
|
|
21
|
+
// MessagePack encoder/decoder with optimizations for streaming data
|
|
22
|
+
const packr = new Packr( {
|
|
23
|
+
structuredClone: false, // Avoid unnecessary object cloning
|
|
24
|
+
variableMapSize: true, // Handle varying message sizes efficiently
|
|
25
|
+
bundleStrings: true // Optimize repeated field names (sensorId, timestamp, etc.)
|
|
26
|
+
} );
|
|
27
|
+
|
|
28
|
+
const unpackr = new Unpackr( {
|
|
29
|
+
bundleStrings: true // Must match packr configuration
|
|
30
|
+
} );
|
|
31
|
+
|
|
32
|
+
// UTF-8 encoder/decoder - native browser APIs, also available in Node.js 11+
|
|
33
|
+
const textEncoder = new TextEncoder();
|
|
34
|
+
const textDecoder = new TextDecoder();
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Convert various byte-like types to Uint8Array without unnecessary copying.
|
|
38
|
+
* Handles Buffer (Node.js), ArrayBuffer, DataView, and other typed arrays.
|
|
39
|
+
*
|
|
40
|
+
* @param {BufferSource} bytes - ArrayBuffer, typed array, or DataView
|
|
41
|
+
* @returns {Uint8Array} View over the same underlying memory
|
|
42
|
+
* @throws {TypeError} If input is not a valid byte source
|
|
43
|
+
*/
|
|
44
|
+
const toUint8 = function ( bytes ) {
|
|
45
|
+
// Fast path - already correct type (includes Node.js Buffer)
|
|
46
|
+
if ( bytes instanceof Uint8Array ) return bytes;
|
|
47
|
+
|
|
48
|
+
// ArrayBuffer - wrap in view
|
|
49
|
+
if ( bytes instanceof ArrayBuffer ) return new Uint8Array( bytes );
|
|
50
|
+
|
|
51
|
+
// Other typed arrays (Int16Array, DataView, etc.) - create view over same buffer
|
|
52
|
+
if ( ArrayBuffer.isView( bytes ) ) {
|
|
53
|
+
return new Uint8Array( bytes.buffer, bytes.byteOffset, bytes.byteLength );
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
throw new TypeError( 'Expected BufferSource' );
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Create a codec for message serialization
|
|
61
|
+
*
|
|
62
|
+
* @param {string} format - Serialization format: 'msgpack' or 'json'
|
|
63
|
+
* @returns {{
|
|
64
|
+
* pack: (obj: any) => Uint8Array,
|
|
65
|
+
* unpack: (bytes: BufferSource | string) => any,
|
|
66
|
+
* contentType: string,
|
|
67
|
+
* payloadFormatIndicator: number
|
|
68
|
+
* }} Frozen codec instance with MQTT v5 properties
|
|
69
|
+
* @throws {TypeError} If format is not supported
|
|
70
|
+
*/
|
|
71
|
+
export const createCodec = function ( format = 'msgpack' ) {
|
|
72
|
+
if ( format === 'msgpack' ) {
|
|
73
|
+
return Object.freeze( {
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Serialize object to MessagePack binary format
|
|
77
|
+
* @param {*} obj - Object to serialize
|
|
78
|
+
* @returns {Uint8Array} Packed bytes
|
|
79
|
+
*/
|
|
80
|
+
pack: ( obj ) => {
|
|
81
|
+
const out = packr.encode( obj );
|
|
82
|
+
// Ensure Uint8Array (packr returns Buffer in Node.js, but may differ in browsers)
|
|
83
|
+
/* c8 ignore next - defensive for browser environments, Buffer is Uint8Array in Node.js */
|
|
84
|
+
return out instanceof Uint8Array ? out : new Uint8Array( out );
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Deserialize MessagePack bytes to object
|
|
89
|
+
* @param {BufferSource} bytes - MessagePack data
|
|
90
|
+
* @returns {*} Deserialized object
|
|
91
|
+
*/
|
|
92
|
+
unpack: ( bytes ) => unpackr.decode( toUint8( bytes ) ),
|
|
93
|
+
|
|
94
|
+
// MQTT v5 properties
|
|
95
|
+
contentType: 'application/msgpack',
|
|
96
|
+
payloadFormatIndicator: 0 // 0 = binary format
|
|
97
|
+
} );
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if ( format === 'json' ) {
|
|
101
|
+
return Object.freeze( {
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Serialize object to JSON UTF-8 bytes
|
|
105
|
+
* @param {*} obj - Object to serialize (must be JSON-serializable)
|
|
106
|
+
* @returns {Uint8Array} UTF-8 encoded JSON
|
|
107
|
+
*/
|
|
108
|
+
pack: ( obj ) => textEncoder.encode( JSON.stringify( obj ) ),
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Deserialize JSON from UTF-8 bytes or string
|
|
112
|
+
* @param {BufferSource | string} bytes - JSON data
|
|
113
|
+
* @returns {*} Parsed object
|
|
114
|
+
*/
|
|
115
|
+
unpack: ( bytes ) => {
|
|
116
|
+
// Handle both string and binary input
|
|
117
|
+
const u8 = typeof bytes === 'string' ?
|
|
118
|
+
textEncoder.encode( bytes ) :
|
|
119
|
+
toUint8( bytes );
|
|
120
|
+
return JSON.parse( textDecoder.decode( u8 ) );
|
|
121
|
+
},
|
|
122
|
+
|
|
123
|
+
// MQTT v5 properties
|
|
124
|
+
contentType: 'application/json',
|
|
125
|
+
payloadFormatIndicator: 1 // 1 = UTF-8 text
|
|
126
|
+
} );
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
throw new TypeError( `Unknown format: ${format}` );
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Pre-created codecs for convenience
|
|
133
|
+
export const msgpackCodec = createCodec( 'msgpack' );
|
|
134
|
+
export const jsonCodec = createCodec( 'json' );
|
|
135
|
+
|
|
136
|
+
// Default export for simple import
|
|
137
|
+
export default createCodec;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// core/emitter-manager/mqtt/constants.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Production Constants - Pure Transport Layer
|
|
5
|
+
*
|
|
6
|
+
* Protocol invariants (QoS, WINK_NAMESPACE, protocol version) are imported
|
|
7
|
+
* from the shared mqtt-protocol module. Deployment-configurable values
|
|
8
|
+
* (keepalive, reconnect, queue limits, etc.) come from ENV_VARS.
|
|
9
|
+
*
|
|
10
|
+
* DESIGN DECISIONS (invariants, not configurable):
|
|
11
|
+
*
|
|
12
|
+
* 1. FIXED QoS 1
|
|
13
|
+
* - Reliable without overhead of QoS 2
|
|
14
|
+
* - At-least-once delivery sufficient for telemetry
|
|
15
|
+
* - Duplicates handled by backend deduplication (UUID)
|
|
16
|
+
*
|
|
17
|
+
* 2. QUEUE_CRITICAL_THRESHOLD at 80%
|
|
18
|
+
* - Time to investigate before critical
|
|
19
|
+
*
|
|
20
|
+
* 3. STORE_CONFIG compression + 8MB cache
|
|
21
|
+
* - LevelDB defaults for the DORMANT store module (ADR-021; kept
|
|
22
|
+
* for the WAL successor, not wired)
|
|
23
|
+
*
|
|
24
|
+
* @see src/core/mqtt-protocol.js - Shared protocol invariants
|
|
25
|
+
* @see src/core/env-vars.js - Deployment configuration
|
|
26
|
+
* @module mqtt-constants
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { ENV_VARS } from '../../env-vars.js';
|
|
30
|
+
import {
|
|
31
|
+
WINK_NAMESPACE,
|
|
32
|
+
MQTT_QOS as QOS,
|
|
33
|
+
MQTT_PROTOCOL_V
|
|
34
|
+
} from '../../mqtt-protocol.js';
|
|
35
|
+
|
|
36
|
+
// Re-export protocol invariants for local consumers
|
|
37
|
+
export { WINK_NAMESPACE, QOS };
|
|
38
|
+
|
|
39
|
+
// Queue default from ENV_VARS
|
|
40
|
+
export const DEFAULT_MAX_QUEUE_SIZE = ENV_VARS.mqttMaxQueueSize;
|
|
41
|
+
|
|
42
|
+
// Byte-axis cap for the DORMANT LevelDB store (ADR-021). The
|
|
43
|
+
// MQTT_MAX_QUEUE_BYTES env var was retired with the disk store — the
|
|
44
|
+
// in-memory emitter bounds memory by message count alone. The literal
|
|
45
|
+
// stays so the dormant store module keeps a working default until the
|
|
46
|
+
// composer-owned WAL successor re-wires deployment configuration.
|
|
47
|
+
export const DEFAULT_MAX_QUEUE_BYTES = 52428800; // 50 MB
|
|
48
|
+
|
|
49
|
+
// Operational constant — not configurable (design decision)
|
|
50
|
+
export const QUEUE_CRITICAL_THRESHOLD = 0.8;
|
|
51
|
+
|
|
52
|
+
// Hard ceiling on maxQueueSize — not configurable (design
|
|
53
|
+
// decision). MQTT packet ids are 16-bit, so at most 65,535 publishes
|
|
54
|
+
// can be unacknowledged at once; a queue sized beyond that promises
|
|
55
|
+
// capacity the protocol cannot deliver. The measured failure mode with
|
|
56
|
+
// the default id allocator: the id space wraps and a new packet
|
|
57
|
+
// OVERWRITES an unacked packet's store entry, destroying the only copy
|
|
58
|
+
// of an undelivered QoS-1 message (about 1 per 700,000 under sustained
|
|
59
|
+
// load in the soak gate). The emitter uses the client's
|
|
60
|
+
// UniqueMessageIdProvider, which never reissues an in-use id — so the
|
|
61
|
+
// unacked window must never hold more messages than the id space has
|
|
62
|
+
// ids. 60,000 leaves margin for ids stuck on never-acknowledged packets.
|
|
63
|
+
export const MQTT_INFLIGHT_ID_LIMIT = 60000;
|
|
64
|
+
|
|
65
|
+
// Message expiry intervals (seconds)
|
|
66
|
+
export const MESSAGE_EXPIRY = {
|
|
67
|
+
telemetry: 3600, // 1 hour - sensor data loses value quickly
|
|
68
|
+
status: 86400, // 24 hours - status needs longer persistence
|
|
69
|
+
default: ENV_VARS.mqttMsgExpiry // Default expiry from ENV_VARS
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// MQTT v5 configuration
|
|
73
|
+
export const MQTT_CONFIG = {
|
|
74
|
+
protocolVersion: MQTT_PROTOCOL_V,
|
|
75
|
+
keepalive: ENV_VARS.mqttKeepalive,
|
|
76
|
+
reconnectPeriod: ENV_VARS.mqttReconnectMs,
|
|
77
|
+
connectTimeout: ENV_VARS.mqttConnectTimeoutMs,
|
|
78
|
+
// A deliberately clean session, spelled with the key mqtt.js
|
|
79
|
+
// actually reads (`clean`). The MQTT 5 spelling `cleanStart` is
|
|
80
|
+
// silently ignored by mqtt.js — the source carried that exact
|
|
81
|
+
// defect until 2026-07-09, caught by the ADR-022 dedup soak
|
|
82
|
+
// (see the cleanStart→clean mapping in source-manager/mqtt/client.js).
|
|
83
|
+
//
|
|
84
|
+
// Why clean: the emitter is publish-only. It holds no
|
|
85
|
+
// subscriptions a broker session could preserve, and its
|
|
86
|
+
// unacknowledged messages live in the mqtt.js client's in-memory
|
|
87
|
+
// store inside this process, tracked by composer's unacked
|
|
88
|
+
// counter (ADR-021).
|
|
89
|
+
// A broker session buys it nothing. Before this fix, the ignored
|
|
90
|
+
// key plus a random per-start clientId parked a 7-day orphan
|
|
91
|
+
// session at the broker on every restart (`sessionExpiryInterval`
|
|
92
|
+
// was riding along here as the same dead weight — the source is
|
|
93
|
+
// the only adapter that needs MQTT_SESSION_EXPIRY_S).
|
|
94
|
+
clean: true
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// Storage configuration — operational constant for the DORMANT LevelDB
|
|
98
|
+
// store (ADR-021; kept for the WAL successor, not wired)
|
|
99
|
+
export const STORE_CONFIG = {
|
|
100
|
+
compression: true,
|
|
101
|
+
cacheSize: 8 * 1024 * 1024 // 8MB LevelDB cache
|
|
102
|
+
};
|