@xyo-network/event-kit-statement-graph 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"finalizedReplayController.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayController.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAMnF,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,sCAAsC,CAAA;AAQ7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAM7E,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EAChC,kBAAkB,EAGnB,MAAM,uBAAuB,CAAA;AAO9B,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,oFAAoF;IACpF,IAAI,CAAC,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D;AAED,MAAM,WAAW,8BAA+B,SAAQ,gCAAgC;IACtF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAA;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,6BAA6B,CAAA;IACvD,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kCAAkC;IACjD,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,MAAM,WAAW,iCAAiC;IAChD,6EAA6E;IAC7E,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAA;IACxD,8FAA8F;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IACjE,QAAQ,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAA;IAC9C,MAAM,IAAI,6BAA6B,CAAA;IACvC,yFAAyF;IACzF,IAAI,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC1F,sFAAsF;IACtF,MAAM,IAAI,oBAAoB,CAAA;CAC/B;AAgaD,wBAAsB,uCAAuC,CAC3D,UAAU,EAAE,8BAA8B,GACzC,OAAO,CAAC,iCAAiC,CAAC,CAwB5C;AAED,uFAAuF;AACvF,wBAAgB,yCAAyC,CACvD,OAAO,CAAC,EAAE,OAAO,GAChB,6BAA6B,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,CAWzF"}
1
+ {"version":3,"file":"finalizedReplayController.d.ts","sourceRoot":"","sources":["../../src/finalizedReplayController.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAA;AAMnF,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,sCAAsC,CAAA;AAQ7C,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAM7E,OAAO,KAAK,EACV,wBAAwB,EACxB,gCAAgC,EAChC,kBAAkB,EAGnB,MAAM,uBAAuB,CAAA;AAO9B,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACxB,oFAAoF;IACpF,IAAI,CAAC,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1D;AAED,MAAM,WAAW,8BAA+B,SAAQ,gCAAgC;IACtF,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,4BAA4B,CAAA;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,eAAe,EAAE,6BAA6B,CAAA;IACvD,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CACvC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,kCAAkC;IACjD,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAC9B;AAED,MAAM,WAAW,iCAAiC;IAChD,6EAA6E;IAC7E,MAAM,IAAI,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,CAAA;IACxD,8FAA8F;IAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IACjE,QAAQ,IAAI,QAAQ,CAAC,wBAAwB,CAAC,CAAA;IAC9C,MAAM,IAAI,6BAA6B,CAAA;IACvC,yFAAyF;IACzF,IAAI,CAAC,OAAO,CAAC,EAAE,kCAAkC,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC1F,sFAAsF;IACtF,MAAM,IAAI,oBAAoB,CAAA;CAC/B;AA8ZD,wBAAsB,uCAAuC,CAC3D,UAAU,EAAE,8BAA8B,GACzC,OAAO,CAAC,iCAAiC,CAAC,CAwB5C;AAED,uFAAuF;AACvF,wBAAgB,yCAAyC,CACvD,OAAO,CAAC,EAAE,OAAO,GAChB,6BAA6B,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAA;CAAE,CAWzF"}
@@ -346,8 +346,7 @@ function checkpointIdentityError(checkpoint, identity) {
346
346
  if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`;
347
347
  if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`;
348
348
  if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`;
349
- if (checkpoint.publisher !== identity.publisher) return `publisher ${checkpoint.publisher} != ${identity.publisher}`;
350
- return void 0;
349
+ return checkpoint.publisher === identity.publisher ? void 0 : `publisher ${checkpoint.publisher} != ${identity.publisher}`;
351
350
  }
352
351
  function appliedKey(record) {
353
352
  return `${record.txHash}:${record.eventHash}:${record.hashIndex}`;
@@ -392,8 +391,7 @@ function expectedClaimRecords(applied) {
392
391
  function sameClaimRecords(left, right) {
393
392
  return left.length === right.length && left.every((record, index) => {
394
393
  const candidate = right[index];
395
- if (candidate === void 0) return false;
396
- return record.declaredObjectSchema === candidate.declaredObjectSchema && record.firstBlock === candidate.firstBlock && record.firstEventHash === candidate.firstEventHash && record.lastBlock === candidate.lastBlock && record.objectHash === candidate.objectHash && normalizeAddress2(record.source) === normalizeAddress2(candidate.source) && normalizeAddress2(record.subject) === normalizeAddress2(candidate.subject);
394
+ return candidate?.objectHash === record.objectHash && record.declaredObjectSchema === candidate.declaredObjectSchema && record.firstBlock === candidate.firstBlock && record.firstEventHash === candidate.firstEventHash && record.lastBlock === candidate.lastBlock && normalizeAddress2(record.source) === normalizeAddress2(candidate.source) && normalizeAddress2(record.subject) === normalizeAddress2(candidate.subject);
397
395
  });
398
396
  }
399
397
  function progressIntegrityError(checkpoint) {
@@ -416,10 +414,7 @@ function progressIntegrityError(checkpoint) {
416
414
  if (indexedThrough === null && checkpoint.applied.length > 0) {
417
415
  return "applied events exist before floorBlock has been indexed";
418
416
  }
419
- if (indexedThrough === null && checkpoint.bodies.length > 0) {
420
- return "resolved bodies exist before floorBlock has been indexed";
421
- }
422
- return void 0;
417
+ return indexedThrough === null && checkpoint.bodies.length > 0 ? "resolved bodies exist before floorBlock has been indexed" : void 0;
423
418
  }
424
419
  function bodySetIntegrityError(checkpoint) {
425
420
  const hashes = /* @__PURE__ */ new Set();
@@ -518,10 +513,7 @@ function scanIntegrityError(checkpoint) {
518
513
  if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {
519
514
  return "scan claim records differ from applied-event history";
520
515
  }
521
- if (scan.watermark !== void 0 && scan.watermark.block > indexedThrough) {
522
- return `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`;
523
- }
524
- return watermarkIntegrityError(checkpoint);
516
+ return scan.watermark !== void 0 && scan.watermark.block > indexedThrough ? `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}` : watermarkIntegrityError(checkpoint);
525
517
  }
526
518
  function watermarkIntegrityError(checkpoint) {
527
519
  const scan = checkpoint.scan;
@@ -547,10 +539,7 @@ function watermarkIntegrityError(checkpoint) {
547
539
  const group = checkpoint.applied.filter((event) => event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx);
548
540
  const uniqueExpectedKeys = new Set(group.map(eventKey2));
549
541
  const expectedKeys = uniqueExpectedKeys.values().toArray().toSorted();
550
- if (expectedKeys.some((key) => !actualKeys.includes(key))) {
551
- return "scan watermark group event keys omit publisher applied-event history";
552
- }
553
- return void 0;
542
+ return expectedKeys.some((key) => !actualKeys.includes(key)) ? "scan watermark group event keys omit publisher applied-event history" : void 0;
554
543
  }
555
544
  function blockedIntegrityError(checkpoint) {
556
545
  const { blocked, indexedThrough } = checkpoint;
@@ -562,10 +551,7 @@ function blockedIntegrityError(checkpoint) {
562
551
  if (blocked.atBlock > checkpoint.finalizedHead) {
563
552
  return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`;
564
553
  }
565
- if (blocked.unresolvedEvents.some((event) => event.block !== blocked.atBlock)) {
566
- return "blocked unresolved event does not belong to blocked block";
567
- }
568
- return void 0;
554
+ return blocked.unresolvedEvents.some((event) => event.block !== blocked.atBlock) ? "blocked unresolved event does not belong to blocked block" : void 0;
569
555
  }
570
556
  function checkpointIntegrityError(checkpoint) {
571
557
  return progressIntegrityError(checkpoint) ?? bodySetIntegrityError(checkpoint) ?? appliedIntegrityError(checkpoint) ?? scanIntegrityError(checkpoint) ?? blockedIntegrityError(checkpoint);
@@ -604,8 +590,7 @@ async function loadEventKitReplayCheckpoint(value, identity) {
604
590
  const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint);
605
591
  if (bodyIntegrityError !== void 0) return { detail: bodyIntegrityError, status: "corrupt" };
606
592
  const integrityError = checkpointIntegrityError(checkpoint);
607
- if (integrityError !== void 0) return { detail: integrityError, status: "corrupt" };
608
- return { checkpoint, status: "valid" };
593
+ return integrityError === void 0 ? { checkpoint, status: "valid" } : { detail: integrityError, status: "corrupt" };
609
594
  }
610
595
 
611
596
  // src/finalizedReplayController.ts
@@ -862,7 +847,7 @@ var DefaultFinalizedEventKitReplayController = class {
862
847
  signal?.throwIfAborted();
863
848
  if (exact.blocked === void 0) {
864
849
  await this.#commitStaged(exact, blockedAt, finalizedHead, signal);
865
- return blockedAt === throughBlock ? false : await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal);
850
+ return blockedAt !== throughBlock && await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal);
866
851
  }
867
852
  const blocked = EventKitReplayCheckpointZod.parse({
868
853
  ...this.#checkpoint,
@@ -1343,10 +1328,7 @@ function publisherSubjectViewer(viewer, publisher) {
1343
1328
  return Object.freeze({
1344
1329
  claims: async (source, query) => await filterClaims(viewer.claims(source, claimQuery(query))),
1345
1330
  claimsByObject: async (objectHash) => await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash }))),
1346
- async claimsBySubject(subject, query) {
1347
- if (!isPublisherSubject(subject, publisher)) return [];
1348
- return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)));
1349
- },
1331
+ claimsBySubject: async (subject, query) => isPublisherSubject(subject, publisher) ? await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query))) : [],
1350
1332
  event: async (txHash, eventHash) => await filterEvents(viewer.event(txHash, eventHash)),
1351
1333
  events: async (source, query) => await filterEvents(viewer.events(source, eventQuery(query))),
1352
1334
  head: async () => await viewer.head(),
