@descix/frqtl-node 0.0.0-stage → 0.6.0-p0.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/CLAUDE.md +87 -0
- package/README.md +84 -2
- package/dist/dist-manifest.json +218 -0
- package/dist/eyes/index.js +109 -0
- package/dist/fat/pkg-node/egpt_wasm.js +1277 -0
- package/dist/fat/pkg-node/egpt_wasm_bg.wasm +0 -0
- package/dist/fat/pkg-node/package.json +12 -0
- package/dist/frqtl/assets/vendor/chroma.mjs +64 -0
- package/dist/frqtl/compat/boot-node.js +34 -0
- package/dist/frqtl/compat/engine.js +127 -0
- package/dist/frqtl/compat/package-root.js +24 -0
- package/dist/frqtl/compat/providers/wasm-engine.js +2501 -0
- package/dist/frqtl/compat/providers/wasm-load-browser.js +134 -0
- package/dist/frqtl/compat/providers/wasm-load-node.js +59 -0
- package/dist/frqtl/compat/renderer/FieldBuilder.js +145 -0
- package/dist/frqtl/compat/renderer/Filters.js +163 -0
- package/dist/frqtl/compat/renderer/RenderFamily.js +85 -0
- package/dist/frqtl/compat/renderer/RenderMesh.js +100 -0
- package/dist/frqtl/compat/renderer/RenderShape.js +154 -0
- package/dist/frqtl/compat/renderer/camera2d-geometry.js +183 -0
- package/dist/frqtl/compat/renderer/captureStill-common.js +259 -0
- package/dist/frqtl/compat/renderer/display-slot.js +96 -0
- package/dist/frqtl/compat/renderer/lo-drawn-center.js +231 -0
- package/dist/frqtl/compat/renderer/orbit-bag.js +216 -0
- package/dist/frqtl/compat/renderer/providers/godrays-layer.js +213 -0
- package/dist/frqtl/compat/renderer/providers/index.js +22 -0
- package/dist/frqtl/compat/renderer/providers/p5-provider.js +861 -0
- package/dist/frqtl/compat/renderer/providers/three-camera-contract.js +160 -0
- package/dist/frqtl/compat/renderer/providers/three-camera-geometry.js +571 -0
- package/dist/frqtl/compat/renderer/providers/three-provider.js +2474 -0
- package/dist/frqtl/compat/renderer/renderCapabilities-common.js +186 -0
- package/dist/frqtl/compat/renderer/renderer-provider-contract.js +238 -0
- package/dist/frqtl/compat/renderer/unprojectStill.js +172 -0
- package/dist/frqtl/compat/vendor.js +196 -0
- package/dist/frqtl/node-entry.js +17 -0
- package/dist/frqtl/objects/FrqtlApp.js +2922 -0
- package/dist/frqtl/objects/ObjectFactory.js +297 -0
- package/dist/frqtl/objects/RecipeContext.js +322 -0
- package/dist/frqtl/objects/collectors/DataCollector.js +116 -0
- package/dist/frqtl/objects/constants/WallBehaviors.js +178 -0
- package/dist/frqtl/objects/geometry/SlabFace.js +258 -0
- package/dist/frqtl/objects/instruments/capture-host.js +453 -0
- package/dist/frqtl/objects/instruments/capture.js +711 -0
- package/dist/frqtl/objects/instruments/hosted-eyes.js +985 -0
- package/dist/frqtl/objects/kinds-entry.js +14 -0
- package/dist/frqtl/objects/kinds.js +190 -0
- package/dist/frqtl/objects/objects/Box.js +273 -0
- package/dist/frqtl/objects/objects/Bullet.js +155 -0
- package/dist/frqtl/objects/objects/CircuitGate.js +380 -0
- package/dist/frqtl/objects/objects/CircuitProbe.js +214 -0
- package/dist/frqtl/objects/objects/DirectedTunnel.js +412 -0
- package/dist/frqtl/objects/objects/EgptFractal.js +164 -0
- package/dist/frqtl/objects/objects/LightSource.js +354 -0
- package/dist/frqtl/objects/objects/QuantumEmitter.js +760 -0
- package/dist/frqtl/objects/objects/Tube.js +471 -0
- package/dist/frqtl/objects/objects/absorbRadiation.js +310 -0
- package/dist/frqtl/objects/objects/actionCompiler.js +1747 -0
- package/dist/frqtl/objects/objects/controlAction.js +89 -0
- package/dist/frqtl/objects/objects/controlBind.js +278 -0
- package/dist/frqtl/objects/objects/directedRedirectProgram.js +120 -0
- package/dist/frqtl/objects/objects/emitterProgram.js +209 -0
- package/dist/frqtl/objects/objects/frqtl-control-slider.js +197 -0
- package/dist/frqtl/objects/objects/frqtl-control-sync.js +272 -0
- package/dist/frqtl/objects/objects/frqtl-control-widgets.js +219 -0
- package/dist/frqtl/objects/objects/frqtl-control-write-queue.js +174 -0
- package/dist/frqtl/objects/objects/makeControlsForObject.js +824 -0
- package/dist/frqtl/objects/objects/makeControlsForRenderSurface.js +161 -0
- package/dist/frqtl/objects/objects/slitLinerScatter.js +263 -0
- package/dist/frqtl/objects/objects/sustainedSource.js +299 -0
- package/dist/frqtl/objects/objects/tagger.js +228 -0
- package/dist/frqtl/objects/schema/engine-scopes.js +469 -0
- package/dist/frqtl/objects/schema/index.js +256 -0
- package/dist/frqtl/objects/schema/scopes.js +457 -0
- package/dist/frqtl/objects/schema/validate-descriptor.js +49 -0
- package/dist/frqtl/objects/schema/valueNormalizer.js +366 -0
- package/dist/frqtl/objects/setup/_collisionMatrixLanes.js +66 -0
- package/dist/frqtl/objects/setup/_setupOptions.js +118 -0
- package/dist/frqtl/objects/setup/_worldInit.js +162 -0
- package/dist/frqtl/objects/setup/setupBlackbodySubstrate.js +242 -0
- package/dist/frqtl/objects/setup/setupCircuitBasic.js +447 -0
- package/dist/frqtl/objects/setup/setupCollisionMatrix.js +188 -0
- package/dist/frqtl/objects/setup/setupConeEmitter3D.js +251 -0
- package/dist/frqtl/objects/setup/setupDoubleSlit.js +327 -0
- package/dist/frqtl/objects/setup/setupDoubleSlit_Laser.js +229 -0
- package/dist/frqtl/objects/setup/setupEmpty.js +59 -0
- package/dist/frqtl/objects/setup/setupFxSmoke.js +209 -0
- package/dist/frqtl/objects/setup/setupG1Race.js +80 -0
- package/dist/frqtl/objects/setup/setupG2Sweep.js +89 -0
- package/dist/frqtl/objects/setup/setupG3Collide.js +177 -0
- package/dist/frqtl/objects/setup/setupLightSourceLab.js +280 -0
- package/dist/frqtl/objects/setup/setupOscillator.js +68 -0
- package/dist/frqtl/objects/setup/setupParticleWalk.js +93 -0
- package/dist/frqtl/objects/setup/setupParticleWalk3D.js +133 -0
- package/dist/frqtl/objects/setup/setupSphereEmitter3D.js +1259 -0
- package/dist/frqtl/objects/setup/setupTraceCircuit.js +239 -0
- package/dist/frqtl/objects/setup/setupTunnelLab.js +242 -0
- package/dist/frqtl/objects/setup/setupTunnelPointExit.js +306 -0
- package/dist/frqtl/objects/setup/setupWaveInterference.js +178 -0
- package/dist/frqtl/objects/v1-replacements.js +30 -0
- package/dist/frqtl/package-core.js +23 -0
- package/dist/frqtl/parts/CameraControls.js +643 -0
- package/dist/frqtl/parts/CameraPath.js +575 -0
- package/dist/frqtl/parts/CollisionActions.js +35 -0
- package/dist/frqtl/parts/CollisionTypes.js +31 -0
- package/dist/frqtl/parts/DetectorWall.js +496 -0
- package/dist/frqtl/parts/FrqtlControlOverlay.js +227 -0
- package/dist/frqtl/parts/FrqtlControlsPanel.js +415 -0
- package/dist/frqtl/parts/FrqtlVision.js +818 -0
- package/dist/frqtl/parts/GraphingDetectorWall.js +490 -0
- package/dist/frqtl/parts/LargeObject.js +406 -0
- package/dist/frqtl/parts/LightColor.js +255 -0
- package/dist/frqtl/parts/LiveChart.js +285 -0
- package/dist/frqtl/parts/LogicGate.js +720 -0
- package/dist/frqtl/parts/OvenBox.js +612 -0
- package/dist/frqtl/parts/PointSource.js +763 -0
- package/dist/frqtl/parts/Rectangle.js +200 -0
- package/dist/frqtl/parts/SlitLightSource.js +234 -0
- package/dist/frqtl/parts/SlitScreen.js +628 -0
- package/dist/frqtl/parts/SphereEmitter.js +946 -0
- package/dist/frqtl/parts/Trace.js +508 -0
- package/dist/frqtl/parts/Tunnel.js +1057 -0
- package/dist/frqtl/parts/Wall.js +1211 -0
- package/dist/frqtl/parts/index.js +33 -0
- package/dist/frqtl/scenes/absorbing-wall-3d.js +33 -0
- package/dist/frqtl/scenes/absorbing-wall.js +32 -0
- package/dist/frqtl/scenes/atomic-model.js +88 -0
- package/dist/frqtl/scenes/big-bang.js +46 -0
- package/dist/frqtl/scenes/blackbody.js +81 -0
- package/dist/frqtl/scenes/circuit-sat.js +127 -0
- package/dist/frqtl/scenes/collision-matrix-3d.js +107 -0
- package/dist/frqtl/scenes/counting-wall-3d.js +36 -0
- package/dist/frqtl/scenes/counting-wall.js +38 -0
- package/dist/frqtl/scenes/double-slit.js +31 -0
- package/dist/frqtl/scenes/dse-one-emitter.js +196 -0
- package/dist/frqtl/scenes/dse-one-slit.js +114 -0
- package/dist/frqtl/scenes/dse-photoelectric.js +70 -0
- package/dist/frqtl/scenes/dse-tunnel-rebuild.js +244 -0
- package/dist/frqtl/scenes/dse-two-emitters.js +196 -0
- package/dist/frqtl/scenes/dse-two-slits.js +132 -0
- package/dist/frqtl/scenes/empty.js +14 -0
- package/dist/frqtl/scenes/laser-buildup.js +49 -0
- package/dist/frqtl/scenes/mirror-3d.js +56 -0
- package/dist/frqtl/scenes/mirror-route.js +140 -0
- package/dist/frqtl/scenes/mirror.js +38 -0
- package/dist/frqtl/scenes/omni-3d.js +27 -0
- package/dist/frqtl/scenes/omni-source.js +22 -0
- package/dist/frqtl/scenes/self-interference.js +39 -0
- package/dist/frqtl/scenes/smoking-gun.js +122 -0
- package/dist/frqtl/scenes/straight-walk.js +22 -0
- package/dist/frqtl/scenes/sun.js +39 -0
- package/dist/frqtl/scenes/two-source.js +37 -0
- package/dist/frqtl/scenes/wave.js +26 -0
- package/dist/shim/bundle/frqnb.js +112 -0
- package/dist/shim/bundle/index.js +121 -0
- package/dist/shim/bundle/indexHtml.js +107 -0
- package/dist/shim/bundle/manifest.js +95 -0
- package/dist/shim/bundle/zip.js +243 -0
- package/dist/shim/bus.js +67 -0
- package/dist/shim/controls/index.js +627 -0
- package/dist/shim/controls/registry.js +274 -0
- package/dist/shim/engine/artifact-shell.js +212 -0
- package/dist/shim/engine/boot-phases.js +44 -0
- package/dist/shim/engine/engine-stack-boot.js +59 -0
- package/dist/shim/engine/router.js +692 -0
- package/dist/shim/experiment-frame/index.js +296 -0
- package/dist/shim/expr/ast-schema.js +369 -0
- package/dist/shim/field-descriptor/index.js +326 -0
- package/dist/shim/frame-data/index.js +224 -0
- package/dist/shim/index.js +67 -0
- package/dist/shim/notebook/canvas-guard.js +82 -0
- package/dist/shim/notebook/catalog.js +35 -0
- package/dist/shim/notebook/format.js +736 -0
- package/dist/shim/notebook/frqtl-setups-importmap.js +81 -0
- package/dist/shim/notebook/kernel.js +672 -0
- package/dist/shim/notebook/knob.js +151 -0
- package/dist/shim/notebook/module-resolver.js +260 -0
- package/dist/shim/notebook/notebook-knobs.js +65 -0
- package/dist/shim/notebook/produced-bindings.js +67 -0
- package/dist/shim/notebook/realm-registry.js +121 -0
- package/dist/shim/notebook/realm-transport.js +73 -0
- package/dist/shim/notebook/setup-builder.js +510 -0
- package/dist/shim/notebook/store.js +159 -0
- package/dist/shim/notebook/vendor-importmap.js +134 -0
- package/dist/shim/notebook/view-builder.js +189 -0
- package/dist/shim/notebook/view-ctx.js +100 -0
- package/dist/shim/notebook/view-handle.js +202 -0
- package/dist/shim/notebook/warmup.js +102 -0
- package/dist/shim/package.json +4 -0
- package/dist/shim/page-params/index.js +214 -0
- package/dist/shim/project/identity.js +112 -0
- package/dist/shim/project/index.js +19 -0
- package/dist/shim/project/link.js +402 -0
- package/dist/shim/project/node-specifier-hook.mjs +35 -0
- package/dist/shim/project/register-node.mjs +17 -0
- package/dist/shim/project/specifiers.js +106 -0
- package/dist/shim/registry/copy-gate.js +110 -0
- package/dist/shim/registry/exhibits.js +455 -0
- package/dist/shim/registry/experiments.js +215 -0
- package/dist/shim/registry/index.js +19 -0
- package/dist/shim/registry/scene-source.js +157 -0
- package/dist/shim/registry/walkthrough.js +807 -0
- package/dist/shim/render/capture-envelope.js +279 -0
- package/dist/shim/render/heat-colormap.js +92 -0
- package/dist/shim/render/render-stages.js +855 -0
- package/dist/shim/render/sun-look.js +33 -0
- package/dist/shim/render-state/apply.js +262 -0
- package/dist/shim/render-state/index.js +74 -0
- package/dist/shim/rpc/index.js +207 -0
- package/dist/shim/runtime/index.js +1023 -0
- package/dist/shim/storage/boot.js +69 -0
- package/dist/shim/storage/index.js +169 -0
- package/dist/shim/storage/local-storage-provider.js +230 -0
- package/dist/shim/storage/make-namespace-store.js +132 -0
- package/dist/shim/storage/modules.js +249 -0
- package/dist/shim/storage/projects.js +150 -0
- package/llms.txt +12 -0
- package/package.json +62 -4
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/* Copyright 2023-2026 by Essam Abadir */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* lib/shim/bundle/zip.js — a hand-rolled STORE-only ZIP writer + reader
|
|
5
|
+
* (ws-experiments-walkthrough Bite 2, architect ruling R2).
|
|
6
|
+
*
|
|
7
|
+
* ── Why hand-rolled + STORE-only ─────────────────────────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* A bundle folder must download as ONE `.zip`. `jszip` was REJECTED (any dep
|
|
10
|
+
* reachable from features ships in the sdk dist — supply-chain surface in the
|
|
11
|
+
* lean shim). STORE (no compression, method 0) needs no deflate implementation,
|
|
12
|
+
* is trivially readable by every standard unzip, and bundles are small text
|
|
13
|
+
* files + one PNG. This module is PURE + DOM-free: it emits/consumes
|
|
14
|
+
* `Uint8Array` only. The browser download trigger (`Blob` + `a.click`) is a THIN
|
|
15
|
+
* feature-side helper (`lib/features/ide` — shim = bytes, feature = browser UX).
|
|
16
|
+
*
|
|
17
|
+
* ── Contract ─────────────────────────────────────────────────────────────────
|
|
18
|
+
*
|
|
19
|
+
* zipStore(entries) → Uint8Array
|
|
20
|
+
* entries: [{ name: string, bytes: Uint8Array }] (name = archive path)
|
|
21
|
+
*
|
|
22
|
+
* unzipStore(bytes) → [{ name: string, bytes: Uint8Array }]
|
|
23
|
+
* Reads a STORE-only archive (throws FAIL-LOUD on a compressed entry, a bad
|
|
24
|
+
* signature, or a CRC mismatch — never silently returns wrong bytes).
|
|
25
|
+
*
|
|
26
|
+
* textBytes(str) / bytesText(u8) — UTF-8 encode/decode helpers (a text
|
|
27
|
+
* bundle file's bytes ARE its UTF-8 encoding).
|
|
28
|
+
*
|
|
29
|
+
* Layer 2 (physics): none — pure byte format.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
'use strict';
|
|
33
|
+
|
|
34
|
+
var _enc = new TextEncoder();
|
|
35
|
+
var _dec = new TextDecoder();
|
|
36
|
+
|
|
37
|
+
/** @param {string} s @returns {Uint8Array} */
|
|
38
|
+
export function textBytes(s) { return _enc.encode(s == null ? '' : String(s)); }
|
|
39
|
+
|
|
40
|
+
/** @param {Uint8Array} u8 @returns {string} */
|
|
41
|
+
export function bytesText(u8) { return _dec.decode(u8); }
|
|
42
|
+
|
|
43
|
+
// ── CRC-32 (IEEE 802.3, standard ZIP polynomial 0xEDB88320) ──────────────────
|
|
44
|
+
|
|
45
|
+
var _CRC_TABLE = (function () {
|
|
46
|
+
var t = new Uint32Array(256);
|
|
47
|
+
for (var n = 0; n < 256; n++) {
|
|
48
|
+
var c = n;
|
|
49
|
+
for (var k = 0; k < 8; k++) {
|
|
50
|
+
c = (c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1);
|
|
51
|
+
}
|
|
52
|
+
t[n] = c >>> 0;
|
|
53
|
+
}
|
|
54
|
+
return t;
|
|
55
|
+
})();
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @param {Uint8Array} bytes
|
|
59
|
+
* @returns {number} unsigned 32-bit CRC.
|
|
60
|
+
*/
|
|
61
|
+
export function crc32(bytes) {
|
|
62
|
+
var crc = 0xFFFFFFFF;
|
|
63
|
+
for (var i = 0; i < bytes.length; i++) {
|
|
64
|
+
crc = (crc >>> 8) ^ _CRC_TABLE[(crc ^ bytes[i]) & 0xFF];
|
|
65
|
+
}
|
|
66
|
+
return (crc ^ 0xFFFFFFFF) >>> 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ── little-endian writers ────────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
function _u16(v) { return [v & 0xFF, (v >>> 8) & 0xFF]; }
|
|
72
|
+
function _u32(v) {
|
|
73
|
+
v = v >>> 0;
|
|
74
|
+
return [v & 0xFF, (v >>> 8) & 0xFF, (v >>> 16) & 0xFF, (v >>> 24) & 0xFF];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function _concat(chunks) {
|
|
78
|
+
var total = 0, i;
|
|
79
|
+
for (i = 0; i < chunks.length; i++) { total += chunks[i].length; }
|
|
80
|
+
var out = new Uint8Array(total);
|
|
81
|
+
var off = 0;
|
|
82
|
+
for (i = 0; i < chunks.length; i++) { out.set(chunks[i], off); off += chunks[i].length; }
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// ── little-endian readers ────────────────────────────────────────────────────
|
|
87
|
+
|
|
88
|
+
function _readU16(b, o) { return b[o] | (b[o + 1] << 8); }
|
|
89
|
+
function _readU32(b, o) { return (b[o] | (b[o + 1] << 8) | (b[o + 2] << 16) | (b[o + 3] << 24)) >>> 0; }
|
|
90
|
+
|
|
91
|
+
var LOCAL_SIG = 0x04034b50;
|
|
92
|
+
var CENTRAL_SIG = 0x02014b50;
|
|
93
|
+
var EOCD_SIG = 0x06054b50;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Build a STORE-only ZIP archive from a list of named byte entries.
|
|
97
|
+
*
|
|
98
|
+
* @param {{name:string, bytes:Uint8Array}[]} entries
|
|
99
|
+
* @returns {Uint8Array} the complete `.zip` bytes.
|
|
100
|
+
*/
|
|
101
|
+
export function zipStore(entries) {
|
|
102
|
+
if (!Array.isArray(entries)) {
|
|
103
|
+
throw new Error('[bundle/zip] zipStore(entries): entries must be an array.');
|
|
104
|
+
}
|
|
105
|
+
var localChunks = [];
|
|
106
|
+
var centralChunks = [];
|
|
107
|
+
var offset = 0; // running offset of each local header
|
|
108
|
+
|
|
109
|
+
for (var i = 0; i < entries.length; i++) {
|
|
110
|
+
var e = entries[i];
|
|
111
|
+
if (!e || typeof e.name !== 'string' || !(e.bytes instanceof Uint8Array)) {
|
|
112
|
+
throw new Error('[bundle/zip] zipStore: entry ' + i + ' must be {name:string, bytes:Uint8Array}.');
|
|
113
|
+
}
|
|
114
|
+
var nameBytes = textBytes(e.name);
|
|
115
|
+
var data = e.bytes;
|
|
116
|
+
var crc = crc32(data);
|
|
117
|
+
var size = data.length;
|
|
118
|
+
|
|
119
|
+
// Local file header.
|
|
120
|
+
var local = _concat([
|
|
121
|
+
new Uint8Array(_u32(LOCAL_SIG)),
|
|
122
|
+
new Uint8Array(_u16(20)), // version needed to extract (2.0)
|
|
123
|
+
new Uint8Array(_u16(0)), // general purpose bit flag
|
|
124
|
+
new Uint8Array(_u16(0)), // compression method: 0 = STORE
|
|
125
|
+
new Uint8Array(_u16(0)), // last mod time (fixed 0 — deterministic)
|
|
126
|
+
new Uint8Array(_u16(0)), // last mod date (fixed 0 — deterministic)
|
|
127
|
+
new Uint8Array(_u32(crc)),
|
|
128
|
+
new Uint8Array(_u32(size)), // compressed size (== uncompressed for STORE)
|
|
129
|
+
new Uint8Array(_u32(size)), // uncompressed size
|
|
130
|
+
new Uint8Array(_u16(nameBytes.length)),
|
|
131
|
+
new Uint8Array(_u16(0)), // extra field length
|
|
132
|
+
nameBytes,
|
|
133
|
+
data
|
|
134
|
+
]);
|
|
135
|
+
localChunks.push(local);
|
|
136
|
+
|
|
137
|
+
// Central directory record (references this local header's offset).
|
|
138
|
+
var central = _concat([
|
|
139
|
+
new Uint8Array(_u32(CENTRAL_SIG)),
|
|
140
|
+
new Uint8Array(_u16(20)), // version made by
|
|
141
|
+
new Uint8Array(_u16(20)), // version needed
|
|
142
|
+
new Uint8Array(_u16(0)), // flags
|
|
143
|
+
new Uint8Array(_u16(0)), // method: STORE
|
|
144
|
+
new Uint8Array(_u16(0)), // time
|
|
145
|
+
new Uint8Array(_u16(0)), // date
|
|
146
|
+
new Uint8Array(_u32(crc)),
|
|
147
|
+
new Uint8Array(_u32(size)),
|
|
148
|
+
new Uint8Array(_u32(size)),
|
|
149
|
+
new Uint8Array(_u16(nameBytes.length)),
|
|
150
|
+
new Uint8Array(_u16(0)), // extra length
|
|
151
|
+
new Uint8Array(_u16(0)), // comment length
|
|
152
|
+
new Uint8Array(_u16(0)), // disk number start
|
|
153
|
+
new Uint8Array(_u16(0)), // internal attrs
|
|
154
|
+
new Uint8Array(_u32(0)), // external attrs
|
|
155
|
+
new Uint8Array(_u32(offset)), // local header offset
|
|
156
|
+
nameBytes
|
|
157
|
+
]);
|
|
158
|
+
centralChunks.push(central);
|
|
159
|
+
|
|
160
|
+
offset += local.length;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
var localBlob = _concat(localChunks);
|
|
164
|
+
var centralBlob = _concat(centralChunks);
|
|
165
|
+
var eocd = _concat([
|
|
166
|
+
new Uint8Array(_u32(EOCD_SIG)),
|
|
167
|
+
new Uint8Array(_u16(0)), // disk number
|
|
168
|
+
new Uint8Array(_u16(0)), // disk with central dir
|
|
169
|
+
new Uint8Array(_u16(entries.length)), // CD records on this disk
|
|
170
|
+
new Uint8Array(_u16(entries.length)), // total CD records
|
|
171
|
+
new Uint8Array(_u32(centralBlob.length)), // central dir size
|
|
172
|
+
new Uint8Array(_u32(localBlob.length)), // central dir offset (== size of all local records)
|
|
173
|
+
new Uint8Array(_u16(0)) // comment length
|
|
174
|
+
]);
|
|
175
|
+
|
|
176
|
+
return _concat([localBlob, centralBlob, eocd]);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Read a STORE-only ZIP archive. Walks the central directory (the canonical
|
|
181
|
+
* index), resolves each entry's local header, and extracts its stored bytes.
|
|
182
|
+
*
|
|
183
|
+
* FAIL-LOUD: throws on a missing EOCD, a bad central/local signature, a
|
|
184
|
+
* non-STORE compression method, or a CRC-32 mismatch — never returns wrong bytes.
|
|
185
|
+
*
|
|
186
|
+
* @param {Uint8Array} bytes
|
|
187
|
+
* @returns {{name:string, bytes:Uint8Array}[]}
|
|
188
|
+
*/
|
|
189
|
+
export function unzipStore(bytes) {
|
|
190
|
+
if (!(bytes instanceof Uint8Array)) {
|
|
191
|
+
throw new Error('[bundle/zip] unzipStore(bytes): bytes must be a Uint8Array.');
|
|
192
|
+
}
|
|
193
|
+
// Locate the End Of Central Directory record (scan backward for its signature).
|
|
194
|
+
var eocd = -1;
|
|
195
|
+
for (var p = bytes.length - 22; p >= 0; p--) {
|
|
196
|
+
if (_readU32(bytes, p) === EOCD_SIG) { eocd = p; break; }
|
|
197
|
+
}
|
|
198
|
+
if (eocd === -1) {
|
|
199
|
+
throw new Error('[bundle/zip] unzipStore: End Of Central Directory record not found (not a ZIP).');
|
|
200
|
+
}
|
|
201
|
+
var count = _readU16(bytes, eocd + 10);
|
|
202
|
+
var cdOffset = _readU32(bytes, eocd + 16);
|
|
203
|
+
|
|
204
|
+
var out = [];
|
|
205
|
+
var o = cdOffset;
|
|
206
|
+
for (var i = 0; i < count; i++) {
|
|
207
|
+
if (_readU32(bytes, o) !== CENTRAL_SIG) {
|
|
208
|
+
throw new Error('[bundle/zip] unzipStore: bad central directory signature at record ' + i + '.');
|
|
209
|
+
}
|
|
210
|
+
var method = _readU16(bytes, o + 10);
|
|
211
|
+
var crcStored = _readU32(bytes, o + 16);
|
|
212
|
+
var compSize = _readU32(bytes, o + 20);
|
|
213
|
+
var nameLen = _readU16(bytes, o + 28);
|
|
214
|
+
var extraLen = _readU16(bytes, o + 30);
|
|
215
|
+
var commentLen = _readU16(bytes, o + 32);
|
|
216
|
+
var localOff = _readU32(bytes, o + 42);
|
|
217
|
+
var name = bytesText(bytes.subarray(o + 46, o + 46 + nameLen));
|
|
218
|
+
|
|
219
|
+
if (method !== 0) {
|
|
220
|
+
throw new Error('[bundle/zip] unzipStore: entry "' + name + '" uses compression method ' +
|
|
221
|
+
method + ' — this reader is STORE-only (method 0).');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Resolve the local header to find the data start (its own name/extra lengths).
|
|
225
|
+
if (_readU32(bytes, localOff) !== LOCAL_SIG) {
|
|
226
|
+
throw new Error('[bundle/zip] unzipStore: bad local header signature for "' + name + '".');
|
|
227
|
+
}
|
|
228
|
+
var lNameLen = _readU16(bytes, localOff + 26);
|
|
229
|
+
var lExtraLen = _readU16(bytes, localOff + 28);
|
|
230
|
+
var dataStart = localOff + 30 + lNameLen + lExtraLen;
|
|
231
|
+
var data = bytes.slice(dataStart, dataStart + compSize);
|
|
232
|
+
|
|
233
|
+
var crcActual = crc32(data);
|
|
234
|
+
if (crcActual !== crcStored) {
|
|
235
|
+
throw new Error('[bundle/zip] unzipStore: CRC-32 mismatch for "' + name +
|
|
236
|
+
'" (stored ' + crcStored + ', computed ' + crcActual + ').');
|
|
237
|
+
}
|
|
238
|
+
out.push({ name: name, bytes: data });
|
|
239
|
+
|
|
240
|
+
o += 46 + nameLen + extraLen + commentLen;
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
package/dist/shim/bus.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* Copyright 2023-2026 by Essam Abadir */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Bus — the single shared event bus for all Common IDE components.
|
|
5
|
+
*
|
|
6
|
+
* Named ESM export. A missing import of this module is a hard FAIL-LOUD load
|
|
7
|
+
* error (no silent window.CommonBus fallback).
|
|
8
|
+
*
|
|
9
|
+
* Plain synchronous pub/sub; no async, no queuing.
|
|
10
|
+
*
|
|
11
|
+
* ── Canonical event catalogue (frozen) ─────────────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* run:request { source: 'frqtl'|'math', code: string, fileId: string, sourceUrl?: string }
|
|
14
|
+
* run:result { source: 'frqtl'|'math', ok: boolean, error?: string }
|
|
15
|
+
* console:write { level: 'info'|'warn'|'error'|'pass'|'fail', text: string }
|
|
16
|
+
* console:clear {}
|
|
17
|
+
* render:frame { universe?: object, tickData?: object }
|
|
18
|
+
* engine:tick { tick: number, metrics: object }
|
|
19
|
+
* engine:error { message: string }
|
|
20
|
+
* pane:show/hide/focus/resize/layout
|
|
21
|
+
*
|
|
22
|
+
* ── kind enum (frozen) ──────────────────────────────────────────────────────
|
|
23
|
+
* 'frqtl' physics JS code | 'math' EGPT Math SDK JS code
|
|
24
|
+
*
|
|
25
|
+
* ── Usage ───────────────────────────────────────────────────────────────────
|
|
26
|
+
* import { Bus } from 'lib/shim';
|
|
27
|
+
* Bus.on('console:write', function(payload) { ... });
|
|
28
|
+
* Bus.emit('console:write', { level: 'info', text: 'hello' });
|
|
29
|
+
* Bus.off('console:write', handler);
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
'use strict';
|
|
33
|
+
|
|
34
|
+
var _listeners = Object.create(null); // event → Array<fn>
|
|
35
|
+
|
|
36
|
+
export const Bus = {
|
|
37
|
+
on: function (event, fn) {
|
|
38
|
+
if (!_listeners[event]) { _listeners[event] = []; }
|
|
39
|
+
_listeners[event].push(fn);
|
|
40
|
+
},
|
|
41
|
+
off: function (event, fn) {
|
|
42
|
+
if (!_listeners[event]) { return; }
|
|
43
|
+
_listeners[event] = _listeners[event].filter(function (f) { return f !== fn; });
|
|
44
|
+
},
|
|
45
|
+
emit: function (event, payload) {
|
|
46
|
+
var fns = _listeners[event];
|
|
47
|
+
if (!fns || !fns.length) { return; }
|
|
48
|
+
var snap = fns.slice();
|
|
49
|
+
for (var i = 0; i < snap.length; i++) {
|
|
50
|
+
try {
|
|
51
|
+
snap[i](payload);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
if (typeof console !== 'undefined' && console.error) {
|
|
54
|
+
console.error('[Bus] handler error on "' + event + '":', e);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
once: function (event, fn) {
|
|
60
|
+
var bus = this;
|
|
61
|
+
var wrapper = function (payload) {
|
|
62
|
+
bus.off(event, wrapper);
|
|
63
|
+
fn(payload);
|
|
64
|
+
};
|
|
65
|
+
this.on(event, wrapper);
|
|
66
|
+
}
|
|
67
|
+
};
|