@czap/core 0.1.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/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/addressed-digest.d.ts +15 -0
- package/dist/addressed-digest.d.ts.map +1 -0
- package/dist/addressed-digest.js +35 -0
- package/dist/addressed-digest.js.map +1 -0
- package/dist/animation.d.ts +46 -0
- package/dist/animation.d.ts.map +1 -0
- package/dist/animation.js +70 -0
- package/dist/animation.js.map +1 -0
- package/dist/assembly.d.ts +25 -0
- package/dist/assembly.d.ts.map +1 -0
- package/dist/assembly.js +58 -0
- package/dist/assembly.js.map +1 -0
- package/dist/av-bridge.d.ts +74 -0
- package/dist/av-bridge.d.ts.map +1 -0
- package/dist/av-bridge.js +107 -0
- package/dist/av-bridge.js.map +1 -0
- package/dist/av-renderer.d.ts +56 -0
- package/dist/av-renderer.d.ts.map +1 -0
- package/dist/av-renderer.js +65 -0
- package/dist/av-renderer.js.map +1 -0
- package/dist/blend.d.ts +61 -0
- package/dist/blend.d.ts.map +1 -0
- package/dist/blend.js +100 -0
- package/dist/blend.js.map +1 -0
- package/dist/boundary.d.ts +154 -0
- package/dist/boundary.d.ts.map +1 -0
- package/dist/boundary.js +269 -0
- package/dist/boundary.js.map +1 -0
- package/dist/brands.d.ts +63 -0
- package/dist/brands.d.ts.map +1 -0
- package/dist/brands.js +31 -0
- package/dist/brands.js.map +1 -0
- package/dist/caps.d.ts +49 -0
- package/dist/caps.d.ts.map +1 -0
- package/dist/caps.js +73 -0
- package/dist/caps.js.map +1 -0
- package/dist/capsule.d.ts +77 -0
- package/dist/capsule.d.ts.map +1 -0
- package/dist/capsule.js +18 -0
- package/dist/capsule.js.map +1 -0
- package/dist/capsules/boundary-evaluate.d.ts +28 -0
- package/dist/capsules/boundary-evaluate.d.ts.map +1 -0
- package/dist/capsules/boundary-evaluate.js +117 -0
- package/dist/capsules/boundary-evaluate.js.map +1 -0
- package/dist/capsules/canonical-cbor.d.ts +13 -0
- package/dist/capsules/canonical-cbor.d.ts.map +1 -0
- package/dist/capsules/canonical-cbor.js +60 -0
- package/dist/capsules/canonical-cbor.js.map +1 -0
- package/dist/capsules/token-buffer.d.ts +24 -0
- package/dist/capsules/token-buffer.d.ts.map +1 -0
- package/dist/capsules/token-buffer.js +53 -0
- package/dist/capsules/token-buffer.js.map +1 -0
- package/dist/capture.d.ts +40 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +10 -0
- package/dist/capture.js.map +1 -0
- package/dist/cbor.d.ts +33 -0
- package/dist/cbor.d.ts.map +1 -0
- package/dist/cbor.js +179 -0
- package/dist/cbor.js.map +1 -0
- package/dist/cell.d.ts +53 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +83 -0
- package/dist/cell.js.map +1 -0
- package/dist/codec.d.ts +30 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +25 -0
- package/dist/codec.js.map +1 -0
- package/dist/component.d.ts +52 -0
- package/dist/component.d.ts.map +1 -0
- package/dist/component.js +44 -0
- package/dist/component.js.map +1 -0
- package/dist/composable.d.ts +76 -0
- package/dist/composable.d.ts.map +1 -0
- package/dist/composable.js +221 -0
- package/dist/composable.js.map +1 -0
- package/dist/compositor-pool.d.ts +74 -0
- package/dist/compositor-pool.d.ts.map +1 -0
- package/dist/compositor-pool.js +119 -0
- package/dist/compositor-pool.js.map +1 -0
- package/dist/compositor.d.ts +90 -0
- package/dist/compositor.d.ts.map +1 -0
- package/dist/compositor.js +278 -0
- package/dist/compositor.js.map +1 -0
- package/dist/config.d.ts +72 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -0
- package/dist/dag.d.ts +251 -0
- package/dist/dag.d.ts.map +1 -0
- package/dist/dag.js +450 -0
- package/dist/dag.js.map +1 -0
- package/dist/defaults.d.ts +45 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +45 -0
- package/dist/defaults.js.map +1 -0
- package/dist/derived.d.ts +34 -0
- package/dist/derived.d.ts.map +1 -0
- package/dist/derived.js +101 -0
- package/dist/derived.js.map +1 -0
- package/dist/diagnostics.d.ts +77 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +122 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/dirty.d.ts +55 -0
- package/dist/dirty.d.ts.map +1 -0
- package/dist/dirty.js +80 -0
- package/dist/dirty.js.map +1 -0
- package/dist/easing.d.ts +55 -0
- package/dist/easing.d.ts.map +1 -0
- package/dist/easing.js +291 -0
- package/dist/easing.js.map +1 -0
- package/dist/ecs.d.ts +105 -0
- package/dist/ecs.d.ts.map +1 -0
- package/dist/ecs.js +245 -0
- package/dist/ecs.js.map +1 -0
- package/dist/fnv.d.ts +14 -0
- package/dist/fnv.d.ts.map +1 -0
- package/dist/fnv.js +28 -0
- package/dist/fnv.js.map +1 -0
- package/dist/frame-budget.d.ts +73 -0
- package/dist/frame-budget.d.ts.map +1 -0
- package/dist/frame-budget.js +114 -0
- package/dist/frame-budget.js.map +1 -0
- package/dist/gen-frame.d.ts +102 -0
- package/dist/gen-frame.d.ts.map +1 -0
- package/dist/gen-frame.js +121 -0
- package/dist/gen-frame.js.map +1 -0
- package/dist/harness/arbitrary-from-schema.d.ts +28 -0
- package/dist/harness/arbitrary-from-schema.d.ts.map +1 -0
- package/dist/harness/arbitrary-from-schema.js +262 -0
- package/dist/harness/arbitrary-from-schema.js.map +1 -0
- package/dist/harness/cached-projection.d.ts +19 -0
- package/dist/harness/cached-projection.d.ts.map +1 -0
- package/dist/harness/cached-projection.js +39 -0
- package/dist/harness/cached-projection.js.map +1 -0
- package/dist/harness/index.d.ts +16 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +15 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/policy-gate.d.ts +18 -0
- package/dist/harness/policy-gate.d.ts.map +1 -0
- package/dist/harness/policy-gate.js +46 -0
- package/dist/harness/policy-gate.js.map +1 -0
- package/dist/harness/pure-transform.d.ts +42 -0
- package/dist/harness/pure-transform.d.ts.map +1 -0
- package/dist/harness/pure-transform.js +76 -0
- package/dist/harness/pure-transform.js.map +1 -0
- package/dist/harness/receipted-mutation.d.ts +23 -0
- package/dist/harness/receipted-mutation.d.ts.map +1 -0
- package/dist/harness/receipted-mutation.js +52 -0
- package/dist/harness/receipted-mutation.js.map +1 -0
- package/dist/harness/scene-composition.d.ts +19 -0
- package/dist/harness/scene-composition.d.ts.map +1 -0
- package/dist/harness/scene-composition.js +47 -0
- package/dist/harness/scene-composition.js.map +1 -0
- package/dist/harness/site-adapter.d.ts +18 -0
- package/dist/harness/site-adapter.d.ts.map +1 -0
- package/dist/harness/site-adapter.js +38 -0
- package/dist/harness/site-adapter.js.map +1 -0
- package/dist/harness/state-machine.d.ts +19 -0
- package/dist/harness/state-machine.d.ts.map +1 -0
- package/dist/harness/state-machine.js +44 -0
- package/dist/harness/state-machine.js.map +1 -0
- package/dist/hlc.d.ts +99 -0
- package/dist/hlc.d.ts.map +1 -0
- package/dist/hlc.js +219 -0
- package/dist/hlc.js.map +1 -0
- package/dist/index.d.ts +104 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +137 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate.d.ts +14 -0
- package/dist/interpolate.d.ts.map +1 -0
- package/dist/interpolate.js +31 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/live-cell.d.ts +46 -0
- package/dist/live-cell.d.ts.map +1 -0
- package/dist/live-cell.js +154 -0
- package/dist/live-cell.js.map +1 -0
- package/dist/op.d.ts +58 -0
- package/dist/op.d.ts.map +1 -0
- package/dist/op.js +171 -0
- package/dist/op.js.map +1 -0
- package/dist/plan.d.ts +195 -0
- package/dist/plan.d.ts.map +1 -0
- package/dist/plan.js +211 -0
- package/dist/plan.js.map +1 -0
- package/dist/protocol.d.ts +33 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +10 -0
- package/dist/protocol.js.map +1 -0
- package/dist/quantizer-types.d.ts +28 -0
- package/dist/quantizer-types.d.ts.map +1 -0
- package/dist/quantizer-types.js +9 -0
- package/dist/quantizer-types.js.map +1 -0
- package/dist/receipt.d.ts +294 -0
- package/dist/receipt.d.ts.map +1 -0
- package/dist/receipt.js +352 -0
- package/dist/receipt.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +75 -0
- package/dist/runtime-coordinator.d.ts.map +1 -0
- package/dist/runtime-coordinator.js +149 -0
- package/dist/runtime-coordinator.js.map +1 -0
- package/dist/scheduler.d.ts +58 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +109 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/ship-capsule.d.ts +54 -0
- package/dist/ship-capsule.d.ts.map +1 -0
- package/dist/ship-capsule.js +142 -0
- package/dist/ship-capsule.js.map +1 -0
- package/dist/ship-manifest.d.ts +45 -0
- package/dist/ship-manifest.d.ts.map +1 -0
- package/dist/ship-manifest.js +175 -0
- package/dist/ship-manifest.js.map +1 -0
- package/dist/signal.d.ts +149 -0
- package/dist/signal.d.ts.map +1 -0
- package/dist/signal.js +277 -0
- package/dist/signal.js.map +1 -0
- package/dist/speculative.d.ts +67 -0
- package/dist/speculative.d.ts.map +1 -0
- package/dist/speculative.js +139 -0
- package/dist/speculative.js.map +1 -0
- package/dist/store.d.ts +39 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +42 -0
- package/dist/store.js.map +1 -0
- package/dist/style.d.ts +119 -0
- package/dist/style.d.ts.map +1 -0
- package/dist/style.js +168 -0
- package/dist/style.js.map +1 -0
- package/dist/testing.d.ts +14 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +14 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme.d.ts +78 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +109 -0
- package/dist/theme.js.map +1 -0
- package/dist/timeline.d.ts +45 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +101 -0
- package/dist/timeline.js.map +1 -0
- package/dist/token-buffer.d.ts +43 -0
- package/dist/token-buffer.d.ts.map +1 -0
- package/dist/token-buffer.js +112 -0
- package/dist/token-buffer.js.map +1 -0
- package/dist/token.d.ts +107 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +143 -0
- package/dist/token.js.map +1 -0
- package/dist/tuple.d.ts +16 -0
- package/dist/tuple.d.ts.map +1 -0
- package/dist/tuple.js +16 -0
- package/dist/tuple.js.map +1 -0
- package/dist/type-utils.d.ts +41 -0
- package/dist/type-utils.d.ts.map +1 -0
- package/dist/type-utils.js +10 -0
- package/dist/type-utils.js.map +1 -0
- package/dist/typed-ref.d.ts +50 -0
- package/dist/typed-ref.d.ts.map +1 -0
- package/dist/typed-ref.js +59 -0
- package/dist/typed-ref.js.map +1 -0
- package/dist/ui-quality.d.ts +50 -0
- package/dist/ui-quality.d.ts.map +1 -0
- package/dist/ui-quality.js +64 -0
- package/dist/ui-quality.js.map +1 -0
- package/dist/validation-error.d.ts +25 -0
- package/dist/validation-error.d.ts.map +1 -0
- package/dist/validation-error.js +32 -0
- package/dist/validation-error.js.map +1 -0
- package/dist/vector-clock.d.ts +46 -0
- package/dist/vector-clock.d.ts.map +1 -0
- package/dist/vector-clock.js +91 -0
- package/dist/vector-clock.js.map +1 -0
- package/dist/video.d.ts +62 -0
- package/dist/video.d.ts.map +1 -0
- package/dist/video.js +59 -0
- package/dist/video.js.map +1 -0
- package/dist/wasm-dispatch.d.ts +52 -0
- package/dist/wasm-dispatch.d.ts.map +1 -0
- package/dist/wasm-dispatch.js +204 -0
- package/dist/wasm-dispatch.js.map +1 -0
- package/dist/wasm-fallback.d.ts +19 -0
- package/dist/wasm-fallback.d.ts.map +1 -0
- package/dist/wasm-fallback.js +93 -0
- package/dist/wasm-fallback.js.map +1 -0
- package/dist/wire.d.ts +49 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +201 -0
- package/dist/wire.js.map +1 -0
- package/dist/zap.d.ts +42 -0
- package/dist/zap.d.ts.map +1 -0
- package/dist/zap.js +172 -0
- package/dist/zap.js.map +1 -0
- package/package.json +71 -0
- package/src/addressed-digest.ts +48 -0
- package/src/animation.ts +103 -0
- package/src/assembly.ts +76 -0
- package/src/av-bridge.ts +161 -0
- package/src/av-renderer.ts +118 -0
- package/src/blend.ts +135 -0
- package/src/boundary.ts +363 -0
- package/src/brands.ts +86 -0
- package/src/caps.ts +100 -0
- package/src/capsule.ts +95 -0
- package/src/capsules/boundary-evaluate.ts +128 -0
- package/src/capsules/canonical-cbor.ts +60 -0
- package/src/capsules/token-buffer.ts +57 -0
- package/src/capture.ts +48 -0
- package/src/cbor.ts +199 -0
- package/src/cell.ts +130 -0
- package/src/codec.ts +39 -0
- package/src/component.ts +102 -0
- package/src/composable.ts +328 -0
- package/src/compositor-pool.ts +162 -0
- package/src/compositor.ts +387 -0
- package/src/config.ts +157 -0
- package/src/dag.ts +527 -0
- package/src/defaults.ts +60 -0
- package/src/derived.ts +164 -0
- package/src/diagnostics.ts +186 -0
- package/src/dirty.ts +101 -0
- package/src/easing.ts +334 -0
- package/src/ecs.ts +382 -0
- package/src/fnv.ts +31 -0
- package/src/frame-budget.ts +149 -0
- package/src/gen-frame.ts +229 -0
- package/src/harness/arbitrary-from-schema.ts +270 -0
- package/src/harness/cached-projection.ts +46 -0
- package/src/harness/index.ts +16 -0
- package/src/harness/policy-gate.ts +51 -0
- package/src/harness/pure-transform.ts +121 -0
- package/src/harness/receipted-mutation.ts +59 -0
- package/src/harness/scene-composition.ts +54 -0
- package/src/harness/site-adapter.ts +43 -0
- package/src/harness/state-machine.ts +49 -0
- package/src/hlc.ts +238 -0
- package/src/index.ts +274 -0
- package/src/interpolate.ts +37 -0
- package/src/live-cell.ts +199 -0
- package/src/op.ts +233 -0
- package/src/plan.ts +317 -0
- package/src/protocol.ts +49 -0
- package/src/quantizer-types.ts +29 -0
- package/src/receipt.ts +444 -0
- package/src/runtime-coordinator.ts +230 -0
- package/src/scheduler.ts +161 -0
- package/src/ship-capsule.ts +191 -0
- package/src/signal.ts +345 -0
- package/src/speculative.ts +186 -0
- package/src/store.ts +77 -0
- package/src/style.ts +249 -0
- package/src/testing.ts +14 -0
- package/src/theme.ts +153 -0
- package/src/timeline.ts +146 -0
- package/src/token-buffer.ts +151 -0
- package/src/token.ts +197 -0
- package/src/tuple.ts +19 -0
- package/src/type-utils.ts +48 -0
- package/src/typed-ref.ts +79 -0
- package/src/ui-quality.ts +105 -0
- package/src/validation-error.ts +34 -0
- package/src/vector-clock.ts +111 -0
- package/src/video.ts +106 -0
- package/src/wasm-dispatch.ts +300 -0
- package/src/wasm-fallback.ts +102 -0
- package/src/wire.ts +274 -0
- package/src/zap.ts +241 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI5D,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAgChC,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,SAAS,KAAK,CACZ,MAAmB,EACnB,UAA4B,EAC5B,MAAoC;IAEpC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEtD,OAAO;QACL,MAAM;QACN,WAAW;QACX,SAAS;QACT,KAAK,CAAC,CAAC,MAAM;YACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;gBACrC,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC1C,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzC,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;gBACnD,MAAM;oBACJ,KAAK,EAAE,CAAC;oBACR,SAAS;oBACT,QAAQ,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrD,KAAK;iBACN,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,yFAAyF;IACzF,IAAI,EAAE,KAAK;CACZ,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WASM escape hatch -- capability detection, module loading, and dispatch.
|
|
3
|
+
*
|
|
4
|
+
* Detects WebAssembly availability, loads the czap-compute WASM module,
|
|
5
|
+
* and provides a unified kernel interface that transparently falls back
|
|
6
|
+
* to pure TypeScript implementations when WASM is unavailable.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const kernels = WASMDispatch.kernels(); // TS fallbacks
|
|
10
|
+
* await WASMDispatch.load(wasmUrl); // upgrade to WASM
|
|
11
|
+
* const kernels2 = WASMDispatch.kernels(); // now WASM-backed
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
/** Kernel functions available from both WASM and TS fallback. */
|
|
16
|
+
export interface WASMKernels {
|
|
17
|
+
/**
|
|
18
|
+
* Sample a spring easing at `samples` evenly-spaced points in [0, 1].
|
|
19
|
+
* Returns Float32Array of length `samples + 1`.
|
|
20
|
+
*/
|
|
21
|
+
springCurve(stiffness: number, damping: number, mass: number, samples: number): Float32Array;
|
|
22
|
+
/**
|
|
23
|
+
* Batch boundary evaluation. For each value, returns the index of the
|
|
24
|
+
* highest threshold where `value >= threshold`.
|
|
25
|
+
* Thresholds must be sorted ascending.
|
|
26
|
+
*/
|
|
27
|
+
batchBoundaryEval(thresholds: Float64Array, values: Float64Array): Uint32Array;
|
|
28
|
+
/**
|
|
29
|
+
* Normalize weights in-place so positive values sum to 1.0.
|
|
30
|
+
* Negative weights clamped to 0. Returns the (modified) input array.
|
|
31
|
+
*/
|
|
32
|
+
blendNormalize(weights: Float32Array): Float32Array;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Public API of the {@link WASMDispatch} singleton: probe for WebAssembly,
|
|
36
|
+
* asynchronously load the Rust compute module, and hand back either WASM or
|
|
37
|
+
* {@link fallbackKernels} via {@link WASMDispatchAPI.kernels}.
|
|
38
|
+
*/
|
|
39
|
+
export interface WASMDispatchAPI {
|
|
40
|
+
detect(): boolean;
|
|
41
|
+
load(wasmUrl: string | ArrayBuffer): Promise<WASMKernels>;
|
|
42
|
+
kernels(): WASMKernels;
|
|
43
|
+
isLoaded(): boolean;
|
|
44
|
+
unload(): void;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* WASMDispatch — singleton that wires the Rust compute crate (spring, boundary,
|
|
48
|
+
* blend kernels) into the runtime, falling back to {@link fallbackKernels}
|
|
49
|
+
* when WebAssembly is unavailable or the module fails to load.
|
|
50
|
+
*/
|
|
51
|
+
export declare const WASMDispatch: WASMDispatchAPI;
|
|
52
|
+
//# sourceMappingURL=wasm-dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-dispatch.d.ts","sourceRoot":"","sources":["../src/wasm-dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,iEAAiE;AACjE,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC;IAE7F;;;;OAIG;IACH,iBAAiB,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAAC;IAE/E;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAAC;CACrD;AAgKD;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,IAAI,OAAO,CAAC;IAClB,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,IAAI,WAAW,CAAC;IACvB,QAAQ,IAAI,OAAO,CAAC;IACpB,MAAM,IAAI,IAAI,CAAC;CAChB;AAOD;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,eA0E1B,CAAC"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WASM escape hatch -- capability detection, module loading, and dispatch.
|
|
3
|
+
*
|
|
4
|
+
* Detects WebAssembly availability, loads the czap-compute WASM module,
|
|
5
|
+
* and provides a unified kernel interface that transparently falls back
|
|
6
|
+
* to pure TypeScript implementations when WASM is unavailable.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const kernels = WASMDispatch.kernels(); // TS fallbacks
|
|
10
|
+
* await WASMDispatch.load(wasmUrl); // upgrade to WASM
|
|
11
|
+
* const kernels2 = WASMDispatch.kernels(); // now WASM-backed
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import { fallbackKernels } from './wasm-fallback.js';
|
|
16
|
+
import { WASM_SCRATCH_BASE } from './defaults.js';
|
|
17
|
+
/**
|
|
18
|
+
* Runtime-verified cast from WebAssembly's opaque exports to the typed interface.
|
|
19
|
+
*
|
|
20
|
+
* `WebAssembly.Instance.exports` is structurally `Record<string, unknown>` — functions,
|
|
21
|
+
* memories, tables, and globals are all opaque at the type level. This helper
|
|
22
|
+
* asserts the expected functions are present as callable values and that the
|
|
23
|
+
* memory export is a WebAssembly.Memory instance, then narrows. If any required
|
|
24
|
+
* export is missing or the wrong shape, it throws — making the cast runtime-safe.
|
|
25
|
+
*
|
|
26
|
+
* This is a sanctioned cast containment point (cf. tuple.ts, cell.ts, boundary.ts,
|
|
27
|
+
* typed-ref.ts).
|
|
28
|
+
*/
|
|
29
|
+
const validateWASMExports = (exports) => {
|
|
30
|
+
const requiredFunctions = ['spring_curve', 'batch_boundary_eval', 'blend_normalize'];
|
|
31
|
+
for (const name of requiredFunctions) {
|
|
32
|
+
if (typeof exports[name] !== 'function') {
|
|
33
|
+
throw new Error(`WASM module missing required export: "${name}". Available exports: [${Object.keys(exports).join(', ')}]`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const mem = exports['memory'];
|
|
37
|
+
const isMemoryShape = mem !== null &&
|
|
38
|
+
typeof mem === 'object' &&
|
|
39
|
+
'buffer' in mem &&
|
|
40
|
+
Reflect.get(mem, 'buffer') instanceof ArrayBuffer;
|
|
41
|
+
/* v8 ignore next 5 — sanctioned cast containment: the czap-compute WASM module always
|
|
42
|
+
exports `memory` as a WebAssembly.Memory (whose `.buffer` is an ArrayBuffer); this
|
|
43
|
+
guard exists only so the cast to WASMExports stays runtime-safe if a caller ever
|
|
44
|
+
supplies a drift/tampered module. Cannot be reached by valid instantiate output. */
|
|
45
|
+
if (!isMemoryShape) {
|
|
46
|
+
throw new Error(`WASM module missing required memory export. Available exports: [${Object.keys(exports).join(', ')}]`);
|
|
47
|
+
}
|
|
48
|
+
return exports;
|
|
49
|
+
};
|
|
50
|
+
/** Loaded WASM module state. */
|
|
51
|
+
let wasmInstance = null;
|
|
52
|
+
function wasmAvailable(available) {
|
|
53
|
+
return { status: 'ok', available };
|
|
54
|
+
}
|
|
55
|
+
function wasmUnavailable() {
|
|
56
|
+
return { status: 'unavailable' };
|
|
57
|
+
}
|
|
58
|
+
function wasmProbeError(error) {
|
|
59
|
+
return { status: 'error', error };
|
|
60
|
+
}
|
|
61
|
+
function probeWASMAvailability() {
|
|
62
|
+
try {
|
|
63
|
+
if (typeof WebAssembly === 'undefined') {
|
|
64
|
+
return wasmUnavailable();
|
|
65
|
+
}
|
|
66
|
+
return wasmAvailable(typeof WebAssembly.instantiate === 'function' && typeof WebAssembly.Module === 'function');
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return wasmProbeError(error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function isWASMAvailable(probe) {
|
|
73
|
+
return probe.status === 'ok' ? probe.available : false;
|
|
74
|
+
}
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
// WASM-backed kernel wrappers
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
function createWASMKernels(wasm) {
|
|
79
|
+
return {
|
|
80
|
+
springCurve(stiffness, damping, mass, samples) {
|
|
81
|
+
const count = Math.min(Math.max(0, samples | 0), 255);
|
|
82
|
+
const ptr = wasm.spring_curve(stiffness, damping, mass, count);
|
|
83
|
+
const view = new Float32Array(wasm.memory.buffer, ptr, count + 1);
|
|
84
|
+
return new Float32Array(view);
|
|
85
|
+
},
|
|
86
|
+
batchBoundaryEval(thresholds, values) {
|
|
87
|
+
const tLen = thresholds.length;
|
|
88
|
+
const vLen = values.length;
|
|
89
|
+
const SCRATCH_BASE = WASM_SCRATCH_BASE;
|
|
90
|
+
const thresholdsOffset = SCRATCH_BASE;
|
|
91
|
+
const valuesOffset = thresholdsOffset + tLen * 4;
|
|
92
|
+
const needed = valuesOffset + vLen * 4;
|
|
93
|
+
const currentSize = wasm.memory.buffer.byteLength;
|
|
94
|
+
if (needed > currentSize) {
|
|
95
|
+
const pages = Math.ceil((needed - currentSize) / 65536);
|
|
96
|
+
wasm.memory.grow(pages);
|
|
97
|
+
}
|
|
98
|
+
const threshF32 = new Float32Array(wasm.memory.buffer, thresholdsOffset, tLen);
|
|
99
|
+
for (let i = 0; i < tLen; i++) {
|
|
100
|
+
threshF32[i] = thresholds[i];
|
|
101
|
+
}
|
|
102
|
+
const valF32 = new Float32Array(wasm.memory.buffer, valuesOffset, vLen);
|
|
103
|
+
for (let i = 0; i < vLen; i++) {
|
|
104
|
+
valF32[i] = values[i];
|
|
105
|
+
}
|
|
106
|
+
const resultPtr = wasm.batch_boundary_eval(thresholdsOffset, tLen, valuesOffset, vLen);
|
|
107
|
+
const view = new Uint32Array(wasm.memory.buffer, resultPtr, vLen);
|
|
108
|
+
return new Uint32Array(view);
|
|
109
|
+
},
|
|
110
|
+
blendNormalize(weights) {
|
|
111
|
+
const len = weights.length;
|
|
112
|
+
if (len === 0)
|
|
113
|
+
return weights;
|
|
114
|
+
const SCRATCH_BASE = WASM_SCRATCH_BASE;
|
|
115
|
+
const needed = SCRATCH_BASE + len * 4;
|
|
116
|
+
const currentSize = wasm.memory.buffer.byteLength;
|
|
117
|
+
if (needed > currentSize) {
|
|
118
|
+
const pages = Math.ceil((needed - currentSize) / 65536);
|
|
119
|
+
wasm.memory.grow(pages);
|
|
120
|
+
}
|
|
121
|
+
const wasmWeights = new Float32Array(wasm.memory.buffer, SCRATCH_BASE, len);
|
|
122
|
+
wasmWeights.set(weights);
|
|
123
|
+
wasm.blend_normalize(SCRATCH_BASE, len);
|
|
124
|
+
const result = new Float32Array(wasm.memory.buffer, SCRATCH_BASE, len);
|
|
125
|
+
weights.set(result);
|
|
126
|
+
return weights;
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
let wasmKernels = null;
|
|
131
|
+
let loadingPromise = null;
|
|
132
|
+
let loadingToken = null;
|
|
133
|
+
let loadSession = 0;
|
|
134
|
+
/**
|
|
135
|
+
* WASMDispatch — singleton that wires the Rust compute crate (spring, boundary,
|
|
136
|
+
* blend kernels) into the runtime, falling back to {@link fallbackKernels}
|
|
137
|
+
* when WebAssembly is unavailable or the module fails to load.
|
|
138
|
+
*/
|
|
139
|
+
export const WASMDispatch = {
|
|
140
|
+
detect() {
|
|
141
|
+
return isWASMAvailable(probeWASMAvailability());
|
|
142
|
+
},
|
|
143
|
+
load(wasmUrl) {
|
|
144
|
+
if (!WASMDispatch.detect()) {
|
|
145
|
+
return Promise.reject(new Error('WebAssembly is not available in this environment'));
|
|
146
|
+
}
|
|
147
|
+
if (loadingPromise !== null) {
|
|
148
|
+
return loadingPromise;
|
|
149
|
+
}
|
|
150
|
+
const currentSession = ++loadSession;
|
|
151
|
+
const currentToken = {};
|
|
152
|
+
loadingToken = currentToken;
|
|
153
|
+
const promise = (async () => {
|
|
154
|
+
try {
|
|
155
|
+
let source;
|
|
156
|
+
if (typeof wasmUrl === 'string') {
|
|
157
|
+
const response = await fetch(wasmUrl);
|
|
158
|
+
if (!response.ok) {
|
|
159
|
+
throw new Error(`Failed to fetch WASM module: ${response.status} ${response.statusText}`);
|
|
160
|
+
}
|
|
161
|
+
source = await response.arrayBuffer();
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
source = wasmUrl;
|
|
165
|
+
}
|
|
166
|
+
const { instance } = await WebAssembly.instantiate(source, {
|
|
167
|
+
env: {},
|
|
168
|
+
});
|
|
169
|
+
wasmInstance = validateWASMExports(instance.exports);
|
|
170
|
+
wasmKernels = createWASMKernels(wasmInstance);
|
|
171
|
+
// If unload() ran while we were awaiting fetch/instantiate, it will
|
|
172
|
+
// bump the session and clear the just-installed WASM state.
|
|
173
|
+
if (loadSession !== currentSession) {
|
|
174
|
+
wasmInstance = null;
|
|
175
|
+
wasmKernels = null;
|
|
176
|
+
return fallbackKernels;
|
|
177
|
+
}
|
|
178
|
+
return wasmKernels;
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
if (loadingToken === currentToken) {
|
|
182
|
+
loadingPromise = null;
|
|
183
|
+
loadingToken = null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
})();
|
|
187
|
+
loadingPromise = promise;
|
|
188
|
+
return promise;
|
|
189
|
+
},
|
|
190
|
+
kernels() {
|
|
191
|
+
return wasmKernels ?? fallbackKernels;
|
|
192
|
+
},
|
|
193
|
+
isLoaded() {
|
|
194
|
+
return wasmKernels !== null;
|
|
195
|
+
},
|
|
196
|
+
unload() {
|
|
197
|
+
loadSession += 1;
|
|
198
|
+
wasmInstance = null;
|
|
199
|
+
wasmKernels = null;
|
|
200
|
+
loadingPromise = null;
|
|
201
|
+
loadingToken = null;
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=wasm-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-dispatch.js","sourceRoot":"","sources":["../src/wasm-dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure TypeScript fallback kernels for WASM compute functions.
|
|
3
|
+
*
|
|
4
|
+
* These produce bit-identical results (within float precision) to the
|
|
5
|
+
* Rust WASM kernels. When WASM is unavailable, these are used automatically.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { WASMKernels } from './wasm-dispatch.js';
|
|
10
|
+
/**
|
|
11
|
+
* Pure-JS implementation of the {@link WASMKernels} contract.
|
|
12
|
+
*
|
|
13
|
+
* Selected automatically by {@link WASMDispatch} when the Rust compute crate
|
|
14
|
+
* cannot be instantiated (e.g. missing `WebAssembly`, CSP restrictions, or
|
|
15
|
+
* startup failure). Produces results bit-identical to the WASM build within
|
|
16
|
+
* IEEE-754 precision limits.
|
|
17
|
+
*/
|
|
18
|
+
export declare const fallbackKernels: WASMKernels;
|
|
19
|
+
//# sourceMappingURL=wasm-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-fallback.d.ts","sourceRoot":"","sources":["../src/wasm-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAgFtD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,WAI7B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure TypeScript fallback kernels for WASM compute functions.
|
|
3
|
+
*
|
|
4
|
+
* These produce bit-identical results (within float precision) to the
|
|
5
|
+
* Rust WASM kernels. When WASM is unavailable, these are used automatically.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
function springCurve(stiffness, damping, mass, samples) {
|
|
10
|
+
const m = mass <= 0 ? 1 : mass;
|
|
11
|
+
const count = Math.min(Math.max(0, samples | 0), 255);
|
|
12
|
+
const omega = Math.sqrt(stiffness / m);
|
|
13
|
+
const zeta = damping / (2 * Math.sqrt(stiffness * m));
|
|
14
|
+
const out = new Float32Array(count + 1);
|
|
15
|
+
for (let i = 0; i <= count; i++) {
|
|
16
|
+
const t = i / count;
|
|
17
|
+
if (t <= 0) {
|
|
18
|
+
out[i] = 0;
|
|
19
|
+
}
|
|
20
|
+
else if (t >= 1) {
|
|
21
|
+
out[i] = 1;
|
|
22
|
+
}
|
|
23
|
+
else if (zeta < 1) {
|
|
24
|
+
const omegaD = omega * Math.sqrt(1 - zeta * zeta);
|
|
25
|
+
out[i] =
|
|
26
|
+
1 - Math.exp(-zeta * omega * t) * (Math.cos(omegaD * t) + ((zeta * omega) / omegaD) * Math.sin(omegaD * t));
|
|
27
|
+
}
|
|
28
|
+
else if (zeta === 1) {
|
|
29
|
+
out[i] = 1 - (1 + omega * t) * Math.exp(-omega * t);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const s = Math.sqrt(zeta * zeta - 1);
|
|
33
|
+
const r1 = -omega * (zeta + s);
|
|
34
|
+
const r2 = -omega * (zeta - s);
|
|
35
|
+
const c1 = r2 / (r2 - r1);
|
|
36
|
+
const c2 = -r1 / (r2 - r1);
|
|
37
|
+
out[i] = 1 - (c1 * Math.exp(r1 * t) + c2 * Math.exp(r2 * t));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
function batchBoundaryEval(thresholds, values) {
|
|
43
|
+
const tLen = thresholds.length;
|
|
44
|
+
const vLen = values.length;
|
|
45
|
+
const out = new Uint32Array(vLen);
|
|
46
|
+
for (let vi = 0; vi < vLen; vi++) {
|
|
47
|
+
const value = values[vi];
|
|
48
|
+
let stateIdx = 0;
|
|
49
|
+
for (let ti = tLen - 1; ti >= 0; ti--) {
|
|
50
|
+
if (value >= thresholds[ti]) {
|
|
51
|
+
stateIdx = ti;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
out[vi] = stateIdx;
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
function blendNormalize(weights) {
|
|
60
|
+
const len = weights.length;
|
|
61
|
+
if (len === 0)
|
|
62
|
+
return weights;
|
|
63
|
+
let total = 0;
|
|
64
|
+
for (let i = 0; i < len; i++) {
|
|
65
|
+
let w = weights[i];
|
|
66
|
+
if (w < 0) {
|
|
67
|
+
w = 0;
|
|
68
|
+
weights[i] = 0;
|
|
69
|
+
}
|
|
70
|
+
total += w;
|
|
71
|
+
}
|
|
72
|
+
if (total > 0) {
|
|
73
|
+
const inv = 1 / total;
|
|
74
|
+
for (let i = 0; i < len; i++) {
|
|
75
|
+
weights[i] = weights[i] * inv;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return weights;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Pure-JS implementation of the {@link WASMKernels} contract.
|
|
82
|
+
*
|
|
83
|
+
* Selected automatically by {@link WASMDispatch} when the Rust compute crate
|
|
84
|
+
* cannot be instantiated (e.g. missing `WebAssembly`, CSP restrictions, or
|
|
85
|
+
* startup failure). Produces results bit-identical to the WASM build within
|
|
86
|
+
* IEEE-754 precision limits.
|
|
87
|
+
*/
|
|
88
|
+
export const fallbackKernels = {
|
|
89
|
+
springCurve,
|
|
90
|
+
batchBoundaryEval,
|
|
91
|
+
blendNormalize,
|
|
92
|
+
};
|
|
93
|
+
//# sourceMappingURL=wasm-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-fallback.js","sourceRoot":"","sources":["../src/wasm-fallback.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,SAAS,WAAW,CAAC,SAAiB,EAAE,OAAe,EAAE,IAAY,EAAE,OAAe;IACpF,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACX,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,CAAC;aAAM,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;YAClD,GAAG,CAAC,CAAC,CAAC;gBACJ,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAChH,CAAC;aAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;YACrC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC/B,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC/B,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,UAAwB,EAAE,MAAoB;IACvE,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAE,CAAC;QAC1B,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,KAAK,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YACtC,IAAI,KAAK,IAAI,UAAU,CAAC,EAAE,CAAE,EAAE,CAAC;gBAC7B,QAAQ,GAAG,EAAE,CAAC;gBACd,MAAM;YACR,CAAC;QACH,CAAC;QAED,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC;IACrB,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,OAAqB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAC3B,IAAI,GAAG,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE9B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,CAAC,GAAG,CAAC,CAAC;YACN,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;QACjC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC1C,WAAW;IACX,iBAAiB;IACjB,cAAc;CACf,CAAC"}
|
package/dist/wire.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Wire<T, E>` — fluent stream wrapper.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Effect, Stream } from 'effect';
|
|
7
|
+
import type { Millis } from './brands.js';
|
|
8
|
+
interface WireShape<T, E = never> {
|
|
9
|
+
readonly _tag: 'Wire';
|
|
10
|
+
readonly stream: Stream.Stream<T, E>;
|
|
11
|
+
map<B>(f: (a: T) => B): WireShape<B, E>;
|
|
12
|
+
filter(f: (a: T) => boolean): WireShape<T, E>;
|
|
13
|
+
take(n: number): WireShape<T, E>;
|
|
14
|
+
takeUntil(predicate: (a: T) => boolean): WireShape<T, E>;
|
|
15
|
+
debounce(ms: Millis): WireShape<T, E>;
|
|
16
|
+
throttle(ms: Millis): WireShape<T, E>;
|
|
17
|
+
scan<B>(initial: B, f: (acc: B, value: T) => B): WireShape<B, E>;
|
|
18
|
+
flatMap<B, E2>(f: (a: T) => WireShape<B, E2>): WireShape<B, E | E2>;
|
|
19
|
+
merge<B, E2>(other: WireShape<B, E2>): WireShape<T | B, E | E2>;
|
|
20
|
+
run(): Effect.Effect<void, E>;
|
|
21
|
+
runCollect(): Effect.Effect<T[], E>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Wire -- fluent stream wrapper with chainable operators for map, filter,
|
|
25
|
+
* scan, debounce, throttle, merge, and more. Wraps Effect Streams.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* const wire = Wire.from(Stream.make(1, 2, 3, 4, 5));
|
|
30
|
+
* const result = wire.filter(n => n > 2).map(n => n * 10);
|
|
31
|
+
* const values = Effect.runSync(result.runCollect()); // [30, 40, 50]
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare const Wire: {
|
|
35
|
+
from: <T, E = never>(stream: Stream.Stream<T, E>) => WireShape<T, E>;
|
|
36
|
+
fromSSE: (url: string, options?: EventSourceInit) => WireShape<MessageEvent, Error>;
|
|
37
|
+
fromWebSocket: (url: string, protocols?: string | string[]) => WireShape<MessageEvent, Error>;
|
|
38
|
+
fromAsyncIterable: <T>(iterable: AsyncIterable<T>) => WireShape<T, Error>;
|
|
39
|
+
zip: <A, B>(a: WireShape<A>, b: WireShape<B>) => WireShape<readonly [A, B]>;
|
|
40
|
+
merge: <T, E>(streams: ReadonlyArray<WireShape<T, E>>) => WireShape<T, E>;
|
|
41
|
+
runCollect: <T, E>(stream: WireShape<T, E>) => Effect.Effect<ReadonlyArray<T>, E>;
|
|
42
|
+
runForEach: <T, SE, E, R>(stream: WireShape<T, SE>, fn: (t: T) => Effect.Effect<void, E, R>) => Effect.Effect<void, SE | E, R>;
|
|
43
|
+
};
|
|
44
|
+
export declare namespace Wire {
|
|
45
|
+
/** Structural shape of a {@link Wire}: a fluent wrapper over `Stream.Stream<T, E>`. */
|
|
46
|
+
type Shape<T, E = never> = WireShape<T, E>;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"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"}
|
package/dist/wire.js
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Wire<T, E>` — fluent stream wrapper.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Effect, Stream, Queue } from 'effect';
|
|
7
|
+
function wrap(stream) {
|
|
8
|
+
const wireStream = {
|
|
9
|
+
_tag: 'Wire',
|
|
10
|
+
stream,
|
|
11
|
+
map: (f) => wrap(Stream.map(stream, f)),
|
|
12
|
+
filter: (f) => wrap(Stream.filter(stream, f)),
|
|
13
|
+
take: (n) => wrap(Stream.take(stream, n)),
|
|
14
|
+
takeUntil: (predicate) => wrap(Stream.takeUntil(stream, predicate)),
|
|
15
|
+
debounce: (ms) => wrap(Stream.debounce(stream, ms)),
|
|
16
|
+
throttle: (ms) => wrap(Stream.throttle(stream, {
|
|
17
|
+
cost: () => 1,
|
|
18
|
+
units: 1,
|
|
19
|
+
duration: ms,
|
|
20
|
+
strategy: 'enforce',
|
|
21
|
+
})),
|
|
22
|
+
scan: (initial, f) => wrap(Stream.scan(stream, initial, f)),
|
|
23
|
+
flatMap: (f) => wrap(Stream.flatMap(stream, (a) => f(a).stream)),
|
|
24
|
+
merge: (other) => wrap(Stream.merge(stream, other.stream)),
|
|
25
|
+
run: () => Stream.runDrain(stream),
|
|
26
|
+
runCollect: () => Effect.map(Stream.runCollect(stream), (chunk) => Array.from(chunk)),
|
|
27
|
+
};
|
|
28
|
+
return wireStream;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Wraps an Effect Stream into a fluent Wire with chainable operators.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* const wire = Wire.from(Stream.make(1, 2, 3));
|
|
36
|
+
* const doubled = wire.map(n => n * 2).filter(n => n > 2);
|
|
37
|
+
* const results = Effect.runSync(doubled.runCollect()); // [4, 6]
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
const _from = (stream) => wrap(stream);
|
|
41
|
+
/**
|
|
42
|
+
* Creates a Wire from a Server-Sent Events endpoint.
|
|
43
|
+
* The EventSource is cleaned up when the stream finalizes.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* const wire = Wire.fromSSE('/api/events');
|
|
48
|
+
* const parsed = wire.map(evt => JSON.parse(evt.data));
|
|
49
|
+
* await Effect.runPromise(Wire.runForEach(parsed, msg => Effect.log(msg)));
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
const _fromSSE = (url, options) => {
|
|
53
|
+
const stream = Stream.callback((queue) => Effect.gen(function* () {
|
|
54
|
+
const eventSource = new EventSource(url, options);
|
|
55
|
+
let closed = false;
|
|
56
|
+
const shutdown = () => {
|
|
57
|
+
if (closed)
|
|
58
|
+
return;
|
|
59
|
+
closed = true;
|
|
60
|
+
Queue.shutdown(queue).pipe(Effect.runSync);
|
|
61
|
+
};
|
|
62
|
+
eventSource.onmessage = (event) => {
|
|
63
|
+
Queue.offerUnsafe(queue, event);
|
|
64
|
+
};
|
|
65
|
+
eventSource.onerror = () => {
|
|
66
|
+
eventSource.close();
|
|
67
|
+
shutdown();
|
|
68
|
+
};
|
|
69
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
70
|
+
eventSource.close();
|
|
71
|
+
shutdown();
|
|
72
|
+
}));
|
|
73
|
+
yield* Effect.never;
|
|
74
|
+
}));
|
|
75
|
+
return wrap(stream);
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Creates a Wire from a WebSocket connection.
|
|
79
|
+
* The socket is closed when the stream finalizes.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* const wire = Wire.fromWebSocket('wss://example.com/ws');
|
|
84
|
+
* const messages = wire.map(evt => evt.data as string);
|
|
85
|
+
* await Effect.runPromise(Wire.runForEach(messages, m => Effect.log(m)));
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
const _fromWebSocket = (url, protocols) => {
|
|
89
|
+
const stream = Stream.callback((queue) => Effect.gen(function* () {
|
|
90
|
+
const ws = new WebSocket(url, protocols);
|
|
91
|
+
let closed = false;
|
|
92
|
+
const shutdown = () => {
|
|
93
|
+
if (closed)
|
|
94
|
+
return;
|
|
95
|
+
closed = true;
|
|
96
|
+
Queue.shutdown(queue).pipe(Effect.runSync);
|
|
97
|
+
};
|
|
98
|
+
ws.onmessage = (event) => {
|
|
99
|
+
Queue.offerUnsafe(queue, event);
|
|
100
|
+
};
|
|
101
|
+
ws.onerror = () => {
|
|
102
|
+
shutdown();
|
|
103
|
+
};
|
|
104
|
+
ws.onclose = () => {
|
|
105
|
+
shutdown();
|
|
106
|
+
};
|
|
107
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
108
|
+
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
109
|
+
ws.close();
|
|
110
|
+
}
|
|
111
|
+
shutdown();
|
|
112
|
+
}));
|
|
113
|
+
yield* Effect.never;
|
|
114
|
+
}));
|
|
115
|
+
return wrap(stream);
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Creates a Wire from any AsyncIterable source.
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* ```ts
|
|
122
|
+
* async function* gen() { yield 1; yield 2; yield 3; }
|
|
123
|
+
* const wire = Wire.fromAsyncIterable(gen());
|
|
124
|
+
* const results = await Effect.runPromise(wire.runCollect()); // [1, 2, 3]
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
const _fromAsyncIterable = (iterable) => {
|
|
128
|
+
const stream = Stream.fromAsyncIterable(iterable, (e) => (e instanceof Error ? e : new Error(String(e))));
|
|
129
|
+
return wrap(stream);
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Zips two Wires into a Wire of tuples, pairing elements pairwise.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* const a = Wire.from(Stream.make(1, 2));
|
|
137
|
+
* const b = Wire.from(Stream.make('a', 'b'));
|
|
138
|
+
* const zipped = Wire.zip(a, b);
|
|
139
|
+
* const results = Effect.runSync(zipped.runCollect()); // [[1,'a'], [2,'b']]
|
|
140
|
+
* ```
|
|
141
|
+
*/
|
|
142
|
+
const _zip = (a, b) => wrap(Stream.zip(a.stream, b.stream));
|
|
143
|
+
/**
|
|
144
|
+
* Merges multiple Wires into a single Wire, interleaving their emissions.
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* ```ts
|
|
148
|
+
* const a = Wire.from(Stream.make(1, 2));
|
|
149
|
+
* const b = Wire.from(Stream.make(3, 4));
|
|
150
|
+
* const merged = Wire.merge([a, b]);
|
|
151
|
+
* const results = Effect.runSync(merged.runCollect()); // [1, 2, 3, 4] (order varies)
|
|
152
|
+
* ```
|
|
153
|
+
*/
|
|
154
|
+
const _merge = (streams) => {
|
|
155
|
+
const effectStreams = streams.map((s) => s.stream);
|
|
156
|
+
const merged = Stream.mergeAll(effectStreams, { concurrency: 'unbounded' });
|
|
157
|
+
return wrap(merged);
|
|
158
|
+
};
|
|
159
|
+
/**
|
|
160
|
+
* Collects all values from a Wire into an array.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```ts
|
|
164
|
+
* const wire = Wire.from(Stream.make(10, 20, 30));
|
|
165
|
+
* const values = Effect.runSync(Wire.runCollect(wire)); // [10, 20, 30]
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
const _runCollect = (stream) => Effect.map(Stream.runCollect(stream.stream), (chunk) => Array.from(chunk));
|
|
169
|
+
/**
|
|
170
|
+
* Runs an effectful function for each value emitted by the Wire.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```ts
|
|
174
|
+
* const wire = Wire.from(Stream.make('hello', 'world'));
|
|
175
|
+
* await Effect.runPromise(Wire.runForEach(wire, s => Effect.log(s)));
|
|
176
|
+
* // Logs: hello, world
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
const _runForEach = (stream, fn) => Stream.runForEach(stream.stream, fn);
|
|
180
|
+
/**
|
|
181
|
+
* Wire -- fluent stream wrapper with chainable operators for map, filter,
|
|
182
|
+
* scan, debounce, throttle, merge, and more. Wraps Effect Streams.
|
|
183
|
+
*
|
|
184
|
+
* @example
|
|
185
|
+
* ```ts
|
|
186
|
+
* const wire = Wire.from(Stream.make(1, 2, 3, 4, 5));
|
|
187
|
+
* const result = wire.filter(n => n > 2).map(n => n * 10);
|
|
188
|
+
* const values = Effect.runSync(result.runCollect()); // [30, 40, 50]
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
export const Wire = {
|
|
192
|
+
from: _from,
|
|
193
|
+
fromSSE: _fromSSE,
|
|
194
|
+
fromWebSocket: _fromWebSocket,
|
|
195
|
+
fromAsyncIterable: _fromAsyncIterable,
|
|
196
|
+
zip: _zip,
|
|
197
|
+
merge: _merge,
|
|
198
|
+
runCollect: _runCollect,
|
|
199
|
+
runForEach: _runForEach,
|
|
200
|
+
};
|
|
201
|
+
//# sourceMappingURL=wire.js.map
|