@ariestools/aries-dapp-core 0.1.20 → 0.1.22
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/dist/bin/dappServer.mjs +21 -20
- package/dist/node/DappActor.d.ts.map +1 -1
- package/dist/node/consumer/api.d.ts.map +1 -1
- package/dist/node/consumer/hash.d.ts.map +1 -1
- package/dist/node/consumer.mjs +14 -7
- package/dist/node/consumer.mjs.map +2 -2
- package/dist/node/examples/productionComposition.d.ts +2 -2
- package/dist/node/index.mjs +75 -48
- package/dist/node/index.mjs.map +3 -3
- package/dist/node/locator/createDappLocator.d.ts.map +1 -1
- package/dist/node/providers/DappBucketStore.d.ts.map +1 -1
- package/dist/node/publication/canonicalHead.d.ts.map +1 -1
- package/dist/node/publication/gc.d.ts.map +1 -1
- package/dist/node/publication/incremental.d.ts.map +1 -1
- package/dist/node/publication/publishGeneration.d.ts.map +1 -1
- package/dist/node/publication/putCreateOnly.d.ts.map +1 -1
- package/dist/node/publication/releases.d.ts.map +1 -1
- package/dist/node/publication/status.d.ts +1 -1
- package/dist/node/publication/status.d.ts.map +1 -1
- package/dist/node/publication/writeGenerationObjects.d.ts.map +1 -1
- package/examples/countFactsReducer.mjs +5 -4
- package/package.json +13 -13
package/dist/bin/dappServer.mjs
CHANGED
|
@@ -92,7 +92,8 @@ function encodeStatus(status) {
|
|
|
92
92
|
async function readIndexerStatus(store, key = STATUS_KEY) {
|
|
93
93
|
const body = await store.get(key);
|
|
94
94
|
if (body === void 0) return void 0;
|
|
95
|
-
const
|
|
95
|
+
const decoder = new TextDecoder();
|
|
96
|
+
const parsed = JSON.parse(decoder.decode(body));
|
|
96
97
|
if (parsed === null || typeof parsed !== "object") throw new Error(`Invalid indexer status at "${key}": not an object`);
|
|
97
98
|
const record = parsed;
|
|
98
99
|
if (record.schema !== "network.aries.dapp.indexer.status") throw new Error(`Invalid indexer status schema at "${key}": ${String(record.schema)}`);
|
|
@@ -100,14 +101,15 @@ async function readIndexerStatus(store, key = STATUS_KEY) {
|
|
|
100
101
|
}
|
|
101
102
|
/**
|
|
102
103
|
* Publish a machine-readable status object with revalidate CDN caching.
|
|
103
|
-
* Status never carries credentials or private
|
|
104
|
+
* Status never carries credentials or private app material.
|
|
104
105
|
*/
|
|
105
106
|
async function writeIndexerStatus(store, input) {
|
|
106
107
|
const key = input.key ?? "status.json";
|
|
108
|
+
const now = /* @__PURE__ */ new Date();
|
|
107
109
|
const status = {
|
|
108
110
|
schema: INDEXER_STATUS_SCHEMA,
|
|
109
111
|
consecutiveFailures: input.consecutiveFailures,
|
|
110
|
-
updatedAt:
|
|
112
|
+
updatedAt: now.toISOString(),
|
|
111
113
|
...input.floor !== void 0 && { floor: input.floor },
|
|
112
114
|
...input.cursor !== void 0 && { cursor: input.cursor },
|
|
113
115
|
...input.lastCompletedPosition !== void 0 && { lastCompletedPosition: input.lastCompletedPosition },
|
|
@@ -181,7 +183,7 @@ function failureStatusFields(prior, consecutiveFailures, error, now) {
|
|
|
181
183
|
};
|
|
182
184
|
}
|
|
183
185
|
//#endregion
|
|
184
|
-
//#region \0@oxc-project+runtime@0.
|
|
186
|
+
//#region \0@oxc-project+runtime@0.149.0/helpers/esm/decorate.js
|
|
185
187
|
function __decorate(decorators, target, key, desc) {
|
|
186
188
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
187
189
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -304,8 +306,8 @@ Strip a role prefix from a physical key, returning the relative key.
|
|
|
304
306
|
function stripPrefix(prefix, physicalKey) {
|
|
305
307
|
const cleanPrefix = prefix.replaceAll(/^\/+|\/+$/g, "");
|
|
306
308
|
if (cleanPrefix.length === 0) return physicalKey;
|
|
307
|
-
const withSlash = `${cleanPrefix}/`;
|
|
308
309
|
if (physicalKey === cleanPrefix) return "";
|
|
310
|
+
const withSlash = `${cleanPrefix}/`;
|
|
309
311
|
if (physicalKey.startsWith(withSlash)) return physicalKey.slice(withSlash.length);
|
|
310
312
|
return physicalKey;
|
|
311
313
|
}
|
|
@@ -331,7 +333,8 @@ function isConditionalFailure(error) {
|
|
|
331
333
|
return name === "PreconditionFailed" || name === "ConditionalRequestConflict" || name === "412" || status === 412;
|
|
332
334
|
}
|
|
333
335
|
function toBodyBytes(body) {
|
|
334
|
-
|
|
336
|
+
if (typeof body !== "string") return body;
|
|
337
|
+
return new TextEncoder().encode(body);
|
|
335
338
|
}
|
|
336
339
|
function metaFromResponse(response) {
|
|
337
340
|
return {
|
|
@@ -394,9 +397,7 @@ function createS3BucketStore(options) {
|
|
|
394
397
|
bucket,
|
|
395
398
|
prefix: bindingPrefix,
|
|
396
399
|
...publicBaseUrl !== void 0 && { publicBaseUrl },
|
|
397
|
-
resolveKey(key)
|
|
398
|
-
return resolve(key);
|
|
399
|
-
},
|
|
400
|
+
resolveKey: (key) => resolve(key),
|
|
400
401
|
publicUrl(key) {
|
|
401
402
|
if (publicBaseUrl === void 0) return void 0;
|
|
402
403
|
const relative = key.replaceAll(/^\/+/g, "");
|
|
@@ -595,9 +596,7 @@ function createDappLocator(options) {
|
|
|
595
596
|
let destroyed = false;
|
|
596
597
|
return {
|
|
597
598
|
context: { logger },
|
|
598
|
-
has(moniker)
|
|
599
|
-
return instances.has(moniker);
|
|
600
|
-
},
|
|
599
|
+
has: (moniker) => instances.has(moniker),
|
|
601
600
|
register(moniker, instance) {
|
|
602
601
|
instances.set(moniker, instance);
|
|
603
602
|
},
|
|
@@ -606,9 +605,7 @@ function createDappLocator(options) {
|
|
|
606
605
|
if (found === void 0) throw new Error(`No provider registered for moniker "${moniker}"`);
|
|
607
606
|
return found;
|
|
608
607
|
},
|
|
609
|
-
async
|
|
610
|
-
return instances.get(moniker);
|
|
611
|
-
},
|
|
608
|
+
tryGetInstance: async (moniker) => instances.get(moniker),
|
|
612
609
|
destroy() {
|
|
613
610
|
if (destroyed) return;
|
|
614
611
|
destroyed = true;
|
|
@@ -649,7 +646,7 @@ function resolvePackageUrl(spec) {
|
|
|
649
646
|
}
|
|
650
647
|
function pickReducer(mod, exportName) {
|
|
651
648
|
if (exportName !== void 0 && exportName.length > 0) {
|
|
652
|
-
if (!(exportName
|
|
649
|
+
if (!Object.hasOwn(mod, exportName)) throw new Error(`Reducer module has no export named "${exportName}"`);
|
|
653
650
|
return mod[exportName];
|
|
654
651
|
}
|
|
655
652
|
if (mod.default !== void 0) return mod.default;
|
|
@@ -752,9 +749,13 @@ async function main() {
|
|
|
752
749
|
await server.close();
|
|
753
750
|
}
|
|
754
751
|
}
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
})
|
|
752
|
+
(async () => {
|
|
753
|
+
try {
|
|
754
|
+
await main();
|
|
755
|
+
} catch (error) {
|
|
756
|
+
console.error(error);
|
|
757
|
+
process.exit(1);
|
|
758
|
+
}
|
|
759
|
+
})();
|
|
759
760
|
//#endregion
|
|
760
761
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DappActor.d.ts","sourceRoot":"","sources":["../../src/DappActor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,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,mBAAmB,CAAC,mBAAmB,CAAC;IAC/E;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;MAEE;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAYD;;;;;;;;GAQG;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;;MAEE;IACF,IAAa,MAAM,IAAI,MAAM,CAE5B;IAED;;MAEE;IACF,cAAuB,UAAU,IAAI,MAAM,CAE1C;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5C;;MAEE;cACuB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;cAIxC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;YAclE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"DappActor.d.ts","sourceRoot":"","sources":["../../src/DappActor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAG7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,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,mBAAmB,CAAC,mBAAmB,CAAC;IAC/E;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;MAEE;IACF,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,WAAW,CAAA;CACrB;AAYD;;;;;;;;GAQG;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;;MAEE;IACF,IAAa,MAAM,IAAI,MAAM,CAE5B;IAED;;MAEE;IACF,cAAuB,UAAU,IAAI,MAAM,CAE1C;IAEc,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAS9B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5C;;MAEE;cACuB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;cAIxC,OAAO,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;YAclE,yBAAyB;YAmBzB,iBAAiB;CAUhC"}
|
|
@@ -1 +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;
|
|
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;AAyBD,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/consumer/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../../src/consumer/hash.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsBH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/E"}
|
package/dist/node/consumer.mjs
CHANGED
|
@@ -25,9 +25,10 @@ function canonicalHeadBytes(head) {
|
|
|
25
25
|
"trust",
|
|
26
26
|
"layout"
|
|
27
27
|
]) {
|
|
28
|
-
if (key
|
|
28
|
+
if (Object.hasOwn(payload, key)) ordered[key] = payload[key];
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
const encoder = new TextEncoder();
|
|
31
|
+
return encoder.encode(`${JSON.stringify(ordered)}
|
|
31
32
|
`);
|
|
32
33
|
}
|
|
33
34
|
|
|
@@ -63,7 +64,9 @@ function shardIdForKey(logicalKey, hexChars = DEFAULT_SHARD_HEX_CHARS) {
|
|
|
63
64
|
|
|
64
65
|
// src/consumer/hash.ts
|
|
65
66
|
function bytesOf(body) {
|
|
66
|
-
|
|
67
|
+
if (typeof body !== "string") return body;
|
|
68
|
+
const encoder = new TextEncoder();
|
|
69
|
+
return encoder.encode(body);
|
|
67
70
|
}
|
|
68
71
|
function toHex(bytes) {
|
|
69
72
|
let out = "";
|
|
@@ -169,6 +172,10 @@ async function fetchBytes(fetchImpl, url) {
|
|
|
169
172
|
if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`);
|
|
170
173
|
return new Uint8Array(await res.arrayBuffer());
|
|
171
174
|
}
|
|
175
|
+
function decodeJson(bytes) {
|
|
176
|
+
const decoder = new TextDecoder();
|
|
177
|
+
return JSON.parse(decoder.decode(bytes));
|
|
178
|
+
}
|
|
172
179
|
function shardIdForKey2(logicalKey, hexChars = DEFAULT_SHARD_HEX_CHARS) {
|
|
173
180
|
return shardIdForKey(logicalKey, hexChars);
|
|
174
181
|
}
|
|
@@ -179,7 +186,7 @@ async function loadFullManifest(fetchImpl, bases, head) {
|
|
|
179
186
|
if (actual !== head.manifestHash) {
|
|
180
187
|
throw new Error(`Manifest hash mismatch: head=${head.manifestHash} actual=${actual}`);
|
|
181
188
|
}
|
|
182
|
-
const manifest = parseGenerationManifest(
|
|
189
|
+
const manifest = parseGenerationManifest(decodeJson(manifestBytes));
|
|
183
190
|
if (manifest.generation !== head.generation) {
|
|
184
191
|
throw new Error("Manifest generation does not match head");
|
|
185
192
|
}
|
|
@@ -192,7 +199,7 @@ async function loadRootShards(fetchImpl, bases, head) {
|
|
|
192
199
|
if (actual !== head.manifestHash) {
|
|
193
200
|
throw new Error(`Root hash mismatch: head=${head.manifestHash} actual=${actual}`);
|
|
194
201
|
}
|
|
195
|
-
return parseMapRoot(
|
|
202
|
+
return parseMapRoot(decodeJson(rootBytes)).shards;
|
|
196
203
|
}
|
|
197
204
|
async function verifyPublishedView(options) {
|
|
198
205
|
const headUrl = joinUrl(options.bases.state, HEAD_KEY);
|
|
@@ -242,14 +249,14 @@ async function resolveIncrementalObject(options) {
|
|
|
242
249
|
if (await hashBytesAsync(rootBytes) !== options.head.manifestHash) {
|
|
243
250
|
throw new Error("Map root hash mismatch");
|
|
244
251
|
}
|
|
245
|
-
const root = parseMapRoot(
|
|
252
|
+
const root = parseMapRoot(decodeJson(rootBytes));
|
|
246
253
|
const sid = shardIdForKey2(options.logicalKey, options.shardHexChars);
|
|
247
254
|
const shardHash = root.shards[sid];
|
|
248
255
|
if (shardHash === void 0) throw new Error(`No shard for key "${options.logicalKey}"`);
|
|
249
256
|
const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`;
|
|
250
257
|
const shardBytes = await fetchBytes(options.fetch, joinUrl(options.bases.state, shardKey));
|
|
251
258
|
if (await hashBytesAsync(shardBytes) !== shardHash) throw new Error("Shard hash mismatch");
|
|
252
|
-
const shard = parseMapShard(
|
|
259
|
+
const shard = parseMapShard(decodeJson(shardBytes));
|
|
253
260
|
const entry = shard.entries[options.logicalKey];
|
|
254
261
|
if (entry === void 0) throw new Error(`Key not found: ${options.logicalKey}`);
|
|
255
262
|
const casKey = `${CAS_PREFIX}/${entry.hash}`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/publication/canonicalHead.ts", "../../src/publication/constants.ts", "../../src/publication/shard.ts", "../../src/consumer/hash.ts", "../../src/consumer/parse.ts", "../../src/consumer/api.ts"],
|
|
4
|
-
"sourcesContent": ["import type { HeadManifest } from './types.ts'\n\n/**\n * Canonical UTF-8 JSON bytes for head signing/verification. Excludes\n * `signature` and uses a fixed field order so Node and browser agree.\n */\nexport function canonicalHeadBytes(head: HeadManifest): Uint8Array {\n const payload: Record<string, unknown> = {\n schema: head.schema,\n generation: head.generation,\n manifestKey: head.manifestKey,\n manifestHash: head.manifestHash,\n publishedAt: head.publishedAt,\n }\n if (head.previousGeneration !== undefined) {\n payload.previousGeneration = head.previousGeneration\n }\n if (head.revision !== undefined) payload.revision = head.revision\n if (head.trust !== undefined) payload.trust = head.trust\n if (head.layout !== undefined) payload.layout = head.layout\n // Stable key order via explicit construction above (not Object key enum order).\n const ordered: Record<string, unknown> = {}\n for (const key of [\n 'schema',\n 'generation',\n 'manifestKey',\n 'manifestHash',\n 'publishedAt',\n 'previousGeneration',\n 'revision',\n 'trust',\n 'layout',\n ]) {\n if (key in payload) ordered[key] = payload[key]\n }\n return new TextEncoder().encode(`${JSON.stringify(ordered)}\\n`)\n}\n", "/**\nWell-known relative keys published by the coherent generation protocol.\n*/\nexport const HEAD_KEY = 'head.json'\nexport const STATUS_KEY = 'status.json'\nexport const PINS_KEY = 'pins.json'\nexport const GENERATIONS_PREFIX = 'generations'\n/**\nContent-addressed object bodies (incremental layout).\n*/\nexport const CAS_PREFIX = 'cas/sha256'\n/**\nSharded logical map roots (incremental layout).\n*/\nexport const MAP_ROOTS_PREFIX = 'map/roots'\n/**\nSharded logical map shards (incremental layout).\n*/\nexport const MAP_SHARDS_PREFIX = 'map/shards'\n/**\nSmall generation receipts for incremental layout.\n*/\nexport const RECEIPTS_PREFIX = 'receipts'\n\n/**\nCDN caching: immutable generation objects and manifests.\n*/\nexport const CACHE_CONTROL_IMMUTABLE = 'public, max-age=31536000, immutable'\n/**\nCDN caching: mutable head and status objects that must revalidate.\n*/\nexport const CACHE_CONTROL_REVALIDATE = 'public, max-age=0, must-revalidate'\n\nexport const GENERATION_MANIFEST_SCHEMA = 'network.aries.dapp.generation.manifest' as const\nexport const HEAD_MANIFEST_SCHEMA = 'network.aries.dapp.head' as const\nexport const INDEXER_STATUS_SCHEMA = 'network.aries.dapp.indexer.status' as const\nexport const PINS_SCHEMA = 'network.aries.dapp.pins' as const\nexport const MAP_ROOT_SCHEMA = 'network.aries.dapp.map.root' as const\nexport const MAP_SHARD_SCHEMA = 'network.aries.dapp.map.shard' as const\nexport const RECEIPT_SCHEMA = 'network.aries.dapp.generation.receipt' as const\n\n/**\nDefault shard width: first 2 hex chars of sha256(logicalKey) \u2192 256 shards.\n*/\nexport const DEFAULT_SHARD_HEX_CHARS = 2\n", "import { DEFAULT_SHARD_HEX_CHARS } from './constants.ts'\n\n/**\n * Shard routing id for a logical key. FNV-1a 32-bit, hex-padded \u2014 used only to\n * partition the logical map (not for content integrity). Must match between\n * writer and browser consumer (no crypto required).\n */\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n let h = 0x81_1C_9D_C5\n for (let i = 0; i < logicalKey.length; i++) {\n h ^= logicalKey.codePointAt(i)!\n h = Math.imul(h, 0x01_00_01_93)\n }\n return (h >>> 0).toString(16).padStart(8, '0').slice(0, hexChars)\n}\n", "/**\n * Browser-neutral SHA-256 via Web Crypto (`crypto.subtle`).\n * Available in modern browsers and Node \u226518 without Node crypto modules.\n */\n\nfunction bytesOf(body: string | Uint8Array): Uint8Array {\n return typeof body === 'string' ? new TextEncoder().encode(body) : body\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = ''\n for (const b of bytes) out += b.toString(16).padStart(2, '0')\n return out\n}\n\nfunction requireSubtle(): SubtleCrypto {\n const subtle = globalThis.crypto?.subtle\n if (subtle === undefined) {\n throw new Error('Web Crypto subtle API is required for consumer hashing')\n }\n return subtle\n}\n\nexport async function hashBytesAsync(body: string | Uint8Array): Promise<string> {\n const data = bytesOf(body)\n const digest = await requireSubtle().digest(\n 'SHA-256',\n data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer,\n )\n return toHex(new Uint8Array(digest))\n}\n", "import {\n GENERATION_MANIFEST_SCHEMA,\n HEAD_MANIFEST_SCHEMA,\n INDEXER_STATUS_SCHEMA,\n MAP_ROOT_SCHEMA,\n MAP_SHARD_SCHEMA,\n} from '../publication/constants.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${label}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requireString(obj: Record<string, unknown>, key: string, label: string): string {\n const v = obj[key]\n if (typeof v !== 'string' || v.length === 0) {\n throw new Error(`Invalid ${label}: missing string \"${key}\"`)\n }\n return v\n}\n\nexport function parseHead(json: unknown): HeadManifest {\n const obj = asRecord(json, 'head')\n if (obj.schema !== HEAD_MANIFEST_SCHEMA) {\n throw new Error(`Invalid head schema: ${String(obj.schema)}`)\n }\n return {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: requireString(obj, 'generation', 'head'),\n manifestKey: requireString(obj, 'manifestKey', 'head'),\n manifestHash: requireString(obj, 'manifestHash', 'head'),\n publishedAt: requireString(obj, 'publishedAt', 'head'),\n ...(typeof obj.previousGeneration === 'string'\n && { previousGeneration: obj.previousGeneration }),\n ...(typeof obj.revision === 'number' && { revision: obj.revision }),\n ...(obj.trust === 'trusted-origin' || obj.trust === 'signed'\n ? { trust: obj.trust }\n : {}),\n ...(typeof obj.signature === 'string' && { signature: obj.signature }),\n ...(obj.layout === 'full' || obj.layout === 'incremental-cas'\n ? { layout: obj.layout }\n : {}),\n }\n}\n\nexport function parseGenerationManifest(json: unknown): GenerationManifest {\n const obj = asRecord(json, 'manifest')\n if (obj.schema !== GENERATION_MANIFEST_SCHEMA) {\n throw new Error(`Invalid generation manifest schema: ${String(obj.schema)}`)\n }\n if (!Array.isArray(obj.objects)) {\n throw new TypeError('Invalid generation manifest: objects must be an array')\n }\n return obj as unknown as GenerationManifest\n}\n\nexport function parseIndexerStatus(json: unknown): IndexerStatus {\n const obj = asRecord(json, 'status')\n if (obj.schema !== INDEXER_STATUS_SCHEMA) {\n throw new Error(`Invalid status schema: ${String(obj.schema)}`)\n }\n return obj as unknown as IndexerStatus\n}\n\nexport function parseMapRoot(json: unknown): {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n} {\n const obj = asRecord(json, 'map root')\n if (obj.schema !== MAP_ROOT_SCHEMA) {\n throw new Error(`Invalid map root schema: ${String(obj.schema)}`)\n }\n if (obj.shards === null || typeof obj.shards !== 'object') {\n throw new Error('Invalid map root: shards must be an object')\n }\n return obj as {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n }\n}\n\nexport function parseMapShard(json: unknown): {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n} {\n const obj = asRecord(json, 'map shard')\n if (obj.schema !== MAP_SHARD_SCHEMA) {\n throw new Error(`Invalid map shard schema: ${String(obj.schema)}`)\n }\n return obj as {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n }\n}\n", "import { canonicalHeadBytes } from '../publication/canonicalHead.ts'\nimport {\n CAS_PREFIX,\n DEFAULT_SHARD_HEX_CHARS,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n MAP_SHARDS_PREFIX,\n STATUS_KEY,\n} from '../publication/constants.ts'\nimport { shardIdForKey as routeShard } from '../publication/shard.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\nimport { hashBytesAsync } from './hash.ts'\nimport {\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n} from './parse.ts'\n\nexport type FetchLike = (input: string, init?: { method?: string }) => Promise<{\n ok: boolean\n status: number\n arrayBuffer(): Promise<ArrayBuffer>\n json(): Promise<unknown>\n text(): Promise<string>\n}>\n\nexport interface PublicBases {\n index?: string\n state: string\n}\n\nexport interface VerifyPublishedViewResult {\n head: HeadManifest\n layout: 'full' | 'incremental-cas'\n manifest?: GenerationManifest\n rootShards?: Record<string, string>\n source?: GenerationManifest['source']\n status?: IndexerStatus\n}\n\nexport interface ResolveObjectResult {\n body: Uint8Array\n contentType?: string\n hash: string\n logicalKey: string\n publicUrl: string\n}\n\nfunction joinUrl(base: string, key: string): string {\n const b = base.replace(/\\/+$/, '')\n const k = key.replace(/^\\/+/, '')\n return `${b}/${k}`\n}\n\nasync function fetchJson(fetchImpl: FetchLike, url: string): Promise<unknown> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return await res.json()\n}\n\nasync function fetchBytes(fetchImpl: FetchLike, url: string): Promise<Uint8Array> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return new Uint8Array(await res.arrayBuffer())\n}\n\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n return routeShard(logicalKey, hexChars)\n}\n\nexport {\n hashBytesAsync,\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n}\n\nasync function loadFullManifest(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<GenerationManifest> {\n const manifestUrl = joinUrl(bases.state, head.manifestKey)\n const manifestBytes = await fetchBytes(fetchImpl, manifestUrl)\n const actual = await hashBytesAsync(manifestBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Manifest hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n const manifest = parseGenerationManifest(JSON.parse(new TextDecoder().decode(manifestBytes)))\n if (manifest.generation !== head.generation) {\n throw new Error('Manifest generation does not match head')\n }\n return manifest\n}\n\nasync function loadRootShards(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<Record<string, string>> {\n const rootUrl = joinUrl(bases.state, head.manifestKey)\n const rootBytes = await fetchBytes(fetchImpl, rootUrl)\n const actual = await hashBytesAsync(rootBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Root hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n return parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes))).shards\n}\n\n/**\n * Fetch head (+ optional status), verify manifest/root integrity, optional\n * signature check. Does not download the full object set.\n */\nexport async function verifyPublishedView(options: {\n bases: PublicBases\n fetch: FetchLike\n includeStatus?: boolean\n verifySignature?: (canonical: Uint8Array, signature: string) => boolean | Promise<boolean>\n}): Promise<VerifyPublishedViewResult> {\n const headUrl = joinUrl(options.bases.state, HEAD_KEY)\n const head = parseHead(await fetchJson(options.fetch, headUrl))\n if (head.trust === 'signed') {\n if (options.verifySignature === undefined) {\n throw new Error('Signed head requires verifySignature callback')\n }\n if (head.signature === undefined) throw new Error('Signed head missing signature')\n const ok = await options.verifySignature(canonicalHeadBytes(head), head.signature)\n if (!ok) throw new Error('Head signature verification failed')\n }\n\n const layout = head.layout === 'incremental-cas' ? 'incremental-cas' : 'full'\n let manifest: GenerationManifest | undefined\n let rootShards: Record<string, string> | undefined\n let source: GenerationManifest['source'] | undefined\n\n if (layout === 'full') {\n manifest = await loadFullManifest(options.fetch, options.bases, head)\n source = manifest.source\n } else {\n rootShards = await loadRootShards(options.fetch, options.bases, head)\n }\n\n let status: IndexerStatus | undefined\n if (options.includeStatus === true) {\n try {\n status = parseIndexerStatus(\n await fetchJson(options.fetch, joinUrl(options.bases.state, STATUS_KEY)),\n )\n } catch {\n // status optional\n }\n }\n\n return {\n head,\n layout,\n ...(manifest !== undefined && { manifest }),\n ...(rootShards !== undefined && { rootShards }),\n ...(source !== undefined && { source }),\n ...(status !== undefined && { status }),\n }\n}\n\nasync function resolveIncrementalObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head: HeadManifest\n logicalKey: string\n role: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const base = options.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const rootBytes = await fetchBytes(\n options.fetch,\n joinUrl(options.bases.state, options.head.manifestKey),\n )\n if (await hashBytesAsync(rootBytes) !== options.head.manifestHash) {\n throw new Error('Map root hash mismatch')\n }\n const root = parseMapRoot(JSON.parse(new TextDecoder().decode(rootBytes)))\n const sid = shardIdForKey(options.logicalKey, options.shardHexChars)\n const shardHash = root.shards[sid]\n if (shardHash === undefined) throw new Error(`No shard for key \"${options.logicalKey}\"`)\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n const shardBytes = await fetchBytes(options.fetch, joinUrl(options.bases.state, shardKey))\n if (await hashBytesAsync(shardBytes) !== shardHash) throw new Error('Shard hash mismatch')\n const shard = parseMapShard(JSON.parse(new TextDecoder().decode(shardBytes)))\n const entry = shard.entries[options.logicalKey]\n if (entry === undefined) throw new Error(`Key not found: ${options.logicalKey}`)\n const casKey = `${CAS_PREFIX}/${entry.hash}`\n const publicUrl = joinUrl(base, casKey)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== entry.hash) {\n throw new Error(`Object hash mismatch for ${options.logicalKey}`)\n }\n return {\n body,\n hash: entry.hash,\n logicalKey: options.logicalKey,\n publicUrl,\n ...(entry.contentType !== undefined && { contentType: entry.contentType }),\n }\n}\n\n/**\n * Resolve and verify a single logical object under the current head without\n * downloading a full-generation object list (incremental: root+shard+cas).\n */\nexport async function resolveObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head?: HeadManifest\n logicalKey: string\n role?: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const role = options.role ?? 'index'\n const head = options.head\n ?? parseHead(await fetchJson(options.fetch, joinUrl(options.bases.state, HEAD_KEY)))\n const logicalKey = options.logicalKey.replaceAll(/^\\/+/g, '')\n\n if (head.layout === 'incremental-cas') {\n return await resolveIncrementalObject({\n bases: options.bases,\n fetch: options.fetch,\n head,\n logicalKey,\n role,\n ...(options.shardHexChars !== undefined && { shardHexChars: options.shardHexChars }),\n })\n }\n\n const manifest = await loadFullManifest(options.fetch, options.bases, head)\n const ref = manifest.objects.find(o =>\n o.role === role && (o.key === logicalKey || o.key.endsWith(`/${logicalKey}`)\n || o.key === `${GENERATIONS_PREFIX}/${head.generation}/${logicalKey}`))\n if (ref === undefined) throw new Error(`Key not found in full manifest: ${logicalKey}`)\n const objectBase = ref.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const publicUrl = ref.publicUrl ?? joinUrl(objectBase, ref.key)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== ref.hash) {\n throw new Error(`Object hash mismatch for ${logicalKey}`)\n }\n return {\n body,\n hash: ref.hash,\n logicalKey,\n publicUrl,\n ...(ref.contentType !== undefined && { contentType: ref.contentType }),\n }\n}\n"],
|
|
5
|
-
"mappings": ";AAMO,SAAS,mBAAmB,MAAgC;AACjE,QAAM,UAAmC;AAAA,IACvC,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,cAAc,KAAK;AAAA,IACnB,aAAa,KAAK;AAAA,EACpB;AACA,MAAI,KAAK,uBAAuB,QAAW;AACzC,YAAQ,qBAAqB,KAAK;AAAA,EACpC;AACA,MAAI,KAAK,aAAa,OAAW,SAAQ,WAAW,KAAK;AACzD,MAAI,KAAK,UAAU,OAAW,SAAQ,QAAQ,KAAK;AACnD,MAAI,KAAK,WAAW,OAAW,SAAQ,SAAS,KAAK;AAErD,QAAM,UAAmC,CAAC;AAC1C,aAAW,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG;AACD,QAAI,OAAO,
|
|
4
|
+
"sourcesContent": ["import type { HeadManifest } from './types.ts'\n\n/**\n * Canonical UTF-8 JSON bytes for head signing/verification. Excludes\n * `signature` and uses a fixed field order so Node and browser agree.\n */\nexport function canonicalHeadBytes(head: HeadManifest): Uint8Array {\n const payload: Record<string, unknown> = {\n schema: head.schema,\n generation: head.generation,\n manifestKey: head.manifestKey,\n manifestHash: head.manifestHash,\n publishedAt: head.publishedAt,\n }\n if (head.previousGeneration !== undefined) {\n payload.previousGeneration = head.previousGeneration\n }\n if (head.revision !== undefined) payload.revision = head.revision\n if (head.trust !== undefined) payload.trust = head.trust\n if (head.layout !== undefined) payload.layout = head.layout\n // Stable key order via explicit construction above (not Object key enum order).\n const ordered: Record<string, unknown> = {}\n for (const key of [\n 'schema',\n 'generation',\n 'manifestKey',\n 'manifestHash',\n 'publishedAt',\n 'previousGeneration',\n 'revision',\n 'trust',\n 'layout',\n ]) {\n if (Object.hasOwn(payload, key)) ordered[key] = payload[key]\n }\n const encoder = new TextEncoder()\n return encoder.encode(`${JSON.stringify(ordered)}\\n`)\n}\n", "/**\nWell-known relative keys published by the coherent generation protocol.\n*/\nexport const HEAD_KEY = 'head.json'\nexport const STATUS_KEY = 'status.json'\nexport const PINS_KEY = 'pins.json'\nexport const GENERATIONS_PREFIX = 'generations'\n/**\nContent-addressed object bodies (incremental layout).\n*/\nexport const CAS_PREFIX = 'cas/sha256'\n/**\nSharded logical map roots (incremental layout).\n*/\nexport const MAP_ROOTS_PREFIX = 'map/roots'\n/**\nSharded logical map shards (incremental layout).\n*/\nexport const MAP_SHARDS_PREFIX = 'map/shards'\n/**\nSmall generation receipts for incremental layout.\n*/\nexport const RECEIPTS_PREFIX = 'receipts'\n\n/**\nCDN caching: immutable generation objects and manifests.\n*/\nexport const CACHE_CONTROL_IMMUTABLE = 'public, max-age=31536000, immutable'\n/**\nCDN caching: mutable head and status objects that must revalidate.\n*/\nexport const CACHE_CONTROL_REVALIDATE = 'public, max-age=0, must-revalidate'\n\nexport const GENERATION_MANIFEST_SCHEMA = 'network.aries.dapp.generation.manifest' as const\nexport const HEAD_MANIFEST_SCHEMA = 'network.aries.dapp.head' as const\nexport const INDEXER_STATUS_SCHEMA = 'network.aries.dapp.indexer.status' as const\nexport const PINS_SCHEMA = 'network.aries.dapp.pins' as const\nexport const MAP_ROOT_SCHEMA = 'network.aries.dapp.map.root' as const\nexport const MAP_SHARD_SCHEMA = 'network.aries.dapp.map.shard' as const\nexport const RECEIPT_SCHEMA = 'network.aries.dapp.generation.receipt' as const\n\n/**\nDefault shard width: first 2 hex chars of sha256(logicalKey) \u2192 256 shards.\n*/\nexport const DEFAULT_SHARD_HEX_CHARS = 2\n", "import { DEFAULT_SHARD_HEX_CHARS } from './constants.ts'\n\n/**\n * Shard routing id for a logical key. FNV-1a 32-bit, hex-padded \u2014 used only to\n * partition the logical map (not for content integrity). Must match between\n * writer and browser consumer (no crypto required).\n */\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n let h = 0x81_1C_9D_C5\n for (let i = 0; i < logicalKey.length; i++) {\n h ^= logicalKey.codePointAt(i)!\n h = Math.imul(h, 0x01_00_01_93)\n }\n return (h >>> 0).toString(16).padStart(8, '0').slice(0, hexChars)\n}\n", "/**\n * Browser-neutral SHA-256 via Web Crypto (`crypto.subtle`).\n * Available in modern browsers and Node \u226518 without Node crypto modules.\n */\n\nfunction bytesOf(body: string | Uint8Array): Uint8Array {\n if (typeof body !== 'string') return body\n const encoder = new TextEncoder()\n return encoder.encode(body)\n}\n\nfunction toHex(bytes: Uint8Array): string {\n let out = ''\n for (const b of bytes) out += b.toString(16).padStart(2, '0')\n return out\n}\n\nfunction requireSubtle(): SubtleCrypto {\n const subtle = globalThis.crypto?.subtle\n if (subtle === undefined) {\n throw new Error('Web Crypto subtle API is required for consumer hashing')\n }\n return subtle\n}\n\nexport async function hashBytesAsync(body: string | Uint8Array): Promise<string> {\n const data = bytesOf(body)\n const digest = await requireSubtle().digest(\n 'SHA-256',\n data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer,\n )\n return toHex(new Uint8Array(digest))\n}\n", "import {\n GENERATION_MANIFEST_SCHEMA,\n HEAD_MANIFEST_SCHEMA,\n INDEXER_STATUS_SCHEMA,\n MAP_ROOT_SCHEMA,\n MAP_SHARD_SCHEMA,\n} from '../publication/constants.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\n\nfunction asRecord(value: unknown, label: string): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${label}: expected object`)\n }\n return value as Record<string, unknown>\n}\n\nfunction requireString(obj: Record<string, unknown>, key: string, label: string): string {\n const v = obj[key]\n if (typeof v !== 'string' || v.length === 0) {\n throw new Error(`Invalid ${label}: missing string \"${key}\"`)\n }\n return v\n}\n\nexport function parseHead(json: unknown): HeadManifest {\n const obj = asRecord(json, 'head')\n if (obj.schema !== HEAD_MANIFEST_SCHEMA) {\n throw new Error(`Invalid head schema: ${String(obj.schema)}`)\n }\n return {\n schema: HEAD_MANIFEST_SCHEMA,\n generation: requireString(obj, 'generation', 'head'),\n manifestKey: requireString(obj, 'manifestKey', 'head'),\n manifestHash: requireString(obj, 'manifestHash', 'head'),\n publishedAt: requireString(obj, 'publishedAt', 'head'),\n ...(typeof obj.previousGeneration === 'string'\n && { previousGeneration: obj.previousGeneration }),\n ...(typeof obj.revision === 'number' && { revision: obj.revision }),\n ...(obj.trust === 'trusted-origin' || obj.trust === 'signed'\n ? { trust: obj.trust }\n : {}),\n ...(typeof obj.signature === 'string' && { signature: obj.signature }),\n ...(obj.layout === 'full' || obj.layout === 'incremental-cas'\n ? { layout: obj.layout }\n : {}),\n }\n}\n\nexport function parseGenerationManifest(json: unknown): GenerationManifest {\n const obj = asRecord(json, 'manifest')\n if (obj.schema !== GENERATION_MANIFEST_SCHEMA) {\n throw new Error(`Invalid generation manifest schema: ${String(obj.schema)}`)\n }\n if (!Array.isArray(obj.objects)) {\n throw new TypeError('Invalid generation manifest: objects must be an array')\n }\n return obj as unknown as GenerationManifest\n}\n\nexport function parseIndexerStatus(json: unknown): IndexerStatus {\n const obj = asRecord(json, 'status')\n if (obj.schema !== INDEXER_STATUS_SCHEMA) {\n throw new Error(`Invalid status schema: ${String(obj.schema)}`)\n }\n return obj as unknown as IndexerStatus\n}\n\nexport function parseMapRoot(json: unknown): {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n} {\n const obj = asRecord(json, 'map root')\n if (obj.schema !== MAP_ROOT_SCHEMA) {\n throw new Error(`Invalid map root schema: ${String(obj.schema)}`)\n }\n if (obj.shards === null || typeof obj.shards !== 'object') {\n throw new Error('Invalid map root: shards must be an object')\n }\n return obj as {\n schema: typeof MAP_ROOT_SCHEMA\n shards: Record<string, string>\n }\n}\n\nexport function parseMapShard(json: unknown): {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n} {\n const obj = asRecord(json, 'map shard')\n if (obj.schema !== MAP_SHARD_SCHEMA) {\n throw new Error(`Invalid map shard schema: ${String(obj.schema)}`)\n }\n return obj as {\n entries: Record<string, { contentType?: string; hash: string; size: number }>\n schema: typeof MAP_SHARD_SCHEMA\n }\n}\n", "import { canonicalHeadBytes } from '../publication/canonicalHead.ts'\nimport {\n CAS_PREFIX,\n DEFAULT_SHARD_HEX_CHARS,\n GENERATIONS_PREFIX,\n HEAD_KEY,\n MAP_SHARDS_PREFIX,\n STATUS_KEY,\n} from '../publication/constants.ts'\nimport { shardIdForKey as routeShard } from '../publication/shard.ts'\nimport type {\n GenerationManifest, HeadManifest, IndexerStatus,\n} from '../publication/types.ts'\nimport { hashBytesAsync } from './hash.ts'\nimport {\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n} from './parse.ts'\n\nexport type FetchLike = (input: string, init?: { method?: string }) => Promise<{\n ok: boolean\n status: number\n arrayBuffer(): Promise<ArrayBuffer>\n json(): Promise<unknown>\n text(): Promise<string>\n}>\n\nexport interface PublicBases {\n index?: string\n state: string\n}\n\nexport interface VerifyPublishedViewResult {\n head: HeadManifest\n layout: 'full' | 'incremental-cas'\n manifest?: GenerationManifest\n rootShards?: Record<string, string>\n source?: GenerationManifest['source']\n status?: IndexerStatus\n}\n\nexport interface ResolveObjectResult {\n body: Uint8Array\n contentType?: string\n hash: string\n logicalKey: string\n publicUrl: string\n}\n\nfunction joinUrl(base: string, key: string): string {\n const b = base.replace(/\\/+$/, '')\n const k = key.replace(/^\\/+/, '')\n return `${b}/${k}`\n}\n\nasync function fetchJson(fetchImpl: FetchLike, url: string): Promise<unknown> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return await res.json()\n}\n\nasync function fetchBytes(fetchImpl: FetchLike, url: string): Promise<Uint8Array> {\n const res = await fetchImpl(url)\n if (!res.ok) throw new Error(`GET ${url} failed: ${res.status}`)\n return new Uint8Array(await res.arrayBuffer())\n}\n\nfunction decodeJson(bytes: Uint8Array): unknown {\n const decoder = new TextDecoder()\n return JSON.parse(decoder.decode(bytes))\n}\n\nexport function shardIdForKey(logicalKey: string, hexChars = DEFAULT_SHARD_HEX_CHARS): string {\n return routeShard(logicalKey, hexChars)\n}\n\nexport {\n hashBytesAsync,\n parseGenerationManifest,\n parseHead,\n parseIndexerStatus,\n parseMapRoot,\n parseMapShard,\n}\n\nasync function loadFullManifest(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<GenerationManifest> {\n const manifestUrl = joinUrl(bases.state, head.manifestKey)\n const manifestBytes = await fetchBytes(fetchImpl, manifestUrl)\n const actual = await hashBytesAsync(manifestBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Manifest hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n const manifest = parseGenerationManifest(decodeJson(manifestBytes))\n if (manifest.generation !== head.generation) {\n throw new Error('Manifest generation does not match head')\n }\n return manifest\n}\n\nasync function loadRootShards(\n fetchImpl: FetchLike,\n bases: PublicBases,\n head: HeadManifest,\n): Promise<Record<string, string>> {\n const rootUrl = joinUrl(bases.state, head.manifestKey)\n const rootBytes = await fetchBytes(fetchImpl, rootUrl)\n const actual = await hashBytesAsync(rootBytes)\n if (actual !== head.manifestHash) {\n throw new Error(`Root hash mismatch: head=${head.manifestHash} actual=${actual}`)\n }\n return parseMapRoot(decodeJson(rootBytes)).shards\n}\n\n/**\n * Fetch head (+ optional status), verify manifest/root integrity, optional\n * signature check. Does not download the full object set.\n */\nexport async function verifyPublishedView(options: {\n bases: PublicBases\n fetch: FetchLike\n includeStatus?: boolean\n verifySignature?: (canonical: Uint8Array, signature: string) => boolean | Promise<boolean>\n}): Promise<VerifyPublishedViewResult> {\n const headUrl = joinUrl(options.bases.state, HEAD_KEY)\n const head = parseHead(await fetchJson(options.fetch, headUrl))\n if (head.trust === 'signed') {\n if (options.verifySignature === undefined) {\n throw new Error('Signed head requires verifySignature callback')\n }\n if (head.signature === undefined) throw new Error('Signed head missing signature')\n const ok = await options.verifySignature(canonicalHeadBytes(head), head.signature)\n if (!ok) throw new Error('Head signature verification failed')\n }\n\n const layout = head.layout === 'incremental-cas' ? 'incremental-cas' : 'full'\n let manifest: GenerationManifest | undefined\n let rootShards: Record<string, string> | undefined\n let source: GenerationManifest['source'] | undefined\n\n if (layout === 'full') {\n manifest = await loadFullManifest(options.fetch, options.bases, head)\n source = manifest.source\n } else {\n rootShards = await loadRootShards(options.fetch, options.bases, head)\n }\n\n let status: IndexerStatus | undefined\n if (options.includeStatus === true) {\n try {\n status = parseIndexerStatus(\n await fetchJson(options.fetch, joinUrl(options.bases.state, STATUS_KEY)),\n )\n } catch {\n // status optional\n }\n }\n\n return {\n head,\n layout,\n ...(manifest !== undefined && { manifest }),\n ...(rootShards !== undefined && { rootShards }),\n ...(source !== undefined && { source }),\n ...(status !== undefined && { status }),\n }\n}\n\nasync function resolveIncrementalObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head: HeadManifest\n logicalKey: string\n role: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const base = options.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const rootBytes = await fetchBytes(\n options.fetch,\n joinUrl(options.bases.state, options.head.manifestKey),\n )\n if (await hashBytesAsync(rootBytes) !== options.head.manifestHash) {\n throw new Error('Map root hash mismatch')\n }\n const root = parseMapRoot(decodeJson(rootBytes))\n const sid = shardIdForKey(options.logicalKey, options.shardHexChars)\n const shardHash = root.shards[sid]\n if (shardHash === undefined) throw new Error(`No shard for key \"${options.logicalKey}\"`)\n const shardKey = `${MAP_SHARDS_PREFIX}/${shardHash}.json`\n const shardBytes = await fetchBytes(options.fetch, joinUrl(options.bases.state, shardKey))\n if (await hashBytesAsync(shardBytes) !== shardHash) throw new Error('Shard hash mismatch')\n const shard = parseMapShard(decodeJson(shardBytes))\n const entry = shard.entries[options.logicalKey]\n if (entry === undefined) throw new Error(`Key not found: ${options.logicalKey}`)\n const casKey = `${CAS_PREFIX}/${entry.hash}`\n const publicUrl = joinUrl(base, casKey)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== entry.hash) {\n throw new Error(`Object hash mismatch for ${options.logicalKey}`)\n }\n return {\n body,\n hash: entry.hash,\n logicalKey: options.logicalKey,\n publicUrl,\n ...(entry.contentType !== undefined && { contentType: entry.contentType }),\n }\n}\n\n/**\n * Resolve and verify a single logical object under the current head without\n * downloading a full-generation object list (incremental: root+shard+cas).\n */\nexport async function resolveObject(options: {\n bases: PublicBases\n fetch: FetchLike\n head?: HeadManifest\n logicalKey: string\n role?: 'state' | 'index'\n shardHexChars?: number\n}): Promise<ResolveObjectResult> {\n const role = options.role ?? 'index'\n const head = options.head\n ?? parseHead(await fetchJson(options.fetch, joinUrl(options.bases.state, HEAD_KEY)))\n const logicalKey = options.logicalKey.replaceAll(/^\\/+/g, '')\n\n if (head.layout === 'incremental-cas') {\n return await resolveIncrementalObject({\n bases: options.bases,\n fetch: options.fetch,\n head,\n logicalKey,\n role,\n ...(options.shardHexChars !== undefined && { shardHexChars: options.shardHexChars }),\n })\n }\n\n const manifest = await loadFullManifest(options.fetch, options.bases, head)\n const ref = manifest.objects.find(o =>\n o.role === role && (o.key === logicalKey || o.key.endsWith(`/${logicalKey}`)\n || o.key === `${GENERATIONS_PREFIX}/${head.generation}/${logicalKey}`))\n if (ref === undefined) throw new Error(`Key not found in full manifest: ${logicalKey}`)\n const objectBase = ref.role === 'index'\n ? (options.bases.index ?? options.bases.state)\n : options.bases.state\n const publicUrl = ref.publicUrl ?? joinUrl(objectBase, ref.key)\n const body = await fetchBytes(options.fetch, publicUrl)\n if (await hashBytesAsync(body) !== ref.hash) {\n throw new Error(`Object hash mismatch for ${logicalKey}`)\n }\n return {\n body,\n hash: ref.hash,\n logicalKey,\n publicUrl,\n ...(ref.contentType !== undefined && { contentType: ref.contentType }),\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["shardIdForKey", "shardIdForKey"]
|
|
7
7
|
}
|
|
@@ -6,10 +6,10 @@
|
|
|
6
6
|
*
|
|
7
7
|
* aries dapp up --reducer ./dist/indexer.mjs
|
|
8
8
|
*
|
|
9
|
-
* For production: copy this pattern into your
|
|
9
|
+
* For production: copy this pattern into your app entrypoint. dapp-core
|
|
10
10
|
* stays application-neutral: you supply the reducer, store bindings, credentials,
|
|
11
11
|
* and any XL1/gateway readers. There is no inbound public listener and no
|
|
12
|
-
*
|
|
12
|
+
* app authority/signing seed stored in dapp-core.
|
|
13
13
|
*
|
|
14
14
|
* ```ts
|
|
15
15
|
* import { S3Client } from '@aws-sdk/client-s3'
|