@xyo-network/event-kit-statement-graph 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -48
- package/dist/neutral/checkpointViewer.d.ts +5 -0
- package/dist/neutral/checkpointViewer.d.ts.map +1 -0
- package/dist/neutral/eventKitSchemaPolicy.d.ts +28 -0
- package/dist/neutral/eventKitSchemaPolicy.d.ts.map +1 -0
- package/dist/neutral/finalizedReplayController.d.ts +35 -0
- package/dist/neutral/finalizedReplayController.d.ts.map +1 -0
- package/dist/neutral/grantReadModel.d.ts +2 -2
- package/dist/neutral/handshakeCatalog.d.ts +45 -0
- package/dist/neutral/handshakeCatalog.d.ts.map +1 -0
- package/dist/neutral/handshakeReadModel.d.ts +3 -0
- package/dist/neutral/handshakeReadModel.d.ts.map +1 -0
- package/dist/neutral/handshakeReadModelTypes.d.ts +142 -0
- package/dist/neutral/handshakeReadModelTypes.d.ts.map +1 -0
- package/dist/neutral/index.d.ts +8 -0
- package/dist/neutral/index.d.ts.map +1 -1
- package/dist/neutral/index.mjs +1489 -5
- package/dist/neutral/index.mjs.map +4 -4
- package/dist/neutral/publisherSubjectViewer.d.ts +9 -0
- package/dist/neutral/publisherSubjectViewer.d.ts.map +1 -0
- package/dist/neutral/replayCheckpoint.d.ts +178 -0
- package/dist/neutral/replayCheckpoint.d.ts.map +1 -0
- package/dist/neutral/subscriptionLifecycleView.d.ts +26 -0
- package/dist/neutral/subscriptionLifecycleView.d.ts.map +1 -0
- package/package.json +25 -18
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/grantReadModel.ts"],
|
|
4
|
-
"sourcesContent": ["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 { ClaimRecord, ObjectRecord } 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 \u2014 and under v2 that\n * is the whole lifecycle, since there is no revoke verb to own.\n */\nexport function createStatementGraphGrantReadModel(\n options: StatementGraphGrantReadModelOptions,\n): StatementGraphGrantReadModel {\n const { viewer } = options\n\n return Object.freeze({\n async head(): Promise<number> {\n return await viewer.head()\n },\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 }\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 })\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"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,eAAe;AAOxB,SAAS,qBAAqB;AAyBvB,SAAS,mCACd,SAC8B;AAC9B,QAAM,EAAE,OAAO,IAAI;AAEnB,SAAO,OAAO,OAAO;AAAA,IACnB,MAAM,OAAwB;AAC5B,aAAO,MAAM,OAAO,KAAK;AAAA,IAC3B;AAAA,IAEA,MAAM,OACJ,QACA,OACyC;AACzC,YAAM,UAAU,MAAM,OAAO,OAAO,cAAc,MAAM,MAAM,GAAG,aAAa,KAAK,CAAC;AACpF,aAAO,OAAO,OAAO,QAAQ,IAAI,YAAY,CAAC;AAAA,IAChD;AAAA,IAEA,MAAM,OAAO,YAA+D;AAC1E,YAAM,SAAS,MAAM,OAAO,OAAO,QAAQ,MAAM,UAAU,CAAC;AAC5D,aAAO,WAAW,SAAY,SAAY,cAAc,MAAM;AAAA,IAChE;AAAA,EACF,CAAC;AACH;AAOA,SAAS,aAAa,OAA0D;AAC9E,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO;AAAA,IACL,GAAI,MAAM,+BAA+B,SACrC,CAAC,IACD,EAAE,4BAA4B,MAAM,2BAA2B;AAAA,IACnE,GAAI,MAAM,eAAe,SAAY,CAAC,IAAI,EAAE,YAAY,QAAQ,MAAM,MAAM,UAAU,EAAE;AAAA,EAC1F;AACF;AAQA,SAAS,aAAa,QAA0C;AAC9D,SAAO,OAAO,OAAO;AAAA,IACnB,sBAAsB,OAAO;AAAA,IAC7B,YAAY,OAAO;AAAA,IACnB,gBAAgB,OAAO;AAAA,IACvB,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO;AAAA,EACjB,CAAC;AACH;AAEA,SAAS,cAAc,QAA4C;AACjE,SAAO,OAAO,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,IACvB,YAAY,OAAO;AAAA,IACnB,QAAQ,OAAO,WAAW,OAAO,OAAO,OAAO,OAAO,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,EAC5E,CAAC;AACH;",
|
|
6
|
-
"names": []
|
|
3
|
+
"sources": ["../../src/checkpointViewer.ts", "../../src/eventKitSchemaPolicy.ts", "../../src/finalizedReplayController.ts", "../../src/replayCheckpoint.ts", "../../src/grantReadModel.ts", "../../src/handshakeReadModel.ts", "../../src/handshakeCatalog.ts", "../../src/publisherSubjectViewer.ts", "../../src/subscriptionLifecycleView.ts"],
|
|
4
|
+
"sourcesContent": ["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()])\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 async claimsByObject(objectHash: StatementObjectHash): Promise<ClaimRecord[]> {\n return claims.filter(record => record.objectHash === objectHash)\n },\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 async event(txHash: string, eventHash: string): Promise<AppliedEventRecord[]> {\n return applied.filter(record => record.txHash === txHash && record.eventHash === eventHash)\n },\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 return {\n claims: new Set(records.map(record => claimKey(record.source, record.subject, record.objectHash))).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 async unresolved(txHash: string, eventHash: string): Promise<UnresolvedEventReference | undefined> {\n return unresolved.find(record => record.txHash === txHash && record.eventHash === eventHash)\n },\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 FinalizedBlockViewer,\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 {\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: FinalizedBlockViewer\n readonly checkpointStore: EventKitReplayCheckpointStore\n}\n\nexport interface FinalizedEventKitReplayStatus {\n readonly blocked?: ReplayBlockedState\n readonly finalizedHead: number\n readonly indexedThrough: number | null\n}\n\nexport interface FinalizedEventKitReplayController {\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(): Promise<FinalizedEventKitReplayStatus>\n /** Snapshot viewer; request it again after `sync()` to observe the new checkpoint. */\n viewer(): StatementGraphViewer\n}\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 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 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 return [...new Map(records.map(record => [corruptKey(record), record])).values()]\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return [...new Set(values)]\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()].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]\n .map(([hash, body]) => ({ body, hash: HashZod.parse(hash) }))\n .toSorted((left, right) => left.hash.localeCompare(right.hash))\n}\n\ninterface StagedBlock {\n readonly applied: AppliedEventRecord[]\n readonly blocked?: ReplayBlockedState\n readonly bodies: Map<string, Record<string, unknown>>\n readonly scan: StatementScanCheckpoint\n}\n\nasync function stageBlock(\n options: FinalizedEventKitReplayOptions,\n prior: EventKitReplayCheckpoint,\n block: number,\n): Promise<StagedBlock> {\n const result = await scanFinalizedStatements(\n options.chain,\n options.bodies,\n replayContract(options, block),\n {\n batchSize: 1,\n ...(prior.scan === null ? {} : { resumeFrom: prior.scan }),\n strict: { rejectAmbiguousSchemaDeclarations: true },\n through: block,\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(\n record => normalizeAddress(record.subject) === options.publisher,\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 const isBlocked = result.unresolved.length > 0 || objectHashes.length > 0 || corrupt.length > 0\n return {\n applied,\n bodies: new Map([...objects.bodies, ...attachments.bodies]),\n scan: result.checkpoint,\n ...(isBlocked\n ? {\n blocked: {\n atBlock: block,\n corrupt,\n objectHashes,\n unresolvedEvents: result.unresolved,\n },\n }\n : {}),\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 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(): Promise<FinalizedEventKitReplayStatus> {\n const result = this.#syncTail.then(async () => await this.#syncOnce())\n this.#syncTail = result.then(\n () => true,\n () => false,\n )\n return result\n }\n\n viewer(): StatementGraphViewer {\n return createCheckpointStatementGraphViewer(this.#checkpoint)\n }\n\n async #syncOnce(): Promise<FinalizedEventKitReplayStatus> {\n const finalizedHead = requireHead(await this.#options.chain.finalization.headNumber())\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 let changed = finalizedHead !== this.#checkpoint.finalizedHead\n while (next <= finalizedHead) {\n const staged = await stageBlock(this.#options, this.#checkpoint, next)\n if (staged.blocked !== undefined) {\n const blocked = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: staged.blocked,\n finalizedHead,\n })\n await this.#options.checkpointStore.save(blocked)\n this.#checkpoint = blocked\n return this.status()\n }\n\n const committed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n applied: mergeApplied(this.#checkpoint.applied, staged.applied),\n bodies: mergeBodies(this.#checkpoint.bodies, staged.bodies),\n blocked: undefined,\n finalizedHead,\n indexedThrough: next,\n scan: staged.scan,\n })\n await this.#options.checkpointStore.save(committed)\n this.#checkpoint = committed\n changed = false\n next += 1\n }\n\n if (changed || this.#checkpoint.blocked !== undefined) {\n const observed = EventKitReplayCheckpointZod.parse({\n ...this.#checkpoint,\n blocked: undefined,\n finalizedHead,\n })\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 floorBlock: requireFloor(rawOptions.floorBlock),\n network: rawOptions.network.trim(),\n publisher: NormalizedAddressZod.parse(rawOptions.publisher),\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 async load(): Promise<unknown> {\n return value\n },\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, NormalizedAddressZod } 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 = 2 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 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\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 sameSchemas(actual: readonly string[]): boolean {\n return actual.length === EventKitClaimedObjectSchemas.length\n && actual.every((schema, index) => schema === EventKitClaimedObjectSchemas[index])\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()])\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 } = 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 && 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 actualKeys = [...new Set(watermarkGroupEventKeys)].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 expectedKeys = [...new Set(group.map(eventKey))].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 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 if (checkpoint.chainId !== identity.chainId) {\n return { detail: `chainId ${checkpoint.chainId} != ${identity.chainId}`, status: 'identity-mismatch' }\n }\n if (checkpoint.floorBlock !== identity.floorBlock) {\n return { detail: `floorBlock ${checkpoint.floorBlock} != ${identity.floorBlock}`, status: 'identity-mismatch' }\n }\n if (checkpoint.network !== identity.network) {\n return { detail: `network ${checkpoint.network} != ${identity.network}`, status: 'identity-mismatch' }\n }\n if (checkpoint.sourceId !== identity.sourceId) {\n return { detail: `sourceId ${checkpoint.sourceId} != ${identity.sourceId}`, status: 'identity-mismatch' }\n }\n if (checkpoint.publisher !== identity.publisher) {\n return { detail: `publisher ${checkpoint.publisher} != ${identity.publisher}`, status: 'identity-mismatch' }\n }\n if (!sameSchemas(checkpoint.objectSchemas)) {\n return { detail: 'Event Kit indexed schema policy differs', status: 'identity-mismatch' }\n }\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 { ClaimRecord, ObjectRecord } 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 async head(): Promise<number> {\n return await viewer.head()\n },\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 FINALIZED_HEAD_EVENT_KIND,\n HandshakeIdZod,\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 { HandshakeCatalogs, HandshakeServiceDiscovery } 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 { isPublisherSubject, publisherSubjectViewer } 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 && subscription.eventKind === FINALIZED_HEAD_EVENT_KIND\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)\n const grantEntries = records.filter(record => record.objectSchema === WakeGrantObjectSchema)\n const subscriptionEntries = records.filter(record => 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 const tupleBlock = subscriptionRecord.block\n\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 claimedKey = catalogs.keyByHash.get(subscription.encryptionKey)\n if (service.evidence.block >= tupleBlock) return reject('service-inactive-at-claim')\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 sources = candidateSources === undefined\n ? [...new Set((await viewer.claimsBySubject(XyoAddressZod.parse(query.publisher)))\n .filter(claim => serviceHashes.has(claim.objectHash))\n .map(claim => claim.source))]\n .filter(source => !isPublisherSubject(source, query.publisher))\n : [...new Set(candidateSources)]\n .filter(source => !isPublisherSubject(source, query.publisher))\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()] }\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()].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 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 async discoverPublisherService(query: PublisherHandshakeQuery): Promise<PublisherServiceDiscovery> {\n return (await discoverHandshakeService(publisherSubjectOptions(options, query.publisher), query)).result\n },\n\n async publisher(query: PublisherHandshakeQuery): Promise<PublisherHandshakeView> {\n return handshakeView(await handshakeLifecycle(options, query))\n },\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 FINALIZED_HEAD_EVENT_KIND,\n NormalizedAddressZod,\n PublisherEncryptionKeyRevocationSchema,\n PublisherEncryptionKeyRevocationZod,\n PublisherEncryptionKeySchema,\n PublisherEncryptionKeyZod,\n PublisherServiceRevocationSchema,\n PublisherServiceRevocationZod,\n PublisherServiceSchema,\n PublisherServiceZod,\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()]\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),\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 })),\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 })),\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: FINALIZED_HEAD_EVENT_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 ?? FINALIZED_HEAD_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 ?? FINALIZED_HEAD_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 ?? FINALIZED_HEAD_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 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 async claims(source: StatementSource, query?: ClaimQuery) {\n return await filterClaims(viewer.claims(source, claimQuery(query)))\n },\n async claimsByObject(objectHash: StatementObjectHash) {\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery({ objectHash })))\n },\n async claimsBySubject(subject: StatementSubject, query?: ClaimQuery) {\n if (!isPublisherSubject(subject, publisher)) return []\n return await filterClaims(viewer.claimsBySubject(publisher, claimQuery(query)))\n },\n async event(txHash: string, eventHash: string) {\n return await filterEvents(viewer.event(txHash, eventHash))\n },\n async events(source: StatementSource, query?: AppliedEventQuery) {\n return await filterEvents(viewer.events(source, eventQuery(query)))\n },\n async head() {\n return await viewer.head()\n },\n async object(objectHash: StatementObjectHash) {\n return await viewer.object(objectHash)\n },\n async source(source: StatementSource) {\n return await viewer.source(source)\n },\n async unresolved(txHash: string, eventHash: string) {\n return await viewer.unresolved(txHash, eventHash)\n },\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 { exactHandshakeKeyAt, exactHandshakeServiceAt } 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 ?? Number.POSITIVE_INFINITY) <= finalizedHead)\n || tuples.some(tuple => (tuple.subscription.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead)\n || acceptances.some(item => subscriptionHashes.has(item.lifecycle.subscription)\n && (item.lifecycle.revokedAtBlock ?? Number.POSITIVE_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 ?? Number.POSITIVE_INFINITY) <= finalizedHead\n || (latest.subscription.revokedAtBlock ?? Number.POSITIVE_INFINITY) <= finalizedHead\n || matchingAcceptances.some(item =>\n (item.lifecycle.revokedAtBlock ?? Number.POSITIVE_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
|
+
"names": ["HashZod", "ChainIdZod", "normalizeAddress", "NormalizedAddressZod", "WakeSubscriptionAcceptanceSchema", "STATEMENT_FOLD_VERSION", "compareApplied", "LegacyHexAddress", "normalizeAddress", "claimKey", "eventKey", "STATEMENT_FOLD_VERSION", "appliedKey", "HashZod", "normalizeAddress", "WakeSubscriptionAcceptanceSchema", "ChainIdZod", "NormalizedAddressZod", "HashZod", "EncryptedWakeSubscriptionSchema", "FINALIZED_HEAD_EVENT_KIND", "NormalizedAddressZod", "PublisherServiceSchema", "WakeGrantObjectSchema", "WakeGrantRevocationSchema", "WakeSubscriptionAcceptanceRevocationSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionRevocationSchema", "XyoAddressZod", "ChainIdZod", "NormalizedAddressZod", "PublisherEncryptionKeyRevocationSchema", "PublisherEncryptionKeySchema", "PublisherServiceRevocationSchema", "PublisherServiceSchema", "PayloadBuilder", "XyoAddressZod", "LegacyHexAddress", "normalizeAddress", "tuple", "XyoAddressZod", "FINALIZED_HEAD_EVENT_KIND", "WakeGrantRevocationSchema", "WakeSubscriptionRevocationSchema", "PublisherServiceSchema", "WakeGrantObjectSchema", "EncryptedWakeSubscriptionSchema", "WakeSubscriptionAcceptanceSchema", "WakeSubscriptionAcceptanceZod", "WakeSubscriptionAcceptanceRevocationSchema", "tuple", "NormalizedAddressZod"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StatementGraphViewer, StatementSubject } from '@xyo-network/xl1-statement-graph-engine';
|
|
2
|
+
export declare function isPublisherSubject(subject: string, publisher: string): boolean;
|
|
3
|
+
/**
|
|
4
|
+
* Defense-in-depth boundary for generic Statement Graph viewers. Querying by
|
|
5
|
+
* subject is not enough: a backing may ignore optional filters, so every
|
|
6
|
+
* returned record is filtered again before D-005 interprets it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function publisherSubjectViewer(viewer: StatementGraphViewer, publisher: StatementSubject): StatementGraphViewer;
|
|
9
|
+
//# sourceMappingURL=publisherSubjectViewer.d.ts.map
|
|
@@ -0,0 +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,CAsCtB"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const EVENT_KIT_REPLAY_CHECKPOINT_VERSION: 2;
|
|
3
|
+
export declare const ResolvedReplayBodyZod: z.ZodObject<{
|
|
4
|
+
body: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
5
|
+
hash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
6
|
+
}, z.core.$strict>;
|
|
7
|
+
export type ResolvedReplayBody = z.infer<typeof ResolvedReplayBodyZod>;
|
|
8
|
+
export declare const ReplayCorruptBodyZod: z.ZodObject<{
|
|
9
|
+
claimedHash: z.ZodOptional<z.ZodString>;
|
|
10
|
+
computedHash: z.ZodString;
|
|
11
|
+
}, z.core.$strict>;
|
|
12
|
+
export type ReplayCorruptBody = z.infer<typeof ReplayCorruptBodyZod>;
|
|
13
|
+
export declare const ReplayBlockedStateZod: z.ZodObject<{
|
|
14
|
+
atBlock: import("zod/mini").ZodMiniNumberFormat;
|
|
15
|
+
corrupt: z.ZodArray<z.ZodObject<{
|
|
16
|
+
claimedHash: z.ZodOptional<z.ZodString>;
|
|
17
|
+
computedHash: z.ZodString;
|
|
18
|
+
}, z.core.$strict>>;
|
|
19
|
+
objectHashes: z.ZodArray<import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>>;
|
|
20
|
+
unresolvedEvents: z.ZodArray<import("zod/mini").ZodMiniObject<{
|
|
21
|
+
block: import("zod/mini").ZodMiniNumberFormat;
|
|
22
|
+
eventHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
23
|
+
eventSchema: import("zod/mini").ZodMiniString<string>;
|
|
24
|
+
txHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
25
|
+
}, z.core.$strict>>;
|
|
26
|
+
}, z.core.$strict>;
|
|
27
|
+
export type ReplayBlockedState = z.infer<typeof ReplayBlockedStateZod>;
|
|
28
|
+
/**
|
|
29
|
+
* Durable, lossless Event Kit projection checkpoint.
|
|
30
|
+
*
|
|
31
|
+
* The upstream Statement Graph checkpoint deliberately retains only the slim
|
|
32
|
+
* current claim set. Event Kit additionally persists the complete applied
|
|
33
|
+
* event stream for its publisher subject because exact same-claim subscription
|
|
34
|
+
* fans cannot be recovered from that current set after restart. The embedded
|
|
35
|
+
* upstream scan checkpoint remains chainwide because its replay contract has
|
|
36
|
+
* no subject filter.
|
|
37
|
+
*/
|
|
38
|
+
export declare const EventKitReplayCheckpointZod: z.ZodObject<{
|
|
39
|
+
applied: z.ZodArray<import("zod/mini").ZodMiniObject<{
|
|
40
|
+
block: import("zod/mini").ZodMiniNumberFormat;
|
|
41
|
+
blockEventOrdinal: import("zod/mini").ZodMiniObject<{
|
|
42
|
+
tx: import("zod/mini").ZodMiniNumberFormat;
|
|
43
|
+
event: import("zod/mini").ZodMiniNumberFormat;
|
|
44
|
+
}, z.core.$strict>;
|
|
45
|
+
eventHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
46
|
+
hashIndex: import("zod/mini").ZodMiniNumberFormat;
|
|
47
|
+
objectHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
48
|
+
objectSchema: import("zod/mini").ZodMiniString<string>;
|
|
49
|
+
source: import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<Lowercase<string> & {
|
|
50
|
+
readonly __hex: true;
|
|
51
|
+
} & {
|
|
52
|
+
readonly __address: true;
|
|
53
|
+
}, string>>, import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@xyo-network/sdk-protocol/address").XyoQuantAddress, string>>]>;
|
|
54
|
+
subject: import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<Lowercase<string> & {
|
|
55
|
+
readonly __hex: true;
|
|
56
|
+
} & {
|
|
57
|
+
readonly __address: true;
|
|
58
|
+
}, string>>, import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@xyo-network/sdk").XyoQuantAddress, string>>]>, import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>]>;
|
|
59
|
+
txHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
60
|
+
}, z.core.$strict>>;
|
|
61
|
+
blocked: z.ZodOptional<z.ZodObject<{
|
|
62
|
+
atBlock: import("zod/mini").ZodMiniNumberFormat;
|
|
63
|
+
corrupt: z.ZodArray<z.ZodObject<{
|
|
64
|
+
claimedHash: z.ZodOptional<z.ZodString>;
|
|
65
|
+
computedHash: z.ZodString;
|
|
66
|
+
}, z.core.$strict>>;
|
|
67
|
+
objectHashes: z.ZodArray<import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>>;
|
|
68
|
+
unresolvedEvents: z.ZodArray<import("zod/mini").ZodMiniObject<{
|
|
69
|
+
block: import("zod/mini").ZodMiniNumberFormat;
|
|
70
|
+
eventHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
71
|
+
eventSchema: import("zod/mini").ZodMiniString<string>;
|
|
72
|
+
txHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
73
|
+
}, z.core.$strict>>;
|
|
74
|
+
}, z.core.$strict>>;
|
|
75
|
+
bodies: z.ZodArray<z.ZodObject<{
|
|
76
|
+
body: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
77
|
+
hash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
78
|
+
}, z.core.$strict>>;
|
|
79
|
+
chainId: z.ZodString;
|
|
80
|
+
finalizedHead: import("zod/mini").ZodMiniNumberFormat;
|
|
81
|
+
floorBlock: import("zod/mini").ZodMiniNumberFormat;
|
|
82
|
+
foldVersion: z.ZodLiteral<4>;
|
|
83
|
+
indexedThrough: z.ZodUnion<readonly [import("zod/mini").ZodMiniNumberFormat, z.ZodNull]>;
|
|
84
|
+
network: z.ZodString;
|
|
85
|
+
objectSchemas: z.ZodTuple<[z.ZodLiteral<"network.xyo.event.wake.publisher" & {
|
|
86
|
+
readonly __schema: true;
|
|
87
|
+
}>, ...z.ZodLiteral<("network.xyo.event.wake.publisher" & {
|
|
88
|
+
readonly __schema: true;
|
|
89
|
+
}) | ("network.xyo.event.wake.publisher.key" & {
|
|
90
|
+
readonly __schema: true;
|
|
91
|
+
}) | ("network.xyo.event.wake.publisher.revocation" & {
|
|
92
|
+
readonly __schema: true;
|
|
93
|
+
}) | ("network.xyo.event.wake.publisher.key.revocation" & {
|
|
94
|
+
readonly __schema: true;
|
|
95
|
+
}) | ("network.xyo.event.wake.subscription" & {
|
|
96
|
+
readonly __schema: true;
|
|
97
|
+
}) | ("network.xyo.event.wake.grant" & {
|
|
98
|
+
readonly __schema: true;
|
|
99
|
+
}) | ("network.xyo.event.wake.subscription.revocation" & {
|
|
100
|
+
readonly __schema: true;
|
|
101
|
+
}) | ("network.xyo.event.wake.grant.revocation" & {
|
|
102
|
+
readonly __schema: true;
|
|
103
|
+
}) | ("network.xyo.event.wake.subscription.acceptance" & {
|
|
104
|
+
readonly __schema: true;
|
|
105
|
+
}) | ("network.xyo.event.wake.subscription.acceptance.revocation" & {
|
|
106
|
+
readonly __schema: true;
|
|
107
|
+
})>[]], null>;
|
|
108
|
+
publisher: z.ZodString;
|
|
109
|
+
scan: z.ZodUnion<readonly [import("zod/mini").ZodMiniObject<{
|
|
110
|
+
contract: import("zod/mini").ZodMiniObject<{
|
|
111
|
+
eventBodyCorpus: import("zod/mini").ZodMiniObject<{
|
|
112
|
+
sourceId: import("zod/mini").ZodMiniString<string>;
|
|
113
|
+
unresolvedDigest: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>>;
|
|
114
|
+
}, z.core.$strict>;
|
|
115
|
+
floorBlock: import("zod/mini").ZodMiniNumberFormat;
|
|
116
|
+
foldVersion: import("zod/mini").ZodMiniNumberFormat;
|
|
117
|
+
indexedSchemaPolicy: import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniLiteral<"any-object-schema">, import("zod/mini").ZodMiniObject<{
|
|
118
|
+
foldedObjectSchemas: import("zod/mini").ZodMiniArray<import("zod/mini").ZodMiniString<string>>;
|
|
119
|
+
}, z.core.$strict>]>;
|
|
120
|
+
network: import("zod/mini").ZodMiniString<string>;
|
|
121
|
+
throughBlock: import("zod/mini").ZodMiniNumberFormat;
|
|
122
|
+
}, z.core.$strict>;
|
|
123
|
+
frozenRecords: import("zod/mini").ZodMiniArray<import("zod/mini").ZodMiniObject<{
|
|
124
|
+
declaredObjectSchema: import("zod/mini").ZodMiniString<string>;
|
|
125
|
+
firstBlock: import("zod/mini").ZodMiniNumberFormat;
|
|
126
|
+
firstEventHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
127
|
+
objectHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
128
|
+
source: import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<Lowercase<string> & {
|
|
129
|
+
readonly __hex: true;
|
|
130
|
+
} & {
|
|
131
|
+
readonly __address: true;
|
|
132
|
+
}, string>>, import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@xyo-network/sdk-protocol/address").XyoQuantAddress, string>>]>;
|
|
133
|
+
subject: import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniUnion<readonly [import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<Lowercase<string> & {
|
|
134
|
+
readonly __hex: true;
|
|
135
|
+
} & {
|
|
136
|
+
readonly __address: true;
|
|
137
|
+
}, string>>, import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@xyo-network/sdk").XyoQuantAddress, string>>]>, import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>]>;
|
|
138
|
+
}, z.core.$strict>>;
|
|
139
|
+
recordClocks: import("zod/mini").ZodMiniRecord<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniNumberFormat>;
|
|
140
|
+
recordShards: import("zod/mini").ZodMiniArray<import("zod/mini").ZodMiniString<string>>;
|
|
141
|
+
unresolved: import("zod/mini").ZodMiniArray<import("zod/mini").ZodMiniObject<{
|
|
142
|
+
block: import("zod/mini").ZodMiniNumberFormat;
|
|
143
|
+
eventHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
144
|
+
eventSchema: import("zod/mini").ZodMiniString<string>;
|
|
145
|
+
txHash: import("zod/mini").ZodMiniPipe<import("zod/mini").ZodMiniString<string>, import("zod/mini").ZodMiniTransform<import("@ariestools/sdk").BrandedHash, string>>;
|
|
146
|
+
}, z.core.$strict>>;
|
|
147
|
+
version: import("zod/mini").ZodMiniLiteral<2>;
|
|
148
|
+
watermark: import("zod/mini").ZodMiniOptional<import("zod/mini").ZodMiniObject<{
|
|
149
|
+
block: import("zod/mini").ZodMiniNumberFormat;
|
|
150
|
+
ordinal: import("zod/mini").ZodMiniObject<{
|
|
151
|
+
tx: import("zod/mini").ZodMiniNumberFormat;
|
|
152
|
+
event: import("zod/mini").ZodMiniNumberFormat;
|
|
153
|
+
}, z.core.$strict>;
|
|
154
|
+
}, z.core.$strict>>;
|
|
155
|
+
watermarkGroupEventKeys: import("zod/mini").ZodMiniArray<import("zod/mini").ZodMiniString<string>>;
|
|
156
|
+
}, z.core.$strict>, z.ZodNull]>;
|
|
157
|
+
sourceId: z.ZodString;
|
|
158
|
+
version: z.ZodLiteral<2>;
|
|
159
|
+
}, z.core.$strict>;
|
|
160
|
+
export type EventKitReplayCheckpoint = z.infer<typeof EventKitReplayCheckpointZod>;
|
|
161
|
+
export interface EventKitReplayCheckpointIdentity {
|
|
162
|
+
readonly chainId: string;
|
|
163
|
+
readonly floorBlock: number;
|
|
164
|
+
readonly network: string;
|
|
165
|
+
readonly publisher: string;
|
|
166
|
+
readonly sourceId: string;
|
|
167
|
+
}
|
|
168
|
+
export type EventKitReplayCheckpointLoad = {
|
|
169
|
+
readonly checkpoint: EventKitReplayCheckpoint;
|
|
170
|
+
readonly status: 'valid';
|
|
171
|
+
} | {
|
|
172
|
+
readonly detail: string;
|
|
173
|
+
readonly status: 'corrupt' | 'identity-mismatch';
|
|
174
|
+
} | {
|
|
175
|
+
readonly status: 'missing';
|
|
176
|
+
};
|
|
177
|
+
export declare function loadEventKitReplayCheckpoint(value: unknown, identity: EventKitReplayCheckpointIdentity): Promise<EventKitReplayCheckpointLoad>;
|
|
178
|
+
//# sourceMappingURL=replayCheckpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replayCheckpoint.d.ts","sourceRoot":"","sources":["../../src/replayCheckpoint.ts"],"names":[],"mappings":"AAgBA,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAkBtC,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;AAED,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,CA8BvC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { PublisherAcceptanceLifecycle, WakeSubscriptionLifecycleRevision } from '@xyo-network/event-kit-protocol';
|
|
2
|
+
import type { PublisherEncryptionKey, PublisherService, WakeSubscriptionAcceptance } from '@xyo-network/event-kit-schemas';
|
|
3
|
+
import type { HandshakeCatalogs } from './handshakeCatalog.ts';
|
|
4
|
+
import type { ClaimedHandshakeObject, FinalizedSubscriptionTuple, PublisherAcceptanceCandidate, PublisherSubscriptionView } from './handshakeReadModelTypes.ts';
|
|
5
|
+
export interface ValidatedSubscriptionTuple extends FinalizedSubscriptionTuple {
|
|
6
|
+
readonly grantRevokedAtBlock?: number;
|
|
7
|
+
readonly subscriptionLifecycle: WakeSubscriptionLifecycleRevision;
|
|
8
|
+
}
|
|
9
|
+
export interface ValidatedSubscriptionAcceptance {
|
|
10
|
+
readonly claimed: ClaimedHandshakeObject<WakeSubscriptionAcceptance>;
|
|
11
|
+
readonly lifecycle: PublisherAcceptanceLifecycle;
|
|
12
|
+
readonly subscriber: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function buildPublisherSubscriptionViews(tuples: readonly ValidatedSubscriptionTuple[], acceptances: readonly ValidatedSubscriptionAcceptance[], publisher: string, finalizedHead: number): PublisherSubscriptionView[];
|
|
15
|
+
export interface SelectPublisherAcceptanceCandidatesInput {
|
|
16
|
+
readonly acceptances: readonly ValidatedSubscriptionAcceptance[];
|
|
17
|
+
readonly catalogs: HandshakeCatalogs;
|
|
18
|
+
readonly finalizedHead: number;
|
|
19
|
+
readonly key: ClaimedHandshakeObject<PublisherEncryptionKey>;
|
|
20
|
+
readonly publisher: string;
|
|
21
|
+
readonly service: ClaimedHandshakeObject<PublisherService>;
|
|
22
|
+
readonly subscriptions: readonly PublisherSubscriptionView[];
|
|
23
|
+
readonly tuples: readonly ValidatedSubscriptionTuple[];
|
|
24
|
+
}
|
|
25
|
+
export declare function selectPublisherAcceptanceCandidates(input: SelectPublisherAcceptanceCandidatesInput): PublisherAcceptanceCandidate[];
|
|
26
|
+
//# sourceMappingURL=subscriptionLifecycleView.d.ts.map
|
|
@@ -0,0 +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;AAE9D,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"}
|