@@ -1363,8 +1345,7 @@ function inactiveState(tuples, acceptances, finalizedHead) {
1363
1345
  if (tuples.some((tuple) => (tuple.grantRevokedAtBlock ?? Infinity) <= finalizedHead) || tuples.some((tuple) => (tuple.subscription.revokedAtBlock ?? Infinity) <= finalizedHead) || acceptances.some((item) => subscriptionHashes.has(item.lifecycle.subscription) && (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {
1364
1346
  return "revoked";
1365
1347
  }
1366
- if (tuples.every((tuple) => tuple.subscription.body.expiresAtBlock <= finalizedHead)) return "expired";
1367
- return "inactive";
1348
+ return tuples.every((tuple) => tuple.subscription.body.expiresAtBlock <= finalizedHead) ? "expired" : "inactive";
1368
1349
  }
1369
1350
  function pendingState(tuples, acceptances, finalizedHead) {
1370
1351
  const latest = tuples.reduce((selected, candidate) => selected === void 0 || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision ? candidate : selected, void 0);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/activeSourceWakeGrantAuthorizer.ts", "../../src/checkpointViewer.ts", "../../src/eventKitSchemaPolicy.ts", "../../src/finalizedReplayController.ts", "../../src/finalizedReplayChain.ts", "../../src/replayCheckpoint.ts", "../../src/grantReadModel.ts", "../../src/handshakeReadModel.ts", "../../src/handshakeCatalog.ts", "../../src/publisherSubjectViewer.ts", "../../src/subscriptionLifecycleView.ts"],
4
- "sourcesContent": ["import type {\n SourceWakeSubscriptionActivation,\n StatementGraphGrantReadModel,\n WakeAdmissionRoute,\n WakeGrantAuthorizationRequest,\n WakeGrantAuthorizer,\n} from '@xyo-network/event-kit-protocol'\nimport {\n createStatementGraphWakeGrantAuthorizer,\n sourceWakeFilterHash,\n WakeAdmissionRouteZod,\n wakeSourceHash,\n wakeSourcesEqual,\n} from '@xyo-network/event-kit-protocol'\nimport {\n HashZod,\n NormalizedAddressZod,\n SOURCE_WAKE_EVENT_KIND,\n SOURCE_WAKE_FILTER_PROFILE,\n} from '@xyo-network/event-kit-schemas'\n\nimport type {\n EventKitHandshakeReadModel,\n PublisherSubscriptionView,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ActiveSourceWakeGrantAuthorizerOptions {\n readonly grantHash: string\n /** Finalized replay read model over the same pinned authorization chain as viewer. */\n readonly handshake: EventKitHandshakeReadModel\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n readonly viewer: StatementGraphGrantReadModel\n}\n\ninterface ActivationBinding {\n readonly grantHash: string\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n}\n\nfunction exactActiveTuple(\n subscriptions: readonly PublisherSubscriptionView[],\n binding: ActivationBinding,\n expectedHead: number,\n) {\n const active = subscriptions.filter(subscription => subscription.subscriber === binding.route.controller\n && subscription.state === 'active'\n && subscription.selectedSubscription === binding.route.subscriptionHash\n && subscription.activeFromBlock !== undefined\n && subscription.activeFromBlock <= expectedHead\n && subscription.acceptance?.body.subscription === binding.route.subscriptionHash\n && subscription.acceptance.body.service === binding.serviceHash\n && subscription.acceptance.body.grant === binding.grantHash\n && subscription.acceptance.evidence.source === binding.publisher)\n if (active.length !== 1) return\n const selected = active[0]\n const tuples = selected.tuples.filter(tuple => tuple.subscription.objectHash === binding.route.subscriptionHash\n && tuple.subscriber === binding.route.controller\n && tuple.grant.objectHash === binding.grantHash\n && tuple.grant.body.publisher === binding.publisher\n && tuple.grant.body.deploymentId === binding.route.deploymentId\n && tuple.grant.body.queueId === binding.route.queueId\n && tuple.service.objectHash === binding.serviceHash\n && tuple.subscription.body.publisher === binding.publisher\n && tuple.subscription.body.chainId === binding.route.authorizationChainId\n && tuple.subscription.body.eventKind === SOURCE_WAKE_EVENT_KIND\n && tuple.subscription.body.expiresAtBlock > expectedHead)\n if (tuples.length !== 1) return\n const tuple = tuples[0]\n const service = tuple.service.body\n if (service.authorizationChainId !== binding.route.authorizationChainId\n || service.events.every(event => !wakeSourcesEqual(event.source, binding.route.source))) return\n return { selected, tuple }\n}\n\n/**\n * Production D-006 receiver authorization: one exact active D-005 subscription\n * plus its exact still-live grant. The injected view must be caught up to the\n * receiver's independent uncapped XL1 finalized head before admission.\n */\nexport function createActiveSourceWakeGrantAuthorizer(\n options: ActiveSourceWakeGrantAuthorizerOptions,\n): WakeGrantAuthorizer {\n const parsedRoute = WakeAdmissionRouteZod.parse(options.route)\n const binding: ActivationBinding = Object.freeze({\n route: Object.freeze({ ...parsedRoute, source: Object.freeze(parsedRoute.source) }),\n publisher: NormalizedAddressZod.parse(options.publisher),\n serviceHash: HashZod.parse(options.serviceHash),\n grantHash: HashZod.parse(options.grantHash),\n })\n const { handshake, viewer } = options\n return createStatementGraphWakeGrantAuthorizer({\n authorizationChainId: binding.route.authorizationChainId,\n source: binding.route.source,\n viewer,\n activation: {\n async read(request: WakeGrantAuthorizationRequest): Promise<SourceWakeSubscriptionActivation | undefined> {\n if (request.publisher !== binding.publisher\n || request.controller !== binding.route.controller\n || request.deploymentId !== binding.route.deploymentId\n || request.queueId !== binding.route.queueId\n || request.subscriptionHash !== binding.route.subscriptionHash\n || request.filterHash !== binding.route.filterHash) return undefined\n const filterHash = await sourceWakeFilterHash({\n schema: SOURCE_WAKE_FILTER_PROFILE,\n source: binding.route.source,\n fromPosition: binding.route.fromPosition,\n maxPositionsPerWake: binding.route.maxPositionsPerWake,\n })\n if (filterHash !== binding.route.filterHash) throw new TypeError('Route filter does not match its canonical hash')\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection is not at the trusted finalized head')\n const view = await handshake.subscriber({\n chainId: binding.route.authorizationChainId,\n eventKind: SOURCE_WAKE_EVENT_KIND,\n finalizedHead: request.expectedHead,\n publisher: binding.publisher,\n subscriber: binding.route.controller,\n })\n if (!view.ok || view.finalizedHead !== request.expectedHead || view.indexedThrough !== request.expectedHead) {\n throw new Error('Subscription projection is not at the trusted finalized head')\n }\n const exact = exactActiveTuple(view.subscriptions, binding, request.expectedHead)\n if (exact === undefined) return undefined\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection changed during activation lookup')\n const activeFromBlock = exact.selected.activeFromBlock\n if (activeFromBlock === undefined) return undefined\n return {\n atBlock: request.expectedHead,\n activeFromBlock,\n expiresAtBlock: exact.tuple.subscription.body.expiresAtBlock,\n authorizationChainId: binding.route.authorizationChainId,\n controller: binding.route.controller,\n publisher: binding.publisher,\n deploymentId: binding.route.deploymentId,\n ...(binding.route.queueId === undefined ? {} : { queueId: binding.route.queueId }),\n sourceHash: await wakeSourceHash(binding.route.source),\n filterHash,\n subscriptionHash: binding.route.subscriptionHash,\n serviceHash: binding.serviceHash,\n grantHash: binding.grantHash,\n }\n },\n },\n })\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ClaimRecord,\n ObjectRecord,\n UnresolvedEventReference,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type { EventKitReplayCheckpoint } from './replayCheckpoint.ts'\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction recordKey(record: Pick<AppliedEventRecord, 'eventHash' | 'hashIndex' | 'txHash'>): string {\n return `${eventKey(record)}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || recordKey(left).localeCompare(recordKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction matchesClaim(record: ClaimRecord, query?: ClaimQuery): boolean {\n return (query?.objectHash === undefined || record.objectHash === query.objectHash)\n && (query?.subject === undefined || normalizeAddress(record.subject) === normalizeAddress(query.subject))\n && (query?.declaredObjectSchemaPrefix === undefined\n || record.declaredObjectSchema.startsWith(query.declaredObjectSchemaPrefix))\n}\n\nfunction sortClaims(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction buildClaims(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const claims = new Map<string, ClaimRecord>()\n for (const record of applied.toSorted(compareApplied)) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n const prior = claims.get(key)\n if (prior === undefined) {\n claims.set(key, {\n declaredObjectSchema: record.objectSchema,\n firstBlock: record.block,\n firstEventHash: record.eventHash,\n lastBlock: record.block,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n } else if (record.block > prior.lastBlock) {\n claims.set(key, { ...prior, lastBlock: record.block })\n }\n }\n return sortClaims(claims.values().toArray())\n}\n\nfunction withoutSchema(body: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'schema'))\n}\n\n/** Restores the canonical Statement Graph read surface from a durable Event Kit checkpoint. */\nexport function createCheckpointStatementGraphViewer(\n checkpoint: EventKitReplayCheckpoint,\n): StatementGraphViewer {\n const applied = checkpoint.applied.toSorted(compareApplied)\n const claims = buildClaims(applied)\n const bodies = new Map(checkpoint.bodies.map(entry => [entry.hash, entry.body] as const))\n const declaredSchemas = new Map<string, string>()\n for (const record of applied) {\n if (!declaredSchemas.has(record.objectHash)) declaredSchemas.set(record.objectHash, record.objectSchema)\n }\n const unresolved = checkpoint.blocked?.unresolvedEvents ?? []\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(source)\n return claims.filter(record => normalizeAddress(record.source) === normalized && matchesClaim(record, query))\n },\n\n claimsByObject: async (objectHash: StatementObjectHash): Promise<ClaimRecord[]> => claims.filter(record => record.objectHash === objectHash),\n\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(subject)\n return claims.filter(record => normalizeAddress(record.subject) === normalized && matchesClaim(record, query))\n },\n\n event: async (txHash: string, eventHash: string): Promise<AppliedEventRecord[]> => applied.filter(record => record.txHash === txHash && record.eventHash === eventHash),\n\n async events(source: StatementSource, query?: AppliedEventQuery): Promise<AppliedEventRecord[]> {\n const normalized = normalizeAddress(source)\n return applied.filter(record => normalizeAddress(record.source) === normalized\n && (query?.fromBlock === undefined || record.block >= query.fromBlock)\n && (query?.toBlock === undefined || record.block <= query.toBlock)\n && (query?.objectSchemaPrefix === undefined || record.objectSchema.startsWith(query.objectSchemaPrefix))\n && (query?.subject === undefined\n || normalizeAddress(record.subject) === normalizeAddress(query.subject)))\n },\n\n async head(): Promise<number> {\n if (checkpoint.indexedThrough === null) throw new Error('Event Kit replay has not indexed its floor block')\n return checkpoint.indexedThrough\n },\n\n async object(objectHash: StatementObjectHash): Promise<ObjectRecord | undefined> {\n const body = bodies.get(objectHash)\n const declaredSchema = declaredSchemas.get(objectHash)\n if (body === undefined || declaredSchema === undefined) return undefined\n return {\n assurance: 'resolved',\n declaredSchema,\n objectHash,\n params: withoutSchema(body),\n }\n },\n\n async source(source: StatementSource) {\n const normalized = normalizeAddress(source)\n const records = applied.filter(record => normalizeAddress(record.source) === normalized)\n const blocks = records.map(record => record.block)\n const uniqueClaims = new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash)))\n return {\n claims: uniqueClaims.size,\n firstBlock: blocks.length === 0 ? null : Math.min(...blocks),\n lastBlock: blocks.length === 0 ? null : Math.max(...blocks),\n source: normalized as StatementSource,\n }\n },\n\n unresolved: async (txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> => unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash),\n })\n}\n", "import {\n EncryptedWakeSubscriptionSchema,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionRevocationSchema,\n} from '@xyo-network/event-kit-schemas'\n\n/**\n * Exact Statement Graph object vocabulary folded by the Event Kit handshake\n * projection. Challenge and response bodies are datalake attachments named by\n * an acceptance; they are not independently claimed lifecycle objects.\n */\nexport const EventKitClaimedObjectSchemas = Object.freeze([\n PublisherServiceSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherEncryptionKeyRevocationSchema,\n EncryptedWakeSubscriptionSchema,\n WakeGrantObjectSchema,\n WakeSubscriptionRevocationSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n] as const)\n\nexport const EventKitClaimedObjectSchemaSet: ReadonlySet<string> = new Set(EventKitClaimedObjectSchemas)\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n normalizeAddress,\n NormalizedAddressZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ReplayContract,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport { STATEMENT_FOLD_VERSION } from '@xyo-network/xl1-statement-graph-schemas'\nimport type {\n BodyReader,\n StatementScanCheckpoint,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport {\n resolveVerifiedBodies,\n scanFinalizedStatements,\n} from '@xyo-network/xl1-statement-graph-sdk'\n\nimport { createCheckpointStatementGraphViewer } from './checkpointViewer.ts'\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\nimport type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts'\nimport {\n exactFinalizedBlockHash,\n lineageValidatingScanChain,\n requireCurrentReplayChain,\n} from './finalizedReplayChain.ts'\nimport type {\n EventKitReplayCheckpoint,\n EventKitReplayCheckpointIdentity,\n ReplayBlockedState,\n ReplayCorruptBody,\n ResolvedReplayBody,\n} from './replayCheckpoint.ts'\nimport {\n EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n EventKitReplayCheckpointZod,\n loadEventKitReplayCheckpoint,\n} from './replayCheckpoint.ts'\n\nexport interface EventKitReplayCheckpointStore {\n /** Returns durable JSON-compatible checkpoint content, if one exists. */\n load(): Promise<unknown>\n /** Must atomically replace the prior checkpoint or reject without publishing it. */\n save(checkpoint: EventKitReplayCheckpoint): Promise<void>\n}\n\nexport interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {\n readonly bodies: BodyReader\n readonly chain: FinalizedEventKitReplayChain\n /** Maximum contiguous blocks staged before one atomic checkpoint save. */\n readonly checkpointBatchSize?: number\n readonly checkpointStore: EventKitReplayCheckpointStore\n /** Maximum blocks requested by each Statement Graph bulk read. */\n readonly scanBatchSize?: number\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayAnchor {\n readonly block: number\n readonly hash: string\n}\n\nexport interface FinalizedEventKitReplaySyncOptions {\n /** Advance at most this many blocks while still reporting the uncapped live finalized head. */\n readonly maxBlocks?: number\n readonly signal?: AbortSignal\n}\n\nexport interface FinalizedEventKitReplayController {\n /** Exact canonical XL1 root retained with the current durable projection. */\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null\n /** Resolve a verified lifecycle or acceptance-attachment body from the durable projection. */\n body(hash: string): Readonly<Record<string, unknown>> | undefined\n snapshot(): Readonly<EventKitReplayCheckpoint>\n status(): FinalizedEventKitReplayStatus\n /** Walks clean finalized blocks and stops before the first unavailable body boundary. */\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\n\nconst DEFAULT_CHECKPOINT_BATCH_SIZE = 4096\n// The public REST viewer may implement a bulk range as concurrent per-block\n// requests. Stay within the resident publisher's default bounded HTTP budget.\nconst DEFAULT_SCAN_BATCH_SIZE = 16\n\nfunction requireHead(value: bigint | number): number {\n const head = Number(value)\n if (!Number.isSafeInteger(head) || head < 0) {\n throw new TypeError(`finalized head must be a nonnegative safe integer, received ${String(value)}`)\n }\n return head\n}\n\nfunction requireFloor(value: number): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`floorBlock must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction requirePositiveInteger(value: number | undefined, fallback: number, name: string): number {\n const selected = value ?? fallback\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new TypeError(`${name} must be a positive safe integer, received ${String(selected)}`)\n }\n return selected\n}\n\nfunction requireMaxBlocks(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`maxBlocks must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction replayContract(options: FinalizedEventKitReplayOptions, throughBlock: number): ReplayContract {\n return {\n eventBodyCorpus: { sourceId: options.sourceId },\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedSchemaPolicy: { foldedObjectSchemas: [...EventKitClaimedObjectSchemas] },\n network: options.network,\n throughBlock,\n }\n}\n\nfunction initialCheckpoint(options: FinalizedEventKitReplayOptions): EventKitReplayCheckpoint {\n return EventKitReplayCheckpointZod.parse({\n applied: [],\n bodies: [],\n chainId: options.chainId,\n finalizedHead: 0,\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedThrough: null,\n indexedThroughHash: null,\n network: options.network,\n objectSchemas: [...EventKitClaimedObjectSchemas],\n publisher: options.publisher,\n scan: null,\n sourceId: options.sourceId,\n version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n })\n}\n\nfunction corruptKey(record: ReplayCorruptBody): string {\n return `${record.claimedHash ?? ''}:${record.computedHash}`\n}\n\nfunction uniqueCorrupt(records: readonly ReplayCorruptBody[]): ReplayCorruptBody[] {\n const unique = new Map(records.map(record => [corruptKey(record), record]))\n return unique.values().toArray()\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const unique = new Set(values)\n return unique.values().toArray()\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction mergeApplied(\n existing: readonly AppliedEventRecord[],\n additions: readonly AppliedEventRecord[],\n): AppliedEventRecord[] {\n const merged = new Map(existing.map(record => [appliedKey(record), record] as const))\n for (const record of additions) {\n const key = appliedKey(record)\n const prior = merged.get(key)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(record)) {\n throw new Error(`applied-event identity collision at ${key}`)\n }\n merged.set(key, record)\n }\n return merged.values().toArray().toSorted((left, right) =>\n left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex)\n}\n\nfunction mergeBodies(\n existing: readonly ResolvedReplayBody[],\n additions: ReadonlyMap<string, Record<string, unknown>>,\n): ResolvedReplayBody[] {\n const merged = new Map<string, Record<string, unknown>>(existing.map(entry => [entry.hash, entry.body] as const))\n for (const [hash, body] of additions) {\n const prior = merged.get(hash)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(body)) {\n throw new Error(`content-addressed body collision for ${hash}`)\n }\n merged.set(hash, body)\n }\n return merged.entries()\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toArray()\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedRange {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n readonly throughHash: string\n}\n\nasync function stageAppliedBlock(\n options: FinalizedEventKitReplayOptions,\n applied: readonly AppliedEventRecord[],\n) {\n const appliedObjectHashes = uniqueStrings(applied.map(record => record.objectHash))\n const objects = await resolveVerifiedBodies(options.bodies, appliedObjectHashes)\n const missingObjects = appliedObjectHashes.filter(hash => !objects.bodies.has(hash))\n const schemaMismatchedObjects = uniqueStrings(applied.flatMap((record) => {\n const body = objects.bodies.get(record.objectHash)\n return body !== undefined && body.schema !== record.objectSchema ? [record.objectHash] : []\n }))\n\n const acceptanceAttachments: string[] = []\n for (const record of applied) {\n if (\n normalizeAddress(record.source) !== options.publisher\n || record.objectSchema !== WakeSubscriptionAcceptanceSchema\n ) continue\n const acceptance = WakeSubscriptionAcceptanceZod.safeParse(objects.bodies.get(record.objectHash))\n if (acceptance.success) acceptanceAttachments.push(acceptance.data.challenge, acceptance.data.response)\n }\n const attachmentHashes = uniqueStrings(acceptanceAttachments)\n const attachments = await resolveVerifiedBodies(options.bodies, attachmentHashes)\n const missingAttachments = attachmentHashes.filter(hash => !attachments.bodies.has(hash))\n\n const corrupt = uniqueCorrupt([\n ...objects.corrupt,\n ...attachments.corrupt,\n ])\n const objectHashes = uniqueStrings([\n ...missingObjects,\n ...schemaMismatchedObjects,\n ...missingAttachments,\n ]).map(hash => HashZod.parse(hash))\n return {\n bodies: new Map([\n ...objects.bodies,\n ...attachments.bodies,\n ]),\n corrupt,\n objectHashes,\n }\n}\n\nasync function stageRange(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n fromBlock: number,\n throughBlock: number,\n signal?: AbortSignal,\n): Promise<StagedRange> {\n signal?.throwIfAborted()\n const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n const result = await scanFinalizedStatements(\n lineageValidatingScanChain(options.chain, options.chainId),\n options.bodies,\n replayContract(options, throughBlock),\n {\n batchSize: requirePositiveInteger(options.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n ...(signal === undefined ? {} : { signal }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: throughBlock,\n },\n )\n signal?.throwIfAborted()\n const throughHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n if (beforeHash !== throughHash) {\n throw new Error(`finalized block root changed while staging through ${throughBlock}`)\n }\n if (result.head !== throughBlock || result.checkpoint.contract.throughBlock !== throughBlock) {\n throw new RangeError(\n `finalized range scan stopped at ${result.head}/${result.checkpoint.contract.throughBlock}; requested ${throughBlock}`,\n )\n }\n\n // The upstream scan checkpoint is necessarily chainwide, but this durable\n // projection belongs to one advertised publisher. A Claim's subject is the\n // authoritative rendezvous key; unrelated subjects must neither enter this\n // projection nor make its progress depend on their off-chain bodies.\n const applied = result.fold.applied.filter(record => record.block >= fromBlock\n && record.block <= throughBlock\n && normalizeAddress(record.subject) === options.publisher)\n const appliedByBlock = Map.groupBy(applied, record => record.block)\n const unresolvedByBlock = Map.groupBy(\n result.unresolved.filter(event => event.block >= fromBlock && event.block <= throughBlock),\n event => event.block,\n )\n const relevant = new Set([\n ...appliedByBlock.keys(),\n ...unresolvedByBlock.keys(),\n ])\n const relevantBlocks = relevant.values().toArray().toSorted((left, right) => left - right)\n const bodies = new Map<string, Record<string, unknown>>()\n for (const block of relevantBlocks) {\n signal?.throwIfAborted()\n const staged = await stageAppliedBlock(options, appliedByBlock.get(block) ?? [])\n for (const [hash, body] of staged.bodies) bodies.set(hash, body)\n const unresolvedEvents = unresolvedByBlock.get(block) ?? []\n if (unresolvedEvents.length > 0 || staged.objectHashes.length > 0 || staged.corrupt.length > 0) {\n return {\n applied,\n blocked: {\n atBlock: block,\n corrupt: staged.corrupt,\n objectHashes: staged.objectHashes,\n unresolvedEvents,\n },\n bodies,\n scan: result.checkpoint,\n throughHash,\n }\n }\n }\n return {\n applied, bodies, scan: result.checkpoint, throughHash,\n }\n}\n\nclass DefaultFinalizedEventKitReplayController implements FinalizedEventKitReplayController {\n #checkpoint: EventKitReplayCheckpoint\n readonly #options: FinalizedEventKitReplayOptions\n #syncTail: Promise<unknown> = Promise.resolve()\n\n constructor(options: FinalizedEventKitReplayOptions, checkpoint: EventKitReplayCheckpoint) {\n this.#options = options\n this.#checkpoint = checkpoint\n }\n\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null {\n return this.#checkpoint.indexedThrough === null || this.#checkpoint.indexedThroughHash === null\n ? null\n : Object.freeze({ block: this.#checkpoint.indexedThrough, hash: this.#checkpoint.indexedThroughHash })\n }\n\n body(hash: string): Readonly<Record<string, unknown>> | undefined {\n return this.#checkpoint.bodies.find(entry => entry.hash === hash)?.body\n }\n\n snapshot(): Readonly<EventKitReplayCheckpoint> {\n return this.#checkpoint\n }\n\n status(): FinalizedEventKitReplayStatus {\n return {\n ...(this.#checkpoint.blocked === undefined ? {} : { blocked: this.#checkpoint.blocked }),\n finalizedHead: this.#checkpoint.finalizedHead,\n indexedThrough: this.#checkpoint.indexedThrough,\n }\n }\n\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const previous = this.#syncTail\n const result = (async () => {\n try {\n await previous\n } catch {\n // Previous sync still releases the tail; this call must run either way.\n }\n return await this.#syncOnce(options)\n })()\n this.#syncTail = (async () => {\n try {\n await result\n return true\n } catch {\n return false\n }\n })()\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #commitRange(\n fromBlock: number,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const staged = await stageRange(this.#options, this.#checkpoint, fromBlock, throughBlock, signal)\n signal?.throwIfAborted()\n if (staged.blocked !== undefined) {\n const blockedAt = staged.blocked.atBlock\n if (blockedAt > fromBlock) {\n const prefixBlocked = await this.#commitRange(fromBlock, blockedAt - 1, finalizedHead, signal)\n if (prefixBlocked) return true\n }\n\n // Mint the diagnostic against the exact next block and the prefix's scan\n // checkpoint. Never truncate the wider staged checkpoint by hand.\n const exact = await stageRange(this.#options, this.#checkpoint, blockedAt, blockedAt, signal)\n signal?.throwIfAborted()\n if (exact.blocked === undefined) {\n await this.#commitStaged(exact, blockedAt, finalizedHead, signal)\n return blockedAt === throughBlock\n ? false\n : await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal)\n }\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: exact.blocked,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return true\n }\n\n await this.#commitStaged(staged, throughBlock, finalizedHead, signal)\n return false\n }\n\n async #commitStaged(\n staged: StagedRange,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const { blocked: _blocked, ...unblocked } = this.#checkpoint\n const committed = EventKitReplayCheckpointZod.parse({\n ...unblocked,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n finalizedHead,\n indexedThrough: throughBlock,\n indexedThroughHash: staged.throughHash,\n scan: staged.scan,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n }\n\n async #syncOnce(rawOptions?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const maxBlocks = requireMaxBlocks(rawOptions?.maxBlocks)\n const signal = rawOptions?.signal\n signal?.throwIfAborted()\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\n signal?.throwIfAborted()\n await requireCurrentReplayChain(this.#options.chain, finalizedHead, this.#options.chainId)\n if (finalizedHead < this.#checkpoint.finalizedHead) {\n throw new RangeError(\n `finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`,\n )\n }\n const indexedThrough = this.#checkpoint.indexedThrough\n if (indexedThrough !== null && finalizedHead < indexedThrough) {\n throw new RangeError(`finalized head ${finalizedHead} is behind indexedThrough ${indexedThrough}`)\n }\n\n let next = indexedThrough === null ? this.#options.floorBlock : indexedThrough + 1\n const remaining = next <= finalizedHead ? finalizedHead - next + 1 : 0\n const budget = maxBlocks === undefined ? remaining : Math.min(maxBlocks, remaining)\n const target = next + (budget === 0 ? -1 : budget - 1)\n const checkpointBatchSize = requirePositiveInteger(\n this.#options.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n )\n while (next <= target) {\n signal?.throwIfAborted()\n const throughBlock = Math.min(target, next + Math.min(checkpointBatchSize, target - next + 1) - 1)\n if (await this.#commitRange(next, throughBlock, finalizedHead, signal)) return this.status()\n next = throughBlock + 1\n }\n\n if (this.#checkpoint.finalizedHead !== finalizedHead) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(observed)\n this.#checkpoint = observed\n }\n return this.status()\n }\n}\n\nexport async function createFinalizedEventKitReplayController(\n rawOptions: FinalizedEventKitReplayOptions,\n): Promise<FinalizedEventKitReplayController> {\n const options: FinalizedEventKitReplayOptions = {\n ...rawOptions,\n chainId: ChainIdZod.parse(rawOptions.chainId),\n checkpointBatchSize: requirePositiveInteger(\n rawOptions.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n ),\n floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\n scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n sourceId: rawOptions.sourceId.trim(),\n }\n if (options.network.length === 0) throw new TypeError('network must not be empty')\n if (options.sourceId.length === 0) throw new TypeError('sourceId must not be empty')\n\n const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options)\n if (loaded.status === 'corrupt' || loaded.status === 'identity-mismatch') {\n throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`)\n }\n const checkpoint = loaded.status === 'valid' ? loaded.checkpoint : initialCheckpoint(options)\n return new DefaultFinalizedEventKitReplayController(options, checkpoint)\n}\n\n/** Simple structural fixture; production durability belongs to the storage adapter. */\nexport function createMemoryEventKitReplayCheckpointStore(\n initial?: unknown,\n): EventKitReplayCheckpointStore & { readonly saved: readonly EventKitReplayCheckpoint[] } {\n let value = initial\n const saved: EventKitReplayCheckpoint[] = []\n return {\n load: async (): Promise<unknown> => value,\n async save(checkpoint: EventKitReplayCheckpoint): Promise<void> {\n value = checkpoint\n saved.push(checkpoint)\n },\n saved,\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport { ChainIdZod } from '@xyo-network/event-kit-schemas'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { isBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { FinalizedBlockViewer } from '@xyo-network/xl1-statement-graph-sdk'\n\ntype Promisable<T> = PromiseLike<T> | T\n\n/**\n * Public XL1 viewers expose height-aware chain identity through `chainId(block)`.\n * Fakes and older adapters may omit it, in which case replay remains deliberately\n * restricted to a single ChainId.\n */\nexport interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {\n chainId?(block: number | 'latest'): Promisable<unknown>\n}\n\nasync function requireBlockIdentity(\n chain: FinalizedEventKitReplayChain,\n raw: unknown,\n chainId: string,\n requestedBlock?: number,\n) {\n if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {\n throw new TypeError(requestedBlock === undefined\n ? 'finalized block is unavailable'\n : `finalized block ${requestedBlock} is unavailable`)\n }\n const header: unknown = raw[0]\n if (!isBlockBoundWitness(header) || !Number.isSafeInteger(header.block) || header.block < 0) {\n throw new TypeError('finalized block has an invalid header')\n }\n const block = header.block\n const expectedChainId = chain.chainId === undefined\n ? chainId\n : ChainIdZod.parse(String(await chain.chainId(block)).toLowerCase())\n if ((requestedBlock !== undefined && block !== requestedBlock) || header.chain !== expectedChainId) {\n throw new TypeError(`finalized block ${block} does not match the configured chain`)\n }\n return header\n}\n\nexport async function exactFinalizedBlockHash(\n chain: FinalizedEventKitReplayChain,\n block: number,\n chainId: string,\n): Promise<string> {\n const raw = await chain.block.blockByNumber(block)\n const header = await requireBlockIdentity(chain, raw, chainId, block)\n const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header))\n const storageHash = (header as unknown as { readonly _hash?: unknown })._hash\n if (typeof storageHash === 'string' && storageHash !== hash) {\n throw new TypeError(`finalized block ${block} has invalid storage hash metadata`)\n }\n return HashZod.parse(hash)\n}\n\n/** Validates every block actually consumed by the scanner without adding a second range read. */\nexport function lineageValidatingScanChain(\n chain: FinalizedEventKitReplayChain,\n chainId: string,\n): FinalizedBlockViewer {\n return {\n block: {\n async blockByNumber(block) {\n const raw = await chain.block.blockByNumber(block)\n await requireBlockIdentity(chain, raw, chainId, block)\n return raw\n },\n ...(chain.block.blocksByNumber === undefined\n ? {}\n : {\n async blocksByNumber(high: number, count: number) {\n const values = await chain.block.blocksByNumber?.(high, count) ?? []\n for (const value of values) await requireBlockIdentity(chain, value, chainId)\n return values\n },\n }),\n },\n finalization: chain.finalization,\n }\n}\n\nexport async function requireCurrentReplayChain(\n chain: FinalizedEventKitReplayChain,\n finalizedHead: number,\n chainId: string,\n): Promise<void> {\n if (chain.chainId === undefined) return\n const headChainId = ChainIdZod.parse(String(await chain.chainId(finalizedHead)).toLowerCase())\n if (headChainId !== chainId) {\n throw new TypeError(`finalized head ${finalizedHead} does not match the configured current chain`)\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport {\n type AppliedEventRecord,\n AppliedEventRecordZod,\n BlockNumberZod,\n type ClaimRecord,\n STATEMENT_FOLD_VERSION,\n UnresolvedEventReferenceZod,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport {\n assembleCheckpointRecords,\n StatementScanCheckpointZod,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport { z } from 'zod'\n\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\n\nexport const EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3 as const\n\nexport const ResolvedReplayBodyZod = z.strictObject({\n body: z.record(z.string(), z.unknown()),\n hash: HashZod,\n})\nexport type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>\n\nexport const ReplayCorruptBodyZod = z.strictObject({\n claimedHash: z.string().optional(),\n computedHash: z.string(),\n})\nexport type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>\n\nexport const ReplayBlockedStateZod = z.strictObject({\n atBlock: BlockNumberZod,\n corrupt: z.array(ReplayCorruptBodyZod),\n objectHashes: z.array(HashZod),\n unresolvedEvents: z.array(UnresolvedEventReferenceZod),\n})\nexport type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>\n\n/**\n * Durable, lossless Event Kit projection checkpoint.\n *\n * The upstream Statement Graph checkpoint deliberately retains only the slim\n * current claim set. Event Kit additionally persists the complete applied\n * event stream for its publisher subject because exact same-claim subscription\n * fans cannot be recovered from that current set after restart. The embedded\n * upstream scan checkpoint remains chainwide because its replay contract has\n * no subject filter.\n */\nexport const EventKitReplayCheckpointZod = z.strictObject({\n applied: z.array(AppliedEventRecordZod),\n blocked: ReplayBlockedStateZod.optional(),\n bodies: z.array(ResolvedReplayBodyZod),\n chainId: ChainIdZod,\n finalizedHead: BlockNumberZod,\n floorBlock: BlockNumberZod,\n foldVersion: z.literal(STATEMENT_FOLD_VERSION),\n indexedThrough: z.union([BlockNumberZod, z.null()]),\n indexedThroughHash: z.union([HashZod, z.null()]),\n network: z.string().min(1),\n objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map(schema => z.literal(schema)) as [\n z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[0]>,\n ...z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[number]>[],\n ]),\n publisher: NormalizedAddressZod,\n scan: z.union([StatementScanCheckpointZod, z.null()]),\n sourceId: z.string().min(1),\n version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION),\n})\nexport type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>\n\nexport interface EventKitReplayCheckpointIdentity {\n readonly chainId: string\n readonly floorBlock: number\n readonly network: string\n readonly publisher: string\n readonly sourceId: string\n}\n\nconst LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({\n chainId: ChainIdZod,\n floorBlock: BlockNumberZod,\n network: z.string().min(1),\n publisher: NormalizedAddressZod,\n sourceId: z.string().min(1),\n version: z.literal(2),\n})\n\nexport type EventKitReplayCheckpointLoad\n = | { readonly checkpoint: EventKitReplayCheckpoint; readonly status: 'valid' }\n | { readonly detail: string; readonly status: 'corrupt' | 'identity-mismatch' }\n | { readonly status: 'missing' }\n\nfunction checkpointIdentityError(\n checkpoint: EventKitReplayCheckpointIdentity,\n identity: EventKitReplayCheckpointIdentity,\n): string | undefined {\n if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`\n if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`\n if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`\n if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`\n if (checkpoint.publisher !== identity.publisher) return `publisher ${checkpoint.publisher} != ${identity.publisher}`\n return undefined\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || appliedKey(left).localeCompare(appliedKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction sortClaimRecords(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction expectedClaimRecords(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const records = new Map<string, ClaimRecord>()\n for (const event of applied.toSorted(compareApplied)) {\n const key = claimKey(event.source, event.subject, event.objectHash)\n const prior = records.get(key)\n if (prior === undefined) {\n records.set(key, {\n declaredObjectSchema: event.objectSchema,\n firstBlock: event.block,\n firstEventHash: event.eventHash,\n lastBlock: event.block,\n objectHash: event.objectHash,\n source: event.source,\n subject: event.subject,\n })\n } else if (event.block > prior.lastBlock) {\n records.set(key, { ...prior, lastBlock: event.block })\n }\n }\n return sortClaimRecords(records.values().toArray())\n}\n\nfunction sameClaimRecords(left: readonly ClaimRecord[], right: readonly ClaimRecord[]): boolean {\n return left.length === right.length && left.every((record, index) => {\n const candidate = right[index]\n if (candidate === undefined) return false\n return record.declaredObjectSchema === candidate.declaredObjectSchema\n && record.firstBlock === candidate.firstBlock\n && record.firstEventHash === candidate.firstEventHash\n && record.lastBlock === candidate.lastBlock\n && record.objectHash === candidate.objectHash\n && normalizeAddress(record.source) === normalizeAddress(candidate.source)\n && normalizeAddress(record.subject) === normalizeAddress(candidate.subject)\n })\n}\n\nfunction progressIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, indexedThroughHash } = checkpoint\n if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {\n return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock) {\n return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`\n }\n if (indexedThrough === null && checkpoint.scan !== null) {\n return 'scan checkpoint exists before floorBlock has been indexed'\n }\n if (indexedThrough !== null && checkpoint.scan === null) {\n return 'scan checkpoint is missing for indexed state'\n }\n if ((indexedThrough === null) !== (indexedThroughHash === null)) {\n return 'indexedThrough and indexedThroughHash must be present together'\n }\n if (indexedThrough === null && checkpoint.applied.length > 0) {\n return 'applied events exist before floorBlock has been indexed'\n }\n if (indexedThrough === null && checkpoint.bodies.length > 0) {\n return 'resolved bodies exist before floorBlock has been indexed'\n }\n return undefined\n}\n\nfunction bodySetIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const hashes = new Set<string>()\n for (const entry of checkpoint.bodies) {\n if (hashes.has(entry.hash)) return `duplicate persisted body ${entry.hash}`\n if (typeof entry.body.schema !== 'string' || entry.body.schema.length === 0) {\n return `persisted body ${entry.hash} has no schema`\n }\n hashes.add(entry.hash)\n }\n return undefined\n}\n\nfunction appliedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough } = checkpoint\n const bodyByHash = new Map(checkpoint.bodies.map(entry => [entry.hash, entry] as const))\n const appliedIdentities = new Set<string>()\n const eventObjects = new Set<string>()\n const eventLocations = new Map<string, string>()\n let prior: AppliedEventRecord | undefined\n for (const event of checkpoint.applied) {\n const key = appliedKey(event)\n if (normalizeAddress(event.subject) !== normalizeAddress(checkpoint.publisher)) {\n return `applied event ${key} subject ${event.subject} != publisher ${checkpoint.publisher}`\n }\n if (appliedIdentities.has(key)) return `duplicate applied-event identity ${key}`\n appliedIdentities.add(key)\n const objectKey = `${event.txHash}:${event.eventHash}:${event.objectHash}`\n if (eventObjects.has(objectKey)) return `duplicate applied-event object ${objectKey}`\n eventObjects.add(objectKey)\n if (prior !== undefined && compareApplied(prior, event) > 0) return 'applied events are not in canonical order'\n prior = event\n\n if (indexedThrough === null || event.block < checkpoint.floorBlock || event.block > indexedThrough) {\n return `applied event ${key} lies outside the indexed block range`\n }\n const eventKey = `${event.txHash}:${event.eventHash}`\n const location = [\n event.block,\n event.blockEventOrdinal.tx,\n event.blockEventOrdinal.event,\n normalizeAddress(event.source),\n normalizeAddress(event.subject),\n ].join(':')\n const priorLocation = eventLocations.get(eventKey)\n if (priorLocation !== undefined && priorLocation !== location) {\n return `applied event ${eventKey} has inconsistent provenance`\n }\n eventLocations.set(eventKey, location)\n\n const body = bodyByHash.get(event.objectHash)?.body\n if (body === undefined) return `applied object body ${event.objectHash} is missing`\n if (body.schema !== event.objectSchema) {\n return `applied object ${event.objectHash} schema ${String(body.schema)} != ${event.objectSchema}`\n }\n }\n return undefined\n}\n\nfunction scanRecordIntegrityError(\n records: readonly ClaimRecord[],\n checkpoint: EventKitReplayCheckpoint,\n indexedThrough: number,\n): string | undefined {\n const indexedSchemas = new Set<string>(checkpoint.objectSchemas)\n for (const record of records) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n if (record.firstBlock < checkpoint.floorBlock || record.lastBlock > indexedThrough) {\n return `scan claim record ${key} lies outside the indexed block range`\n }\n if (record.lastBlock < record.firstBlock) return `scan claim record ${key} has a regressing clock`\n if (!indexedSchemas.has(record.declaredObjectSchema)) {\n return `scan claim record ${key} has an unindexed declared schema`\n }\n }\n return undefined\n}\n\nfunction scanIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, scan } = checkpoint\n if (scan === null || indexedThrough === null) return undefined\n const contract = scan.contract\n if (contract.throughBlock !== indexedThrough) {\n return `scan throughBlock ${contract.throughBlock} != indexedThrough ${indexedThrough}`\n }\n if (contract.floorBlock !== checkpoint.floorBlock) return 'scan floorBlock differs from checkpoint'\n if (contract.foldVersion !== checkpoint.foldVersion) return 'scan foldVersion differs from checkpoint'\n if (contract.network !== checkpoint.network) return 'scan network differs from checkpoint'\n if (contract.eventBodyCorpus.sourceId !== checkpoint.sourceId) return 'scan body source differs from checkpoint'\n if (contract.eventBodyCorpus.unresolvedDigest !== undefined) {\n return 'scan body corpus unresolved digest is invalid for finalized replay'\n }\n if (JSON.stringify(contract.indexedSchemaPolicy)\n !== JSON.stringify({ foldedObjectSchemas: checkpoint.objectSchemas })) {\n return 'scan indexed schema policy differs from checkpoint'\n }\n if (scan.unresolved.length > 0) return 'committed scan checkpoint contains unresolved events'\n if (scan.recordShards.length > 0) return 'Event Kit scan checkpoint is not self-contained'\n\n const assembled = assembleCheckpointRecords(scan, [])\n if (assembled.status !== 'valid') return `scan claim records do not assemble: ${assembled.detail}`\n const recordIntegrityError = scanRecordIntegrityError(assembled.records, checkpoint, indexedThrough)\n if (recordIntegrityError !== undefined) return recordIntegrityError\n const actualRecords = sortClaimRecords(\n assembled.records.filter(record => normalizeAddress(record.subject) === normalizeAddress(checkpoint.publisher)),\n )\n if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {\n return 'scan claim records differ from applied-event history'\n }\n if (scan.watermark !== undefined && scan.watermark.block > indexedThrough) {\n return `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`\n }\n return watermarkIntegrityError(checkpoint)\n}\n\nfunction watermarkIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const scan = checkpoint.scan\n if (scan === null) return undefined\n const { watermark, watermarkGroupEventKeys } = scan\n if (watermark === undefined) {\n if (checkpoint.applied.length > 0) return 'scan watermark is missing for applied-event history'\n return watermarkGroupEventKeys.length === 0 ? undefined : 'scan has group event keys without a watermark'\n }\n if (watermark.block < checkpoint.floorBlock) {\n return `scan watermark block ${watermark.block} precedes floorBlock ${checkpoint.floorBlock}`\n }\n const aboveWatermark = checkpoint.applied.find(event =>\n event.block > watermark.block\n || (event.block === watermark.block && event.blockEventOrdinal.tx > watermark.ordinal.tx)\n || (event.block === watermark.block\n && event.blockEventOrdinal.tx === watermark.ordinal.tx\n && event.blockEventOrdinal.event > watermark.ordinal.event))\n if (aboveWatermark !== undefined) return 'applied event lies above the scan watermark'\n\n const uniqueActualKeys = new Set(watermarkGroupEventKeys)\n const actualKeys = uniqueActualKeys.values().toArray().toSorted()\n if (actualKeys.length !== watermarkGroupEventKeys.length) {\n return 'scan watermark group event keys contain duplicates'\n }\n if (actualKeys.some(key => !/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(key))) {\n return 'scan watermark group contains a malformed event key'\n }\n const group = checkpoint.applied.filter(event =>\n event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx)\n const uniqueExpectedKeys = new Set(group.map(eventKey))\n const expectedKeys = uniqueExpectedKeys.values().toArray().toSorted()\n if (expectedKeys.some(key => !actualKeys.includes(key))) {\n return 'scan watermark group event keys omit publisher applied-event history'\n }\n return undefined\n}\n\nfunction blockedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { blocked, indexedThrough } = checkpoint\n if (blocked === undefined) return undefined\n const expectedBlock = indexedThrough === null ? checkpoint.floorBlock : indexedThrough + 1\n if (blocked.atBlock !== expectedBlock) {\n return `blocked atBlock ${blocked.atBlock} != next unindexed block ${expectedBlock}`\n }\n if (blocked.atBlock > checkpoint.finalizedHead) {\n return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (blocked.unresolvedEvents.some(event => event.block !== blocked.atBlock)) {\n return 'blocked unresolved event does not belong to blocked block'\n }\n return undefined\n}\n\nfunction checkpointIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n return progressIntegrityError(checkpoint)\n ?? bodySetIntegrityError(checkpoint)\n ?? appliedIntegrityError(checkpoint)\n ?? scanIntegrityError(checkpoint)\n ?? blockedIntegrityError(checkpoint)\n}\n\nasync function persistedBodyIntegrityError(checkpoint: EventKitReplayCheckpoint): Promise<string | undefined> {\n for (const entry of checkpoint.bodies) {\n let computedHash: string\n try {\n computedHash = await PayloadBuilder.dataHash(entry.body as unknown as Payload)\n } catch {\n return `persisted body ${entry.hash} cannot be hashed`\n }\n if (computedHash !== entry.hash) {\n return `persisted body ${entry.hash} hashes to ${computedHash}`\n }\n }\n return undefined\n}\n\nexport async function loadEventKitReplayCheckpoint(\n value: unknown,\n identity: EventKitReplayCheckpointIdentity,\n): Promise<EventKitReplayCheckpointLoad> {\n if (value === undefined || value === null) return { status: 'missing' }\n if (typeof value === 'object' && value !== null && (value as { version?: unknown }).version === 2) {\n const legacy = LegacyEventKitReplayCheckpointIdentityZod.safeParse(value)\n if (!legacy.success) {\n return { detail: 'recognized Event Kit replay checkpoint v2 has invalid identity', status: 'corrupt' }\n }\n const mismatch = checkpointIdentityError(legacy.data, identity)\n return mismatch === undefined\n ? { status: 'missing' }\n : { detail: mismatch, status: 'identity-mismatch' }\n }\n const parsed = EventKitReplayCheckpointZod.safeParse(value)\n if (!parsed.success) {\n return { detail: 'recognized Event Kit replay checkpoint has invalid content', status: 'corrupt' }\n }\n const checkpoint = parsed.data\n const mismatch = checkpointIdentityError(checkpoint, identity)\n if (mismatch !== undefined) return { detail: mismatch, status: 'identity-mismatch' }\n const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint)\n if (bodyIntegrityError !== undefined) return { detail: bodyIntegrityError, status: 'corrupt' }\n const integrityError = checkpointIntegrityError(checkpoint)\n if (integrityError !== undefined) return { detail: integrityError, status: 'corrupt' }\n return { checkpoint, status: 'valid' }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport type {\n StatementGrantClaim,\n StatementGrantClaimQuery,\n StatementGrantObject,\n StatementGraphGrantReadModel,\n} from '@xyo-network/event-kit-protocol'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type {\n ClaimQuery,\n StatementGraphViewer,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n ClaimRecord,\n ObjectRecord,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nexport interface StatementGraphGrantReadModelOptions {\n /**\n * Canonical Statement Graph read surface \u2014 a `StateStatementGraphViewer` over\n * engine state, a replay controller's viewer, or any other backing.\n */\n readonly viewer: StatementGraphViewer\n}\n\n/**\n * Adapts the canonical Statement Graph v2 viewer to the unbranded read model\n * the Event Kit grant authorizer consumes.\n *\n * This is a translation seam only. It narrows branded query and record types\n * and preserves every field the authorizer needs as grant evidence; it makes no\n * authorization decision, applies no freshness policy, and drops no claim.\n * Statement Graph remains the sole owner of claim semantics; Event Kit's\n * authorizer separately interprets grant bodies and claimed negations.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n head: async (): Promise<number> => await viewer.head(),\n\n async claims(\n source: string,\n query?: StatementGrantClaimQuery,\n ): Promise<readonly StatementGrantClaim[]> {\n const records = await viewer.claims(XyoAddressZod.parse(source), toClaimQuery(query))\n return Object.freeze(records.map(toGrantClaim))\n },\n\n async object(objectHash: string): Promise<StatementGrantObject | undefined> {\n const record = await viewer.object(HashZod.parse(objectHash))\n return record === undefined ? undefined : toGrantObject(record)\n },\n })\n}\n\n/**\n * Rebrands the query fields. Parsing rather than casting means a malformed hash\n * reaches the viewer as a throw \u2014 surfacing as `grant-unavailable` \u2014 instead of\n * silently querying a nonsense key and reading as \"no grant\".\n */\nfunction toClaimQuery(query?: StatementGrantClaimQuery): ClaimQuery | undefined {\n if (query === undefined) return undefined\n return {\n ...(query.declaredObjectSchemaPrefix === undefined\n ? {}\n : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix }),\n ...(query.objectHash === undefined ? {} : { objectHash: HashZod.parse(query.objectHash) }),\n ...(query.subject === undefined ? {} : { subject: XyoAddressZod.parse(query.subject) }),\n }\n}\n\n/**\n * `firstEventHash` identifies the materializing claim, so the authorizer can\n * cite one concrete transition as evidence rather than a bare boolean. A\n * redundant claim moves only `lastBlock`, so evidence cannot be backdated or\n * refreshed by re-claiming.\n */\nfunction toGrantClaim(record: ClaimRecord): StatementGrantClaim {\n return Object.freeze({\n declaredObjectSchema: record.declaredObjectSchema,\n firstBlock: record.firstBlock,\n firstEventHash: record.firstEventHash,\n lastBlock: record.lastBlock,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n}\n\nfunction toGrantObject(record: ObjectRecord): StatementGrantObject {\n return Object.freeze({\n assurance: record.assurance,\n declaredSchema: record.declaredSchema,\n objectHash: record.objectHash,\n params: record.params === null ? null : Object.freeze({ ...record.params }),\n })\n}\n", "import type {\n EncryptedWakeSubscription,\n EndpointChallenge,\n EndpointChallengeResponse,\n PublisherService,\n WakeGrantObject,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\nimport {\n EncryptedWakeSubscriptionSchema,\n EncryptedWakeSubscriptionZod,\n EndpointChallengeResponseZod,\n EndpointChallengeZod,\n HandshakeIdZod,\n hasMatchingHandshakeProfile,\n NormalizedAddressZod,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantObjectZod,\n WakeGrantRevocationSchema,\n WakeGrantRevocationZod,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceRevocationZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n WakeSubscriptionRevocationSchema,\n WakeSubscriptionRevocationZod,\n} from '@xyo-network/event-kit-schemas'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n HandshakeCatalogs,\n HandshakeServiceDiscovery,\n} from './handshakeCatalog.ts'\nimport {\n discoverHandshakeService,\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n firstHandshakeRevocation,\n handshakeEventEvidence,\n handshakeEventKey,\n handshakeEvidence,\n handshakeRevocations,\n parsedHandshakeObjects,\n verifiedHandshakeAttachmentBody,\n verifiedHandshakeObjectBody,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModel,\n EventKitHandshakeReadModelOptions,\n PublisherAcceptanceCandidateDiscovery,\n PublisherAcceptanceCandidateQuery,\n PublisherHandshakeQuery,\n PublisherHandshakeView,\n PublisherServiceDiscovery,\n PublisherSubscriptionView,\n SubscriberSubscriptionLookup,\n SubscriberSubscriptionQuery,\n SubscriptionTupleRejection,\n SubscriptionTupleRejectionReason,\n} from './handshakeReadModelTypes.ts'\nimport {\n isPublisherSubject,\n publisherSubjectViewer,\n} from './publisherSubjectViewer.ts'\nimport type {\n ValidatedSubscriptionAcceptance as ValidatedAcceptance,\n ValidatedSubscriptionTuple as ValidatedTuple,\n} from './subscriptionLifecycleView.ts'\nimport {\n buildPublisherSubscriptionViews,\n selectPublisherAcceptanceCandidates,\n} from './subscriptionLifecycleView.ts'\n\ninterface HandshakeLifecycleProjection {\n readonly acceptances: readonly ValidatedAcceptance[]\n readonly discovery: HandshakeServiceDiscovery\n readonly rejections: readonly SubscriptionTupleRejection[]\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedTuple[]\n}\n\ntype HandshakeLifecycle\n = | HandshakeLifecycleProjection\n | { readonly discovery: HandshakeServiceDiscovery }\n\nfunction publisherSubjectOptions(\n options: EventKitHandshakeReadModelOptions,\n publisher: string,\n): EventKitHandshakeReadModelOptions {\n return {\n ...options,\n viewer: publisherSubjectViewer(options.viewer, XyoAddressZod.parse(publisher)),\n }\n}\n\nfunction hasExactGrantBinding(grant: WakeGrantObject, publisher: string): boolean {\n return grant.publisher === publisher\n && grant.permissions.length === 1\n && grant.permissions[0] === 'enqueue'\n}\n\nfunction hasExactSubscriptionBinding(\n subscription: EncryptedWakeSubscription,\n chainId: string,\n publisher: string,\n serviceHash: string,\n grantHash: string,\n): boolean {\n return subscription.publisher === publisher\n && subscription.chainId === chainId\n && subscription.service === serviceHash\n && subscription.grant === grantHash\n}\n\nfunction hasExactKeyBinding(\n subscription: EncryptedWakeSubscription,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n tupleBlock: number,\n): boolean {\n const key = catalogs.keyByHash.get(subscription.encryptionKey)\n return subscription.encryptionKey === service.body.preferredEncryptionKey\n && key?.body.keyId === subscription.keyId\n && service.body.encryptionKeys.includes(key.objectHash)\n && exactHandshakeKeyAt(catalogs, service, key.objectHash, tupleBlock)\n}\n\nfunction expiryIsInsideServicePolicy(\n subscription: EncryptedWakeSubscription,\n service: PublisherService,\n tupleBlock: number,\n): boolean {\n return subscription.expiresAtBlock > tupleBlock\n && subscription.expiresAtBlock <= tupleBlock + service.limits.maxSubscriptionLifetimeBlocks\n}\n\nasync function tupleRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n): Promise<{\n grants: readonly { block: number; target: string }[]\n subscriptions: readonly { block: number; target: string }[]\n}> {\n return {\n grants: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeGrantRevocationSchema),\n value => WakeGrantRevocationZod.safeParse(value),\n 'grant',\n ),\n subscriptions: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeSubscriptionRevocationSchema),\n value => WakeSubscriptionRevocationZod.safeParse(value),\n 'subscription',\n ),\n }\n}\n\nasync function validateTuple(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n subscriber: string,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n chainId: string,\n publisher: string,\n sourceEvents: readonly AppliedEventRecord[],\n): Promise<{ rejection?: SubscriptionTupleRejection; tuple?: ValidatedTuple }> {\n const serviceEntries = records.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => record.objectSchema === EncryptedWakeSubscriptionSchema || record.objectSchema === EncryptedWakeSubscriptionSchema)\n const baseEvidence = handshakeEventEvidence(records[0])\n const reject = (reason: SubscriptionTupleRejectionReason) => ({\n rejection: {\n evidence: baseEvidence, reason, subscriber,\n },\n })\n if (serviceEntries.length !== 1\n || serviceEntries[0]?.objectHash !== service.objectHash\n || grantEntries.length !== 1\n || subscriptionEntries.length !== 1) {\n return reject('ambiguous-fan')\n }\n\n const grantRecord = grantEntries[0]\n const subscriptionRecord = subscriptionEntries[0]\n const grantParsed = WakeGrantObjectZod.safeParse(await verifiedHandshakeObjectBody(viewer, grantRecord))\n if (!grantParsed.success) return reject('malformed-grant')\n const subscriptionParsed = EncryptedWakeSubscriptionZod.safeParse(\n await verifiedHandshakeObjectBody(viewer, subscriptionRecord),\n )\n if (!subscriptionParsed.success) return reject('malformed-subscription')\n const grant = grantParsed.data\n const subscription = subscriptionParsed.data\n\n if (!hasMatchingHandshakeProfile(service.body, subscription, chainId)) return reject('subscription-binding-invalid')\n if (!hasExactGrantBinding(grant, publisher)) return reject('grant-binding-invalid')\n if (!hasExactSubscriptionBinding(subscription, chainId, publisher, service.objectHash, grantRecord.objectHash)) {\n return reject('subscription-binding-invalid')\n }\n const tupleBlock = subscriptionRecord.block\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\n const claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (claimedKey === undefined || claimedKey.evidence.block >= tupleBlock) return reject('key-binding-invalid')\n if (!exactHandshakeServiceAt(catalogs, service, publisher, tupleBlock)) return reject('service-inactive-at-claim')\n if (!hasExactKeyBinding(subscription, service, catalogs, tupleBlock)) return reject('key-binding-invalid')\n if (!expiryIsInsideServicePolicy(subscription, service.body, tupleBlock)) return reject('expiry-out-of-policy')\n\n const revoked = await tupleRevocations(viewer, sourceEvents)\n const subscriptionRevokedAtBlock = firstHandshakeRevocation(revoked.subscriptions, subscriptionRecord.objectHash)\n const grantRevokedAtBlock = firstHandshakeRevocation(revoked.grants, grantRecord.objectHash)\n return {\n tuple: {\n grant: {\n body: grant, evidence: handshakeEvidence(grantRecord), objectHash: grantRecord.objectHash,\n },\n grantRevokedAtBlock,\n service,\n subscriber,\n subscription: {\n body: subscription,\n evidence: handshakeEvidence(subscriptionRecord),\n objectHash: subscriptionRecord.objectHash,\n ...(subscriptionRevokedAtBlock === undefined ? {} : { revokedAtBlock: subscriptionRevokedAtBlock }),\n },\n subscriptionLifecycle: {\n claimedAtBlock: tupleBlock,\n expiresAtBlock: subscription.expiresAtBlock,\n objectHash: subscriptionRecord.objectHash,\n revision: subscription.revision,\n revokedAtBlock: subscriptionRevokedAtBlock,\n source: subscriber,\n subscriptionId: subscription.subscriptionId,\n supersedes: subscription.supersedes,\n },\n tupleEvent: baseEvidence,\n },\n }\n}\n\nasync function discoverTuples(\n viewer: StatementGraphViewer,\n services: readonly ClaimedHandshakeObject<PublisherService>[],\n catalogs: HandshakeCatalogs,\n query: Required<Pick<PublisherHandshakeQuery, 'chainId' | 'publisher'>>,\n candidateSources?: readonly string[],\n): Promise<{ rejections: SubscriptionTupleRejection[]; tuples: ValidatedTuple[] }> {\n const serviceByHash = new Map(services.map(service => [service.objectHash, service]))\n const serviceHashes = new Set(serviceByHash.keys())\n const uniqueSources = new Set(\n candidateSources ?? (\n (await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source)\n ),\n )\n const sources = uniqueSources.values()\n .filter(source => !isPublisherSubject(source, query.publisher))\n .toArray()\n const tuples = new Map<string, ValidatedTuple>()\n const rejections: SubscriptionTupleRejection[] = []\n for (const source of sources) {\n const sourceAddress = XyoAddressZod.parse(source)\n const events = await viewer.events(sourceAddress, { subject: XyoAddressZod.parse(query.publisher) })\n const groups = Map.groupBy(events, handshakeEventKey)\n for (const records of groups.values()) {\n const referencedServices = records.flatMap((record) => {\n const service = serviceByHash.get(record.objectHash)\n return service === undefined ? [] : [service]\n })\n for (const service of referencedServices) {\n const result = await validateTuple(\n viewer,\n records,\n source,\n service,\n catalogs,\n query.chainId,\n query.publisher,\n events,\n )\n if (result.rejection !== undefined) rejections.push(result.rejection)\n if (result.tuple !== undefined) {\n const tupleKey = `${result.tuple.subscriber}:${result.tuple.subscription.objectHash}`\n const prior = tuples.get(tupleKey)\n if (prior === undefined || result.tuple.subscription.evidence.block < prior.subscription.evidence.block) {\n tuples.set(tupleKey, result.tuple)\n }\n }\n }\n }\n }\n return { rejections, tuples: tuples.values().toArray() }\n}\n\nfunction challengeMatchesTuple(\n challenge: EndpointChallenge,\n response: EndpointChallengeResponse,\n acceptance: WakeSubscriptionAcceptance,\n tuple: ValidatedTuple,\n chainId: string,\n publisher: string,\n): boolean {\n return challenge.chainId === chainId\n && challenge.publisher === publisher\n && challenge.subscriber === tuple.subscriber\n && challenge.service === tuple.service.objectHash\n && challenge.encryptionKey === tuple.subscription.body.encryptionKey\n && challenge.keyId === tuple.subscription.body.keyId\n && challenge.subscription === tuple.subscription.objectHash\n && challenge.grant === tuple.grant.objectHash\n && challenge.eventKind === tuple.subscription.body.eventKind\n && response.challenge === acceptance.challenge\n}\n\nasync function validatedAcceptances(\n options: EventKitHandshakeReadModelOptions,\n catalogs: HandshakeCatalogs,\n tuples: readonly ValidatedTuple[],\n chainId: string,\n publisher: string,\n): Promise<ValidatedAcceptance[]> {\n const publisherAddress = XyoAddressZod.parse(publisher)\n const events = await options.viewer.events(publisherAddress, { subject: publisherAddress })\n const acceptances = await parsedHandshakeObjects(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceSchema),\n value => WakeSubscriptionAcceptanceZod.safeParse(value),\n )\n const acceptanceRevocations = await handshakeRevocations(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceRevocationSchema),\n value => WakeSubscriptionAcceptanceRevocationZod.safeParse(value),\n 'acceptance',\n )\n const result: ValidatedAcceptance[] = []\n for (const claimed of acceptances) {\n const candidates = tuples.filter(candidate =>\n claimed.body.service === candidate.service.objectHash\n && claimed.body.encryptionKey === candidate.subscription.body.encryptionKey\n && claimed.body.subscription === candidate.subscription.objectHash\n && claimed.body.grant === candidate.grant.objectHash)\n if (candidates.length === 0) continue\n\n const challengeBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.challenge)\n const responseBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.response)\n const challenge = EndpointChallengeZod.safeParse(challengeBody)\n const response = EndpointChallengeResponseZod.safeParse(responseBody)\n if (!challenge.success || !response.success) continue\n\n // Acceptance attests that the publisher verified the endpoint proof inside\n // its Unix-time window. XL1 provides no consensus wall clock, so finalized\n // replay validates the immutable proof binding and block lifecycle only.\n const eligible = candidates.filter(tuple => claimed.evidence.block > tuple.subscription.evidence.block\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, claimed.evidence.block)\n && exactHandshakeKeyAt(catalogs, tuple.service, claimed.body.encryptionKey, claimed.evidence.block)\n && claimed.evidence.block + 1 < tuple.subscription.body.expiresAtBlock\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > claimed.evidence.block)\n && (tuple.subscription.revokedAtBlock === undefined\n || tuple.subscription.revokedAtBlock > claimed.evidence.block)\n && challengeMatchesTuple(challenge.data, response.data, claimed.body, tuple, chainId, publisher))\n if (eligible.length !== 1) continue\n const tuple = eligible[0]\n\n const revokedAtBlock = firstHandshakeRevocation(acceptanceRevocations, claimed.objectHash)\n const withRevocation: ClaimedHandshakeObject<WakeSubscriptionAcceptance> = {\n ...claimed,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }\n result.push({\n claimed: withRevocation,\n lifecycle: {\n acceptanceBlock: claimed.evidence.block,\n objectHash: claimed.objectHash,\n revokedAtBlock,\n source: publisher,\n subscription: tuple.subscription.objectHash,\n },\n subscriber: tuple.subscriber,\n })\n }\n return result\n}\n\nasync function handshakeLifecycle(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n candidateSources?: readonly string[],\n subscriptionId?: string,\n): Promise<HandshakeLifecycle> {\n const scopedOptions = publisherSubjectOptions(options, rawQuery.publisher)\n const discovery = await discoverHandshakeService(scopedOptions, rawQuery)\n if (discovery.catalogs === undefined) return { discovery }\n\n const serviceRevisions = discovery.catalogs.serviceByHash.values()\n .filter(service =>\n service.evidence.source === discovery.query.publisher\n && (discovery.query.serviceId === undefined || service.body.serviceId === discovery.query.serviceId)\n && service.body.events.some(event => event.kind === discovery.query.eventKind)\n && service.evidence.block <= discovery.query.finalizedHead)\n .toArray()\n const found = await discoverTuples(\n scopedOptions.viewer,\n serviceRevisions,\n discovery.catalogs,\n { chainId: discovery.query.chainId, publisher: discovery.query.publisher },\n candidateSources,\n )\n const tuples = subscriptionId === undefined\n ? found.tuples\n : found.tuples.filter(tuple => tuple.subscription.body.subscriptionId === subscriptionId)\n const acceptances = await validatedAcceptances(\n scopedOptions,\n discovery.catalogs,\n tuples,\n discovery.query.chainId,\n discovery.query.publisher,\n )\n return {\n acceptances,\n discovery,\n rejections: found.rejections,\n subscriptions: buildPublisherSubscriptionViews(\n tuples,\n acceptances,\n discovery.query.publisher,\n discovery.query.finalizedHead,\n ),\n tuples,\n }\n}\n\nfunction handshakeView(projection: HandshakeLifecycle): PublisherHandshakeView {\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n const {\n discovery, rejections, subscriptions,\n } = projection\n const lifecycle = { rejections, subscriptions }\n if (discovery.result.ok) {\n return {\n ...discovery.result,\n ...lifecycle,\n hasCurrentAdvertisement: true,\n serviceDiscovery: discovery.result,\n }\n }\n if (discovery.result.indexedThrough === null) {\n throw new Error('catalog-backed service discovery must have an indexed head')\n }\n return {\n finalizedHead: discovery.result.finalizedHead,\n hasCurrentAdvertisement: false,\n indexedThrough: discovery.result.indexedThrough,\n ok: true,\n serviceDiscovery: discovery.result,\n ...lifecycle,\n }\n}\n\nexport function createEventKitHandshakeReadModel(\n options: EventKitHandshakeReadModelOptions,\n): EventKitHandshakeReadModel {\n return Object.freeze({\n async acceptanceCandidates(\n rawQuery: PublisherAcceptanceCandidateQuery,\n ): Promise<PublisherAcceptanceCandidateDiscovery> {\n const subscriber = rawQuery.subscriber === undefined\n ? undefined\n : NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const projection = await handshakeLifecycle(\n options,\n rawQuery,\n subscriber === undefined ? undefined : [subscriber],\n subscriptionId,\n )\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n if (!projection.discovery.result.ok) return projection.discovery.result\n const {\n catalogs, query, result,\n } = projection.discovery\n if (catalogs === undefined) throw new Error('catalog-backed candidate discovery requires catalogs')\n return {\n ...result,\n candidates: selectPublisherAcceptanceCandidates({\n acceptances: projection.acceptances,\n catalogs,\n finalizedHead: query.finalizedHead,\n key: result.key,\n publisher: query.publisher,\n service: result.service,\n subscriptions: projection.subscriptions,\n tuples: projection.tuples,\n }),\n rejections: projection.rejections,\n subscriptions: projection.subscriptions,\n }\n },\n\n discoverPublisherService: async (query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> =>\n (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result,\n\n publisher: async (query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> => handshakeView(await handshakeLifecycle(options, query)),\n\n async subscriber(rawQuery: SubscriberSubscriptionQuery): Promise<SubscriberSubscriptionLookup> {\n const subscriber = NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const view = handshakeView(await handshakeLifecycle(options, rawQuery, [subscriber], subscriptionId))\n return view.ok ? { ...view, subscriber } : view\n },\n })\n}\n", "import type {\n PublisherEncryptionKeyLifecycle,\n PublisherServiceLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport {\n resolvePreferredEncryptionKey,\n selectPublisherService,\n} from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n} from '@xyo-network/event-kit-schemas'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\n SOURCE_WAKE_EVENT_KIND,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModelOptions,\n HandshakeClaimEvidence,\n PublisherHandshakeQuery,\n PublisherServiceDiscovery,\n PublisherServiceDiscoveryFailure,\n} from './handshakeReadModelTypes.ts'\n\nexport interface HandshakeCatalogs {\n readonly keyByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherEncryptionKey>>\n readonly keyLifecycles: readonly PublisherEncryptionKeyLifecycle[]\n readonly serviceByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherService>>\n readonly serviceLifecycles: readonly PublisherServiceLifecycleRevision[]\n}\n\nexport interface HandshakeServiceDiscovery {\n readonly catalogs?: HandshakeCatalogs\n readonly query: PublisherHandshakeQuery\n readonly result: PublisherServiceDiscovery\n}\n\nexport function handshakeEvidence(record: AppliedEventRecord): HandshakeClaimEvidence {\n return {\n block: record.block,\n eventHash: record.eventHash,\n hashIndex: record.hashIndex,\n objectHash: record.objectHash,\n ordinal: record.blockEventOrdinal,\n source: record.source,\n txHash: record.txHash,\n }\n}\n\nexport function handshakeEventEvidence(\n record: AppliedEventRecord,\n): Omit<HandshakeClaimEvidence, 'hashIndex' | 'objectHash'> {\n const item = handshakeEvidence(record)\n return {\n block: item.block,\n eventHash: item.eventHash,\n ordinal: item.ordinal,\n source: item.source,\n txHash: item.txHash,\n }\n}\n\nexport function handshakeEventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction earliestByHash(records: readonly AppliedEventRecord[]): AppliedEventRecord[] {\n const result = new Map<string, AppliedEventRecord>()\n for (const record of records) {\n const prior = result.get(record.objectHash)\n if (prior === undefined\n || record.block < prior.block\n || (record.block === prior.block && record.blockEventOrdinal.tx < prior.blockEventOrdinal.tx)\n || (record.block === prior.block\n && record.blockEventOrdinal.tx === prior.blockEventOrdinal.tx\n && record.blockEventOrdinal.event < prior.blockEventOrdinal.event)) {\n result.set(record.objectHash, record)\n }\n }\n return result.values().toArray()\n}\n\nexport async function verifiedHandshakeObjectBody(\n viewer: StatementGraphViewer,\n record: AppliedEventRecord,\n): Promise<Record<string, unknown> | undefined> {\n const object = await viewer.object(record.objectHash)\n if (object?.assurance !== 'resolved'\n || object.declaredSchema !== record.objectSchema\n || object.params === null) return undefined\n const body = { schema: object.declaredSchema, ...object.params }\n return await PayloadBuilder.dataHash(body as Payload) === record.objectHash ? body : undefined\n}\n\nexport async function verifiedHandshakeAttachmentBody(\n resolver: EventKitHandshakeReadModelOptions['body'],\n hash: string,\n): Promise<Record<string, unknown> | undefined> {\n const body = resolver?.(hash)\n if (body === undefined) return undefined\n return await PayloadBuilder.dataHash(body as unknown as Payload) === hash ? { ...body } : undefined\n}\n\nexport function firstHandshakeRevocation(\n revocations: readonly { readonly block: number; readonly target: string }[],\n target: string,\n): number | undefined {\n const blocks = revocations.filter(item => item.target === target).map(item => item.block)\n return blocks.length === 0 ? undefined : Math.min(...blocks)\n}\n\nexport async function parsedHandshakeObjects<T>(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: T; readonly success: true } | { readonly success: false },\n): Promise<ClaimedHandshakeObject<T>[]> {\n const objects: ClaimedHandshakeObject<T>[] = []\n for (const record of earliestByHash(records)) {\n const body = await verifiedHandshakeObjectBody(viewer, record)\n const parsed = parse(body)\n if (!parsed.success) continue\n objects.push({\n body: parsed.data,\n evidence: handshakeEvidence(record),\n objectHash: record.objectHash,\n })\n }\n return objects\n}\n\nexport async function handshakeRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: Record<string, string>; readonly success: true } | { readonly success: false },\n field: string,\n): Promise<{ block: number; target: string }[]> {\n const result: { block: number; target: string }[] = []\n for (const record of earliestByHash(records)) {\n const parsed = parse(await verifiedHandshakeObjectBody(viewer, record))\n if (parsed.success && typeof parsed.data[field] === 'string') {\n result.push({ block: record.block, target: parsed.data[field] })\n }\n }\n return result\n}\n\nexport async function buildHandshakeCatalogs(\n viewer: StatementGraphViewer,\n publisher: string,\n): Promise<HandshakeCatalogs> {\n const events = await viewer.events(XyoAddressZod.parse(publisher))\n const services = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema),\n value => PublisherServiceZod.safeParse(value),\n )\n const keys = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeySchema),\n value => PublisherEncryptionKeyZod.safeParse(value),\n )\n const serviceRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceRevocationSchema),\n value => PublisherServiceRevocationZod.safeParse(value),\n 'service',\n )\n const keyRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeyRevocationSchema),\n value => PublisherEncryptionKeyRevocationZod.safeParse(value),\n 'key',\n )\n\n const serviceByHash = new Map(services.map((service) => {\n const revokedAtBlock = firstHandshakeRevocation(serviceRevocations, service.objectHash)\n return [service.objectHash, {\n ...service,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n const keyByHash = new Map(keys.map((key) => {\n const revokedAtBlock = firstHandshakeRevocation(keyRevocations, key.objectHash)\n return [key.objectHash, {\n ...key,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n\n return {\n keyByHash,\n keyLifecycles: keyByHash.values().map(key => ({\n claimedAtBlock: key.evidence.block,\n expiresAtBlock: key.body.expiresAtBlock,\n keyId: key.body.keyId,\n objectHash: key.objectHash,\n revokedAtBlock: key.revokedAtBlock,\n source: key.evidence.source,\n validFromBlock: key.body.validFromBlock,\n })).toArray(),\n serviceByHash,\n serviceLifecycles: serviceByHash.values().map(service => ({\n claimedAtBlock: service.evidence.block,\n encryptionKeys: service.body.encryptionKeys,\n eventKinds: service.body.events.map(event => event.kind),\n expiresAtBlock: service.body.expiresAtBlock,\n objectHash: service.objectHash,\n preferredEncryptionKey: service.body.preferredEncryptionKey,\n revision: service.body.revision,\n revokedAtBlock: service.revokedAtBlock,\n serviceId: service.body.serviceId,\n source: service.evidence.source,\n supersedes: service.body.supersedes,\n validFromBlock: service.body.validFromBlock,\n })).toArray(),\n }\n}\n\nasync function viewHead(\n viewer: StatementGraphViewer,\n finalizedHead: number,\n): Promise<PublisherServiceDiscoveryFailure | { indexedThrough: number }> {\n if (!Number.isSafeInteger(finalizedHead) || finalizedHead < 0) {\n throw new TypeError('finalizedHead must be a nonnegative safe integer')\n }\n let indexedThrough: number\n try {\n indexedThrough = await viewer.head()\n } catch {\n return {\n finalizedHead, indexedThrough: null, ok: false, reason: 'view-unavailable',\n }\n }\n if (indexedThrough < finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'stale-view',\n }\n if (indexedThrough > finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'ahead-of-finality',\n }\n return { indexedThrough }\n}\n\nexport function exactHandshakeServiceAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n publisher: string,\n finalizedHead: number,\n): boolean {\n const selection = selectPublisherService({\n eventKind: service.body.events[0].kind,\n finalizedHead,\n publisherSource: publisher,\n serviceId: service.body.serviceId,\n services: catalogs.serviceLifecycles,\n })\n return selection.ok && selection.service.objectHash === service.objectHash\n}\n\nexport function exactHandshakeKeyAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n keyHash: string,\n finalizedHead: number,\n): boolean {\n const serviceLifecycle = catalogs.serviceLifecycles.find(item => item.objectHash === service.objectHash)\n if (serviceLifecycle === undefined) return false\n const resolution = resolvePreferredEncryptionKey({\n finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceLifecycle,\n })\n return resolution.ok && resolution.key.objectHash === keyHash\n}\n\nfunction hasPendingPublisherService(\n catalogs: HandshakeCatalogs,\n query: PublisherHandshakeQuery,\n): boolean {\n return catalogs.serviceLifecycles.some(service => service.source === query.publisher\n && service.claimedAtBlock <= query.finalizedHead\n && service.validFromBlock > query.finalizedHead\n && (service.revokedAtBlock === undefined || service.revokedAtBlock > query.finalizedHead)\n && (query.serviceId === undefined || service.serviceId === query.serviceId)\n && service.eventKinds.includes(query.eventKind ?? SOURCE_WAKE_EVENT_KIND))\n}\n\nexport async function discoverHandshakeService(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n): Promise<HandshakeServiceDiscovery> {\n const query: PublisherHandshakeQuery = {\n ...rawQuery,\n chainId: ChainIdZod.parse(rawQuery.chainId),\n eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n publisher: NormalizedAddressZod.parse(rawQuery.publisher),\n }\n const head = await viewHead(options.viewer, query.finalizedHead)\n if ('ok' in head) return { query, result: head }\n\n const catalogs = await buildHandshakeCatalogs(options.viewer, query.publisher)\n const serviceSelection = selectPublisherService({\n eventKind: query.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n finalizedHead: query.finalizedHead,\n publisherSource: query.publisher,\n ...(query.serviceId === undefined ? {} : { serviceId: query.serviceId }),\n services: catalogs.serviceLifecycles,\n })\n if (!serviceSelection.ok) {\n const reason = serviceSelection.reason === 'service-not-found'\n && hasPendingPublisherService(catalogs, query)\n ? 'service-pending'\n : serviceSelection.reason\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason,\n },\n }\n }\n const service = catalogs.serviceByHash.get(serviceSelection.service.objectHash)\n if (service === undefined) throw new Error('selected service body is unavailable')\n if (service.body.authorizationChainId !== query.chainId) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead, indexedThrough: head.indexedThrough, ok: false, reason: 'service-not-found',\n },\n }\n }\n const keySelection = resolvePreferredEncryptionKey({\n finalizedHead: query.finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceSelection.service,\n })\n if (!keySelection.ok) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason: keySelection.reason,\n },\n }\n }\n const key = catalogs.keyByHash.get(keySelection.key.objectHash)\n if (key === undefined) throw new Error('selected encryption-key body is unavailable')\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n key,\n ok: true,\n service,\n },\n }\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nexport function isPublisherSubject(subject: string, publisher: string): boolean {\n return normalizeAddress(subject) === normalizeAddress(publisher)\n}\n\n/**\n * Defense-in-depth boundary for generic Statement Graph viewers. Querying by\n * subject is not enough: a backing may ignore optional filters, so every\n * returned record is filtered again before D-005 interprets it.\n */\nexport function publisherSubjectViewer(\n viewer: StatementGraphViewer,\n publisher: StatementSubject,\n): StatementGraphViewer {\n const claimQuery = (query?: ClaimQuery): ClaimQuery => ({ ...query, subject: publisher })\n const eventQuery = (query?: AppliedEventQuery): AppliedEventQuery => ({ ...query, subject: publisher })\n const filterClaims = async (records: ReturnType<StatementGraphViewer['claims']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n const filterEvents = async (records: ReturnType<StatementGraphViewer['events']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n\n return Object.freeze({\n claims: async (source: StatementSource, query?: ClaimQuery) => await filterClaims(viewer.claims(source, claimQuery(query))),\n claimsByObject: async (objectHash: StatementObjectHash) => await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash }))),\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery) {\n if (!isPublisherSubject(subject, publisher)) return []\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))\n },\n event: async (txHash: string, eventHash: string) => await filterEvents(viewer.event(txHash, eventHash)),\n events: async (source: StatementSource, query?: AppliedEventQuery) => await filterEvents(viewer.events(source, eventQuery(query))),\n head: async () => await viewer.head(),\n object: async (objectHash: StatementObjectHash) => await viewer.object(objectHash),\n source: async (source: StatementSource) => await viewer.source(source),\n unresolved: async (txHash: string, eventHash: string) => await viewer.unresolved(txHash, eventHash),\n })\n}\n", "import type {\n PublisherAcceptanceLifecycle,\n WakeSubscriptionLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport { selectSubscriptionActivation } from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\n\nimport type { HandshakeCatalogs } from './handshakeCatalog.ts'\nimport {\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n FinalizedSubscriptionTuple,\n PublisherAcceptanceCandidate,\n PublisherSubscriptionView,\n SubscriptionLifecycleState,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {\n readonly grantRevokedAtBlock?: number\n readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision\n}\n\nexport interface ValidatedSubscriptionAcceptance {\n readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>\n readonly lifecycle: PublisherAcceptanceLifecycle\n readonly subscriber: string\n}\n\nfunction inactiveState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const subscriptionHashes = new Set(tuples.map(tuple => tuple.subscription.objectHash))\n if (tuples.some(tuple => (tuple.grantRevokedAtBlock ?? Infinity) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Infinity) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n if (tuples.every(tuple => tuple.subscription.body.expiresAtBlock <= finalizedHead)) return 'expired'\n return 'inactive'\n}\n\nfunction pendingState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const latest = tuples.reduce<ValidatedSubscriptionTuple | undefined>((selected, candidate) =>\n selected === undefined || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision\n ? candidate\n : selected, undefined)\n if (latest === undefined) return 'inactive'\n\n const matchingAcceptances = acceptances.filter(item =>\n item.lifecycle.subscription === latest.subscription.objectHash)\n if ((latest.grantRevokedAtBlock ?? Infinity) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Infinity) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n return latest.subscription.body.expiresAtBlock <= finalizedHead ? 'expired' : 'pending'\n}\n\nexport function buildPublisherSubscriptionViews(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n publisher: string,\n finalizedHead: number,\n): PublisherSubscriptionView[] {\n const grouped = Map.groupBy(tuples, tuple => `${tuple.subscriber}:${tuple.subscription.body.subscriptionId}`)\n const result: PublisherSubscriptionView[] = []\n for (const group of grouped.values()) {\n const first = group[0]\n const groupAcceptances = acceptances.filter(item => item.subscriber === first.subscriber)\n const activation = selectSubscriptionActivation({\n acceptances: groupAcceptances.map(item => item.lifecycle),\n finalizedHead,\n publisherSource: publisher,\n subscriberSource: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n subscriptions: group.map(item => item.subscriptionLifecycle),\n })\n if (activation.ok) {\n const selected = group.find(item => item.subscription.objectHash === activation.subscription.objectHash)\n const acceptance = groupAcceptances.find(item => item.lifecycle.objectHash === activation.acceptance.objectHash)\n if (selected?.grantRevokedAtBlock !== undefined && selected.grantRevokedAtBlock <= finalizedHead) {\n result.push({\n reason: 'grant-revoked',\n state: 'revoked',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n } else {\n result.push({\n ...(acceptance === undefined ? {} : { acceptance: acceptance.claimed }),\n activeFromBlock: activation.activeFromBlock,\n pendingReplacement: activation.pendingReplacement,\n selectedSubscription: activation.subscription.objectHash,\n state: 'active',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n } else {\n result.push({\n reason: activation.reason,\n state: activation.reason === 'subscription-pending'\n ? pendingState(group, groupAcceptances, finalizedHead)\n : activation.reason === 'invalid-revision-chain' || activation.reason === 'ambiguous-acceptance'\n ? 'rejected'\n : inactiveState(group, groupAcceptances, finalizedHead),\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n }\n return result\n}\n\nfunction publicSubscriptionTuple(tuple: ValidatedSubscriptionTuple): FinalizedSubscriptionTuple {\n return {\n grant: tuple.grant,\n service: tuple.service,\n subscriber: tuple.subscriber,\n subscription: tuple.subscription,\n tupleEvent: tuple.tupleEvent,\n }\n}\n\nfunction isAcceptanceEligibleAtHead(\n tuple: ValidatedSubscriptionTuple,\n catalogs: HandshakeCatalogs,\n serviceHash: string,\n key: ClaimedHandshakeObject<PublisherEncryptionKey>,\n finalizedHead: number,\n publisher: string,\n): boolean {\n return tuple.service.objectHash === serviceHash\n && tuple.subscription.body.encryptionKey === key.objectHash\n && tuple.subscription.body.keyId === key.body.keyId\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, finalizedHead)\n && exactHandshakeKeyAt(catalogs, tuple.service, key.objectHash, finalizedHead)\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > finalizedHead)\n && (tuple.subscription.revokedAtBlock === undefined || tuple.subscription.revokedAtBlock > finalizedHead)\n && finalizedHead < Number.MAX_SAFE_INTEGER\n && tuple.subscription.body.expiresAtBlock - finalizedHead > 2\n}\n\nexport interface SelectPublisherAcceptanceCandidatesInput {\n readonly acceptances: readonly ValidatedSubscriptionAcceptance[]\n readonly catalogs: HandshakeCatalogs\n readonly finalizedHead: number\n readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>\n readonly publisher: string\n readonly service: ClaimedHandshakeObject<PublisherService>\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedSubscriptionTuple[]\n}\n\nexport function selectPublisherAcceptanceCandidates(\n input: SelectPublisherAcceptanceCandidatesInput,\n): PublisherAcceptanceCandidate[] {\n const acceptedSubscriptions = new Set(input.acceptances.map(item => item.lifecycle.subscription))\n const candidates: PublisherAcceptanceCandidate[] = []\n for (const subscription of input.subscriptions) {\n if (subscription.state !== 'pending'\n && !(subscription.state === 'active' && subscription.pendingReplacement === true)) continue\n\n const highestRevision = Math.max(...subscription.tuples.map(tuple => tuple.subscription.body.revision))\n const latest = input.tuples.filter(tuple =>\n tuple.subscriber === subscription.subscriber\n && tuple.subscription.body.subscriptionId === subscription.subscriptionId\n && tuple.subscription.body.revision === highestRevision)\n if (latest.length !== 1) continue\n const tuple = latest[0]\n if (acceptedSubscriptions.has(tuple.subscription.objectHash)\n || !isAcceptanceEligibleAtHead(\n tuple,\n input.catalogs,\n input.service.objectHash,\n input.key,\n input.finalizedHead,\n input.publisher,\n )) continue\n candidates.push({\n key: input.key,\n subscriber: tuple.subscriber,\n subscriptionId: tuple.subscription.body.subscriptionId,\n tuple: publicSubscriptionTuple(tuple),\n })\n }\n return candidates\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n SourceWakeSubscriptionActivation,\n StatementGraphGrantReadModel,\n WakeAdmissionRoute,\n WakeGrantAuthorizationRequest,\n WakeGrantAuthorizer,\n} from '@xyo-network/event-kit-protocol'\nimport {\n createStatementGraphWakeGrantAuthorizer,\n sourceWakeFilterHash,\n WakeAdmissionRouteZod,\n wakeSourceHash,\n wakeSourcesEqual,\n} from '@xyo-network/event-kit-protocol'\nimport {\n HashZod,\n NormalizedAddressZod,\n SOURCE_WAKE_EVENT_KIND,\n SOURCE_WAKE_FILTER_PROFILE,\n} from '@xyo-network/event-kit-schemas'\n\nimport type {\n EventKitHandshakeReadModel,\n PublisherSubscriptionView,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ActiveSourceWakeGrantAuthorizerOptions {\n readonly grantHash: string\n /** Finalized replay read model over the same pinned authorization chain as viewer. */\n readonly handshake: EventKitHandshakeReadModel\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n readonly viewer: StatementGraphGrantReadModel\n}\n\ninterface ActivationBinding {\n readonly grantHash: string\n readonly publisher: string\n readonly route: WakeAdmissionRoute\n readonly serviceHash: string\n}\n\nfunction exactActiveTuple(\n subscriptions: readonly PublisherSubscriptionView[],\n binding: ActivationBinding,\n expectedHead: number,\n) {\n const active = subscriptions.filter(subscription => subscription.subscriber === binding.route.controller\n && subscription.state === 'active'\n && subscription.selectedSubscription === binding.route.subscriptionHash\n && subscription.activeFromBlock !== undefined\n && subscription.activeFromBlock <= expectedHead\n && subscription.acceptance?.body.subscription === binding.route.subscriptionHash\n && subscription.acceptance.body.service === binding.serviceHash\n && subscription.acceptance.body.grant === binding.grantHash\n && subscription.acceptance.evidence.source === binding.publisher)\n if (active.length !== 1) return\n const selected = active[0]\n const tuples = selected.tuples.filter(tuple => tuple.subscription.objectHash === binding.route.subscriptionHash\n && tuple.subscriber === binding.route.controller\n && tuple.grant.objectHash === binding.grantHash\n && tuple.grant.body.publisher === binding.publisher\n && tuple.grant.body.deploymentId === binding.route.deploymentId\n && tuple.grant.body.queueId === binding.route.queueId\n && tuple.service.objectHash === binding.serviceHash\n && tuple.subscription.body.publisher === binding.publisher\n && tuple.subscription.body.chainId === binding.route.authorizationChainId\n && tuple.subscription.body.eventKind === SOURCE_WAKE_EVENT_KIND\n && tuple.subscription.body.expiresAtBlock > expectedHead)\n if (tuples.length !== 1) return\n const tuple = tuples[0]\n const service = tuple.service.body\n if (service.authorizationChainId !== binding.route.authorizationChainId\n || service.events.every(event => !wakeSourcesEqual(event.source, binding.route.source))) return\n return { selected, tuple }\n}\n\n/**\n * Production D-006 receiver authorization: one exact active D-005 subscription\n * plus its exact still-live grant. The injected view must be caught up to the\n * receiver's independent uncapped XL1 finalized head before admission.\n */\nexport function createActiveSourceWakeGrantAuthorizer(\n options: ActiveSourceWakeGrantAuthorizerOptions,\n): WakeGrantAuthorizer {\n const parsedRoute = WakeAdmissionRouteZod.parse(options.route)\n const binding: ActivationBinding = Object.freeze({\n route: Object.freeze({ ...parsedRoute, source: Object.freeze(parsedRoute.source) }),\n publisher: NormalizedAddressZod.parse(options.publisher),\n serviceHash: HashZod.parse(options.serviceHash),\n grantHash: HashZod.parse(options.grantHash),\n })\n const { handshake, viewer } = options\n return createStatementGraphWakeGrantAuthorizer({\n authorizationChainId: binding.route.authorizationChainId,\n source: binding.route.source,\n viewer,\n activation: {\n async read(request: WakeGrantAuthorizationRequest): Promise<SourceWakeSubscriptionActivation | undefined> {\n if (request.publisher !== binding.publisher\n || request.controller !== binding.route.controller\n || request.deploymentId !== binding.route.deploymentId\n || request.queueId !== binding.route.queueId\n || request.subscriptionHash !== binding.route.subscriptionHash\n || request.filterHash !== binding.route.filterHash) return undefined\n const filterHash = await sourceWakeFilterHash({\n schema: SOURCE_WAKE_FILTER_PROFILE,\n source: binding.route.source,\n fromPosition: binding.route.fromPosition,\n maxPositionsPerWake: binding.route.maxPositionsPerWake,\n })\n if (filterHash !== binding.route.filterHash) throw new TypeError('Route filter does not match its canonical hash')\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection is not at the trusted finalized head')\n const view = await handshake.subscriber({\n chainId: binding.route.authorizationChainId,\n eventKind: SOURCE_WAKE_EVENT_KIND,\n finalizedHead: request.expectedHead,\n publisher: binding.publisher,\n subscriber: binding.route.controller,\n })\n if (!view.ok || view.finalizedHead !== request.expectedHead || view.indexedThrough !== request.expectedHead) {\n throw new Error('Subscription projection is not at the trusted finalized head')\n }\n const exact = exactActiveTuple(view.subscriptions, binding, request.expectedHead)\n if (exact === undefined) return undefined\n if (await viewer.head() !== request.expectedHead) throw new Error('Grant projection changed during activation lookup')\n const activeFromBlock = exact.selected.activeFromBlock\n if (activeFromBlock === undefined) return undefined\n return {\n atBlock: request.expectedHead,\n activeFromBlock,\n expiresAtBlock: exact.tuple.subscription.body.expiresAtBlock,\n authorizationChainId: binding.route.authorizationChainId,\n controller: binding.route.controller,\n publisher: binding.publisher,\n deploymentId: binding.route.deploymentId,\n ...(binding.route.queueId === undefined ? {} : { queueId: binding.route.queueId }),\n sourceHash: await wakeSourceHash(binding.route.source),\n filterHash,\n subscriptionHash: binding.route.subscriptionHash,\n serviceHash: binding.serviceHash,\n grantHash: binding.grantHash,\n }\n },\n },\n })\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ClaimRecord,\n ObjectRecord,\n UnresolvedEventReference,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type { EventKitReplayCheckpoint } from './replayCheckpoint.ts'\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction recordKey(record: Pick<AppliedEventRecord, 'eventHash' | 'hashIndex' | 'txHash'>): string {\n return `${eventKey(record)}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || recordKey(left).localeCompare(recordKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction matchesClaim(record: ClaimRecord, query?: ClaimQuery): boolean {\n return (query?.objectHash === undefined || record.objectHash === query.objectHash)\n && (query?.subject === undefined || normalizeAddress(record.subject) === normalizeAddress(query.subject))\n && (query?.declaredObjectSchemaPrefix === undefined\n || record.declaredObjectSchema.startsWith(query.declaredObjectSchemaPrefix))\n}\n\nfunction sortClaims(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction buildClaims(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const claims = new Map<string, ClaimRecord>()\n for (const record of applied.toSorted(compareApplied)) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n const prior = claims.get(key)\n if (prior === undefined) {\n claims.set(key, {\n declaredObjectSchema: record.objectSchema,\n firstBlock: record.block,\n firstEventHash: record.eventHash,\n lastBlock: record.block,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n } else if (record.block > prior.lastBlock) {\n claims.set(key, { ...prior, lastBlock: record.block })\n }\n }\n return sortClaims(claims.values().toArray())\n}\n\nfunction withoutSchema(body: Readonly<Record<string, unknown>>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(body).filter(([key]) => key !== 'schema'))\n}\n\n/** Restores the canonical Statement Graph read surface from a durable Event Kit checkpoint. */\nexport function createCheckpointStatementGraphViewer(\n checkpoint: EventKitReplayCheckpoint,\n): StatementGraphViewer {\n const applied = checkpoint.applied.toSorted(compareApplied)\n const claims = buildClaims(applied)\n const bodies = new Map(checkpoint.bodies.map(entry => [entry.hash, entry.body] as const))\n const declaredSchemas = new Map<string, string>()\n for (const record of applied) {\n if (!declaredSchemas.has(record.objectHash)) declaredSchemas.set(record.objectHash, record.objectSchema)\n }\n const unresolved = checkpoint.blocked?.unresolvedEvents ?? []\n\n return Object.freeze({\n async claims(source: StatementSource, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(source)\n return claims.filter(record => normalizeAddress(record.source) === normalized && matchesClaim(record, query))\n },\n\n claimsByObject: async (objectHash: StatementObjectHash): Promise<ClaimRecord[]> => claims.filter(record => record.objectHash === objectHash),\n\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery): Promise<ClaimRecord[]> {\n const normalized = normalizeAddress(subject)\n return claims.filter(record => normalizeAddress(record.subject) === normalized && matchesClaim(record, query))\n },\n\n event: async (txHash: string, eventHash: string): Promise<AppliedEventRecord[]> => applied.filter(record => record.txHash === txHash && record.eventHash === eventHash),\n\n async events(source: StatementSource, query?: AppliedEventQuery): Promise<AppliedEventRecord[]> {\n const normalized = normalizeAddress(source)\n return applied.filter(record => normalizeAddress(record.source) === normalized\n && (query?.fromBlock === undefined || record.block >= query.fromBlock)\n && (query?.toBlock === undefined || record.block <= query.toBlock)\n && (query?.objectSchemaPrefix === undefined || record.objectSchema.startsWith(query.objectSchemaPrefix))\n && (query?.subject === undefined\n || normalizeAddress(record.subject) === normalizeAddress(query.subject)))\n },\n\n async head(): Promise<number> {\n if (checkpoint.indexedThrough === null) throw new Error('Event Kit replay has not indexed its floor block')\n return checkpoint.indexedThrough\n },\n\n async object(objectHash: StatementObjectHash): Promise<ObjectRecord | undefined> {\n const body = bodies.get(objectHash)\n const declaredSchema = declaredSchemas.get(objectHash)\n if (body === undefined || declaredSchema === undefined) return undefined\n return {\n assurance: 'resolved',\n declaredSchema,\n objectHash,\n params: withoutSchema(body),\n }\n },\n\n async source(source: StatementSource) {\n const normalized = normalizeAddress(source)\n const records = applied.filter(record => normalizeAddress(record.source) === normalized)\n const blocks = records.map(record => record.block)\n const uniqueClaims = new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash)))\n return {\n claims: uniqueClaims.size,\n firstBlock: blocks.length === 0 ? null : Math.min(...blocks),\n lastBlock: blocks.length === 0 ? null : Math.max(...blocks),\n source: normalized as StatementSource,\n }\n },\n\n unresolved: async (txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> => unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash),\n })\n}\n", "import {\n EncryptedWakeSubscriptionSchema,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionRevocationSchema,\n} from '@xyo-network/event-kit-schemas'\n\n/**\n * Exact Statement Graph object vocabulary folded by the Event Kit handshake\n * projection. Challenge and response bodies are datalake attachments named by\n * an acceptance; they are not independently claimed lifecycle objects.\n */\nexport const EventKitClaimedObjectSchemas = Object.freeze([\n PublisherServiceSchema,\n PublisherEncryptionKeySchema,\n PublisherServiceRevocationSchema,\n PublisherEncryptionKeyRevocationSchema,\n EncryptedWakeSubscriptionSchema,\n WakeGrantObjectSchema,\n WakeSubscriptionRevocationSchema,\n WakeGrantRevocationSchema,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceRevocationSchema,\n] as const)\n\nexport const EventKitClaimedObjectSchemaSet: ReadonlySet<string> = new Set(EventKitClaimedObjectSchemas)\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n normalizeAddress,\n NormalizedAddressZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n AppliedEventRecord,\n ReplayContract,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport { STATEMENT_FOLD_VERSION } from '@xyo-network/xl1-statement-graph-schemas'\nimport type {\n BodyReader,\n StatementScanCheckpoint,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport {\n resolveVerifiedBodies,\n scanFinalizedStatements,\n} from '@xyo-network/xl1-statement-graph-sdk'\n\nimport { createCheckpointStatementGraphViewer } from './checkpointViewer.ts'\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\nimport type { FinalizedEventKitReplayChain } from './finalizedReplayChain.ts'\nimport {\n exactFinalizedBlockHash,\n lineageValidatingScanChain,\n requireCurrentReplayChain,\n} from './finalizedReplayChain.ts'\nimport type {\n EventKitReplayCheckpoint,\n EventKitReplayCheckpointIdentity,\n ReplayBlockedState,\n ReplayCorruptBody,\n ResolvedReplayBody,\n} from './replayCheckpoint.ts'\nimport {\n EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n EventKitReplayCheckpointZod,\n loadEventKitReplayCheckpoint,\n} from './replayCheckpoint.ts'\n\nexport interface EventKitReplayCheckpointStore {\n /** Returns durable JSON-compatible checkpoint content, if one exists. */\n load(): Promise<unknown>\n /** Must atomically replace the prior checkpoint or reject without publishing it. */\n save(checkpoint: EventKitReplayCheckpoint): Promise<void>\n}\n\nexport interface FinalizedEventKitReplayOptions extends EventKitReplayCheckpointIdentity {\n readonly bodies: BodyReader\n readonly chain: FinalizedEventKitReplayChain\n /** Maximum contiguous blocks staged before one atomic checkpoint save. */\n readonly checkpointBatchSize?: number\n readonly checkpointStore: EventKitReplayCheckpointStore\n /** Maximum blocks requested by each Statement Graph bulk read. */\n readonly scanBatchSize?: number\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayAnchor {\n readonly block: number\n readonly hash: string\n}\n\nexport interface FinalizedEventKitReplaySyncOptions {\n /** Advance at most this many blocks while still reporting the uncapped live finalized head. */\n readonly maxBlocks?: number\n readonly signal?: AbortSignal\n}\n\nexport interface FinalizedEventKitReplayController {\n /** Exact canonical XL1 root retained with the current durable projection. */\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null\n /** Resolve a verified lifecycle or acceptance-attachment body from the durable projection. */\n body(hash: string): Readonly<Record<string, unknown>> | undefined\n snapshot(): Readonly<EventKitReplayCheckpoint>\n status(): FinalizedEventKitReplayStatus\n /** Walks clean finalized blocks and stops before the first unavailable body boundary. */\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\n\nconst DEFAULT_CHECKPOINT_BATCH_SIZE = 4096\n// The public REST viewer may implement a bulk range as concurrent per-block\n// requests. Stay within the resident publisher's default bounded HTTP budget.\nconst DEFAULT_SCAN_BATCH_SIZE = 16\n\nfunction requireHead(value: bigint | number): number {\n const head = Number(value)\n if (!Number.isSafeInteger(head) || head < 0) {\n throw new TypeError(`finalized head must be a nonnegative safe integer, received ${String(value)}`)\n }\n return head\n}\n\nfunction requireFloor(value: number): number {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`floorBlock must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction requirePositiveInteger(value: number | undefined, fallback: number, name: string): number {\n const selected = value ?? fallback\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new TypeError(`${name} must be a positive safe integer, received ${String(selected)}`)\n }\n return selected\n}\n\nfunction requireMaxBlocks(value: number | undefined): number | undefined {\n if (value !== undefined && (!Number.isSafeInteger(value) || value < 0)) {\n throw new TypeError(`maxBlocks must be a nonnegative safe integer, received ${String(value)}`)\n }\n return value\n}\n\nfunction replayContract(options: FinalizedEventKitReplayOptions, throughBlock: number): ReplayContract {\n return {\n eventBodyCorpus: { sourceId: options.sourceId },\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedSchemaPolicy: { foldedObjectSchemas: [...EventKitClaimedObjectSchemas] },\n network: options.network,\n throughBlock,\n }\n}\n\nfunction initialCheckpoint(options: FinalizedEventKitReplayOptions): EventKitReplayCheckpoint {\n return EventKitReplayCheckpointZod.parse({\n applied: [],\n bodies: [],\n chainId: options.chainId,\n finalizedHead: 0,\n floorBlock: options.floorBlock,\n foldVersion: STATEMENT_FOLD_VERSION,\n indexedThrough: null,\n indexedThroughHash: null,\n network: options.network,\n objectSchemas: [...EventKitClaimedObjectSchemas],\n publisher: options.publisher,\n scan: null,\n sourceId: options.sourceId,\n version: EVENT_KIT_REPLAY_CHECKPOINT_VERSION,\n })\n}\n\nfunction corruptKey(record: ReplayCorruptBody): string {\n return `${record.claimedHash ?? ''}:${record.computedHash}`\n}\n\nfunction uniqueCorrupt(records: readonly ReplayCorruptBody[]): ReplayCorruptBody[] {\n const unique = new Map(records.map(record => [corruptKey(record), record]))\n return unique.values().toArray()\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n const unique = new Set(values)\n return unique.values().toArray()\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction mergeApplied(\n existing: readonly AppliedEventRecord[],\n additions: readonly AppliedEventRecord[],\n): AppliedEventRecord[] {\n const merged = new Map(existing.map(record => [appliedKey(record), record] as const))\n for (const record of additions) {\n const key = appliedKey(record)\n const prior = merged.get(key)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(record)) {\n throw new Error(`applied-event identity collision at ${key}`)\n }\n merged.set(key, record)\n }\n return merged.values().toArray().toSorted((left, right) =>\n left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex)\n}\n\nfunction mergeBodies(\n existing: readonly ResolvedReplayBody[],\n additions: ReadonlyMap<string, Record<string, unknown>>,\n): ResolvedReplayBody[] {\n const merged = new Map<string, Record<string, unknown>>(existing.map(entry => [entry.hash, entry.body] as const))\n for (const [hash, body] of additions) {\n const prior = merged.get(hash)\n if (prior !== undefined && JSON.stringify(prior) !== JSON.stringify(body)) {\n throw new Error(`content-addressed body collision for ${hash}`)\n }\n merged.set(hash, body)\n }\n return merged.entries()\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toArray()\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedRange {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n readonly throughHash: string\n}\n\nasync function stageAppliedBlock(\n options: FinalizedEventKitReplayOptions,\n applied: readonly AppliedEventRecord[],\n) {\n const appliedObjectHashes = uniqueStrings(applied.map(record => record.objectHash))\n const objects = await resolveVerifiedBodies(options.bodies, appliedObjectHashes)\n const missingObjects = appliedObjectHashes.filter(hash => !objects.bodies.has(hash))\n const schemaMismatchedObjects = uniqueStrings(applied.flatMap((record) => {\n const body = objects.bodies.get(record.objectHash)\n return body !== undefined && body.schema !== record.objectSchema ? [record.objectHash] : []\n }))\n\n const acceptanceAttachments: string[] = []\n for (const record of applied) {\n if (\n normalizeAddress(record.source) !== options.publisher\n || record.objectSchema !== WakeSubscriptionAcceptanceSchema\n ) continue\n const acceptance = WakeSubscriptionAcceptanceZod.safeParse(objects.bodies.get(record.objectHash))\n if (acceptance.success) acceptanceAttachments.push(acceptance.data.challenge, acceptance.data.response)\n }\n const attachmentHashes = uniqueStrings(acceptanceAttachments)\n const attachments = await resolveVerifiedBodies(options.bodies, attachmentHashes)\n const missingAttachments = attachmentHashes.filter(hash => !attachments.bodies.has(hash))\n\n const corrupt = uniqueCorrupt([\n ...objects.corrupt,\n ...attachments.corrupt,\n ])\n const objectHashes = uniqueStrings([\n ...missingObjects,\n ...schemaMismatchedObjects,\n ...missingAttachments,\n ]).map(hash => HashZod.parse(hash))\n return {\n bodies: new Map([\n ...objects.bodies,\n ...attachments.bodies,\n ]),\n corrupt,\n objectHashes,\n }\n}\n\nasync function stageRange(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n fromBlock: number,\n throughBlock: number,\n signal?: AbortSignal,\n): Promise<StagedRange> {\n signal?.throwIfAborted()\n const beforeHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n const result = await scanFinalizedStatements(\n lineageValidatingScanChain(options.chain, options.chainId),\n options.bodies,\n replayContract(options, throughBlock),\n {\n batchSize: requirePositiveInteger(options.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n ...(signal === undefined ? {} : { signal }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: throughBlock,\n },\n )\n signal?.throwIfAborted()\n const throughHash = await exactFinalizedBlockHash(options.chain, throughBlock, options.chainId)\n signal?.throwIfAborted()\n if (beforeHash !== throughHash) {\n throw new Error(`finalized block root changed while staging through ${throughBlock}`)\n }\n if (result.head !== throughBlock || result.checkpoint.contract.throughBlock !== throughBlock) {\n throw new RangeError(\n `finalized range scan stopped at ${result.head}/${result.checkpoint.contract.throughBlock}; requested ${throughBlock}`,\n )\n }\n\n // The upstream scan checkpoint is necessarily chainwide, but this durable\n // projection belongs to one advertised publisher. A Claim's subject is the\n // authoritative rendezvous key; unrelated subjects must neither enter this\n // projection nor make its progress depend on their off-chain bodies.\n const applied = result.fold.applied.filter(record => record.block >= fromBlock\n && record.block <= throughBlock\n && normalizeAddress(record.subject) === options.publisher)\n const appliedByBlock = Map.groupBy(applied, record => record.block)\n const unresolvedByBlock = Map.groupBy(\n result.unresolved.filter(event => event.block >= fromBlock && event.block <= throughBlock),\n event => event.block,\n )\n const relevant = new Set([\n ...appliedByBlock.keys(),\n ...unresolvedByBlock.keys(),\n ])\n const relevantBlocks = relevant.values().toArray().toSorted((left, right) => left - right)\n const bodies = new Map<string, Record<string, unknown>>()\n for (const block of relevantBlocks) {\n signal?.throwIfAborted()\n const staged = await stageAppliedBlock(options, appliedByBlock.get(block) ?? [])\n for (const [hash, body] of staged.bodies) bodies.set(hash, body)\n const unresolvedEvents = unresolvedByBlock.get(block) ?? []\n if (unresolvedEvents.length > 0 || staged.objectHashes.length > 0 || staged.corrupt.length > 0) {\n return {\n applied,\n blocked: {\n atBlock: block,\n corrupt: staged.corrupt,\n objectHashes: staged.objectHashes,\n unresolvedEvents,\n },\n bodies,\n scan: result.checkpoint,\n throughHash,\n }\n }\n }\n return {\n applied, bodies, scan: result.checkpoint, throughHash,\n }\n}\n\nclass DefaultFinalizedEventKitReplayController implements FinalizedEventKitReplayController {\n #checkpoint: EventKitReplayCheckpoint\n readonly #options: FinalizedEventKitReplayOptions\n #syncTail: Promise<unknown> = Promise.resolve()\n\n constructor(options: FinalizedEventKitReplayOptions, checkpoint: EventKitReplayCheckpoint) {\n this.#options = options\n this.#checkpoint = checkpoint\n }\n\n anchor(): Readonly<FinalizedEventKitReplayAnchor> | null {\n return this.#checkpoint.indexedThrough === null || this.#checkpoint.indexedThroughHash === null\n ? null\n : Object.freeze({ block: this.#checkpoint.indexedThrough, hash: this.#checkpoint.indexedThroughHash })\n }\n\n body(hash: string): Readonly<Record<string, unknown>> | undefined {\n return this.#checkpoint.bodies.find(entry => entry.hash === hash)?.body\n }\n\n snapshot(): Readonly<EventKitReplayCheckpoint> {\n return this.#checkpoint\n }\n\n status(): FinalizedEventKitReplayStatus {\n return {\n ...(this.#checkpoint.blocked === undefined ? {} : { blocked: this.#checkpoint.blocked }),\n finalizedHead: this.#checkpoint.finalizedHead,\n indexedThrough: this.#checkpoint.indexedThrough,\n }\n }\n\n sync(options?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const previous = this.#syncTail\n const result = (async () => {\n try {\n await previous\n } catch {\n // Previous sync still releases the tail; this call must run either way.\n }\n return await this.#syncOnce(options)\n })()\n this.#syncTail = (async () => {\n try {\n await result\n return true\n } catch {\n return false\n }\n })()\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #commitRange(\n fromBlock: number,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<boolean> {\n const staged = await stageRange(this.#options, this.#checkpoint, fromBlock, throughBlock, signal)\n signal?.throwIfAborted()\n if (staged.blocked !== undefined) {\n const blockedAt = staged.blocked.atBlock\n if (blockedAt > fromBlock) {\n const prefixBlocked = await this.#commitRange(fromBlock, blockedAt - 1, finalizedHead, signal)\n if (prefixBlocked) return true\n }\n\n // Mint the diagnostic against the exact next block and the prefix's scan\n // checkpoint. Never truncate the wider staged checkpoint by hand.\n const exact = await stageRange(this.#options, this.#checkpoint, blockedAt, blockedAt, signal)\n signal?.throwIfAborted()\n if (exact.blocked === undefined) {\n await this.#commitStaged(exact, blockedAt, finalizedHead, signal)\n return blockedAt !== throughBlock && await this.#commitRange(blockedAt + 1, throughBlock, finalizedHead, signal)\n }\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: exact.blocked,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return true\n }\n\n await this.#commitStaged(staged, throughBlock, finalizedHead, signal)\n return false\n }\n\n async #commitStaged(\n staged: StagedRange,\n throughBlock: number,\n finalizedHead: number,\n signal?: AbortSignal,\n ): Promise<void> {\n const { blocked: _blocked, ...unblocked } = this.#checkpoint\n const committed = EventKitReplayCheckpointZod.parse({\n ...unblocked,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n finalizedHead,\n indexedThrough: throughBlock,\n indexedThroughHash: staged.throughHash,\n scan: staged.scan,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n }\n\n async #syncOnce(rawOptions?: FinalizedEventKitReplaySyncOptions): Promise<FinalizedEventKitReplayStatus> {\n const maxBlocks = requireMaxBlocks(rawOptions?.maxBlocks)\n const signal = rawOptions?.signal\n signal?.throwIfAborted()\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\n signal?.throwIfAborted()\n await requireCurrentReplayChain(this.#options.chain, finalizedHead, this.#options.chainId)\n if (finalizedHead < this.#checkpoint.finalizedHead) {\n throw new RangeError(\n `finalized head regressed from ${this.#checkpoint.finalizedHead} to ${finalizedHead}; refusing to roll back`,\n )\n }\n const indexedThrough = this.#checkpoint.indexedThrough\n if (indexedThrough !== null && finalizedHead < indexedThrough) {\n throw new RangeError(`finalized head ${finalizedHead} is behind indexedThrough ${indexedThrough}`)\n }\n\n let next = indexedThrough === null ? this.#options.floorBlock : indexedThrough + 1\n const remaining = next <= finalizedHead ? finalizedHead - next + 1 : 0\n const budget = maxBlocks === undefined ? remaining : Math.min(maxBlocks, remaining)\n const target = next + (budget === 0 ? -1 : budget - 1)\n const checkpointBatchSize = requirePositiveInteger(\n this.#options.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n )\n while (next <= target) {\n signal?.throwIfAborted()\n const throughBlock = Math.min(target, next + Math.min(checkpointBatchSize, target - next + 1) - 1)\n if (await this.#commitRange(next, throughBlock, finalizedHead, signal)) return this.status()\n next = throughBlock + 1\n }\n\n if (this.#checkpoint.finalizedHead !== finalizedHead) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n finalizedHead,\n })\n signal?.throwIfAborted()\n await this.#options.checkpointStore.save(observed)\n this.#checkpoint = observed\n }\n return this.status()\n }\n}\n\nexport async function createFinalizedEventKitReplayController(\n rawOptions: FinalizedEventKitReplayOptions,\n): Promise<FinalizedEventKitReplayController> {\n const options: FinalizedEventKitReplayOptions = {\n ...rawOptions,\n chainId: ChainIdZod.parse(rawOptions.chainId),\n checkpointBatchSize: requirePositiveInteger(\n rawOptions.checkpointBatchSize,\n DEFAULT_CHECKPOINT_BATCH_SIZE,\n 'checkpointBatchSize',\n ),\n floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\n scanBatchSize: requirePositiveInteger(rawOptions.scanBatchSize, DEFAULT_SCAN_BATCH_SIZE, 'scanBatchSize'),\n sourceId: rawOptions.sourceId.trim(),\n }\n if (options.network.length === 0) throw new TypeError('network must not be empty')\n if (options.sourceId.length === 0) throw new TypeError('sourceId must not be empty')\n\n const loaded = await loadEventKitReplayCheckpoint(await options.checkpointStore.load(), options)\n if (loaded.status === 'corrupt' || loaded.status === 'identity-mismatch') {\n throw new Error(`cannot load Event Kit replay checkpoint: ${loaded.detail}`)\n }\n const checkpoint = loaded.status === 'valid' ? loaded.checkpoint : initialCheckpoint(options)\n return new DefaultFinalizedEventKitReplayController(options, checkpoint)\n}\n\n/** Simple structural fixture; production durability belongs to the storage adapter. */\nexport function createMemoryEventKitReplayCheckpointStore(\n initial?: unknown,\n): EventKitReplayCheckpointStore & { readonly saved: readonly EventKitReplayCheckpoint[] } {\n let value = initial\n const saved: EventKitReplayCheckpoint[] = []\n return {\n load: async (): Promise<unknown> => value,\n async save(checkpoint: EventKitReplayCheckpoint): Promise<void> {\n value = checkpoint\n saved.push(checkpoint)\n },\n saved,\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport { ChainIdZod } from '@xyo-network/event-kit-schemas'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { isBlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type { FinalizedBlockViewer } from '@xyo-network/xl1-statement-graph-sdk'\n\ntype Promisable<T> = PromiseLike<T> | T\n\n/**\n * Public XL1 viewers expose height-aware chain identity through `chainId(block)`.\n * Fakes and older adapters may omit it, in which case replay remains deliberately\n * restricted to a single ChainId.\n */\nexport interface FinalizedEventKitReplayChain extends FinalizedBlockViewer {\n chainId?(block: number | 'latest'): Promisable<unknown>\n}\n\nasync function requireBlockIdentity(\n chain: FinalizedEventKitReplayChain,\n raw: unknown,\n chainId: string,\n requestedBlock?: number,\n) {\n if (!Array.isArray(raw) || raw.length !== 2 || !Array.isArray(raw[1])) {\n throw new TypeError(requestedBlock === undefined\n ? 'finalized block is unavailable'\n : `finalized block ${requestedBlock} is unavailable`)\n }\n const header: unknown = raw[0]\n if (!isBlockBoundWitness(header) || !Number.isSafeInteger(header.block) || header.block < 0) {\n throw new TypeError('finalized block has an invalid header')\n }\n const block = header.block\n const expectedChainId = chain.chainId === undefined\n ? chainId\n : ChainIdZod.parse(String(await chain.chainId(block)).toLowerCase())\n if ((requestedBlock !== undefined && block !== requestedBlock) || header.chain !== expectedChainId) {\n throw new TypeError(`finalized block ${block} does not match the configured chain`)\n }\n return header\n}\n\nexport async function exactFinalizedBlockHash(\n chain: FinalizedEventKitReplayChain,\n block: number,\n chainId: string,\n): Promise<string> {\n const raw = await chain.block.blockByNumber(block)\n const header = await requireBlockIdentity(chain, raw, chainId, block)\n const hash = await PayloadBuilder.hash(PayloadBuilder.omitStorageMeta(header))\n const storageHash = (header as unknown as { readonly _hash?: unknown })._hash\n if (typeof storageHash === 'string' && storageHash !== hash) {\n throw new TypeError(`finalized block ${block} has invalid storage hash metadata`)\n }\n return HashZod.parse(hash)\n}\n\n/** Validates every block actually consumed by the scanner without adding a second range read. */\nexport function lineageValidatingScanChain(\n chain: FinalizedEventKitReplayChain,\n chainId: string,\n): FinalizedBlockViewer {\n return {\n block: {\n async blockByNumber(block) {\n const raw = await chain.block.blockByNumber(block)\n await requireBlockIdentity(chain, raw, chainId, block)\n return raw\n },\n ...(chain.block.blocksByNumber === undefined\n ? {}\n : {\n async blocksByNumber(high: number, count: number) {\n const values = await chain.block.blocksByNumber?.(high, count) ?? []\n for (const value of values) await requireBlockIdentity(chain, value, chainId)\n return values\n },\n }),\n },\n finalization: chain.finalization,\n }\n}\n\nexport async function requireCurrentReplayChain(\n chain: FinalizedEventKitReplayChain,\n finalizedHead: number,\n chainId: string,\n): Promise<void> {\n if (chain.chainId === undefined) return\n const headChainId = ChainIdZod.parse(String(await chain.chainId(finalizedHead)).toLowerCase())\n if (headChainId !== chainId) {\n throw new TypeError(`finalized head ${finalizedHead} does not match the configured current chain`)\n }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport {\n type AppliedEventRecord,\n AppliedEventRecordZod,\n BlockNumberZod,\n type ClaimRecord,\n STATEMENT_FOLD_VERSION,\n UnresolvedEventReferenceZod,\n} from '@xyo-network/xl1-statement-graph-schemas'\nimport {\n assembleCheckpointRecords,\n StatementScanCheckpointZod,\n} from '@xyo-network/xl1-statement-graph-sdk'\nimport { z } from 'zod'\n\nimport { EventKitClaimedObjectSchemas } from './eventKitSchemaPolicy.ts'\n\nexport const EVENT_KIT_REPLAY_CHECKPOINT_VERSION = 3 as const\n\nexport const ResolvedReplayBodyZod = z.strictObject({\n body: z.record(z.string(), z.unknown()),\n hash: HashZod,\n})\nexport type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>\n\nexport const ReplayCorruptBodyZod = z.strictObject({\n claimedHash: z.string().optional(),\n computedHash: z.string(),\n})\nexport type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>\n\nexport const ReplayBlockedStateZod = z.strictObject({\n atBlock: BlockNumberZod,\n corrupt: z.array(ReplayCorruptBodyZod),\n objectHashes: z.array(HashZod),\n unresolvedEvents: z.array(UnresolvedEventReferenceZod),\n})\nexport type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>\n\n/**\n * Durable, lossless Event Kit projection checkpoint.\n *\n * The upstream Statement Graph checkpoint deliberately retains only the slim\n * current claim set. Event Kit additionally persists the complete applied\n * event stream for its publisher subject because exact same-claim subscription\n * fans cannot be recovered from that current set after restart. The embedded\n * upstream scan checkpoint remains chainwide because its replay contract has\n * no subject filter.\n */\nexport const EventKitReplayCheckpointZod = z.strictObject({\n applied: z.array(AppliedEventRecordZod),\n blocked: ReplayBlockedStateZod.optional(),\n bodies: z.array(ResolvedReplayBodyZod),\n chainId: ChainIdZod,\n finalizedHead: BlockNumberZod,\n floorBlock: BlockNumberZod,\n foldVersion: z.literal(STATEMENT_FOLD_VERSION),\n indexedThrough: z.union([BlockNumberZod, z.null()]),\n indexedThroughHash: z.union([HashZod, z.null()]),\n network: z.string().min(1),\n objectSchemas: z.tuple(EventKitClaimedObjectSchemas.map(schema => z.literal(schema)) as [\n z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[0]>,\n ...z.ZodLiteral<(typeof EventKitClaimedObjectSchemas)[number]>[],\n ]),\n publisher: NormalizedAddressZod,\n scan: z.union([StatementScanCheckpointZod, z.null()]),\n sourceId: z.string().min(1),\n version: z.literal(EVENT_KIT_REPLAY_CHECKPOINT_VERSION),\n})\nexport type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>\n\nexport interface EventKitReplayCheckpointIdentity {\n readonly chainId: string\n readonly floorBlock: number\n readonly network: string\n readonly publisher: string\n readonly sourceId: string\n}\n\nconst LegacyEventKitReplayCheckpointIdentityZod = z.looseObject({\n chainId: ChainIdZod,\n floorBlock: BlockNumberZod,\n network: z.string().min(1),\n publisher: NormalizedAddressZod,\n sourceId: z.string().min(1),\n version: z.literal(2),\n})\n\nexport type EventKitReplayCheckpointLoad\n = | { readonly checkpoint: EventKitReplayCheckpoint; readonly status: 'valid' }\n | { readonly detail: string; readonly status: 'corrupt' | 'identity-mismatch' }\n | { readonly status: 'missing' }\n\nfunction checkpointIdentityError(\n checkpoint: EventKitReplayCheckpointIdentity,\n identity: EventKitReplayCheckpointIdentity,\n): string | undefined {\n if (checkpoint.chainId !== identity.chainId) return `chainId ${checkpoint.chainId} != ${identity.chainId}`\n if (checkpoint.floorBlock !== identity.floorBlock) return `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`\n if (checkpoint.network !== identity.network) return `network ${checkpoint.network} != ${identity.network}`\n if (checkpoint.sourceId !== identity.sourceId) return `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`\n return checkpoint.publisher === identity.publisher ? undefined : `publisher ${checkpoint.publisher} != ${identity.publisher}`\n}\n\nfunction appliedKey(record: AppliedEventRecord): string {\n return `${record.txHash}:${record.eventHash}:${record.hashIndex}`\n}\n\nfunction compareApplied(left: AppliedEventRecord, right: AppliedEventRecord): number {\n return left.block - right.block\n || left.blockEventOrdinal.tx - right.blockEventOrdinal.tx\n || left.blockEventOrdinal.event - right.blockEventOrdinal.event\n || left.hashIndex - right.hashIndex\n || appliedKey(left).localeCompare(appliedKey(right))\n}\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nfunction claimKey(source: string, subject: string, objectHash: string): string {\n return `${normalizeAddress(source)}|${normalizeAddress(subject)}|${objectHash}`\n}\n\nfunction eventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction sortClaimRecords(records: ClaimRecord[]): ClaimRecord[] {\n return records.toSorted((left, right) =>\n claimKey(left.source, left.subject, left.objectHash)\n .localeCompare(claimKey(right.source, right.subject, right.objectHash)))\n}\n\nfunction expectedClaimRecords(applied: readonly AppliedEventRecord[]): ClaimRecord[] {\n const records = new Map<string, ClaimRecord>()\n for (const event of applied.toSorted(compareApplied)) {\n const key = claimKey(event.source, event.subject, event.objectHash)\n const prior = records.get(key)\n if (prior === undefined) {\n records.set(key, {\n declaredObjectSchema: event.objectSchema,\n firstBlock: event.block,\n firstEventHash: event.eventHash,\n lastBlock: event.block,\n objectHash: event.objectHash,\n source: event.source,\n subject: event.subject,\n })\n } else if (event.block > prior.lastBlock) {\n records.set(key, { ...prior, lastBlock: event.block })\n }\n }\n return sortClaimRecords(records.values().toArray())\n}\n\nfunction sameClaimRecords(left: readonly ClaimRecord[], right: readonly ClaimRecord[]): boolean {\n return left.length === right.length && left.every((record, index) => {\n const candidate = right[index]\n return candidate?.objectHash === record.objectHash\n && record.declaredObjectSchema === candidate.declaredObjectSchema\n && record.firstBlock === candidate.firstBlock\n && record.firstEventHash === candidate.firstEventHash\n && record.lastBlock === candidate.lastBlock\n && normalizeAddress(record.source) === normalizeAddress(candidate.source)\n && normalizeAddress(record.subject) === normalizeAddress(candidate.subject)\n })\n}\n\nfunction progressIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, indexedThroughHash } = checkpoint\n if (indexedThrough !== null && indexedThrough > checkpoint.finalizedHead) {\n return `indexedThrough ${indexedThrough} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n if (indexedThrough !== null && indexedThrough < checkpoint.floorBlock) {\n return `indexedThrough ${indexedThrough} precedes floorBlock ${checkpoint.floorBlock}`\n }\n if (indexedThrough === null && checkpoint.scan !== null) {\n return 'scan checkpoint exists before floorBlock has been indexed'\n }\n if (indexedThrough !== null && checkpoint.scan === null) {\n return 'scan checkpoint is missing for indexed state'\n }\n if ((indexedThrough === null) !== (indexedThroughHash === null)) {\n return 'indexedThrough and indexedThroughHash must be present together'\n }\n if (indexedThrough === null && checkpoint.applied.length > 0) {\n return 'applied events exist before floorBlock has been indexed'\n }\n return indexedThrough === null && checkpoint.bodies.length > 0 ? 'resolved bodies exist before floorBlock has been indexed' : undefined\n}\n\nfunction bodySetIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const hashes = new Set<string>()\n for (const entry of checkpoint.bodies) {\n if (hashes.has(entry.hash)) return `duplicate persisted body ${entry.hash}`\n if (typeof entry.body.schema !== 'string' || entry.body.schema.length === 0) {\n return `persisted body ${entry.hash} has no schema`\n }\n hashes.add(entry.hash)\n }\n return undefined\n}\n\nfunction appliedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough } = checkpoint\n const bodyByHash = new Map(checkpoint.bodies.map(entry => [entry.hash, entry] as const))\n const appliedIdentities = new Set<string>()\n const eventObjects = new Set<string>()\n const eventLocations = new Map<string, string>()\n let prior: AppliedEventRecord | undefined\n for (const event of checkpoint.applied) {\n const key = appliedKey(event)\n if (normalizeAddress(event.subject) !== normalizeAddress(checkpoint.publisher)) {\n return `applied event ${key} subject ${event.subject} != publisher ${checkpoint.publisher}`\n }\n if (appliedIdentities.has(key)) return `duplicate applied-event identity ${key}`\n appliedIdentities.add(key)\n const objectKey = `${event.txHash}:${event.eventHash}:${event.objectHash}`\n if (eventObjects.has(objectKey)) return `duplicate applied-event object ${objectKey}`\n eventObjects.add(objectKey)\n if (prior !== undefined && compareApplied(prior, event) > 0) return 'applied events are not in canonical order'\n prior = event\n\n if (indexedThrough === null || event.block < checkpoint.floorBlock || event.block > indexedThrough) {\n return `applied event ${key} lies outside the indexed block range`\n }\n const eventKey = `${event.txHash}:${event.eventHash}`\n const location = [\n event.block,\n event.blockEventOrdinal.tx,\n event.blockEventOrdinal.event,\n normalizeAddress(event.source),\n normalizeAddress(event.subject),\n ].join(':')\n const priorLocation = eventLocations.get(eventKey)\n if (priorLocation !== undefined && priorLocation !== location) {\n return `applied event ${eventKey} has inconsistent provenance`\n }\n eventLocations.set(eventKey, location)\n\n const body = bodyByHash.get(event.objectHash)?.body\n if (body === undefined) return `applied object body ${event.objectHash} is missing`\n if (body.schema !== event.objectSchema) {\n return `applied object ${event.objectHash} schema ${String(body.schema)} != ${event.objectSchema}`\n }\n }\n return undefined\n}\n\nfunction scanRecordIntegrityError(\n records: readonly ClaimRecord[],\n checkpoint: EventKitReplayCheckpoint,\n indexedThrough: number,\n): string | undefined {\n const indexedSchemas = new Set<string>(checkpoint.objectSchemas)\n for (const record of records) {\n const key = claimKey(record.source, record.subject, record.objectHash)\n if (record.firstBlock < checkpoint.floorBlock || record.lastBlock > indexedThrough) {\n return `scan claim record ${key} lies outside the indexed block range`\n }\n if (record.lastBlock < record.firstBlock) return `scan claim record ${key} has a regressing clock`\n if (!indexedSchemas.has(record.declaredObjectSchema)) {\n return `scan claim record ${key} has an unindexed declared schema`\n }\n }\n return undefined\n}\n\nfunction scanIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { indexedThrough, scan } = checkpoint\n if (scan === null || indexedThrough === null) return undefined\n const contract = scan.contract\n if (contract.throughBlock !== indexedThrough) {\n return `scan throughBlock ${contract.throughBlock} != indexedThrough ${indexedThrough}`\n }\n if (contract.floorBlock !== checkpoint.floorBlock) return 'scan floorBlock differs from checkpoint'\n if (contract.foldVersion !== checkpoint.foldVersion) return 'scan foldVersion differs from checkpoint'\n if (contract.network !== checkpoint.network) return 'scan network differs from checkpoint'\n if (contract.eventBodyCorpus.sourceId !== checkpoint.sourceId) return 'scan body source differs from checkpoint'\n if (contract.eventBodyCorpus.unresolvedDigest !== undefined) {\n return 'scan body corpus unresolved digest is invalid for finalized replay'\n }\n if (JSON.stringify(contract.indexedSchemaPolicy)\n !== JSON.stringify({ foldedObjectSchemas: checkpoint.objectSchemas })) {\n return 'scan indexed schema policy differs from checkpoint'\n }\n if (scan.unresolved.length > 0) return 'committed scan checkpoint contains unresolved events'\n if (scan.recordShards.length > 0) return 'Event Kit scan checkpoint is not self-contained'\n\n const assembled = assembleCheckpointRecords(scan, [])\n if (assembled.status !== 'valid') return `scan claim records do not assemble: ${assembled.detail}`\n const recordIntegrityError = scanRecordIntegrityError(assembled.records, checkpoint, indexedThrough)\n if (recordIntegrityError !== undefined) return recordIntegrityError\n const actualRecords = sortClaimRecords(\n assembled.records.filter(record => normalizeAddress(record.subject) === normalizeAddress(checkpoint.publisher)),\n )\n if (!sameClaimRecords(actualRecords, expectedClaimRecords(checkpoint.applied))) {\n return 'scan claim records differ from applied-event history'\n }\n return scan.watermark !== undefined && scan.watermark.block > indexedThrough\n ? `scan watermark block ${scan.watermark.block} exceeds indexedThrough ${indexedThrough}`\n : watermarkIntegrityError(checkpoint)\n}\n\nfunction watermarkIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const scan = checkpoint.scan\n if (scan === null) return undefined\n const { watermark, watermarkGroupEventKeys } = scan\n if (watermark === undefined) {\n if (checkpoint.applied.length > 0) return 'scan watermark is missing for applied-event history'\n return watermarkGroupEventKeys.length === 0 ? undefined : 'scan has group event keys without a watermark'\n }\n if (watermark.block < checkpoint.floorBlock) {\n return `scan watermark block ${watermark.block} precedes floorBlock ${checkpoint.floorBlock}`\n }\n const aboveWatermark = checkpoint.applied.find(event =>\n event.block > watermark.block\n || (event.block === watermark.block && event.blockEventOrdinal.tx > watermark.ordinal.tx)\n || (event.block === watermark.block\n && event.blockEventOrdinal.tx === watermark.ordinal.tx\n && event.blockEventOrdinal.event > watermark.ordinal.event))\n if (aboveWatermark !== undefined) return 'applied event lies above the scan watermark'\n\n const uniqueActualKeys = new Set(watermarkGroupEventKeys)\n const actualKeys = uniqueActualKeys.values().toArray().toSorted()\n if (actualKeys.length !== watermarkGroupEventKeys.length) {\n return 'scan watermark group event keys contain duplicates'\n }\n if (actualKeys.some(key => !/^[0-9a-f]{64}:[0-9a-f]{64}$/u.test(key))) {\n return 'scan watermark group contains a malformed event key'\n }\n const group = checkpoint.applied.filter(event =>\n event.block === watermark.block && event.blockEventOrdinal.tx === watermark.ordinal.tx)\n const uniqueExpectedKeys = new Set(group.map(eventKey))\n const expectedKeys = uniqueExpectedKeys.values().toArray().toSorted()\n return expectedKeys.some(key => !actualKeys.includes(key)) ? 'scan watermark group event keys omit publisher applied-event history' : undefined\n}\n\nfunction blockedIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n const { blocked, indexedThrough } = checkpoint\n if (blocked === undefined) return undefined\n const expectedBlock = indexedThrough === null ? checkpoint.floorBlock : indexedThrough + 1\n if (blocked.atBlock !== expectedBlock) {\n return `blocked atBlock ${blocked.atBlock} != next unindexed block ${expectedBlock}`\n }\n if (blocked.atBlock > checkpoint.finalizedHead) {\n return `blocked atBlock ${blocked.atBlock} exceeds finalizedHead ${checkpoint.finalizedHead}`\n }\n return blocked.unresolvedEvents.some(event => event.block !== blocked.atBlock) ? 'blocked unresolved event does not belong to blocked block' : undefined\n}\n\nfunction checkpointIntegrityError(checkpoint: EventKitReplayCheckpoint): string | undefined {\n return progressIntegrityError(checkpoint)\n ?? bodySetIntegrityError(checkpoint)\n ?? appliedIntegrityError(checkpoint)\n ?? scanIntegrityError(checkpoint)\n ?? blockedIntegrityError(checkpoint)\n}\n\nasync function persistedBodyIntegrityError(checkpoint: EventKitReplayCheckpoint): Promise<string | undefined> {\n for (const entry of checkpoint.bodies) {\n let computedHash: string\n try {\n computedHash = await PayloadBuilder.dataHash(entry.body as unknown as Payload)\n } catch {\n return `persisted body ${entry.hash} cannot be hashed`\n }\n if (computedHash !== entry.hash) {\n return `persisted body ${entry.hash} hashes to ${computedHash}`\n }\n }\n return undefined\n}\n\nexport async function loadEventKitReplayCheckpoint(\n value: unknown,\n identity: EventKitReplayCheckpointIdentity,\n): Promise<EventKitReplayCheckpointLoad> {\n if (value === undefined || value === null) return { status: 'missing' }\n if (typeof value === 'object' && value !== null && (value as { version?: unknown }).version === 2) {\n const legacy = LegacyEventKitReplayCheckpointIdentityZod.safeParse(value)\n if (!legacy.success) {\n return { detail: 'recognized Event Kit replay checkpoint v2 has invalid identity', status: 'corrupt' }\n }\n const mismatch = checkpointIdentityError(legacy.data, identity)\n return mismatch === undefined\n ? { status: 'missing' }\n : { detail: mismatch, status: 'identity-mismatch' }\n }\n const parsed = EventKitReplayCheckpointZod.safeParse(value)\n if (!parsed.success) {\n return { detail: 'recognized Event Kit replay checkpoint has invalid content', status: 'corrupt' }\n }\n const checkpoint = parsed.data\n const mismatch = checkpointIdentityError(checkpoint, identity)\n if (mismatch !== undefined) return { detail: mismatch, status: 'identity-mismatch' }\n const bodyIntegrityError = await persistedBodyIntegrityError(checkpoint)\n if (bodyIntegrityError !== undefined) return { detail: bodyIntegrityError, status: 'corrupt' }\n const integrityError = checkpointIntegrityError(checkpoint)\n return integrityError === undefined ? { checkpoint, status: 'valid' } : { detail: integrityError, status: 'corrupt' }\n}\n", "import { HashZod } from '@ariestools/sdk'\nimport type {\n StatementGrantClaim,\n StatementGrantClaimQuery,\n StatementGrantObject,\n StatementGraphGrantReadModel,\n} from '@xyo-network/event-kit-protocol'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type {\n ClaimQuery,\n StatementGraphViewer,\n} from '@xyo-network/xl1-statement-graph-engine'\nimport type {\n ClaimRecord,\n ObjectRecord,\n} from '@xyo-network/xl1-statement-graph-schemas'\n\nexport interface StatementGraphGrantReadModelOptions {\n /**\n * Canonical Statement Graph read surface \u2014 a `StateStatementGraphViewer` over\n * engine state, a replay controller's viewer, or any other backing.\n */\n readonly viewer: StatementGraphViewer\n}\n\n/**\n * Adapts the canonical Statement Graph v2 viewer to the unbranded read model\n * the Event Kit grant authorizer consumes.\n *\n * This is a translation seam only. It narrows branded query and record types\n * and preserves every field the authorizer needs as grant evidence; it makes no\n * authorization decision, applies no freshness policy, and drops no claim.\n * Statement Graph remains the sole owner of claim semantics; Event Kit's\n * authorizer separately interprets grant bodies and claimed negations.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n head: async (): Promise<number> => await viewer.head(),\n\n async claims(\n source: string,\n query?: StatementGrantClaimQuery,\n ): Promise<readonly StatementGrantClaim[]> {\n const records = await viewer.claims(XyoAddressZod.parse(source), toClaimQuery(query))\n return Object.freeze(records.map(toGrantClaim))\n },\n\n async object(objectHash: string): Promise<StatementGrantObject | undefined> {\n const record = await viewer.object(HashZod.parse(objectHash))\n return record === undefined ? undefined : toGrantObject(record)\n },\n })\n}\n\n/**\n * Rebrands the query fields. Parsing rather than casting means a malformed hash\n * reaches the viewer as a throw \u2014 surfacing as `grant-unavailable` \u2014 instead of\n * silently querying a nonsense key and reading as \"no grant\".\n */\nfunction toClaimQuery(query?: StatementGrantClaimQuery): ClaimQuery | undefined {\n if (query === undefined) return undefined\n return {\n ...(query.declaredObjectSchemaPrefix === undefined\n ? {}\n : { declaredObjectSchemaPrefix: query.declaredObjectSchemaPrefix }),\n ...(query.objectHash === undefined ? {} : { objectHash: HashZod.parse(query.objectHash) }),\n ...(query.subject === undefined ? {} : { subject: XyoAddressZod.parse(query.subject) }),\n }\n}\n\n/**\n * `firstEventHash` identifies the materializing claim, so the authorizer can\n * cite one concrete transition as evidence rather than a bare boolean. A\n * redundant claim moves only `lastBlock`, so evidence cannot be backdated or\n * refreshed by re-claiming.\n */\nfunction toGrantClaim(record: ClaimRecord): StatementGrantClaim {\n return Object.freeze({\n declaredObjectSchema: record.declaredObjectSchema,\n firstBlock: record.firstBlock,\n firstEventHash: record.firstEventHash,\n lastBlock: record.lastBlock,\n objectHash: record.objectHash,\n source: record.source,\n subject: record.subject,\n })\n}\n\nfunction toGrantObject(record: ObjectRecord): StatementGrantObject {\n return Object.freeze({\n assurance: record.assurance,\n declaredSchema: record.declaredSchema,\n objectHash: record.objectHash,\n params: record.params === null ? null : Object.freeze({ ...record.params }),\n })\n}\n", "import type {\n EncryptedWakeSubscription,\n EndpointChallenge,\n EndpointChallengeResponse,\n PublisherService,\n WakeGrantObject,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\nimport {\n EncryptedWakeSubscriptionSchema,\n EncryptedWakeSubscriptionZod,\n EndpointChallengeResponseZod,\n EndpointChallengeZod,\n HandshakeIdZod,\n hasMatchingHandshakeProfile,\n NormalizedAddressZod,\n PublisherServiceSchema,\n WakeGrantObjectSchema,\n WakeGrantObjectZod,\n WakeGrantRevocationSchema,\n WakeGrantRevocationZod,\n WakeSubscriptionAcceptanceRevocationSchema,\n WakeSubscriptionAcceptanceRevocationZod,\n WakeSubscriptionAcceptanceSchema,\n WakeSubscriptionAcceptanceZod,\n WakeSubscriptionRevocationSchema,\n WakeSubscriptionRevocationZod,\n} from '@xyo-network/event-kit-schemas'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n HandshakeCatalogs,\n HandshakeServiceDiscovery,\n} from './handshakeCatalog.ts'\nimport {\n discoverHandshakeService,\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n firstHandshakeRevocation,\n handshakeEventEvidence,\n handshakeEventKey,\n handshakeEvidence,\n handshakeRevocations,\n parsedHandshakeObjects,\n verifiedHandshakeAttachmentBody,\n verifiedHandshakeObjectBody,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModel,\n EventKitHandshakeReadModelOptions,\n PublisherAcceptanceCandidateDiscovery,\n PublisherAcceptanceCandidateQuery,\n PublisherHandshakeQuery,\n PublisherHandshakeView,\n PublisherServiceDiscovery,\n PublisherSubscriptionView,\n SubscriberSubscriptionLookup,\n SubscriberSubscriptionQuery,\n SubscriptionTupleRejection,\n SubscriptionTupleRejectionReason,\n} from './handshakeReadModelTypes.ts'\nimport {\n isPublisherSubject,\n publisherSubjectViewer,\n} from './publisherSubjectViewer.ts'\nimport type {\n ValidatedSubscriptionAcceptance as ValidatedAcceptance,\n ValidatedSubscriptionTuple as ValidatedTuple,\n} from './subscriptionLifecycleView.ts'\nimport {\n buildPublisherSubscriptionViews,\n selectPublisherAcceptanceCandidates,\n} from './subscriptionLifecycleView.ts'\n\ninterface HandshakeLifecycleProjection {\n readonly acceptances: readonly ValidatedAcceptance[]\n readonly discovery: HandshakeServiceDiscovery\n readonly rejections: readonly SubscriptionTupleRejection[]\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedTuple[]\n}\n\ntype HandshakeLifecycle\n = | HandshakeLifecycleProjection\n | { readonly discovery: HandshakeServiceDiscovery }\n\nfunction publisherSubjectOptions(\n options: EventKitHandshakeReadModelOptions,\n publisher: string,\n): EventKitHandshakeReadModelOptions {\n return {\n ...options,\n viewer: publisherSubjectViewer(options.viewer, XyoAddressZod.parse(publisher)),\n }\n}\n\nfunction hasExactGrantBinding(grant: WakeGrantObject, publisher: string): boolean {\n return grant.publisher === publisher\n && grant.permissions.length === 1\n && grant.permissions[0] === 'enqueue'\n}\n\nfunction hasExactSubscriptionBinding(\n subscription: EncryptedWakeSubscription,\n chainId: string,\n publisher: string,\n serviceHash: string,\n grantHash: string,\n): boolean {\n return subscription.publisher === publisher\n && subscription.chainId === chainId\n && subscription.service === serviceHash\n && subscription.grant === grantHash\n}\n\nfunction hasExactKeyBinding(\n subscription: EncryptedWakeSubscription,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n tupleBlock: number,\n): boolean {\n const key = catalogs.keyByHash.get(subscription.encryptionKey)\n return subscription.encryptionKey === service.body.preferredEncryptionKey\n && key?.body.keyId === subscription.keyId\n && service.body.encryptionKeys.includes(key.objectHash)\n && exactHandshakeKeyAt(catalogs, service, key.objectHash, tupleBlock)\n}\n\nfunction expiryIsInsideServicePolicy(\n subscription: EncryptedWakeSubscription,\n service: PublisherService,\n tupleBlock: number,\n): boolean {\n return subscription.expiresAtBlock > tupleBlock\n && subscription.expiresAtBlock <= tupleBlock + service.limits.maxSubscriptionLifetimeBlocks\n}\n\nasync function tupleRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n): Promise<{\n grants: readonly { block: number; target: string }[]\n subscriptions: readonly { block: number; target: string }[]\n}> {\n return {\n grants: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeGrantRevocationSchema),\n value => WakeGrantRevocationZod.safeParse(value),\n 'grant',\n ),\n subscriptions: await handshakeRevocations(\n viewer,\n records.filter(record => record.objectSchema === WakeSubscriptionRevocationSchema),\n value => WakeSubscriptionRevocationZod.safeParse(value),\n 'subscription',\n ),\n }\n}\n\nasync function validateTuple(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n subscriber: string,\n service: ClaimedHandshakeObject<PublisherService>,\n catalogs: HandshakeCatalogs,\n chainId: string,\n publisher: string,\n sourceEvents: readonly AppliedEventRecord[],\n): Promise<{ rejection?: SubscriptionTupleRejection; tuple?: ValidatedTuple }> {\n const serviceEntries = records.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => record.objectSchema === EncryptedWakeSubscriptionSchema || record.objectSchema === EncryptedWakeSubscriptionSchema)\n const baseEvidence = handshakeEventEvidence(records[0])\n const reject = (reason: SubscriptionTupleRejectionReason) => ({\n rejection: {\n evidence: baseEvidence, reason, subscriber,\n },\n })\n if (serviceEntries.length !== 1\n || serviceEntries[0]?.objectHash !== service.objectHash\n || grantEntries.length !== 1\n || subscriptionEntries.length !== 1) {\n return reject('ambiguous-fan')\n }\n\n const grantRecord = grantEntries[0]\n const subscriptionRecord = subscriptionEntries[0]\n const grantParsed = WakeGrantObjectZod.safeParse(await verifiedHandshakeObjectBody(viewer, grantRecord))\n if (!grantParsed.success) return reject('malformed-grant')\n const subscriptionParsed = EncryptedWakeSubscriptionZod.safeParse(\n await verifiedHandshakeObjectBody(viewer, subscriptionRecord),\n )\n if (!subscriptionParsed.success) return reject('malformed-subscription')\n const grant = grantParsed.data\n const subscription = subscriptionParsed.data\n\n if (!hasMatchingHandshakeProfile(service.body, subscription, chainId)) return reject('subscription-binding-invalid')\n if (!hasExactGrantBinding(grant, publisher)) return reject('grant-binding-invalid')\n if (!hasExactSubscriptionBinding(subscription, chainId, publisher, service.objectHash, grantRecord.objectHash)) {\n return reject('subscription-binding-invalid')\n }\n const tupleBlock = subscriptionRecord.block\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\n const claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (claimedKey === undefined || claimedKey.evidence.block >= tupleBlock) return reject('key-binding-invalid')\n if (!exactHandshakeServiceAt(catalogs, service, publisher, tupleBlock)) return reject('service-inactive-at-claim')\n if (!hasExactKeyBinding(subscription, service, catalogs, tupleBlock)) return reject('key-binding-invalid')\n if (!expiryIsInsideServicePolicy(subscription, service.body, tupleBlock)) return reject('expiry-out-of-policy')\n\n const revoked = await tupleRevocations(viewer, sourceEvents)\n const subscriptionRevokedAtBlock = firstHandshakeRevocation(revoked.subscriptions, subscriptionRecord.objectHash)\n const grantRevokedAtBlock = firstHandshakeRevocation(revoked.grants, grantRecord.objectHash)\n return {\n tuple: {\n grant: {\n body: grant, evidence: handshakeEvidence(grantRecord), objectHash: grantRecord.objectHash,\n },\n grantRevokedAtBlock,\n service,\n subscriber,\n subscription: {\n body: subscription,\n evidence: handshakeEvidence(subscriptionRecord),\n objectHash: subscriptionRecord.objectHash,\n ...(subscriptionRevokedAtBlock === undefined ? {} : { revokedAtBlock: subscriptionRevokedAtBlock }),\n },\n subscriptionLifecycle: {\n claimedAtBlock: tupleBlock,\n expiresAtBlock: subscription.expiresAtBlock,\n objectHash: subscriptionRecord.objectHash,\n revision: subscription.revision,\n revokedAtBlock: subscriptionRevokedAtBlock,\n source: subscriber,\n subscriptionId: subscription.subscriptionId,\n supersedes: subscription.supersedes,\n },\n tupleEvent: baseEvidence,\n },\n }\n}\n\nasync function discoverTuples(\n viewer: StatementGraphViewer,\n services: readonly ClaimedHandshakeObject<PublisherService>[],\n catalogs: HandshakeCatalogs,\n query: Required<Pick<PublisherHandshakeQuery, 'chainId' | 'publisher'>>,\n candidateSources?: readonly string[],\n): Promise<{ rejections: SubscriptionTupleRejection[]; tuples: ValidatedTuple[] }> {\n const serviceByHash = new Map(services.map(service => [service.objectHash, service]))\n const serviceHashes = new Set(serviceByHash.keys())\n const uniqueSources = new Set(\n candidateSources ?? (\n (await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source)\n ),\n )\n const sources = uniqueSources.values()\n .filter(source => !isPublisherSubject(source, query.publisher))\n .toArray()\n const tuples = new Map<string, ValidatedTuple>()\n const rejections: SubscriptionTupleRejection[] = []\n for (const source of sources) {\n const sourceAddress = XyoAddressZod.parse(source)\n const events = await viewer.events(sourceAddress, { subject: XyoAddressZod.parse(query.publisher) })\n const groups = Map.groupBy(events, handshakeEventKey)\n for (const records of groups.values()) {\n const referencedServices = records.flatMap((record) => {\n const service = serviceByHash.get(record.objectHash)\n return service === undefined ? [] : [service]\n })\n for (const service of referencedServices) {\n const result = await validateTuple(\n viewer,\n records,\n source,\n service,\n catalogs,\n query.chainId,\n query.publisher,\n events,\n )\n if (result.rejection !== undefined) rejections.push(result.rejection)\n if (result.tuple !== undefined) {\n const tupleKey = `${result.tuple.subscriber}:${result.tuple.subscription.objectHash}`\n const prior = tuples.get(tupleKey)\n if (prior === undefined || result.tuple.subscription.evidence.block < prior.subscription.evidence.block) {\n tuples.set(tupleKey, result.tuple)\n }\n }\n }\n }\n }\n return { rejections, tuples: tuples.values().toArray() }\n}\n\nfunction challengeMatchesTuple(\n challenge: EndpointChallenge,\n response: EndpointChallengeResponse,\n acceptance: WakeSubscriptionAcceptance,\n tuple: ValidatedTuple,\n chainId: string,\n publisher: string,\n): boolean {\n return challenge.chainId === chainId\n && challenge.publisher === publisher\n && challenge.subscriber === tuple.subscriber\n && challenge.service === tuple.service.objectHash\n && challenge.encryptionKey === tuple.subscription.body.encryptionKey\n && challenge.keyId === tuple.subscription.body.keyId\n && challenge.subscription === tuple.subscription.objectHash\n && challenge.grant === tuple.grant.objectHash\n && challenge.eventKind === tuple.subscription.body.eventKind\n && response.challenge === acceptance.challenge\n}\n\nasync function validatedAcceptances(\n options: EventKitHandshakeReadModelOptions,\n catalogs: HandshakeCatalogs,\n tuples: readonly ValidatedTuple[],\n chainId: string,\n publisher: string,\n): Promise<ValidatedAcceptance[]> {\n const publisherAddress = XyoAddressZod.parse(publisher)\n const events = await options.viewer.events(publisherAddress, { subject: publisherAddress })\n const acceptances = await parsedHandshakeObjects(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceSchema),\n value => WakeSubscriptionAcceptanceZod.safeParse(value),\n )\n const acceptanceRevocations = await handshakeRevocations(\n options.viewer,\n events.filter(record => record.objectSchema === WakeSubscriptionAcceptanceRevocationSchema),\n value => WakeSubscriptionAcceptanceRevocationZod.safeParse(value),\n 'acceptance',\n )\n const result: ValidatedAcceptance[] = []\n for (const claimed of acceptances) {\n const candidates = tuples.filter(candidate =>\n claimed.body.service === candidate.service.objectHash\n && claimed.body.encryptionKey === candidate.subscription.body.encryptionKey\n && claimed.body.subscription === candidate.subscription.objectHash\n && claimed.body.grant === candidate.grant.objectHash)\n if (candidates.length === 0) continue\n\n const challengeBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.challenge)\n const responseBody = await verifiedHandshakeAttachmentBody(options.body, claimed.body.response)\n const challenge = EndpointChallengeZod.safeParse(challengeBody)\n const response = EndpointChallengeResponseZod.safeParse(responseBody)\n if (!challenge.success || !response.success) continue\n\n // Acceptance attests that the publisher verified the endpoint proof inside\n // its Unix-time window. XL1 provides no consensus wall clock, so finalized\n // replay validates the immutable proof binding and block lifecycle only.\n const eligible = candidates.filter(tuple => claimed.evidence.block > tuple.subscription.evidence.block\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, claimed.evidence.block)\n && exactHandshakeKeyAt(catalogs, tuple.service, claimed.body.encryptionKey, claimed.evidence.block)\n && claimed.evidence.block + 1 < tuple.subscription.body.expiresAtBlock\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > claimed.evidence.block)\n && (tuple.subscription.revokedAtBlock === undefined\n || tuple.subscription.revokedAtBlock > claimed.evidence.block)\n && challengeMatchesTuple(challenge.data, response.data, claimed.body, tuple, chainId, publisher))\n if (eligible.length !== 1) continue\n const tuple = eligible[0]\n\n const revokedAtBlock = firstHandshakeRevocation(acceptanceRevocations, claimed.objectHash)\n const withRevocation: ClaimedHandshakeObject<WakeSubscriptionAcceptance> = {\n ...claimed,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }\n result.push({\n claimed: withRevocation,\n lifecycle: {\n acceptanceBlock: claimed.evidence.block,\n objectHash: claimed.objectHash,\n revokedAtBlock,\n source: publisher,\n subscription: tuple.subscription.objectHash,\n },\n subscriber: tuple.subscriber,\n })\n }\n return result\n}\n\nasync function handshakeLifecycle(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n candidateSources?: readonly string[],\n subscriptionId?: string,\n): Promise<HandshakeLifecycle> {\n const scopedOptions = publisherSubjectOptions(options, rawQuery.publisher)\n const discovery = await discoverHandshakeService(scopedOptions, rawQuery)\n if (discovery.catalogs === undefined) return { discovery }\n\n const serviceRevisions = discovery.catalogs.serviceByHash.values()\n .filter(service =>\n service.evidence.source === discovery.query.publisher\n && (discovery.query.serviceId === undefined || service.body.serviceId === discovery.query.serviceId)\n && service.body.events.some(event => event.kind === discovery.query.eventKind)\n && service.evidence.block <= discovery.query.finalizedHead)\n .toArray()\n const found = await discoverTuples(\n scopedOptions.viewer,\n serviceRevisions,\n discovery.catalogs,\n { chainId: discovery.query.chainId, publisher: discovery.query.publisher },\n candidateSources,\n )\n const tuples = subscriptionId === undefined\n ? found.tuples\n : found.tuples.filter(tuple => tuple.subscription.body.subscriptionId === subscriptionId)\n const acceptances = await validatedAcceptances(\n scopedOptions,\n discovery.catalogs,\n tuples,\n discovery.query.chainId,\n discovery.query.publisher,\n )\n return {\n acceptances,\n discovery,\n rejections: found.rejections,\n subscriptions: buildPublisherSubscriptionViews(\n tuples,\n acceptances,\n discovery.query.publisher,\n discovery.query.finalizedHead,\n ),\n tuples,\n }\n}\n\nfunction handshakeView(projection: HandshakeLifecycle): PublisherHandshakeView {\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n const {\n discovery, rejections, subscriptions,\n } = projection\n const lifecycle = { rejections, subscriptions }\n if (discovery.result.ok) {\n return {\n ...discovery.result,\n ...lifecycle,\n hasCurrentAdvertisement: true,\n serviceDiscovery: discovery.result,\n }\n }\n if (discovery.result.indexedThrough === null) {\n throw new Error('catalog-backed service discovery must have an indexed head')\n }\n return {\n finalizedHead: discovery.result.finalizedHead,\n hasCurrentAdvertisement: false,\n indexedThrough: discovery.result.indexedThrough,\n ok: true,\n serviceDiscovery: discovery.result,\n ...lifecycle,\n }\n}\n\nexport function createEventKitHandshakeReadModel(\n options: EventKitHandshakeReadModelOptions,\n): EventKitHandshakeReadModel {\n return Object.freeze({\n async acceptanceCandidates(\n rawQuery: PublisherAcceptanceCandidateQuery,\n ): Promise<PublisherAcceptanceCandidateDiscovery> {\n const subscriber = rawQuery.subscriber === undefined\n ? undefined\n : NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const projection = await handshakeLifecycle(\n options,\n rawQuery,\n subscriber === undefined ? undefined : [subscriber],\n subscriptionId,\n )\n if (!('subscriptions' in projection)) {\n if (projection.discovery.result.ok) {\n throw new Error('successful service discovery produced no catalogs')\n }\n return projection.discovery.result\n }\n if (!projection.discovery.result.ok) return projection.discovery.result\n const {\n catalogs, query, result,\n } = projection.discovery\n if (catalogs === undefined) throw new Error('catalog-backed candidate discovery requires catalogs')\n return {\n ...result,\n candidates: selectPublisherAcceptanceCandidates({\n acceptances: projection.acceptances,\n catalogs,\n finalizedHead: query.finalizedHead,\n key: result.key,\n publisher: query.publisher,\n service: result.service,\n subscriptions: projection.subscriptions,\n tuples: projection.tuples,\n }),\n rejections: projection.rejections,\n subscriptions: projection.subscriptions,\n }\n },\n\n discoverPublisherService: async (query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> =>\n (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result,\n\n publisher: async (query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> => handshakeView(await handshakeLifecycle(options, query)),\n\n async subscriber(rawQuery: SubscriberSubscriptionQuery): Promise<SubscriberSubscriptionLookup> {\n const subscriber = NormalizedAddressZod.parse(rawQuery.subscriber)\n const subscriptionId = rawQuery.subscriptionId === undefined\n ? undefined\n : HandshakeIdZod.parse(rawQuery.subscriptionId)\n const view = handshakeView(await handshakeLifecycle(options, rawQuery, [subscriber], subscriptionId))\n return view.ok ? { ...view, subscriber } : view\n },\n })\n}\n", "import type {\n PublisherEncryptionKeyLifecycle,\n PublisherServiceLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport {\n resolvePreferredEncryptionKey,\n selectPublisherService,\n} from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n} from '@xyo-network/event-kit-schemas'\nimport {\n ChainIdZod,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\n SOURCE_WAKE_EVENT_KIND,\n} from '@xyo-network/event-kit-schemas'\nimport type { Payload } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { XyoAddressZod } from '@xyo-network/sdk-protocol/address'\nimport type { StatementGraphViewer } from '@xyo-network/xl1-statement-graph-engine'\nimport type { AppliedEventRecord } from '@xyo-network/xl1-statement-graph-schemas'\n\nimport type {\n ClaimedHandshakeObject,\n EventKitHandshakeReadModelOptions,\n HandshakeClaimEvidence,\n PublisherHandshakeQuery,\n PublisherServiceDiscovery,\n PublisherServiceDiscoveryFailure,\n} from './handshakeReadModelTypes.ts'\n\nexport interface HandshakeCatalogs {\n readonly keyByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherEncryptionKey>>\n readonly keyLifecycles: readonly PublisherEncryptionKeyLifecycle[]\n readonly serviceByHash: ReadonlyMap<string, ClaimedHandshakeObject<PublisherService>>\n readonly serviceLifecycles: readonly PublisherServiceLifecycleRevision[]\n}\n\nexport interface HandshakeServiceDiscovery {\n readonly catalogs?: HandshakeCatalogs\n readonly query: PublisherHandshakeQuery\n readonly result: PublisherServiceDiscovery\n}\n\nexport function handshakeEvidence(record: AppliedEventRecord): HandshakeClaimEvidence {\n return {\n block: record.block,\n eventHash: record.eventHash,\n hashIndex: record.hashIndex,\n objectHash: record.objectHash,\n ordinal: record.blockEventOrdinal,\n source: record.source,\n txHash: record.txHash,\n }\n}\n\nexport function handshakeEventEvidence(\n record: AppliedEventRecord,\n): Omit<HandshakeClaimEvidence, 'hashIndex' | 'objectHash'> {\n const item = handshakeEvidence(record)\n return {\n block: item.block,\n eventHash: item.eventHash,\n ordinal: item.ordinal,\n source: item.source,\n txHash: item.txHash,\n }\n}\n\nexport function handshakeEventKey(record: Pick<AppliedEventRecord, 'eventHash' | 'txHash'>): string {\n return `${record.txHash}:${record.eventHash}`\n}\n\nfunction earliestByHash(records: readonly AppliedEventRecord[]): AppliedEventRecord[] {\n const result = new Map<string, AppliedEventRecord>()\n for (const record of records) {\n const prior = result.get(record.objectHash)\n if (prior === undefined\n || record.block < prior.block\n || (record.block === prior.block && record.blockEventOrdinal.tx < prior.blockEventOrdinal.tx)\n || (record.block === prior.block\n && record.blockEventOrdinal.tx === prior.blockEventOrdinal.tx\n && record.blockEventOrdinal.event < prior.blockEventOrdinal.event)) {\n result.set(record.objectHash, record)\n }\n }\n return result.values().toArray()\n}\n\nexport async function verifiedHandshakeObjectBody(\n viewer: StatementGraphViewer,\n record: AppliedEventRecord,\n): Promise<Record<string, unknown> | undefined> {\n const object = await viewer.object(record.objectHash)\n if (object?.assurance !== 'resolved'\n || object.declaredSchema !== record.objectSchema\n || object.params === null) return undefined\n const body = { schema: object.declaredSchema, ...object.params }\n return await PayloadBuilder.dataHash(body as Payload) === record.objectHash ? body : undefined\n}\n\nexport async function verifiedHandshakeAttachmentBody(\n resolver: EventKitHandshakeReadModelOptions['body'],\n hash: string,\n): Promise<Record<string, unknown> | undefined> {\n const body = resolver?.(hash)\n if (body === undefined) return undefined\n return await PayloadBuilder.dataHash(body as unknown as Payload) === hash ? { ...body } : undefined\n}\n\nexport function firstHandshakeRevocation(\n revocations: readonly { readonly block: number; readonly target: string }[],\n target: string,\n): number | undefined {\n const blocks = revocations.filter(item => item.target === target).map(item => item.block)\n return blocks.length === 0 ? undefined : Math.min(...blocks)\n}\n\nexport async function parsedHandshakeObjects<T>(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: T; readonly success: true } | { readonly success: false },\n): Promise<ClaimedHandshakeObject<T>[]> {\n const objects: ClaimedHandshakeObject<T>[] = []\n for (const record of earliestByHash(records)) {\n const body = await verifiedHandshakeObjectBody(viewer, record)\n const parsed = parse(body)\n if (!parsed.success) continue\n objects.push({\n body: parsed.data,\n evidence: handshakeEvidence(record),\n objectHash: record.objectHash,\n })\n }\n return objects\n}\n\nexport async function handshakeRevocations(\n viewer: StatementGraphViewer,\n records: readonly AppliedEventRecord[],\n parse: (value: unknown) => { readonly data: Record<string, string>; readonly success: true } | { readonly success: false },\n field: string,\n): Promise<{ block: number; target: string }[]> {\n const result: { block: number; target: string }[] = []\n for (const record of earliestByHash(records)) {\n const parsed = parse(await verifiedHandshakeObjectBody(viewer, record))\n if (parsed.success && typeof parsed.data[field] === 'string') {\n result.push({ block: record.block, target: parsed.data[field] })\n }\n }\n return result\n}\n\nexport async function buildHandshakeCatalogs(\n viewer: StatementGraphViewer,\n publisher: string,\n): Promise<HandshakeCatalogs> {\n const events = await viewer.events(XyoAddressZod.parse(publisher))\n const services = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceSchema || record.objectSchema === PublisherServiceSchema),\n value => PublisherServiceZod.safeParse(value),\n )\n const keys = await parsedHandshakeObjects(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeySchema),\n value => PublisherEncryptionKeyZod.safeParse(value),\n )\n const serviceRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherServiceRevocationSchema),\n value => PublisherServiceRevocationZod.safeParse(value),\n 'service',\n )\n const keyRevocations = await handshakeRevocations(\n viewer,\n events.filter(record => record.objectSchema === PublisherEncryptionKeyRevocationSchema),\n value => PublisherEncryptionKeyRevocationZod.safeParse(value),\n 'key',\n )\n\n const serviceByHash = new Map(services.map((service) => {\n const revokedAtBlock = firstHandshakeRevocation(serviceRevocations, service.objectHash)\n return [service.objectHash, {\n ...service,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n const keyByHash = new Map(keys.map((key) => {\n const revokedAtBlock = firstHandshakeRevocation(keyRevocations, key.objectHash)\n return [key.objectHash, {\n ...key,\n ...(revokedAtBlock === undefined ? {} : { revokedAtBlock }),\n }] as const\n }))\n\n return {\n keyByHash,\n keyLifecycles: keyByHash.values().map(key => ({\n claimedAtBlock: key.evidence.block,\n expiresAtBlock: key.body.expiresAtBlock,\n keyId: key.body.keyId,\n objectHash: key.objectHash,\n revokedAtBlock: key.revokedAtBlock,\n source: key.evidence.source,\n validFromBlock: key.body.validFromBlock,\n })).toArray(),\n serviceByHash,\n serviceLifecycles: serviceByHash.values().map(service => ({\n claimedAtBlock: service.evidence.block,\n encryptionKeys: service.body.encryptionKeys,\n eventKinds: service.body.events.map(event => event.kind),\n expiresAtBlock: service.body.expiresAtBlock,\n objectHash: service.objectHash,\n preferredEncryptionKey: service.body.preferredEncryptionKey,\n revision: service.body.revision,\n revokedAtBlock: service.revokedAtBlock,\n serviceId: service.body.serviceId,\n source: service.evidence.source,\n supersedes: service.body.supersedes,\n validFromBlock: service.body.validFromBlock,\n })).toArray(),\n }\n}\n\nasync function viewHead(\n viewer: StatementGraphViewer,\n finalizedHead: number,\n): Promise<PublisherServiceDiscoveryFailure | { indexedThrough: number }> {\n if (!Number.isSafeInteger(finalizedHead) || finalizedHead < 0) {\n throw new TypeError('finalizedHead must be a nonnegative safe integer')\n }\n let indexedThrough: number\n try {\n indexedThrough = await viewer.head()\n } catch {\n return {\n finalizedHead, indexedThrough: null, ok: false, reason: 'view-unavailable',\n }\n }\n if (indexedThrough < finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'stale-view',\n }\n if (indexedThrough > finalizedHead) return {\n finalizedHead, indexedThrough, ok: false, reason: 'ahead-of-finality',\n }\n return { indexedThrough }\n}\n\nexport function exactHandshakeServiceAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n publisher: string,\n finalizedHead: number,\n): boolean {\n const selection = selectPublisherService({\n eventKind: service.body.events[0].kind,\n finalizedHead,\n publisherSource: publisher,\n serviceId: service.body.serviceId,\n services: catalogs.serviceLifecycles,\n })\n return selection.ok && selection.service.objectHash === service.objectHash\n}\n\nexport function exactHandshakeKeyAt(\n catalogs: HandshakeCatalogs,\n service: ClaimedHandshakeObject<PublisherService>,\n keyHash: string,\n finalizedHead: number,\n): boolean {\n const serviceLifecycle = catalogs.serviceLifecycles.find(item => item.objectHash === service.objectHash)\n if (serviceLifecycle === undefined) return false\n const resolution = resolvePreferredEncryptionKey({\n finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceLifecycle,\n })\n return resolution.ok && resolution.key.objectHash === keyHash\n}\n\nfunction hasPendingPublisherService(\n catalogs: HandshakeCatalogs,\n query: PublisherHandshakeQuery,\n): boolean {\n return catalogs.serviceLifecycles.some(service => service.source === query.publisher\n && service.claimedAtBlock <= query.finalizedHead\n && service.validFromBlock > query.finalizedHead\n && (service.revokedAtBlock === undefined || service.revokedAtBlock > query.finalizedHead)\n && (query.serviceId === undefined || service.serviceId === query.serviceId)\n && service.eventKinds.includes(query.eventKind ?? SOURCE_WAKE_EVENT_KIND))\n}\n\nexport async function discoverHandshakeService(\n options: EventKitHandshakeReadModelOptions,\n rawQuery: PublisherHandshakeQuery,\n): Promise<HandshakeServiceDiscovery> {\n const query: PublisherHandshakeQuery = {\n ...rawQuery,\n chainId: ChainIdZod.parse(rawQuery.chainId),\n eventKind: rawQuery.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n publisher: NormalizedAddressZod.parse(rawQuery.publisher),\n }\n const head = await viewHead(options.viewer, query.finalizedHead)\n if ('ok' in head) return { query, result: head }\n\n const catalogs = await buildHandshakeCatalogs(options.viewer, query.publisher)\n const serviceSelection = selectPublisherService({\n eventKind: query.eventKind ?? SOURCE_WAKE_EVENT_KIND,\n finalizedHead: query.finalizedHead,\n publisherSource: query.publisher,\n ...(query.serviceId === undefined ? {} : { serviceId: query.serviceId }),\n services: catalogs.serviceLifecycles,\n })\n if (!serviceSelection.ok) {\n const reason = serviceSelection.reason === 'service-not-found'\n && hasPendingPublisherService(catalogs, query)\n ? 'service-pending'\n : serviceSelection.reason\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason,\n },\n }\n }\n const service = catalogs.serviceByHash.get(serviceSelection.service.objectHash)\n if (service === undefined) throw new Error('selected service body is unavailable')\n if (service.body.authorizationChainId !== query.chainId) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead, indexedThrough: head.indexedThrough, ok: false, reason: 'service-not-found',\n },\n }\n }\n const keySelection = resolvePreferredEncryptionKey({\n finalizedHead: query.finalizedHead,\n keys: catalogs.keyLifecycles,\n service: serviceSelection.service,\n })\n if (!keySelection.ok) {\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n ok: false,\n reason: keySelection.reason,\n },\n }\n }\n const key = catalogs.keyByHash.get(keySelection.key.objectHash)\n if (key === undefined) throw new Error('selected encryption-key body is unavailable')\n return {\n catalogs,\n query,\n result: {\n finalizedHead: query.finalizedHead,\n indexedThrough: head.indexedThrough,\n key,\n ok: true,\n service,\n },\n }\n}\n", "import type {\n AppliedEventQuery,\n ClaimQuery,\n StatementGraphViewer,\n StatementObjectHash,\n StatementSource,\n StatementSubject,\n} from '@xyo-network/xl1-statement-graph-engine'\n\nconst LegacyHexAddress = /^[A-Fa-f0-9]{40}$/\n\nfunction normalizeAddress(value: string): string {\n return LegacyHexAddress.test(value) ? value.toLowerCase() : value\n}\n\nexport function isPublisherSubject(subject: string, publisher: string): boolean {\n return normalizeAddress(subject) === normalizeAddress(publisher)\n}\n\n/**\n * Defense-in-depth boundary for generic Statement Graph viewers. Querying by\n * subject is not enough: a backing may ignore optional filters, so every\n * returned record is filtered again before D-005 interprets it.\n */\nexport function publisherSubjectViewer(\n viewer: StatementGraphViewer,\n publisher: StatementSubject,\n): StatementGraphViewer {\n const claimQuery = (query?: ClaimQuery): ClaimQuery => ({ ...query, subject: publisher })\n const eventQuery = (query?: AppliedEventQuery): AppliedEventQuery => ({ ...query, subject: publisher })\n const filterClaims = async (records: ReturnType<StatementGraphViewer['claims']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n const filterEvents = async (records: ReturnType<StatementGraphViewer['events']>) =>\n (await records).filter(record => isPublisherSubject(record.subject, publisher))\n\n return Object.freeze({\n claims: async (source: StatementSource, query?: ClaimQuery) => await filterClaims(viewer.claims(source, claimQuery(query))),\n claimsByObject: async (objectHash: StatementObjectHash) => await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash }))),\n claimsBySubject: async (subject: StatementSubject, query?: ClaimQuery) => isPublisherSubject(subject, publisher) ? (await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))) : [],\n event: async (txHash: string, eventHash: string) => await filterEvents(viewer.event(txHash, eventHash)),\n events: async (source: StatementSource, query?: AppliedEventQuery) => await filterEvents(viewer.events(source, eventQuery(query))),\n head: async () => await viewer.head(),\n object: async (objectHash: StatementObjectHash) => await viewer.object(objectHash),\n source: async (source: StatementSource) => await viewer.source(source),\n unresolved: async (txHash: string, eventHash: string) => await viewer.unresolved(txHash, eventHash),\n })\n}\n", "import type {\n PublisherAcceptanceLifecycle,\n WakeSubscriptionLifecycleRevision,\n} from '@xyo-network/event-kit-protocol'\nimport { selectSubscriptionActivation } from '@xyo-network/event-kit-protocol'\nimport type {\n PublisherEncryptionKey,\n PublisherService,\n WakeSubscriptionAcceptance,\n} from '@xyo-network/event-kit-schemas'\n\nimport type { HandshakeCatalogs } from './handshakeCatalog.ts'\nimport {\n exactHandshakeKeyAt,\n exactHandshakeServiceAt,\n} from './handshakeCatalog.ts'\nimport type {\n ClaimedHandshakeObject,\n FinalizedSubscriptionTuple,\n PublisherAcceptanceCandidate,\n PublisherSubscriptionView,\n SubscriptionLifecycleState,\n} from './handshakeReadModelTypes.ts'\n\nexport interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {\n readonly grantRevokedAtBlock?: number\n readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision\n}\n\nexport interface ValidatedSubscriptionAcceptance {\n readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>\n readonly lifecycle: PublisherAcceptanceLifecycle\n readonly subscriber: string\n}\n\nfunction inactiveState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const subscriptionHashes = new Set(tuples.map(tuple => tuple.subscription.objectHash))\n if (tuples.some(tuple => (tuple.grantRevokedAtBlock ?? Infinity) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Infinity) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n return tuples.every(tuple => tuple.subscription.body.expiresAtBlock <= finalizedHead) ? 'expired' : 'inactive'\n}\n\nfunction pendingState(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n finalizedHead: number,\n): SubscriptionLifecycleState {\n const latest = tuples.reduce<ValidatedSubscriptionTuple | undefined>((selected, candidate) =>\n selected === undefined || candidate.subscriptionLifecycle.revision > selected.subscriptionLifecycle.revision\n ? candidate\n : selected, undefined)\n if (latest === undefined) return 'inactive'\n\n const matchingAcceptances = acceptances.filter(item =>\n item.lifecycle.subscription === latest.subscription.objectHash)\n if ((latest.grantRevokedAtBlock ?? Infinity) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Infinity) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Infinity) <= finalizedHead)) {\n return 'revoked'\n }\n return latest.subscription.body.expiresAtBlock <= finalizedHead ? 'expired' : 'pending'\n}\n\nexport function buildPublisherSubscriptionViews(\n tuples: readonly ValidatedSubscriptionTuple[],\n acceptances: readonly ValidatedSubscriptionAcceptance[],\n publisher: string,\n finalizedHead: number,\n): PublisherSubscriptionView[] {\n const grouped = Map.groupBy(tuples, tuple => `${tuple.subscriber}:${tuple.subscription.body.subscriptionId}`)\n const result: PublisherSubscriptionView[] = []\n for (const group of grouped.values()) {\n const first = group[0]\n const groupAcceptances = acceptances.filter(item => item.subscriber === first.subscriber)\n const activation = selectSubscriptionActivation({\n acceptances: groupAcceptances.map(item => item.lifecycle),\n finalizedHead,\n publisherSource: publisher,\n subscriberSource: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n subscriptions: group.map(item => item.subscriptionLifecycle),\n })\n if (activation.ok) {\n const selected = group.find(item => item.subscription.objectHash === activation.subscription.objectHash)\n const acceptance = groupAcceptances.find(item => item.lifecycle.objectHash === activation.acceptance.objectHash)\n if (selected?.grantRevokedAtBlock !== undefined && selected.grantRevokedAtBlock <= finalizedHead) {\n result.push({\n reason: 'grant-revoked',\n state: 'revoked',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n } else {\n result.push({\n ...(acceptance === undefined ? {} : { acceptance: acceptance.claimed }),\n activeFromBlock: activation.activeFromBlock,\n pendingReplacement: activation.pendingReplacement,\n selectedSubscription: activation.subscription.objectHash,\n state: 'active',\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n } else {\n result.push({\n reason: activation.reason,\n state: activation.reason === 'subscription-pending'\n ? pendingState(group, groupAcceptances, finalizedHead)\n : activation.reason === 'invalid-revision-chain' || activation.reason === 'ambiguous-acceptance'\n ? 'rejected'\n : inactiveState(group, groupAcceptances, finalizedHead),\n subscriber: first.subscriber,\n subscriptionId: first.subscription.body.subscriptionId,\n tuples: group,\n })\n }\n }\n return result\n}\n\nfunction publicSubscriptionTuple(tuple: ValidatedSubscriptionTuple): FinalizedSubscriptionTuple {\n return {\n grant: tuple.grant,\n service: tuple.service,\n subscriber: tuple.subscriber,\n subscription: tuple.subscription,\n tupleEvent: tuple.tupleEvent,\n }\n}\n\nfunction isAcceptanceEligibleAtHead(\n tuple: ValidatedSubscriptionTuple,\n catalogs: HandshakeCatalogs,\n serviceHash: string,\n key: ClaimedHandshakeObject<PublisherEncryptionKey>,\n finalizedHead: number,\n publisher: string,\n): boolean {\n return tuple.service.objectHash === serviceHash\n && tuple.subscription.body.encryptionKey === key.objectHash\n && tuple.subscription.body.keyId === key.body.keyId\n && exactHandshakeServiceAt(catalogs, tuple.service, publisher, finalizedHead)\n && exactHandshakeKeyAt(catalogs, tuple.service, key.objectHash, finalizedHead)\n && (tuple.grantRevokedAtBlock === undefined || tuple.grantRevokedAtBlock > finalizedHead)\n && (tuple.subscription.revokedAtBlock === undefined || tuple.subscription.revokedAtBlock > finalizedHead)\n && finalizedHead < Number.MAX_SAFE_INTEGER\n && tuple.subscription.body.expiresAtBlock - finalizedHead > 2\n}\n\nexport interface SelectPublisherAcceptanceCandidatesInput {\n readonly acceptances: readonly ValidatedSubscriptionAcceptance[]\n readonly catalogs: HandshakeCatalogs\n readonly finalizedHead: number\n readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>\n readonly publisher: string\n readonly service: ClaimedHandshakeObject<PublisherService>\n readonly subscriptions: readonly PublisherSubscriptionView[]\n readonly tuples: readonly ValidatedSubscriptionTuple[]\n}\n\nexport function selectPublisherAcceptanceCandidates(\n input: SelectPublisherAcceptanceCandidatesInput,\n): PublisherAcceptanceCandidate[] {\n const acceptedSubscriptions = new Set(input.acceptances.map(item => item.lifecycle.subscription))\n const candidates: PublisherAcceptanceCandidate[] = []\n for (const subscription of input.subscriptions) {\n if (subscription.state !== 'pending'\n && !(subscription.state === 'active' && subscription.pendingReplacement === true)) continue\n\n const highestRevision = Math.max(...subscription.tuples.map(tuple => tuple.subscription.body.revision))\n const latest = input.tuples.filter(tuple =>\n tuple.subscriber === subscription.subscriber\n && tuple.subscription.body.subscriptionId === subscription.subscriptionId\n && tuple.subscription.body.revision === highestRevision)\n if (latest.length !== 1) continue\n const tuple = latest[0]\n if (acceptedSubscriptions.has(tuple.subscription.objectHash)\n || !isAcceptanceEligibleAtHead(\n tuple,\n input.catalogs,\n input.service.objectHash,\n input.key,\n input.finalizedHead,\n input.publisher,\n )) continue\n candidates.push({\n key: input.key,\n subscriber: tuple.subscriber,\n subscriptionId: tuple.subscription.body.subscriptionId,\n tuple: publicSubscriptionTuple(tuple),\n })\n }\n return candidates\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["tuple", "HashZod", "ChainIdZod", "normalizeAddress", "NormalizedAddressZod", "WakeSubscriptionAcceptanceSchema", "STATEMENT_FOLD_VERSION", "HashZod", "HashZod", "ChainIdZod", "NormalizedAddressZod", "PayloadBuilder", "HashZod", "ChainIdZod", "NormalizedAddressZod", "compareApplied", "LegacyHexAddress", "normalizeAddress", "claimKey", "eventKey", "PayloadBuilder", "mismatch", "STATEMENT_FOLD_VERSION", "appliedKey", "HashZod", "normalizeAddress", "WakeSubscriptionAcceptanceSchema", "ChainIdZod", "NormalizedAddressZod", "HashZod", "EncryptedWakeSubscriptionSchema", "NormalizedAddressZod", "PublisherServiceSchema", "WakeGrantObjectSchema", "WakeGrantRevocationSchema", "WakeSubscriptionAcceptanceRevocationSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionRevocationSchema", "XyoAddressZod", "ChainIdZod", "NormalizedAddressZod", "PublisherEncryptionKeyRevocationSchema", "PublisherEncryptionKeySchema", "PublisherServiceRevocationSchema", "PublisherServiceSchema", "SOURCE_WAKE_EVENT_KIND", "PayloadBuilder", "XyoAddressZod", "LegacyHexAddress", "normalizeAddress", "tuple", "XyoAddressZod", "WakeGrantRevocationSchema", "WakeSubscriptionRevocationSchema", "PublisherServiceSchema", "WakeGrantObjectSchema", "EncryptedWakeSubscriptionSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionAcceptanceRevocationSchema", "tuple", "NormalizedAddressZod"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"publisherSubjectViewer.d.ts","sourceRoot":"","sources":["../../src/publisherSubjectViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EAGpB,gBAAgB,EACjB,MAAM,yCAAyC,CAAA;AAQhD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,gBAAgB,GAC1B,oBAAoB,CAsBtB"}
1
+ {"version":3,"file":"publisherSubjectViewer.d.ts","sourceRoot":"","sources":["../../src/publisherSubjectViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,oBAAoB,EAGpB,gBAAgB,EACjB,MAAM,yCAAyC,CAAA;AAQhD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,oBAAoB,EAC5B,SAAS,EAAE,gBAAgB,GAC1B,oBAAoB,CAmBtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"replayCheckpoint.d.ts","sourceRoot":"","sources":["../../src/replayCheckpoint.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mCAAmC,EAAG,CAAU,CAAA;AAE7D,eAAO,MAAM,qBAAqB;;;kBAGhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE,eAAO,MAAM,oBAAoB;;;kBAG/B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEpE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;kBAKhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBtC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAElF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAWD,MAAM,MAAM,4BAA4B,GAClC;IAAE,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AA0SpC,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,gCAAgC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CAwBvC"}
1
+ {"version":3,"file":"replayCheckpoint.d.ts","sourceRoot":"","sources":["../../src/replayCheckpoint.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,mCAAmC,EAAG,CAAU,CAAA;AAE7D,eAAO,MAAM,qBAAqB;;;kBAGhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE,eAAO,MAAM,oBAAoB;;;kBAG/B,CAAA;AACF,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAA;AAEpE,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;kBAKhC,CAAA;AACF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEtE;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBtC,CAAA;AACF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;AAElF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAWD,MAAM,MAAM,4BAA4B,GAClC;IAAE,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC3E;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,mBAAmB,CAAA;CAAE,GAC7E;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,CAAA;AA8RpC,wBAAsB,4BAA4B,CAChD,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,gCAAgC,GACzC,OAAO,CAAC,4BAA4B,CAAC,CAuBvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"subscriptionLifecycleView.d.ts","sourceRoot":"","sources":["../../src/subscriptionLifecycleView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iCAAiC,EAClC,MAAM,iCAAiC,CAAA;AAExC,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAK9D,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EAE1B,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,qBAAqB,EAAE,iCAAiC,CAAA;CAClE;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,0BAA0B,CAAC,CAAA;IACpE,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAA;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAwCD,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,0BAA0B,EAAE,EAC7C,WAAW,EAAE,SAAS,+BAA+B,EAAE,EACvD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,yBAAyB,EAAE,CAoD7B;AA+BD,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,+BAA+B,EAAE,CAAA;IAChE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;IAC1D,QAAQ,CAAC,aAAa,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACvD;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,GAC9C,4BAA4B,EAAE,CA+BhC"}
1
+ {"version":3,"file":"subscriptionLifecycleView.d.ts","sourceRoot":"","sources":["../../src/subscriptionLifecycleView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iCAAiC,EAClC,MAAM,iCAAiC,CAAA;AAExC,OAAO,KAAK,EACV,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC3B,MAAM,gCAAgC,CAAA;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAK9D,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,4BAA4B,EAC5B,yBAAyB,EAE1B,MAAM,8BAA8B,CAAA;AAErC,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,QAAQ,CAAC,qBAAqB,EAAE,iCAAiC,CAAA;CAClE;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,0BAA0B,CAAC,CAAA;IACpE,QAAQ,CAAC,SAAS,EAAE,4BAA4B,CAAA;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAuCD,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,SAAS,0BAA0B,EAAE,EAC7C,WAAW,EAAE,SAAS,+BAA+B,EAAE,EACvD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,GACpB,yBAAyB,EAAE,CAoD7B;AA+BD,MAAM,WAAW,wCAAwC;IACvD,QAAQ,CAAC,WAAW,EAAE,SAAS,+BAA+B,EAAE,CAAA;IAChE,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAA;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,sBAAsB,CAAC,sBAAsB,CAAC,CAAA;IAC5D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC,gBAAgB,CAAC,CAAA;IAC1D,QAAQ,CAAC,aAAa,EAAE,SAAS,yBAAyB,EAAE,CAAA;IAC5D,QAAQ,CAAC,MAAM,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACvD;AAED,wBAAgB,mCAAmC,CACjD,KAAK,EAAE,wCAAwC,GAC9C,4BAA4B,EAAE,CA+BhC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/event-kit-statement-graph",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Statement Graph read-model adapter for Event Kit wake grants",
5
5
  "keywords": [
6
6
  "xyo",
@@ -33,32 +33,32 @@
33
33
  "README.md"
34
34
  ],
35
35
  "dependencies": {
36
- "@xyo-network/event-kit-protocol": "~1.0.0",
37
- "@xyo-network/event-kit-schemas": "~1.0.0"
36
+ "@xyo-network/event-kit-protocol": "~1.0.1",
37
+ "@xyo-network/event-kit-schemas": "~1.0.1"
38
38
  },
39
39
  "devDependencies": {
40
- "@ariestools/lib-neutral": "~10.0.7",
41
- "@ariestools/sdk": "~9.0.0",
42
- "@ariestools/toolchain": "~10.0.7",
43
- "@ariestools/tsconfig": "~10.0.7",
40
+ "@ariestools/lib-neutral": "~10.0.8",
41
+ "@ariestools/sdk": "~9.0.1",
42
+ "@ariestools/toolchain": "~10.0.8",
43
+ "@ariestools/tsconfig": "~10.0.8",
44
44
  "@opentelemetry/api": "~1.9.1",
45
- "@xyo-network/event-kit-xl1": "~1.0.0",
46
- "@xyo-network/sdk": "~8.0.0",
47
- "@xyo-network/sdk-protocol": "~8.0.0",
48
- "@xyo-network/xl1-protocol": "~5.5.4",
49
- "@xyo-network/xl1-sdk": "~5.5.4",
50
- "@xyo-network/xl1-statement-graph-engine": "~0.5.3",
51
- "@xyo-network/xl1-statement-graph-schemas": "~0.5.3",
52
- "@xyo-network/xl1-statement-graph-sdk": "~0.5.3",
53
- "@xyo-network/xl1-statement-graph-testing": "~0.5.3",
45
+ "@xyo-network/event-kit-xl1": "~1.0.1",
46
+ "@xyo-network/sdk": "~8.0.1",
47
+ "@xyo-network/sdk-protocol": "~8.0.1",
48
+ "@xyo-network/xl1-protocol": "~5.8.0",
49
+ "@xyo-network/xl1-sdk": "~5.8.0",
50
+ "@xyo-network/xl1-statement-graph-engine": "~0.5.4",
51
+ "@xyo-network/xl1-statement-graph-schemas": "~0.5.4",
52
+ "@xyo-network/xl1-statement-graph-sdk": "~0.5.4",
53
+ "@xyo-network/xl1-statement-graph-testing": "~0.5.4",
54
54
  "ajv": "~8.20.0",
55
55
  "async-mutex": "~0.5.0",
56
56
  "eslint": "~10.11.0",
57
57
  "eslint-import-resolver-typescript": "~4.4.5",
58
58
  "ethers": "~6.17.0",
59
59
  "typescript": "~6.0.3",
60
- "vite": "~8.3.0",
61
- "vitest": "~5.0.1",
60
+ "vite": "~8.3.1",
61
+ "vitest": "~5.0.3",
62
62
  "zod": "~4.6.5"
63
63
  },
64
64
  "peerDependencies": {
@@ -66,7 +66,7 @@
66
66
  "@opentelemetry/api": "^1.9",
67
67
  "@xyo-network/sdk": "^8.0",
68
68
  "@xyo-network/sdk-protocol": "^8.0",
69
- "@xyo-network/xl1-protocol": "^5.5",
69
+ "@xyo-network/xl1-protocol": "^5.8",
70
70
  "@xyo-network/xl1-statement-graph-engine": "^0.5",
71
71
  "@xyo-network/xl1-statement-graph-schemas": "^0.5",
72
72
  "@xyo-network/xl1-statement-graph-sdk": "^0.5",