@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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scheduler -- clock abstraction decoupling animation from requestAnimationFrame.
|
|
3
|
+
*
|
|
4
|
+
* Four implementations:
|
|
5
|
+
* - raf: browser real-time (default)
|
|
6
|
+
* - noop: SSR-safe
|
|
7
|
+
* - fixedStep: deterministic timestamps at target fps (video rendering)
|
|
8
|
+
* - audioSync: ticks in lockstep with an AVBridge sample counter
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Implementations
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** Default: requestAnimationFrame. Used by Timeline/animate in browser. */
|
|
16
|
+
function _raf() {
|
|
17
|
+
return {
|
|
18
|
+
_tag: 'FrameScheduler',
|
|
19
|
+
schedule: (cb) => requestAnimationFrame(cb),
|
|
20
|
+
cancel: (id) => cancelAnimationFrame(id),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** SSR-safe: noop scheduler for server environments. */
|
|
24
|
+
function _noop() {
|
|
25
|
+
return {
|
|
26
|
+
_tag: 'FrameScheduler',
|
|
27
|
+
schedule: () => 0,
|
|
28
|
+
cancel: () => { },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/** Fixed-step: deterministic timestamps at target fps. For video rendering.
|
|
32
|
+
* Uses a class for V8 hidden-class optimization (stable inline caches). */
|
|
33
|
+
class FixedStepSchedulerImpl {
|
|
34
|
+
_tag = 'FrameScheduler';
|
|
35
|
+
_frame = 0;
|
|
36
|
+
_cb = null;
|
|
37
|
+
_dt;
|
|
38
|
+
constructor(fps) {
|
|
39
|
+
this._dt = 1000 / fps;
|
|
40
|
+
}
|
|
41
|
+
get frame() {
|
|
42
|
+
return this._frame;
|
|
43
|
+
}
|
|
44
|
+
schedule(cb) {
|
|
45
|
+
this._cb = cb;
|
|
46
|
+
return this._frame;
|
|
47
|
+
}
|
|
48
|
+
cancel() {
|
|
49
|
+
this._cb = null;
|
|
50
|
+
}
|
|
51
|
+
step() {
|
|
52
|
+
const cb = this._cb;
|
|
53
|
+
if (cb) {
|
|
54
|
+
this._cb = null;
|
|
55
|
+
cb(this._frame * this._dt);
|
|
56
|
+
}
|
|
57
|
+
this._frame++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function _fixedStep(fps) {
|
|
61
|
+
return new FixedStepSchedulerImpl(fps);
|
|
62
|
+
}
|
|
63
|
+
function _audioSync(bridge) {
|
|
64
|
+
let lastFrame = -1;
|
|
65
|
+
let pendingCallback = null;
|
|
66
|
+
return {
|
|
67
|
+
_tag: 'FrameScheduler',
|
|
68
|
+
bridge,
|
|
69
|
+
get frame() {
|
|
70
|
+
return bridge.getCurrentFrame();
|
|
71
|
+
},
|
|
72
|
+
schedule(cb) {
|
|
73
|
+
pendingCallback = cb;
|
|
74
|
+
return bridge.getCurrentFrame();
|
|
75
|
+
},
|
|
76
|
+
cancel() {
|
|
77
|
+
pendingCallback = null;
|
|
78
|
+
},
|
|
79
|
+
poll() {
|
|
80
|
+
const currentFrame = bridge.getCurrentFrame();
|
|
81
|
+
if (currentFrame !== lastFrame) {
|
|
82
|
+
lastFrame = currentFrame;
|
|
83
|
+
const cb = pendingCallback;
|
|
84
|
+
if (cb) {
|
|
85
|
+
pendingCallback = null;
|
|
86
|
+
const timestampMs = bridge.sampleToTime(bridge.getCurrentSample()) * 1000;
|
|
87
|
+
cb(timestampMs);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Scheduler — clock abstraction that decouples animation driver from real time.
|
|
95
|
+
* Pick the impl that matches the runtime: `raf` in browser, `noop` on the
|
|
96
|
+
* server, `fixedStep` for deterministic video render, `audioSync` to drive UI
|
|
97
|
+
* in lockstep with an {@link AVBridge}.
|
|
98
|
+
*/
|
|
99
|
+
export const Scheduler = {
|
|
100
|
+
/** `requestAnimationFrame`-backed scheduler for browser real-time work. */
|
|
101
|
+
raf: _raf,
|
|
102
|
+
/** No-op scheduler for SSR / environments without rAF. */
|
|
103
|
+
noop: _noop,
|
|
104
|
+
/** Fixed-step scheduler at the given fps — deterministic timestamps for offline rendering. */
|
|
105
|
+
fixedStep: _fixedStep,
|
|
106
|
+
/** Scheduler that polls an {@link AVBridge} and fires callbacks when the sample frame advances. */
|
|
107
|
+
audioSync: _audioSync,
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShipCapsule — release-artifact receipt (ADR-0011).
|
|
3
|
+
*
|
|
4
|
+
* Same canonical-CBOR + ContentAddress kernel as runtime primitives, applied
|
|
5
|
+
* to a published-package tarball. `id` is the fnv1a label over the
|
|
6
|
+
* canonical bytes of every field except `id` and `integrity`; `integrity`
|
|
7
|
+
* pairs that label with a sha256 digest over the same bytes.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { Effect } from 'effect';
|
|
12
|
+
import type { AddressedDigest, ContentAddress, HLC } from './brands.js';
|
|
13
|
+
interface ShipCapsuleBuildEnv {
|
|
14
|
+
readonly node_version: string;
|
|
15
|
+
readonly pnpm_version: string;
|
|
16
|
+
readonly os: 'linux' | 'darwin' | 'win32';
|
|
17
|
+
readonly arch: 'x64' | 'arm64';
|
|
18
|
+
}
|
|
19
|
+
interface ShipCapsuleShape {
|
|
20
|
+
readonly _kind: 'shipCapsule';
|
|
21
|
+
readonly schema_version: 1;
|
|
22
|
+
readonly id: ContentAddress;
|
|
23
|
+
readonly integrity: AddressedDigest;
|
|
24
|
+
readonly package_name: string;
|
|
25
|
+
readonly package_version: string;
|
|
26
|
+
readonly source_commit: string;
|
|
27
|
+
readonly source_dirty: boolean;
|
|
28
|
+
readonly lockfile_address: AddressedDigest;
|
|
29
|
+
readonly workspace_manifest_address: AddressedDigest;
|
|
30
|
+
readonly tarball_manifest_address: AddressedDigest;
|
|
31
|
+
readonly build_env: ShipCapsuleBuildEnv;
|
|
32
|
+
readonly package_manager: 'pnpm';
|
|
33
|
+
readonly package_manager_version: string;
|
|
34
|
+
readonly publish_dry_run_address: AddressedDigest;
|
|
35
|
+
readonly lifecycle_scripts_observed: readonly string[];
|
|
36
|
+
readonly generated_at: HLC;
|
|
37
|
+
readonly previous_ship_capsule: ContentAddress | null;
|
|
38
|
+
}
|
|
39
|
+
type ShipCapsuleInput = Omit<ShipCapsuleShape, 'id' | 'integrity'>;
|
|
40
|
+
type ShipCapsuleDecodeError = 'non_canonical' | 'malformed_cbor' | 'invalid_shape';
|
|
41
|
+
export declare const ShipCapsule: {
|
|
42
|
+
make: (input: ShipCapsuleInput) => Effect.Effect<ShipCapsuleShape, Error>;
|
|
43
|
+
canonicalize: (capsule: ShipCapsuleShape) => Uint8Array;
|
|
44
|
+
decode: (bytes: Uint8Array) => Effect.Effect<ShipCapsuleShape, ShipCapsuleDecodeError>;
|
|
45
|
+
computeId: (capsuleWithoutIdentity: ShipCapsuleInput) => Effect.Effect<AddressedDigest, Error>;
|
|
46
|
+
};
|
|
47
|
+
export declare namespace ShipCapsule {
|
|
48
|
+
type Shape = ShipCapsuleShape;
|
|
49
|
+
type Input = ShipCapsuleInput;
|
|
50
|
+
type DecodeError = ShipCapsuleDecodeError;
|
|
51
|
+
type BuildEnv = ShipCapsuleBuildEnv;
|
|
52
|
+
}
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=ship-capsule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-capsule.d.ts","sourceRoot":"","sources":["../src/ship-capsule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIxE,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC;CAChC;AAED,UAAU,gBAAgB;IACxB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,0BAA0B,EAAE,eAAe,CAAC;IACrD,QAAQ,CAAC,wBAAwB,EAAE,eAAe,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,uBAAuB,EAAE,eAAe,CAAC;IAClD,QAAQ,CAAC,0BAA0B,EAAE,SAAS,MAAM,EAAE,CAAC;IACvD,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,cAAc,GAAG,IAAI,CAAC;CACvD;AAED,KAAK,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;AAEnE,KAAK,sBAAsB,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,CAAC;AAwInF,eAAO,MAAM,WAAW;kBAzFH,gBAAgB,KAAG,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC;4BAyB/C,gBAAgB,KAAG,UAAU;oBAwCnD,UAAU,KAChB,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;wCArEhC,gBAAgB,KACvC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;CA2F4B,CAAC;AAErE,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAY,KAAK,GAAG,gBAAgB,CAAC;IACrC,KAAY,KAAK,GAAG,gBAAgB,CAAC;IACrC,KAAY,WAAW,GAAG,sBAAsB,CAAC;IACjD,KAAY,QAAQ,GAAG,mBAAmB,CAAC;CAC5C"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShipCapsule — release-artifact receipt (ADR-0011).
|
|
3
|
+
*
|
|
4
|
+
* Same canonical-CBOR + ContentAddress kernel as runtime primitives, applied
|
|
5
|
+
* to a published-package tarball. `id` is the fnv1a label over the
|
|
6
|
+
* canonical bytes of every field except `id` and `integrity`; `integrity`
|
|
7
|
+
* pairs that label with a sha256 digest over the same bytes.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { Effect } from 'effect';
|
|
12
|
+
import { decode as cborDecode } from 'cborg';
|
|
13
|
+
import { CanonicalCbor } from './cbor.js';
|
|
14
|
+
import { AddressedDigest as AddressedDigestNs } from './addressed-digest.js';
|
|
15
|
+
const REQUIRED_KEYS = [
|
|
16
|
+
'_kind',
|
|
17
|
+
'schema_version',
|
|
18
|
+
'id',
|
|
19
|
+
'integrity',
|
|
20
|
+
'package_name',
|
|
21
|
+
'package_version',
|
|
22
|
+
'source_commit',
|
|
23
|
+
'source_dirty',
|
|
24
|
+
'lockfile_address',
|
|
25
|
+
'workspace_manifest_address',
|
|
26
|
+
'tarball_manifest_address',
|
|
27
|
+
'build_env',
|
|
28
|
+
'package_manager',
|
|
29
|
+
'package_manager_version',
|
|
30
|
+
'publish_dry_run_address',
|
|
31
|
+
'lifecycle_scripts_observed',
|
|
32
|
+
'generated_at',
|
|
33
|
+
'previous_ship_capsule',
|
|
34
|
+
];
|
|
35
|
+
const encodeIdentityBearing = (capsule) => CanonicalCbor.encode({
|
|
36
|
+
_kind: capsule._kind,
|
|
37
|
+
schema_version: capsule.schema_version,
|
|
38
|
+
package_name: capsule.package_name,
|
|
39
|
+
package_version: capsule.package_version,
|
|
40
|
+
source_commit: capsule.source_commit,
|
|
41
|
+
source_dirty: capsule.source_dirty,
|
|
42
|
+
lockfile_address: capsule.lockfile_address,
|
|
43
|
+
workspace_manifest_address: capsule.workspace_manifest_address,
|
|
44
|
+
tarball_manifest_address: capsule.tarball_manifest_address,
|
|
45
|
+
build_env: capsule.build_env,
|
|
46
|
+
package_manager: capsule.package_manager,
|
|
47
|
+
package_manager_version: capsule.package_manager_version,
|
|
48
|
+
publish_dry_run_address: capsule.publish_dry_run_address,
|
|
49
|
+
lifecycle_scripts_observed: capsule.lifecycle_scripts_observed,
|
|
50
|
+
generated_at: capsule.generated_at,
|
|
51
|
+
previous_ship_capsule: capsule.previous_ship_capsule,
|
|
52
|
+
});
|
|
53
|
+
const computeId = (capsuleWithoutIdentity) => AddressedDigestNs.of(encodeIdentityBearing(capsuleWithoutIdentity));
|
|
54
|
+
const make = (input) => Effect.gen(function* () {
|
|
55
|
+
const digest = yield* computeId(input);
|
|
56
|
+
return {
|
|
57
|
+
_kind: input._kind,
|
|
58
|
+
schema_version: input.schema_version,
|
|
59
|
+
id: digest.display_id,
|
|
60
|
+
integrity: digest,
|
|
61
|
+
package_name: input.package_name,
|
|
62
|
+
package_version: input.package_version,
|
|
63
|
+
source_commit: input.source_commit,
|
|
64
|
+
source_dirty: input.source_dirty,
|
|
65
|
+
lockfile_address: input.lockfile_address,
|
|
66
|
+
workspace_manifest_address: input.workspace_manifest_address,
|
|
67
|
+
tarball_manifest_address: input.tarball_manifest_address,
|
|
68
|
+
build_env: input.build_env,
|
|
69
|
+
package_manager: input.package_manager,
|
|
70
|
+
package_manager_version: input.package_manager_version,
|
|
71
|
+
publish_dry_run_address: input.publish_dry_run_address,
|
|
72
|
+
lifecycle_scripts_observed: input.lifecycle_scripts_observed,
|
|
73
|
+
generated_at: input.generated_at,
|
|
74
|
+
previous_ship_capsule: input.previous_ship_capsule,
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
const canonicalize = (capsule) => CanonicalCbor.encode({
|
|
78
|
+
_kind: capsule._kind,
|
|
79
|
+
schema_version: capsule.schema_version,
|
|
80
|
+
id: capsule.id,
|
|
81
|
+
integrity: capsule.integrity,
|
|
82
|
+
package_name: capsule.package_name,
|
|
83
|
+
package_version: capsule.package_version,
|
|
84
|
+
source_commit: capsule.source_commit,
|
|
85
|
+
source_dirty: capsule.source_dirty,
|
|
86
|
+
lockfile_address: capsule.lockfile_address,
|
|
87
|
+
workspace_manifest_address: capsule.workspace_manifest_address,
|
|
88
|
+
tarball_manifest_address: capsule.tarball_manifest_address,
|
|
89
|
+
build_env: capsule.build_env,
|
|
90
|
+
package_manager: capsule.package_manager,
|
|
91
|
+
package_manager_version: capsule.package_manager_version,
|
|
92
|
+
publish_dry_run_address: capsule.publish_dry_run_address,
|
|
93
|
+
lifecycle_scripts_observed: capsule.lifecycle_scripts_observed,
|
|
94
|
+
generated_at: capsule.generated_at,
|
|
95
|
+
previous_ship_capsule: capsule.previous_ship_capsule,
|
|
96
|
+
});
|
|
97
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
98
|
+
const validateShape = (value) => {
|
|
99
|
+
if (!isRecord(value))
|
|
100
|
+
return false;
|
|
101
|
+
for (const k of REQUIRED_KEYS) {
|
|
102
|
+
if (!(k in value))
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
if (value._kind !== 'shipCapsule')
|
|
106
|
+
return false;
|
|
107
|
+
if (value.schema_version !== 1)
|
|
108
|
+
return false;
|
|
109
|
+
if (!isRecord(value.integrity))
|
|
110
|
+
return false;
|
|
111
|
+
if (!isRecord(value.build_env))
|
|
112
|
+
return false;
|
|
113
|
+
if (!Array.isArray(value.lifecycle_scripts_observed))
|
|
114
|
+
return false;
|
|
115
|
+
if (!isRecord(value.generated_at))
|
|
116
|
+
return false;
|
|
117
|
+
return true;
|
|
118
|
+
};
|
|
119
|
+
const decode = (bytes) => Effect.gen(function* () {
|
|
120
|
+
let decoded;
|
|
121
|
+
try {
|
|
122
|
+
decoded = cborDecode(bytes);
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return yield* Effect.fail('malformed_cbor');
|
|
126
|
+
}
|
|
127
|
+
if (!validateShape(decoded)) {
|
|
128
|
+
return yield* Effect.fail('invalid_shape');
|
|
129
|
+
}
|
|
130
|
+
const reencoded = canonicalize(decoded);
|
|
131
|
+
if (reencoded.length !== bytes.length) {
|
|
132
|
+
return yield* Effect.fail('non_canonical');
|
|
133
|
+
}
|
|
134
|
+
for (let i = 0; i < reencoded.length; i++) {
|
|
135
|
+
if (reencoded[i] !== bytes[i]) {
|
|
136
|
+
return yield* Effect.fail('non_canonical');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return decoded;
|
|
140
|
+
});
|
|
141
|
+
export const ShipCapsule = { make, canonicalize, decode, computeId };
|
|
142
|
+
//# sourceMappingURL=ship-capsule.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-capsule.js","sourceRoot":"","sources":["../src/ship-capsule.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShipCapsule release-input addressing helpers (ADR-0011).
|
|
3
|
+
*
|
|
4
|
+
* Pure functions that turn raw artifact bytes into {@link AddressedDigest}
|
|
5
|
+
* values consumed by `ShipCapsule.make`. Tarball identity goes through a
|
|
6
|
+
* sorted uncompressed-manifest CBOR, never the raw `.tgz` bytes, since gzip
|
|
7
|
+
* timestamps make those non-deterministic across publish runs.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { Effect } from 'effect';
|
|
12
|
+
import type { AddressedDigest } from './brands.js';
|
|
13
|
+
/**
|
|
14
|
+
* Address a tarball by its sorted uncompressed file manifest.
|
|
15
|
+
* Decompresses gzip, parses USTAR entries, builds a `{path, size, sha256}` list
|
|
16
|
+
* sorted lex by `path`, encodes via CanonicalCbor, and hashes those bytes.
|
|
17
|
+
* Raw `.tgz` bytes are non-deterministic across publish runs (gzip mtime); the
|
|
18
|
+
* manifest is.
|
|
19
|
+
*/
|
|
20
|
+
export declare const tarballManifestAddress: (tarballBytes: Uint8Array) => Effect.Effect<AddressedDigest, Error>;
|
|
21
|
+
/** Address a pnpm-lock.yaml (or equivalent) by its raw file bytes. YAML is its own normalization. */
|
|
22
|
+
export declare const lockfileAddress: (lockfileBytes: Uint8Array) => Effect.Effect<AddressedDigest, Error>;
|
|
23
|
+
/**
|
|
24
|
+
* Address a workspace's set of package.json files. Hashes each file with
|
|
25
|
+
* sha256, builds a `{relative_path, sha256}` list sorted lex by
|
|
26
|
+
* `relative_path`, and addresses the CBOR of that list.
|
|
27
|
+
*/
|
|
28
|
+
export declare const workspaceManifestAddress: (input: ReadonlyArray<{
|
|
29
|
+
relative_path: string;
|
|
30
|
+
package_json_bytes: Uint8Array;
|
|
31
|
+
}>) => Effect.Effect<AddressedDigest, Error>;
|
|
32
|
+
/**
|
|
33
|
+
* Strip platform-specific noise from `pnpm publish --dry-run` stdout so two
|
|
34
|
+
* clean publishes produce byte-identical normalized text. Trims per-line
|
|
35
|
+
* trailing whitespace, normalizes line endings, redacts the repo root prefix,
|
|
36
|
+
* and replaces ISO-8601 timestamps with a fixed token.
|
|
37
|
+
*/
|
|
38
|
+
export declare const normalizeDryRunOutput: (rawStdout: string, normalizationContext: {
|
|
39
|
+
repo_root_absolute_path: string;
|
|
40
|
+
}) => string;
|
|
41
|
+
/** Address a normalized `pnpm publish --dry-run` stdout (see {@link normalizeDryRunOutput}). */
|
|
42
|
+
export declare const normalizedDryRunAddress: (rawStdout: string, normalizationContext: {
|
|
43
|
+
repo_root_absolute_path: string;
|
|
44
|
+
}) => Effect.Effect<AddressedDigest, Error>;
|
|
45
|
+
//# sourceMappingURL=ship-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-manifest.d.ts","sourceRoot":"","sources":["../src/ship-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAsGnD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,cAAc,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAgBlG,CAAC;AAEL,qGAAqG;AACrG,eAAO,MAAM,eAAe,GAAI,eAAe,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAC3D,CAAC;AAEtC;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GACnC,OAAO,aAAa,CAAC;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,UAAU,CAAA;CAAE,CAAC,KAC9E,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAYnC,CAAC;AAIL;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,sBAAsB;IAAE,uBAAuB,EAAE,MAAM,CAAA;CAAE,KACxD,MASF,CAAC;AAEF,gGAAgG;AAChG,eAAO,MAAM,uBAAuB,GAClC,WAAW,MAAM,EACjB,sBAAsB;IAAE,uBAAuB,EAAE,MAAM,CAAA;CAAE,KACxD,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,CAItC,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShipCapsule release-input addressing helpers (ADR-0011).
|
|
3
|
+
*
|
|
4
|
+
* Pure functions that turn raw artifact bytes into {@link AddressedDigest}
|
|
5
|
+
* values consumed by `ShipCapsule.make`. Tarball identity goes through a
|
|
6
|
+
* sorted uncompressed-manifest CBOR, never the raw `.tgz` bytes, since gzip
|
|
7
|
+
* timestamps make those non-deterministic across publish runs.
|
|
8
|
+
*
|
|
9
|
+
* @module
|
|
10
|
+
*/
|
|
11
|
+
import { gunzipSync } from 'node:zlib';
|
|
12
|
+
import { Effect } from 'effect';
|
|
13
|
+
import { CanonicalCbor } from './cbor.js';
|
|
14
|
+
import { AddressedDigest as AddressedDigestNs } from './addressed-digest.js';
|
|
15
|
+
const bytesToHex = (bytes) => {
|
|
16
|
+
let out = '';
|
|
17
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
18
|
+
out += bytes[i].toString(16).padStart(2, '0');
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
};
|
|
22
|
+
const sha256HexRaw = (bytes) => Effect.tryPromise({
|
|
23
|
+
try: async () => {
|
|
24
|
+
const buffer = await crypto.subtle.digest('SHA-256', bytes);
|
|
25
|
+
return bytesToHex(new Uint8Array(buffer));
|
|
26
|
+
},
|
|
27
|
+
catch: (error) => new Error(`SHA-256 hash failed: ${error instanceof Error ? error.message : String(error)}`),
|
|
28
|
+
}).pipe(Effect.orDie);
|
|
29
|
+
// Decode a NUL-terminated ASCII field from a USTAR header.
|
|
30
|
+
const decodeAsciiZ = (header, offset, length) => {
|
|
31
|
+
let end = offset;
|
|
32
|
+
const stop = offset + length;
|
|
33
|
+
while (end < stop && header[end] !== 0)
|
|
34
|
+
end++;
|
|
35
|
+
let out = '';
|
|
36
|
+
for (let i = offset; i < end; i++)
|
|
37
|
+
out += String.fromCharCode(header[i]);
|
|
38
|
+
return out;
|
|
39
|
+
};
|
|
40
|
+
// USTAR size field is octal in ASCII (NUL- or space-terminated).
|
|
41
|
+
const decodeOctal = (header, offset, length) => {
|
|
42
|
+
const text = decodeAsciiZ(header, offset, length).trim();
|
|
43
|
+
if (text === '')
|
|
44
|
+
return 0;
|
|
45
|
+
return parseInt(text, 8);
|
|
46
|
+
};
|
|
47
|
+
const parseTar = (bytes) => {
|
|
48
|
+
const entries = [];
|
|
49
|
+
let offset = 0;
|
|
50
|
+
let pendingLongPath = null;
|
|
51
|
+
while (offset + 512 <= bytes.length) {
|
|
52
|
+
const header = bytes.subarray(offset, offset + 512);
|
|
53
|
+
let allZero = true;
|
|
54
|
+
for (let i = 0; i < 512; i++) {
|
|
55
|
+
if (header[i] !== 0) {
|
|
56
|
+
allZero = false;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (allZero)
|
|
61
|
+
break;
|
|
62
|
+
const name = decodeAsciiZ(header, 0, 100);
|
|
63
|
+
const size = decodeOctal(header, 124, 12);
|
|
64
|
+
const typeflag = header[156] === 0 ? '0' : String.fromCharCode(header[156]);
|
|
65
|
+
const prefix = decodeAsciiZ(header, 345, 155);
|
|
66
|
+
const dataStart = offset + 512;
|
|
67
|
+
const paddedSize = Math.ceil(size / 512) * 512;
|
|
68
|
+
const data = bytes.subarray(dataStart, dataStart + size);
|
|
69
|
+
if (typeflag === 'L') {
|
|
70
|
+
// GNU long-name extension: next entry's name is in this entry's body.
|
|
71
|
+
let end = data.length;
|
|
72
|
+
while (end > 0 && data[end - 1] === 0)
|
|
73
|
+
end--;
|
|
74
|
+
let s = '';
|
|
75
|
+
for (let i = 0; i < end; i++)
|
|
76
|
+
s += String.fromCharCode(data[i]);
|
|
77
|
+
pendingLongPath = s;
|
|
78
|
+
}
|
|
79
|
+
else if (typeflag === 'x' || typeflag === 'g') {
|
|
80
|
+
// PAX header: scan for `path=...` records.
|
|
81
|
+
let text = '';
|
|
82
|
+
for (let i = 0; i < data.length; i++)
|
|
83
|
+
text += String.fromCharCode(data[i]);
|
|
84
|
+
const lines = text.split('\n');
|
|
85
|
+
for (const line of lines) {
|
|
86
|
+
const spaceIx = line.indexOf(' ');
|
|
87
|
+
if (spaceIx < 0)
|
|
88
|
+
continue;
|
|
89
|
+
const rest = line.slice(spaceIx + 1);
|
|
90
|
+
const eqIx = rest.indexOf('=');
|
|
91
|
+
if (eqIx < 0)
|
|
92
|
+
continue;
|
|
93
|
+
const key = rest.slice(0, eqIx);
|
|
94
|
+
const val = rest.slice(eqIx + 1);
|
|
95
|
+
if (key === 'path')
|
|
96
|
+
pendingLongPath = val;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (typeflag === '0' || typeflag === '\x00' || typeflag === '7') {
|
|
100
|
+
const fullPath = pendingLongPath !== null
|
|
101
|
+
? pendingLongPath
|
|
102
|
+
: prefix.length > 0 ? `${prefix}/${name}` : name;
|
|
103
|
+
pendingLongPath = null;
|
|
104
|
+
entries.push({ path: fullPath, size, bytes: new Uint8Array(data) });
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
pendingLongPath = null;
|
|
108
|
+
}
|
|
109
|
+
offset = dataStart + paddedSize;
|
|
110
|
+
}
|
|
111
|
+
return entries;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Address a tarball by its sorted uncompressed file manifest.
|
|
115
|
+
* Decompresses gzip, parses USTAR entries, builds a `{path, size, sha256}` list
|
|
116
|
+
* sorted lex by `path`, encodes via CanonicalCbor, and hashes those bytes.
|
|
117
|
+
* Raw `.tgz` bytes are non-deterministic across publish runs (gzip mtime); the
|
|
118
|
+
* manifest is.
|
|
119
|
+
*/
|
|
120
|
+
export const tarballManifestAddress = (tarballBytes) => Effect.gen(function* () {
|
|
121
|
+
const unzipped = yield* Effect.try({
|
|
122
|
+
try: () => new Uint8Array(gunzipSync(tarballBytes)),
|
|
123
|
+
catch: (error) => new Error(`Failed to gunzip tarball: ${error instanceof Error ? error.message : String(error)}`),
|
|
124
|
+
});
|
|
125
|
+
const entries = parseTar(unzipped);
|
|
126
|
+
const manifest = [];
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
const sha256 = yield* sha256HexRaw(entry.bytes);
|
|
129
|
+
manifest.push({ path: entry.path, size: entry.size, sha256 });
|
|
130
|
+
}
|
|
131
|
+
manifest.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
|
|
132
|
+
const canonical = CanonicalCbor.encode(manifest);
|
|
133
|
+
return yield* AddressedDigestNs.of(canonical);
|
|
134
|
+
});
|
|
135
|
+
/** Address a pnpm-lock.yaml (or equivalent) by its raw file bytes. YAML is its own normalization. */
|
|
136
|
+
export const lockfileAddress = (lockfileBytes) => AddressedDigestNs.of(lockfileBytes);
|
|
137
|
+
/**
|
|
138
|
+
* Address a workspace's set of package.json files. Hashes each file with
|
|
139
|
+
* sha256, builds a `{relative_path, sha256}` list sorted lex by
|
|
140
|
+
* `relative_path`, and addresses the CBOR of that list.
|
|
141
|
+
*/
|
|
142
|
+
export const workspaceManifestAddress = (input) => Effect.gen(function* () {
|
|
143
|
+
const rows = [];
|
|
144
|
+
for (const item of input) {
|
|
145
|
+
const sha256 = yield* sha256HexRaw(item.package_json_bytes);
|
|
146
|
+
rows.push({ relative_path: item.relative_path, sha256 });
|
|
147
|
+
}
|
|
148
|
+
rows.sort((a, b) => a.relative_path < b.relative_path ? -1 : a.relative_path > b.relative_path ? 1 : 0);
|
|
149
|
+
const canonical = CanonicalCbor.encode(rows);
|
|
150
|
+
return yield* AddressedDigestNs.of(canonical);
|
|
151
|
+
});
|
|
152
|
+
const ISO_TIMESTAMP_RE = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})/g;
|
|
153
|
+
/**
|
|
154
|
+
* Strip platform-specific noise from `pnpm publish --dry-run` stdout so two
|
|
155
|
+
* clean publishes produce byte-identical normalized text. Trims per-line
|
|
156
|
+
* trailing whitespace, normalizes line endings, redacts the repo root prefix,
|
|
157
|
+
* and replaces ISO-8601 timestamps with a fixed token.
|
|
158
|
+
*/
|
|
159
|
+
export const normalizeDryRunOutput = (rawStdout, normalizationContext) => {
|
|
160
|
+
const repoRoot = normalizationContext.repo_root_absolute_path;
|
|
161
|
+
const unified = rawStdout.replace(/\r\n/g, '\n');
|
|
162
|
+
const trimmed = unified
|
|
163
|
+
.split('\n')
|
|
164
|
+
.map((line) => line.replace(/[ \t]+$/, ''))
|
|
165
|
+
.join('\n');
|
|
166
|
+
const repoReplaced = repoRoot.length > 0 ? trimmed.split(repoRoot).join('<REPO>') : trimmed;
|
|
167
|
+
return repoReplaced.replace(ISO_TIMESTAMP_RE, '<TIME>');
|
|
168
|
+
};
|
|
169
|
+
/** Address a normalized `pnpm publish --dry-run` stdout (see {@link normalizeDryRunOutput}). */
|
|
170
|
+
export const normalizedDryRunAddress = (rawStdout, normalizationContext) => {
|
|
171
|
+
const normalized = normalizeDryRunOutput(rawStdout, normalizationContext);
|
|
172
|
+
const bytes = new TextEncoder().encode(normalized);
|
|
173
|
+
return AddressedDigestNs.of(bytes);
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=ship-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ship-manifest.js","sourceRoot":"","sources":["../src/ship-manifest.ts"],"names":[],"mappings":"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"}
|