@ariestools/aries-dapp-core 0.1.7 → 0.1.8
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/README.md +253 -32
- package/dist/bin/dappServer.mjs +614 -100
- package/dist/node/DappActor.d.ts +28 -7
- package/dist/node/DappActor.d.ts.map +1 -1
- package/dist/node/actor/AbstractActor.d.ts +13 -8
- package/dist/node/actor/AbstractActor.d.ts.map +1 -1
- package/dist/node/actor/types.d.ts +7 -0
- package/dist/node/actor/types.d.ts.map +1 -1
- package/dist/node/bin/dappServer.d.ts +8 -4
- package/dist/node/bin/dappServer.d.ts.map +1 -1
- package/dist/node/boot/bootDappActors.d.ts +12 -1
- package/dist/node/boot/bootDappActors.d.ts.map +1 -1
- package/dist/node/consumer/api.d.ts +56 -0
- package/dist/node/consumer/api.d.ts.map +1 -0
- package/dist/node/consumer/hash.d.ts +6 -0
- package/dist/node/consumer/hash.d.ts.map +1 -0
- package/dist/node/consumer/parse.d.ts +18 -0
- package/dist/node/consumer/parse.d.ts.map +1 -0
- package/dist/node/consumer.d.ts +9 -0
- package/dist/node/consumer.d.ts.map +1 -0
- package/dist/node/consumer.mjs +330 -0
- package/dist/node/consumer.mjs.map +7 -0
- package/dist/node/examples/productionComposition.d.ts +114 -0
- package/dist/node/examples/productionComposition.d.ts.map +1 -0
- package/dist/node/index.d.ts +25 -3
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.mjs +1730 -68
- package/dist/node/index.mjs.map +4 -4
- package/dist/node/locator/createDappLocator.d.ts +32 -5
- package/dist/node/locator/createDappLocator.d.ts.map +1 -1
- package/dist/node/providers/DappBucketStore.d.ts +26 -21
- package/dist/node/providers/DappBucketStore.d.ts.map +1 -1
- package/dist/node/providers/capabilities.d.ts +49 -0
- package/dist/node/providers/capabilities.d.ts.map +1 -0
- package/dist/node/providers/errors.d.ts +11 -0
- package/dist/node/providers/errors.d.ts.map +1 -0
- package/dist/node/providers/hashBytes.d.ts +3 -0
- package/dist/node/providers/hashBytes.d.ts.map +1 -0
- package/dist/node/providers/joinKey.d.ts +11 -0
- package/dist/node/providers/joinKey.d.ts.map +1 -0
- package/dist/node/providers/memoryBucketStore.d.ts +14 -0
- package/dist/node/providers/memoryBucketStore.d.ts.map +1 -0
- package/dist/node/providers/types.d.ts +99 -0
- package/dist/node/providers/types.d.ts.map +1 -0
- package/dist/node/publication/canonicalHead.d.ts +7 -0
- package/dist/node/publication/canonicalHead.d.ts.map +1 -0
- package/dist/node/publication/commitHead.d.ts +9 -0
- package/dist/node/publication/commitHead.d.ts.map +1 -0
- package/dist/node/publication/constants.d.ts +27 -0
- package/dist/node/publication/constants.d.ts.map +1 -0
- package/dist/node/publication/gc.d.ts +42 -0
- package/dist/node/publication/gc.d.ts.map +1 -0
- package/dist/node/publication/incremental.d.ts +83 -0
- package/dist/node/publication/incremental.d.ts.map +1 -0
- package/dist/node/publication/publishGeneration.d.ts +18 -0
- package/dist/node/publication/publishGeneration.d.ts.map +1 -0
- package/dist/node/publication/putCreateOnly.d.ts +11 -0
- package/dist/node/publication/putCreateOnly.d.ts.map +1 -0
- package/dist/node/publication/releases.d.ts +49 -0
- package/dist/node/publication/releases.d.ts.map +1 -0
- package/dist/node/publication/safety.d.ts +55 -0
- package/dist/node/publication/safety.d.ts.map +1 -0
- package/dist/node/publication/shard.d.ts +7 -0
- package/dist/node/publication/shard.d.ts.map +1 -0
- package/dist/node/publication/status.d.ts +27 -0
- package/dist/node/publication/status.d.ts.map +1 -0
- package/dist/node/publication/statusPatch.d.ts +10 -0
- package/dist/node/publication/statusPatch.d.ts.map +1 -0
- package/dist/node/publication/types.d.ts +138 -0
- package/dist/node/publication/types.d.ts.map +1 -0
- package/dist/node/publication/writeGenerationObjects.d.ts +5 -0
- package/dist/node/publication/writeGenerationObjects.d.ts.map +1 -0
- package/dist/node/reducer/DappReducer.d.ts +37 -14
- package/dist/node/reducer/DappReducer.d.ts.map +1 -1
- package/package.json +12 -5
package/dist/node/DappActor.d.ts
CHANGED
|
@@ -1,26 +1,47 @@
|
|
|
1
1
|
import { AbstractActor } from './actor/AbstractActor.ts';
|
|
2
2
|
import type { ActorParams } from './actor/types.ts';
|
|
3
|
-
import type {
|
|
3
|
+
import type { DappObjectReader, DappObjectWriter } from './providers/capabilities.ts';
|
|
4
4
|
import type { DappReducer } from './reducer/DappReducer.ts';
|
|
5
5
|
export interface DappActorParams extends ActorParams {
|
|
6
6
|
/** Delay before the first reduce pass. Defaults to 2000ms. */
|
|
7
7
|
firstRunDelayMs?: number;
|
|
8
|
+
/**
|
|
9
|
+
* When set, after this many consecutive reduce failures the actor stops so a
|
|
10
|
+
* supervisor can restart the process.
|
|
11
|
+
*/
|
|
12
|
+
maxConsecutiveFailures?: number;
|
|
13
|
+
/**
|
|
14
|
+
* When true (default), publish durable indexer status to the state store
|
|
15
|
+
* after each reduce pass (success or failure).
|
|
16
|
+
*/
|
|
17
|
+
publishStatus?: boolean;
|
|
8
18
|
reduceIntervalMs?: number;
|
|
9
19
|
reducer: DappReducer;
|
|
10
20
|
}
|
|
11
21
|
/**
|
|
12
22
|
* The stock dapp actor: resolves the three bucket stores from the shared
|
|
13
23
|
* locator, then drives its reducer on an interval to keep `state` and `index`
|
|
14
|
-
* derived from
|
|
15
|
-
* one locator; this is the default single-reducer instance
|
|
24
|
+
* derived from authoritative input. Multiple actors (each with its own
|
|
25
|
+
* reducer) can share one locator; this is the default single-reducer instance
|
|
26
|
+
* the local daemon boots.
|
|
16
27
|
*/
|
|
17
28
|
export declare class DappActor extends AbstractActor<DappActorParams> {
|
|
18
29
|
static readonly dependencies: readonly ["DappDataStore", "DappStateStore", "DappIndexStore"];
|
|
19
|
-
protected _data:
|
|
20
|
-
protected _index:
|
|
21
|
-
protected _state:
|
|
30
|
+
protected _data: DappObjectReader;
|
|
31
|
+
protected _index: DappObjectWriter;
|
|
32
|
+
protected _state: DappObjectWriter;
|
|
33
|
+
private _consecutiveFailures;
|
|
34
|
+
private readonly _firstPass;
|
|
35
|
+
private _firstPassSettled;
|
|
36
|
+
/** Consecutive reduce failures since the last success. */
|
|
37
|
+
get consecutiveFailures(): number;
|
|
22
38
|
createHandler(): Promise<void>;
|
|
23
|
-
|
|
39
|
+
readyHandler(): Promise<void>;
|
|
40
|
+
startHandler(): Promise<void>;
|
|
41
|
+
stopHandler(): Promise<void>;
|
|
42
|
+
private publishStatusFromProgress;
|
|
24
43
|
private runReducePass;
|
|
44
|
+
private safePublishStatus;
|
|
45
|
+
private settleFirstPass;
|
|
25
46
|
}
|
|
26
47
|
//# sourceMappingURL=DappActor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DappActor.d.ts","sourceRoot":"","sources":["../../src/DappActor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"DappActor.d.ts","sourceRoot":"","sources":["../../src/DappActor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AASrF,OAAO,KAAK,EAAsB,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE/E,MAAM,WAAW,eAAgB,SAAQ,WAAW;IAClD,8DAA8D;IAC9D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAmCD;;;;;;GAMG;AACH,qBACa,SAAU,SAAQ,aAAa,CAAC,eAAe,CAAC;IAC3D,MAAM,CAAC,QAAQ,CAAC,YAAY,iEAIlB;IAEV,SAAS,CAAC,KAAK,EAAG,gBAAgB,CAAA;IAClC,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAA;IACnC,SAAS,CAAC,MAAM,EAAG,gBAAgB,CAAA;IAEnC,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,iBAAiB,CAAQ;IAEjC,0DAA0D;IAC1D,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAK7B,yBAAyB;YAkBzB,aAAa;YAsCb,iBAAiB;IAW/B,OAAO,CAAC,eAAe;CAMxB"}
|
|
@@ -17,6 +17,7 @@ import type { ActorParams, DappContext, DappProviderLocator, ReadyState } from '
|
|
|
17
17
|
export declare abstract class AbstractActor<TParams extends ActorParams = ActorParams> extends AbstractCreatable<TParams> {
|
|
18
18
|
protected readonly _intervals: Map<string, NodeJS.Timeout>;
|
|
19
19
|
protected readonly _timeouts: Map<string, NodeJS.Timeout>;
|
|
20
|
+
private _abortController;
|
|
20
21
|
private _idLogger?;
|
|
21
22
|
private readonly _inFlight;
|
|
22
23
|
private readonly _readyDeferred;
|
|
@@ -27,22 +28,26 @@ export declare abstract class AbstractActor<TParams extends ActorParams = ActorP
|
|
|
27
28
|
get readyState(): ReadyState;
|
|
28
29
|
protected get context(): DappContext;
|
|
29
30
|
protected get locator(): DappProviderLocator;
|
|
31
|
+
/** Abort signal cancelled when the actor stops (or is replaced on restart). */
|
|
32
|
+
protected get signal(): AbortSignal;
|
|
30
33
|
static paramsHandler<T extends CreatableInstance>(params?: Partial<T['params']>): Promise<T['params']>;
|
|
34
|
+
/** Override to prove the actor can do useful work. Default: no-op. */
|
|
35
|
+
readyHandler(): Promise<void>;
|
|
31
36
|
/**
|
|
32
|
-
* Register a recurring task. The
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
37
|
+
* Register a recurring task. The first invocation fires after `dueTimeMs`
|
|
38
|
+
* (the documented first-run delay); subsequent invocations fire every
|
|
39
|
+
* `periodMs` while the actor is `started`. A run is skipped if the previous
|
|
40
|
+
* one is still in flight, so a slow pass can never stack on top of itself.
|
|
41
|
+
* Must be called from `startHandler` (guards on `starting` status).
|
|
36
42
|
*/
|
|
37
43
|
registerTimer(timerName: string, callback: () => Promise<void>, dueTimeMs: number, periodMs: number): void;
|
|
38
44
|
/**
|
|
39
|
-
* Run the warm-pass once.
|
|
40
|
-
*
|
|
45
|
+
* Run the warm-pass once. The standard boot path invokes this after
|
|
46
|
+
* `start()` so readiness either resolves or rejects.
|
|
41
47
|
*/
|
|
42
48
|
runReadyHandler(): Promise<void>;
|
|
49
|
+
startHandler(): Promise<void>;
|
|
43
50
|
stopHandler(): Promise<void>;
|
|
44
51
|
whenReady(): Promise<void>;
|
|
45
|
-
/** Override to prove the actor can do useful work. Default: no-op. */
|
|
46
|
-
protected readyHandler(): Promise<void>;
|
|
47
52
|
}
|
|
48
53
|
//# sourceMappingURL=AbstractActor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractActor.d.ts","sourceRoot":"","sources":["../../../src/actor/AbstractActor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EACL,iBAAiB,EAClB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EACV,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAC1D,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"AbstractActor.d.ts","sourceRoot":"","sources":["../../../src/actor/AbstractActor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EACL,iBAAiB,EAClB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EACV,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAC1D,MAAM,YAAY,CAAA;AAyBnB;;;;;;;;;;;;GAYG;AACH,8BAAsB,aAAa,CAAC,OAAO,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IAC/G,SAAS,CAAC,QAAQ,CAAC,UAAU,8BAAoC;IACjE,SAAS,CAAC,QAAQ,CAAC,SAAS,8BAAoC;IAEhE,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmC;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,WAAW,CAAC,CAAO;IAC3B,OAAO,CAAC,WAAW,CAAwB;IAE3C,IAAa,MAAM,IAAI,MAAM,CAM5B;IAED,IAAI,UAAU,IAAI,KAAK,GAAG,SAAS,CAElC;IAED,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,SAAS,KAAK,OAAO,IAAI,WAAW,CAEnC;IAED,SAAS,KAAK,OAAO,IAAI,mBAAmB,CAE3C;IAED,+EAA+E;IAC/E,SAAS,KAAK,MAAM,IAAI,WAAW,CAElC;WAEqB,aAAa,CAAC,CAAC,SAAS,iBAAiB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAOrH,sEAAsE;IAChE,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;;;;;OAMG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAuC1G;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAevB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBrC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
|
|
@@ -18,6 +18,8 @@ export interface DappContext {
|
|
|
18
18
|
*/
|
|
19
19
|
export interface DappProviderLocator {
|
|
20
20
|
readonly context: DappContext;
|
|
21
|
+
/** Release owned resources (e.g. an S3 client constructed by the locator). */
|
|
22
|
+
destroy(): void;
|
|
21
23
|
getInstance<T>(moniker: DappMoniker): Promise<T>;
|
|
22
24
|
has(moniker: DappMoniker): boolean;
|
|
23
25
|
register(moniker: DappMoniker, instance: unknown): void;
|
|
@@ -26,5 +28,10 @@ export interface DappProviderLocator {
|
|
|
26
28
|
/** Base params every dapp actor takes: the shared, process-wide locator. */
|
|
27
29
|
export interface ActorParams extends CreatableParams {
|
|
28
30
|
locator: DappProviderLocator;
|
|
31
|
+
/**
|
|
32
|
+
* Max time to wait for in-flight timer work on stop after aborting the
|
|
33
|
+
* signal. When omitted, stop waits until in-flight work settles.
|
|
34
|
+
*/
|
|
35
|
+
shutdownTimeoutMs?: number;
|
|
29
36
|
}
|
|
30
37
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE9D,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAChD,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;IACvD,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;CAChE;AAED,4EAA4E;AAC5E,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,OAAO,EAAE,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actor/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE9D,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAA;AAEvD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;IAC7B,8EAA8E;IAC9E,OAAO,IAAI,IAAI,CAAA;IACf,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAChD,GAAG,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAA;IAClC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAA;IACvD,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAA;CAChE;AAED,4EAA4E;AAC5E,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,OAAO,EAAE,mBAAmB,CAAA;IAC5B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Composed dapp daemon: boots the
|
|
4
|
-
* `@ariestools/aries-dapp-serve`) and, in
|
|
5
|
-
* process-wide locator plus
|
|
6
|
-
*
|
|
3
|
+
* **Local development only.** Composed dapp daemon: boots the embedded
|
|
4
|
+
* S3-compatible storage server (from `@ariestools/aries-dapp-serve`) and, in
|
|
5
|
+
* the same process, a shared process-wide locator plus a `noopReducer`
|
|
6
|
+
* DappActor. Spawned by `aries dapp up`.
|
|
7
|
+
*
|
|
8
|
+
* Production indexers must not use this binary. Compose `dapp-core` from a
|
|
9
|
+
* project-owned entrypoint with real store bindings, an injected S3/R2 client,
|
|
10
|
+
* and a real reducer — see the package README.
|
|
7
11
|
*/
|
|
8
12
|
export {};
|
|
9
13
|
//# sourceMappingURL=dappServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dappServer.d.ts","sourceRoot":"","sources":["../../../src/bin/dappServer.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"dappServer.d.ts","sourceRoot":"","sources":["../../../src/bin/dappServer.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
|
|
@@ -2,13 +2,24 @@ import type { DappProviderLocator } from '../actor/types.ts';
|
|
|
2
2
|
import { DappActor } from '../DappActor.ts';
|
|
3
3
|
import type { DappReducer } from '../reducer/DappReducer.ts';
|
|
4
4
|
export interface DappActorSpec {
|
|
5
|
+
firstRunDelayMs?: number;
|
|
6
|
+
maxConsecutiveFailures?: number;
|
|
5
7
|
name: string;
|
|
8
|
+
publishStatus?: boolean;
|
|
6
9
|
reduceIntervalMs?: number;
|
|
7
10
|
reducer: DappReducer;
|
|
11
|
+
/**
|
|
12
|
+
* When true (default), run readiness after start so boot completes only when
|
|
13
|
+
* the first reduce pass succeeds (or fails under the failure policy).
|
|
14
|
+
*/
|
|
15
|
+
runReady?: boolean;
|
|
16
|
+
shutdownTimeoutMs?: number;
|
|
8
17
|
}
|
|
9
18
|
/**
|
|
10
19
|
* Creates and starts one {@link DappActor} per spec, all sharing the single
|
|
11
|
-
* process-wide locator.
|
|
20
|
+
* process-wide locator. On partial failure, actors already started are stopped
|
|
21
|
+
* before the error is rethrown. Returns them so the caller can stop them on
|
|
22
|
+
* shutdown.
|
|
12
23
|
*/
|
|
13
24
|
export declare function bootDappActors(locator: DappProviderLocator, specs: readonly DappActorSpec[]): Promise<DappActor[]>;
|
|
14
25
|
//# sourceMappingURL=bootDappActors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootDappActors.d.ts","sourceRoot":"","sources":["../../../src/boot/bootDappActors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"bootDappActors.d.ts","sourceRoot":"","sources":["../../../src/boot/bootDappActors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5D,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,mBAAmB,EAC5B,KAAK,EAAE,SAAS,aAAa,EAAE,GAC9B,OAAO,CAAC,SAAS,EAAE,CAAC,CAiCtB"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { GenerationManifest, HeadManifest, IndexerStatus } from '../publication/types.ts';
|
|
2
|
+
import { hashBytesAsync } from './hash.ts';
|
|
3
|
+
import { parseGenerationManifest, parseHead, parseIndexerStatus, parseMapRoot, parseMapShard } from './parse.ts';
|
|
4
|
+
export type FetchLike = (input: string, init?: {
|
|
5
|
+
method?: string;
|
|
6
|
+
}) => Promise<{
|
|
7
|
+
ok: boolean;
|
|
8
|
+
status: number;
|
|
9
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
10
|
+
json(): Promise<unknown>;
|
|
11
|
+
text(): Promise<string>;
|
|
12
|
+
}>;
|
|
13
|
+
export interface PublicBases {
|
|
14
|
+
index?: string;
|
|
15
|
+
state: string;
|
|
16
|
+
}
|
|
17
|
+
export interface VerifyPublishedViewResult {
|
|
18
|
+
head: HeadManifest;
|
|
19
|
+
layout: 'full' | 'incremental-cas';
|
|
20
|
+
manifest?: GenerationManifest;
|
|
21
|
+
rootShards?: Record<string, string>;
|
|
22
|
+
source?: GenerationManifest['source'];
|
|
23
|
+
status?: IndexerStatus;
|
|
24
|
+
}
|
|
25
|
+
export interface ResolveObjectResult {
|
|
26
|
+
body: Uint8Array;
|
|
27
|
+
contentType?: string;
|
|
28
|
+
hash: string;
|
|
29
|
+
logicalKey: string;
|
|
30
|
+
publicUrl: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function shardIdForKey(logicalKey: string, hexChars?: number): string;
|
|
33
|
+
export { hashBytesAsync, parseGenerationManifest, parseHead, parseIndexerStatus, parseMapRoot, parseMapShard, };
|
|
34
|
+
/**
|
|
35
|
+
* Fetch head (+ optional status), verify manifest/root integrity, optional
|
|
36
|
+
* signature check. Does not download the full object set.
|
|
37
|
+
*/
|
|
38
|
+
export declare function verifyPublishedView(options: {
|
|
39
|
+
bases: PublicBases;
|
|
40
|
+
fetch: FetchLike;
|
|
41
|
+
includeStatus?: boolean;
|
|
42
|
+
verifySignature?: (canonical: Uint8Array, signature: string) => boolean | Promise<boolean>;
|
|
43
|
+
}): Promise<VerifyPublishedViewResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Resolve and verify a single logical object under the current head without
|
|
46
|
+
* downloading a full-generation object list (incremental: root+shard+cas).
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveObject(options: {
|
|
49
|
+
bases: PublicBases;
|
|
50
|
+
fetch: FetchLike;
|
|
51
|
+
head?: HeadManifest;
|
|
52
|
+
logicalKey: string;
|
|
53
|
+
role?: 'state' | 'index';
|
|
54
|
+
shardHexChars?: number;
|
|
55
|
+
}): Promise<ResolveObjectResult>;
|
|
56
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/consumer/api.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAChD,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EACL,uBAAuB,EACvB,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACd,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC;IAC7E,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;IACnC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAA;CACxB,CAAC,CAAA;AAEF,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,YAAY,CAAA;IAClB,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAA;IAClC,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,CAAC,EAAE,aAAa,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,UAAU,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAoBD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,SAA0B,GAAG,MAAM,CAE5F;AAED,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,CAAA;AAkCD;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,SAAS,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAC3F,GAAG,OAAO,CAAC,yBAAyB,CAAC,CA2CrC;AA6CD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,KAAK,EAAE,WAAW,CAAA;IAClB,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,CAAC,EAAE,YAAY,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;IACxB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/consumer/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/E"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { MAP_ROOT_SCHEMA, MAP_SHARD_SCHEMA } from '../publication/constants.ts';
|
|
2
|
+
import type { GenerationManifest, HeadManifest, IndexerStatus } from '../publication/types.ts';
|
|
3
|
+
export declare function parseHead(json: unknown): HeadManifest;
|
|
4
|
+
export declare function parseGenerationManifest(json: unknown): GenerationManifest;
|
|
5
|
+
export declare function parseIndexerStatus(json: unknown): IndexerStatus;
|
|
6
|
+
export declare function parseMapRoot(json: unknown): {
|
|
7
|
+
schema: typeof MAP_ROOT_SCHEMA;
|
|
8
|
+
shards: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
export declare function parseMapShard(json: unknown): {
|
|
11
|
+
entries: Record<string, {
|
|
12
|
+
contentType?: string;
|
|
13
|
+
hash: string;
|
|
14
|
+
size: number;
|
|
15
|
+
}>;
|
|
16
|
+
schema: typeof MAP_SHARD_SCHEMA;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../../src/consumer/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,eAAe,EACf,gBAAgB,EACjB,MAAM,6BAA6B,CAAA;AACpC,OAAO,KAAK,EACV,kBAAkB,EAAE,YAAY,EAAE,aAAa,EAChD,MAAM,yBAAyB,CAAA;AAiBhC,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAsBrD;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,kBAAkB,CASzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAM/D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG;IAC3C,MAAM,EAAE,OAAO,eAAe,CAAA;IAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC/B,CAYA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC7E,MAAM,EAAE,OAAO,gBAAgB,CAAA;CAChC,CASA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-neutral public surface for verifying and resolving published dapp
|
|
3
|
+
* views. Must not import Node built-ins or the AWS SDK.
|
|
4
|
+
*/
|
|
5
|
+
export type { FetchLike, PublicBases, ResolveObjectResult, VerifyPublishedViewResult, } from './consumer/api.ts';
|
|
6
|
+
export { hashBytesAsync, parseGenerationManifest, parseHead, parseIndexerStatus, parseMapRoot, parseMapShard, resolveObject, shardIdForKey, verifyPublishedView, } from './consumer/api.ts';
|
|
7
|
+
export { canonicalHeadBytes } from './publication/canonicalHead.ts';
|
|
8
|
+
export { CACHE_CONTROL_IMMUTABLE, CACHE_CONTROL_REVALIDATE, CAS_PREFIX, DEFAULT_SHARD_HEX_CHARS, GENERATION_MANIFEST_SCHEMA, GENERATIONS_PREFIX, HEAD_KEY, HEAD_MANIFEST_SCHEMA, INDEXER_STATUS_SCHEMA, MAP_ROOT_SCHEMA, MAP_ROOTS_PREFIX, MAP_SHARD_SCHEMA, MAP_SHARDS_PREFIX, PINS_KEY, PINS_SCHEMA, RECEIPT_SCHEMA, RECEIPTS_PREFIX, STATUS_KEY, } from './publication/constants.ts';
|
|
9
|
+
//# sourceMappingURL=consumer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/consumer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EACV,SAAS,EAAE,WAAW,EAAE,mBAAmB,EAAE,yBAAyB,GACvE,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,cAAc,EAAE,uBAAuB,EAAE,SAAS,EAAE,kBAAkB,EAAE,YAAY,EAAE,aAAa,EACnG,aAAa,EAAE,aAAa,EAAE,mBAAmB,GAClD,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,UAAU,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,kBAAkB,EAClB,QAAQ,EACR,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
// src/publication/canonicalHead.ts
|
|
2
|
+
function canonicalHeadBytes(head) {
|
|
3
|
+
const payload = {
|
|
4
|
+
schema: head.schema,
|
|
5
|
+
generation: head.generation,
|
|
6
|
+
manifestKey: head.manifestKey,
|
|
7
|
+
manifestHash: head.manifestHash,
|
|
8
|
+
publishedAt: head.publishedAt
|
|
9
|
+
};
|
|
10
|
+
if (head.previousGeneration !== void 0) {
|
|
11
|
+
payload.previousGeneration = head.previousGeneration;
|
|
12
|
+
}
|
|
13
|
+
if (head.revision !== void 0) payload.revision = head.revision;
|
|
14
|
+
if (head.trust !== void 0) payload.trust = head.trust;
|
|
15
|
+
if (head.layout !== void 0) payload.layout = head.layout;
|
|
16
|
+
const ordered = {};
|
|
17
|
+
for (const key of [
|
|
18
|
+
"schema",
|
|
19
|
+
"generation",
|
|
20
|
+
"manifestKey",
|
|
21
|
+
"manifestHash",
|
|
22
|
+
"publishedAt",
|
|
23
|
+
"previousGeneration",
|
|
24
|
+
"revision",
|
|
25
|
+
"trust",
|
|
26
|
+
"layout"
|
|
27
|
+
]) {
|
|
28
|
+
if (key in payload) ordered[key] = payload[key];
|
|
29
|
+
}
|
|
30
|
+
return new TextEncoder().encode(`${JSON.stringify(ordered)}
|
|
31
|
+
`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/publication/constants.ts
|
|
35
|
+
var HEAD_KEY = "head.json";
|
|
36
|
+
var STATUS_KEY = "status.json";
|
|
37
|
+
var PINS_KEY = "pins.json";
|
|
38
|
+
var GENERATIONS_PREFIX = "generations";
|
|
39
|
+
var CAS_PREFIX = "cas/sha256";
|
|
40
|
+
var MAP_ROOTS_PREFIX = "map/roots";
|
|
41
|
+
var MAP_SHARDS_PREFIX = "map/shards";
|
|
42
|
+
var RECEIPTS_PREFIX = "receipts";
|
|
43
|
+
var CACHE_CONTROL_IMMUTABLE = "public, max-age=31536000, immutable";
|
|
44
|
+
var CACHE_CONTROL_REVALIDATE = "public, max-age=0, must-revalidate";
|
|
45
|
+
var GENERATION_MANIFEST_SCHEMA = "network.aries.dapp.generation.manifest";
|
|
46
|
+
var HEAD_MANIFEST_SCHEMA = "network.aries.dapp.head";
|
|
47
|
+
var INDEXER_STATUS_SCHEMA = "network.aries.dapp.indexer.status";
|
|
48
|
+
var PINS_SCHEMA = "network.aries.dapp.pins";
|
|
49
|
+
var MAP_ROOT_SCHEMA = "network.aries.dapp.map.root";
|
|
50
|
+
var MAP_SHARD_SCHEMA = "network.aries.dapp.map.shard";
|
|
51
|
+
var RECEIPT_SCHEMA = "network.aries.dapp.generation.receipt";
|
|
52
|
+
var DEFAULT_SHARD_HEX_CHARS = 2;
|
|
53
|
+
|
|
54
|
+
// src/publication/shard.ts
|
|
55
|
+
function shardIdForKey(logicalKey, hexChars = DEFAULT_SHARD_HEX_CHARS) {
|
|
56
|
+
let h = 2166136261;
|
|
57
|
+
for (let i = 0; i < logicalKey.length; i++) {
|
|
58
|
+
h ^= logicalKey.codePointAt(i);
|
|
59
|
+
h = Math.imul(h, 16777619);
|
|
60
|
+
}
|
|
61
|
+
return (h >>> 0).toString(16).padStart(8, "0").slice(0, hexChars);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// src/consumer/hash.ts
|
|
65
|
+
function bytesOf(body) {
|
|
66
|
+
return typeof body === "string" ? new TextEncoder().encode(body) : body;
|
|
67
|
+
}
|
|
68
|
+
function toHex(bytes) {
|
|
69
|
+
let out = "";
|
|
70
|
+
for (const b of bytes) out += b.toString(16).padStart(2, "0");
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
function requireSubtle() {
|
|
74
|
+
const subtle = globalThis.crypto?.subtle;
|
|
75
|
+
if (subtle === void 0) {
|
|
76
|
+
throw new Error("Web Crypto subtle API is required for consumer hashing");
|
|
77
|
+
}
|
|
78
|
+
return subtle;
|
|
79
|
+
}
|
|
80
|
+
async function hashBytesAsync(body) {
|
|
81
|
+
const data = bytesOf(body);
|
|
82
|
+
const digest = await requireSubtle().digest(
|
|
83
|
+
"SHA-256",
|
|
84
|
+
data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength)
|
|
85
|
+
);
|
|
86
|
+
return toHex(new Uint8Array(digest));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// src/consumer/parse.ts
|
|
90
|
+
function asRecord(value, label) {
|
|
91
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
92
|
+
throw new Error(`Invalid ${label}: expected object`);
|
|
93
|
+
}
|
|
94
|
+
return value;
|
|
95
|
+
}
|
|
96
|
+
function requireString(obj, key, label) {
|
|
97
|
+
const v = obj[key];
|
|
98
|
+
if (typeof v !== "string" || v.length === 0) {
|
|
99
|
+
throw new Error(`Invalid ${label}: missing string "${key}"`);
|
|
100
|
+
}
|
|
101
|
+
return v;
|
|
102
|
+
}
|
|
103
|
+
function parseHead(json) {
|
|
104
|
+
const obj = asRecord(json, "head");
|
|
105
|
+
if (obj.schema !== HEAD_MANIFEST_SCHEMA) {
|
|
106
|
+
throw new Error(`Invalid head schema: ${String(obj.schema)}`);
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
schema: HEAD_MANIFEST_SCHEMA,
|
|
110
|
+
generation: requireString(obj, "generation", "head"),
|
|
111
|
+
manifestKey: requireString(obj, "manifestKey", "head"),
|
|
112
|
+
manifestHash: requireString(obj, "manifestHash", "head"),
|
|
113
|
+
publishedAt: requireString(obj, "publishedAt", "head"),
|
|
114
|
+
...typeof obj.previousGeneration === "string" && { previousGeneration: obj.previousGeneration },
|
|
115
|
+
...typeof obj.revision === "number" && { revision: obj.revision },
|
|
116
|
+
...obj.trust === "trusted-origin" || obj.trust === "signed" ? { trust: obj.trust } : {},
|
|
117
|
+
...typeof obj.signature === "string" && { signature: obj.signature },
|
|
118
|
+
...obj.layout === "full" || obj.layout === "incremental-cas" ? { layout: obj.layout } : {}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function parseGenerationManifest(json) {
|
|
122
|
+
const obj = asRecord(json, "manifest");
|
|
123
|
+
if (obj.schema !== GENERATION_MANIFEST_SCHEMA) {
|
|
124
|
+
throw new Error(`Invalid generation manifest schema: ${String(obj.schema)}`);
|
|
125
|
+
}
|
|
126
|
+
if (!Array.isArray(obj.objects)) {
|
|
127
|
+
throw new TypeError("Invalid generation manifest: objects must be an array");
|
|
128
|
+
}
|
|
129
|
+
return obj;
|
|
130
|
+
}
|
|
131
|
+
function parseIndexerStatus(json) {
|
|
132
|
+
const obj = asRecord(json, "status");
|
|
133
|
+
if (obj.schema !== INDEXER_STATUS_SCHEMA) {
|
|
134
|
+
throw new Error(`Invalid status schema: ${String(obj.schema)}`);
|
|
135
|
+
}
|
|
136
|
+
return obj;
|
|
137
|
+
}
|
|
138
|
+
function parseMapRoot(json) {
|
|
139
|
+
const obj = asRecord(json, "map root");
|
|
140
|
+
if (obj.schema !== MAP_ROOT_SCHEMA) {
|
|
141
|
+
throw new Error(`Invalid map root schema: ${String(obj.schema)}`);
|
|
142
|
+
}
|
|
143
|
+
if (obj.shards === null || typeof obj.shards !== "object") {
|
|
144
|
+
throw new Error("Invalid map root: shards must be an object");
|
|
145
|
+
}
|
|
146
|
+
return obj;
|
|
147
|
+
}
|
|
148
|
+
function parseMapShard(json) {
|
|
149
|
+
const obj = asRecord(json, "map shard");
|
|
150
|
+
if (obj.schema !== MAP_SHARD_SCHEMA) {
|
|
151
|
+
throw new Error(`Invalid map shard schema: ${String(obj.schema)}`);
|
|
152
|
+
}
|
|
153
|
+
return obj;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// src/consumer/api.ts
|
|
157
|
+
function joinUrl(base, key) {
|
|
158
|
+
const b = base.replace(/\/+$/, "");
|
|
159
|
+
const k = key.replace(/^\/+/, "");
|
|
160
|
+
return `${b}/${k}`;
|
|
161
|
+
}
|
|
162
|
+
async function fetchJson(fetchImpl, url) {
|
|
163
|
+
const res = await fetchImpl(url);
|
|
164
|
+
if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`);
|
|
165
|
+
return await res.json();
|
|
166
|
+
}
|
|
167
|
+
async function fetchBytes(fetchImpl, url) {
|
|
168
|
+
const res = await fetchImpl(url);
|
|
169
|
+
if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`);
|
|
170
|
+
return new Uint8Array(await res.arrayBuffer());
|
|
171
|
+
}
|
|
172
|
+
function shardIdForKey2(logicalKey, hexChars = DEFAULT_SHARD_HEX_CHARS) {
|
|
173
|
+
return shardIdForKey(logicalKey, hexChars);
|
|
174
|
+
}
|
|
175
|
+
async function loadFullManifest(fetchImpl, bases, head) {
|
|
176
|
+
const manifestUrl = joinUrl(bases.state, head.manifestKey);
|
|
177
|
+
const manifestBytes = await fetchBytes(fetchImpl, manifestUrl);
|
|
178
|
+
const actual = await hashBytesAsync(manifestBytes);
|
|
179
|
+
if (actual !== head.manifestHash) {
|
|
180
|
+
throw new Error(`Manifest hash mismatch: head=${head.manifestHash} actual=${actual}`);
|
|
181
|
+
}
|
|
182
|
+
const manifest = parseGenerationManifest(JSON.parse(new TextDecoder().decode(manifestBytes)));
|
|
183
|
+
if (manifest.generation !== head.generation) {
|
|
184
|
+
throw new Error("Manifest generation does not match head");
|
|
185
|
+
}
|
|
186
|
+
return manifest;
|
|
187
|
+
}
|
|
188
|
+
async function loadRootShards(fetchImpl, bases, head) {
|
|
189
|
+
const rootUrl = joinUrl(bases.state, head.manifestKey);
|
|
190
|
+
const rootBytes = await fetchBytes(fetchImpl, rootUrl);
|
|
191
|
+
const actual = await hashBytesAsync(rootBytes);
|
|
192
|
+
if (actual !== head.manifestHash) {
|
|
193
|
+
throw new Error(`Root hash mismatch: head=${head.manifestHash} actual=${actual}`);
|
|
194
|
+
}
|
|
195
|
+
return parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes))).shards;
|
|
196
|
+
}
|
|
197
|
+
async function verifyPublishedView(options) {
|
|
198
|
+
const headUrl = joinUrl(options.bases.state, HEAD_KEY);
|
|
199
|
+
const head = parseHead(await fetchJson(options.fetch, headUrl));
|
|
200
|
+
if (head.trust === "signed") {
|
|
201
|
+
if (options.verifySignature === void 0) {
|
|
202
|
+
throw new Error("Signed head requires verifySignature callback");
|
|
203
|
+
}
|
|
204
|
+
if (head.signature === void 0) throw new Error("Signed head missing signature");
|
|
205
|
+
const ok = await options.verifySignature(canonicalHeadBytes(head), head.signature);
|
|
206
|
+
if (!ok) throw new Error("Head signature verification failed");
|
|
207
|
+
}
|
|
208
|
+
const layout = head.layout === "incremental-cas" ? "incremental-cas" : "full";
|
|
209
|
+
let manifest;
|
|
210
|
+
let rootShards;
|
|
211
|
+
let source;
|
|
212
|
+
if (layout === "full") {
|
|
213
|
+
manifest = await loadFullManifest(options.fetch, options.bases, head);
|
|
214
|
+
source = manifest.source;
|
|
215
|
+
} else {
|
|
216
|
+
rootShards = await loadRootShards(options.fetch, options.bases, head);
|
|
217
|
+
}
|
|
218
|
+
let status;
|
|
219
|
+
if (options.includeStatus === true) {
|
|
220
|
+
try {
|
|
221
|
+
status = parseIndexerStatus(
|
|
222
|
+
await fetchJson(options.fetch, joinUrl(options.bases.state, STATUS_KEY))
|
|
223
|
+
);
|
|
224
|
+
} catch {
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
head,
|
|
229
|
+
layout,
|
|
230
|
+
...manifest !== void 0 && { manifest },
|
|
231
|
+
...rootShards !== void 0 && { rootShards },
|
|
232
|
+
...source !== void 0 && { source },
|
|
233
|
+
...status !== void 0 && { status }
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
async function resolveIncrementalObject(options) {
|
|
237
|
+
const base = options.role === "index" ? options.bases.index ?? options.bases.state : options.bases.state;
|
|
238
|
+
const rootBytes = await fetchBytes(
|
|
239
|
+
options.fetch,
|
|
240
|
+
joinUrl(options.bases.state, options.head.manifestKey)
|
|
241
|
+
);
|
|
242
|
+
if (await hashBytesAsync(rootBytes) !== options.head.manifestHash) {
|
|
243
|
+
throw new Error("Map root hash mismatch");
|
|
244
|
+
}
|
|
245
|
+
const root = parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes)));
|
|
246
|
+
const sid = shardIdForKey2(options.logicalKey, options.shardHexChars);
|
|
247
|
+
const shardHash = root.shards[sid];
|
|
248
|
+
if (shardHash === void 0) throw new Error(`No shard for key "${options.logicalKey}"`);
|
|
249
|
+
const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`;
|
|
250
|
+
const shardBytes = await fetchBytes(options.fetch, joinUrl(options.bases.state, shardKey));
|
|
251
|
+
if (await hashBytesAsync(shardBytes) !== shardHash) throw new Error("Shard hash mismatch");
|
|
252
|
+
const shard = parseMapShard(JSON.parse(new TextDecoder().decode(shardBytes)));
|
|
253
|
+
const entry = shard.entries[options.logicalKey];
|
|
254
|
+
if (entry === void 0) throw new Error(`Key not found: ${options.logicalKey}`);
|
|
255
|
+
const casKey = `${CAS_PREFIX}/${entry.hash}`;
|
|
256
|
+
const publicUrl = joinUrl(base, casKey);
|
|
257
|
+
const body = await fetchBytes(options.fetch, publicUrl);
|
|
258
|
+
if (await hashBytesAsync(body) !== entry.hash) {
|
|
259
|
+
throw new Error(`Object hash mismatch for ${options.logicalKey}`);
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
body,
|
|
263
|
+
hash: entry.hash,
|
|
264
|
+
logicalKey: options.logicalKey,
|
|
265
|
+
publicUrl,
|
|
266
|
+
...entry.contentType !== void 0 && { contentType: entry.contentType }
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
async function resolveObject(options) {
|
|
270
|
+
const role = options.role ?? "index";
|
|
271
|
+
const head = options.head ?? parseHead(await fetchJson(options.fetch, joinUrl(options.bases.state, HEAD_KEY)));
|
|
272
|
+
const logicalKey = options.logicalKey.replaceAll(/^\/+/g, "");
|
|
273
|
+
if (head.layout === "incremental-cas") {
|
|
274
|
+
return await resolveIncrementalObject({
|
|
275
|
+
bases: options.bases,
|
|
276
|
+
fetch: options.fetch,
|
|
277
|
+
head,
|
|
278
|
+
logicalKey,
|
|
279
|
+
role,
|
|
280
|
+
...options.shardHexChars !== void 0 && { shardHexChars: options.shardHexChars }
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
const manifest = await loadFullManifest(options.fetch, options.bases, head);
|
|
284
|
+
const ref = manifest.objects.find((o) => o.role === role && (o.key === logicalKey || o.key.endsWith(`/${logicalKey}`) || o.key === `${GENERATIONS_PREFIX}/${head.generation}/${logicalKey}`));
|
|
285
|
+
if (ref === void 0) throw new Error(`Key not found in full manifest: ${logicalKey}`);
|
|
286
|
+
const objectBase = ref.role === "index" ? options.bases.index ?? options.bases.state : options.bases.state;
|
|
287
|
+
const publicUrl = ref.publicUrl ?? joinUrl(objectBase, ref.key);
|
|
288
|
+
const body = await fetchBytes(options.fetch, publicUrl);
|
|
289
|
+
if (await hashBytesAsync(body) !== ref.hash) {
|
|
290
|
+
throw new Error(`Object hash mismatch for ${logicalKey}`);
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
body,
|
|
294
|
+
hash: ref.hash,
|
|
295
|
+
logicalKey,
|
|
296
|
+
publicUrl,
|
|
297
|
+
...ref.contentType !== void 0 && { contentType: ref.contentType }
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
export {
|
|
301
|
+
CACHE_CONTROL_IMMUTABLE,
|
|
302
|
+
CACHE_CONTROL_REVALIDATE,
|
|
303
|
+
CAS_PREFIX,
|
|
304
|
+
DEFAULT_SHARD_HEX_CHARS,
|
|
305
|
+
GENERATIONS_PREFIX,
|
|
306
|
+
GENERATION_MANIFEST_SCHEMA,
|
|
307
|
+
HEAD_KEY,
|
|
308
|
+
HEAD_MANIFEST_SCHEMA,
|
|
309
|
+
INDEXER_STATUS_SCHEMA,
|
|
310
|
+
MAP_ROOTS_PREFIX,
|
|
311
|
+
MAP_ROOT_SCHEMA,
|
|
312
|
+
MAP_SHARDS_PREFIX,
|
|
313
|
+
MAP_SHARD_SCHEMA,
|
|
314
|
+
PINS_KEY,
|
|
315
|
+
PINS_SCHEMA,
|
|
316
|
+
RECEIPTS_PREFIX,
|
|
317
|
+
RECEIPT_SCHEMA,
|
|
318
|
+
STATUS_KEY,
|
|
319
|
+
canonicalHeadBytes,
|
|
320
|
+
hashBytesAsync,
|
|
321
|
+
parseGenerationManifest,
|
|
322
|
+
parseHead,
|
|
323
|
+
parseIndexerStatus,
|
|
324
|
+
parseMapRoot,
|
|
325
|
+
parseMapShard,
|
|
326
|
+
resolveObject,
|
|
327
|
+
shardIdForKey2 as shardIdForKey,
|
|
328
|
+
verifyPublishedView
|
|
329
|
+
};
|
|
330
|
+
//# sourceMappingURL=consumer.mjs.map
|