@ternent/ledger 0.1.2
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/SPEC.md +304 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +963 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger.d.ts +4 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/seal-cli.d.ts +27 -0
- package/dist/types.d.ts +262 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/ledger.ts"],"sourcesContent":["import {\n canonicalStringify,\n deriveCommitId as protocolDeriveCommitId,\n deriveEntryId as protocolDeriveEntryId,\n getCommitChain as protocolGetCommitChain,\n getCommitSigningPayload,\n getEntrySigningPayload,\n validateLedger as protocolValidateLedger,\n type Commit as ProtocolCommit,\n type Entry as ProtocolEntry,\n type LedgerContainer as ProtocolLedgerContainer\n} from \"@ternent/concord-protocol\";\nimport {\n decryptWithIdentity,\n encryptForRecipients,\n initArmour\n} from \"@ternent/armour\";\nimport {\n createSealHash,\n createSealProof,\n verifySealProofAgainstBytes\n} from \"@ternent/seal-cli\";\nimport type {\n CreateLedgerConfig,\n CreateLedgerParams,\n LedgerAppendInput,\n LedgerAppendResult,\n LedgerArmourContract,\n LedgerCommitInput,\n LedgerCommitRecord,\n LedgerCommitResult,\n LedgerContainer,\n LedgerDecryptor,\n LedgerEncryptedPayloadRecord,\n LedgerEntryRecord,\n LedgerIdentityContext,\n LedgerInstance,\n LedgerPayloadRecord,\n LedgerPersistenceSnapshot,\n LedgerProjector,\n LedgerProtocolContract,\n LedgerReplayEntry,\n LedgerReplayOptions,\n LedgerReplayPolicy,\n LedgerSealContract,\n LedgerState,\n LedgerStorageAdapter,\n LedgerUnsignedCommitRecord,\n LedgerVerificationResult,\n LedgerVerifyOptions,\n SealProof\n} from \"./types.js\";\n\ntype UnsignedLedgerEntry = Omit<LedgerEntryRecord, \"entryId\" | \"seal\">;\ntype UnsignedLedgerCommit = LedgerUnsignedCommitRecord;\n\nconst LEDGER_FORMAT = \"concord-ledger\";\nconst LEDGER_VERSION = \"1\" as const;\nconst LEDGER_SPEC = \"@ternent/ledger@2\";\n\nconst textEncoder = new TextEncoder();\nconst textDecoder = new TextDecoder();\n\nfunction cloneValue<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction normalizeMeta(\n value: Record<string, unknown> | undefined\n): Record<string, unknown> | null {\n return value ?? null;\n}\n\nfunction normalizePayloadInput(value: unknown): unknown {\n return value === undefined ? null : value;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction assertRecordOrNull(\n value: unknown,\n label: string\n): Record<string, unknown> | null {\n if (value === null) return null;\n if (!isRecord(value)) {\n throw new Error(`${label} must be an object or null.`);\n }\n return value;\n}\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n return Buffer.from(bytes)\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n\nfunction base64UrlDecode(value: string): Uint8Array {\n const normalized = value.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const pad =\n normalized.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (normalized.length % 4));\n return new Uint8Array(Buffer.from(`${normalized}${pad}`, \"base64\"));\n}\n\nfunction toCiphertextBytes(payload: LedgerEncryptedPayloadRecord): Uint8Array {\n return payload.encoding === \"armor\"\n ? textEncoder.encode(payload.data)\n : base64UrlDecode(payload.data);\n}\n\nfunction createShadowEntryCore(entry: UnsignedLedgerEntry): ProtocolEntry {\n return {\n kind: entry.kind,\n timestamp: entry.authoredAt,\n author: entry.author,\n payload: {\n meta: entry.meta,\n payload: entry.payload\n },\n signature: null\n };\n}\n\nfunction createShadowEntry(entry: LedgerEntryRecord): ProtocolEntry {\n return {\n ...createShadowEntryCore(entry),\n signature: JSON.stringify(entry.seal)\n };\n}\n\nfunction buildUnsignedEntrySubject(entry: UnsignedLedgerEntry): Uint8Array {\n return textEncoder.encode(getEntrySigningPayload(createShadowEntryCore(entry)));\n}\n\nfunction createShadowCommit(commit: LedgerCommitRecord): ProtocolCommit {\n return {\n ...createShadowCommitCore(commit),\n signature: JSON.stringify(commit.seal)\n };\n}\n\nfunction createShadowCommitCore(\n commit: UnsignedLedgerCommit | LedgerCommitRecord\n): ProtocolCommit {\n return {\n parent: commit.parentCommitId,\n timestamp: commit.committedAt,\n metadata: commit.metadata,\n entries: commit.entryIds,\n signature: null\n };\n}\n\nfunction createShadowContainer(container: LedgerContainer): ProtocolLedgerContainer {\n const commits: Record<string, ProtocolCommit> = {};\n const entries: Record<string, ProtocolEntry> = {};\n\n for (const [commitId, commit] of Object.entries(container.commits)) {\n commits[commitId] = createShadowCommit(commit);\n }\n\n for (const [entryId, entry] of Object.entries(container.entries)) {\n entries[entryId] = createShadowEntry(entry);\n }\n\n return {\n format: \"concord-ledger\",\n version: \"1.0\",\n commits,\n entries,\n head: container.head\n };\n}\n\nfunction validatePayloadShape(payload: LedgerPayloadRecord): string[] {\n if (payload.type === \"plain\") {\n return [];\n }\n\n const errors: string[] = [];\n if (payload.scheme !== \"age\") {\n errors.push(\"Encrypted payload scheme must be age.\");\n }\n if (payload.mode !== \"recipients\") {\n errors.push(\"Encrypted payload mode must be recipients.\");\n }\n if (payload.encoding !== \"armor\" && payload.encoding !== \"binary\") {\n errors.push(\"Encrypted payload encoding must be armor or binary.\");\n }\n if (typeof payload.data !== \"string\" || payload.data.length === 0) {\n errors.push(\"Encrypted payload data must be a non-empty string.\");\n }\n if (typeof payload.payloadHash !== \"string\" || payload.payloadHash.length === 0) {\n errors.push(\"Encrypted payload payloadHash must be a non-empty string.\");\n }\n return errors;\n}\n\nfunction validateEntryShape(entry: LedgerEntryRecord): string[] {\n const errors: string[] = [];\n if (typeof entry.entryId !== \"string\" || entry.entryId.length === 0) {\n errors.push(\"Entry.entryId must be a non-empty string.\");\n }\n if (typeof entry.kind !== \"string\" || entry.kind.length === 0) {\n errors.push(\"Entry.kind must be a non-empty string.\");\n }\n if (typeof entry.authoredAt !== \"string\" || entry.authoredAt.length === 0) {\n errors.push(\"Entry.authoredAt must be a non-empty string.\");\n }\n if (typeof entry.author !== \"string\" || entry.author.length === 0) {\n errors.push(\"Entry.author must be a non-empty string.\");\n }\n if (entry.meta !== null && !isRecord(entry.meta)) {\n errors.push(\"Entry.meta must be an object or null.\");\n }\n errors.push(...validatePayloadShape(entry.payload));\n if (!isRecord(entry.seal)) {\n errors.push(\"Entry.seal must be an object.\");\n }\n return errors;\n}\n\nfunction validateCommitShape(commit: LedgerCommitRecord): string[] {\n const errors: string[] = [];\n if (typeof commit.commitId !== \"string\" || commit.commitId.length === 0) {\n errors.push(\"Commit.commitId must be a non-empty string.\");\n }\n if (\n commit.parentCommitId !== null &&\n (typeof commit.parentCommitId !== \"string\" || commit.parentCommitId.length === 0)\n ) {\n errors.push(\"Commit.parentCommitId must be a non-empty string or null.\");\n }\n if (typeof commit.committedAt !== \"string\" || commit.committedAt.length === 0) {\n errors.push(\"Commit.committedAt must be a non-empty string.\");\n }\n if (commit.metadata !== null && !isRecord(commit.metadata)) {\n errors.push(\"Commit.metadata must be an object or null.\");\n }\n if (!Array.isArray(commit.entryIds)) {\n errors.push(\"Commit.entryIds must be an array.\");\n } else if (commit.entryIds.some((entryId) => typeof entryId !== \"string\")) {\n errors.push(\"Commit.entryIds must contain only strings.\");\n }\n if (!isRecord(commit.seal)) {\n errors.push(\"Commit.seal must be an object.\");\n }\n return errors;\n}\n\nfunction validatePublicContainerShape(container: LedgerContainer): string[] {\n const errors: string[] = [];\n\n if (container.format !== LEDGER_FORMAT) {\n errors.push(`Ledger.format must be \"${LEDGER_FORMAT}\".`);\n }\n if (container.version !== LEDGER_VERSION) {\n errors.push(`Ledger.version must be \"${LEDGER_VERSION}\".`);\n }\n if (!isRecord(container.commits)) {\n errors.push(\"Ledger.commits must be an object.\");\n }\n if (!isRecord(container.entries)) {\n errors.push(\"Ledger.entries must be an object.\");\n }\n if (typeof container.head !== \"string\" || container.head.length === 0) {\n errors.push(\"Ledger.head must be a non-empty string.\");\n }\n\n if (errors.length > 0) {\n return errors;\n }\n\n for (const [commitId, commit] of Object.entries(container.commits)) {\n if (commit.commitId !== commitId) {\n errors.push(`Commit key mismatch for ${commitId}.`);\n }\n errors.push(...validateCommitShape(commit));\n }\n\n for (const [entryId, entry] of Object.entries(container.entries)) {\n if (entry.entryId !== entryId) {\n errors.push(`Entry key mismatch for ${entryId}.`);\n }\n errors.push(...validateEntryShape(entry));\n }\n\n if (!container.commits[container.head]) {\n errors.push(`Ledger head ${container.head} does not exist in commits.`);\n }\n\n return errors;\n}\n\nfunction createDefaultProtocolContract(): LedgerProtocolContract {\n return {\n canonicalizePayload(value) {\n return canonicalStringify(normalizePayloadInput(value));\n },\n getEntrySubjectBytes(entry) {\n return buildUnsignedEntrySubject(entry);\n },\n getCommitSubjectBytes(commit) {\n return textEncoder.encode(getCommitSigningPayload(createShadowCommitCore(commit)));\n },\n async deriveEntryId(entry) {\n return protocolDeriveEntryId(createShadowEntry(entry));\n },\n async deriveCommitId(commit) {\n return protocolDeriveCommitId(createShadowCommitCore(commit));\n },\n getCommitChain(container) {\n return protocolGetCommitChain(createShadowContainer(container));\n },\n validateContainer(container) {\n const errors = validatePublicContainerShape(container);\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n try {\n const shadowValidation = protocolValidateLedger(createShadowContainer(container), {\n strictSpec: false\n });\n return shadowValidation.ok\n ? { ok: true, errors: [] }\n : { ok: false, errors: shadowValidation.errors };\n } catch (error) {\n return {\n ok: false,\n errors: [error instanceof Error ? error.message : \"Invalid container.\"]\n };\n }\n }\n };\n}\n\nfunction createDefaultSealContract(): LedgerSealContract {\n return {\n async createEntryProof(input) {\n return (await createSealProof({\n createdAt: input.entry.authoredAt,\n signer: input.signer,\n subject: {\n kind: \"artifact\",\n path: `ledger-entry:${input.entry.kind}:${input.entry.authoredAt}`,\n hash: await createSealHash(input.subjectBytes)\n }\n })) as SealProof;\n },\n async verifyEntryProof(input) {\n const result = await verifySealProofAgainstBytes(\n input.proof as never,\n input.subjectBytes\n );\n return result.valid;\n },\n async createCommitProof(input) {\n return (await createSealProof({\n createdAt: input.commit.committedAt,\n signer: input.signer,\n subject: {\n kind: \"artifact\",\n path: `ledger-commit:${input.commitId}`,\n hash: await createSealHash(input.subjectBytes)\n }\n })) as SealProof;\n },\n async verifyCommitProof(input) {\n const result = await verifySealProofAgainstBytes(\n input.proof as never,\n input.subjectBytes\n );\n return result.valid;\n }\n };\n}\n\nfunction createDefaultArmourContract(): LedgerArmourContract {\n return {\n async encrypt(input) {\n await initArmour();\n const ciphertext = await encryptForRecipients({\n recipients: input.recipients,\n data: input.data,\n output: input.encoding\n });\n return {\n data:\n input.encoding === \"armor\"\n ? textDecoder.decode(ciphertext)\n : base64UrlEncode(ciphertext),\n payloadHash: await createSealHash(ciphertext)\n };\n },\n async decrypt(input) {\n await initArmour();\n const plaintext = await decryptWithIdentity({\n identity: input.decryptor.identity,\n data: toCiphertextBytes(input.payload)\n });\n return JSON.parse(textDecoder.decode(plaintext)) as unknown;\n }\n };\n}\n\nfunction createEmptyProjection<P>(value: P): P {\n return cloneValue(value);\n}\n\nfunction createInitialState<P>(initialProjection: P): LedgerState<P> {\n return {\n container: null,\n staged: [],\n projection: createEmptyProjection(initialProjection),\n verification: null\n };\n}\n\nfunction sortStrings(values: Iterable<string>): string[] {\n return Array.from(values).sort((left, right) => left.localeCompare(right));\n}\n\nfunction mergeReplayOptions(\n defaults: LedgerReplayPolicy | undefined,\n options: LedgerReplayOptions | undefined,\n hasDecryptor: boolean\n): Required<LedgerReplayOptions> {\n const verify = options?.verify ?? defaults?.verify ?? true;\n const decrypt = options?.decrypt ?? defaults?.decrypt ?? true;\n return {\n fromEntryId: options?.fromEntryId ?? \"\",\n toEntryId: options?.toEntryId ?? \"\",\n verify,\n decrypt: decrypt && hasDecryptor\n };\n}\n\nfunction assertAppendInput(input: LedgerAppendInput): void {\n if (typeof input.kind !== \"string\" || input.kind.length === 0) {\n throw new Error(\"append input kind is required.\");\n }\n if (input.meta !== undefined) {\n assertRecordOrNull(input.meta, \"append input meta\");\n }\n if (input.protection?.type === \"recipients\") {\n if (!Array.isArray(input.protection.recipients)) {\n throw new Error(\"append protection recipients must be an array.\");\n }\n if (input.protection.recipients.length === 0) {\n throw new Error(\"append protection recipients must not be empty.\");\n }\n }\n}\n\nfunction assertContainerInput(container: LedgerContainer): void {\n const errors = validatePublicContainerShape(container);\n if (errors.length > 0) {\n throw new Error(errors.join(\"; \"));\n }\n}\n\nfunction getCommittedEntriesInOrder(\n container: LedgerContainer,\n protocol: LedgerProtocolContract\n): LedgerEntryRecord[] {\n const ordered: LedgerEntryRecord[] = [];\n for (const commitId of protocol.getCommitChain(container)) {\n const commit = container.commits[commitId];\n if (!commit) continue;\n for (const entryId of commit.entryIds) {\n const entry = container.entries[entryId];\n if (entry) {\n ordered.push(entry);\n }\n }\n }\n return ordered;\n}\n\nfunction getProjectionSlice(\n entries: LedgerEntryRecord[],\n fromEntryId: string,\n toEntryId: string\n): LedgerEntryRecord[] {\n const startIndex = fromEntryId\n ? entries.findIndex((entry) => entry.entryId === fromEntryId)\n : 0;\n const endIndex = toEntryId\n ? entries.findIndex((entry) => entry.entryId === toEntryId)\n : entries.length - 1;\n\n if (startIndex < 0) {\n throw new Error(`from entry not found: ${fromEntryId}`);\n }\n if (toEntryId && endIndex < 0) {\n throw new Error(`to entry not found: ${toEntryId}`);\n }\n if (entries.length === 0) {\n return [];\n }\n\n return entries.slice(startIndex, endIndex + 1);\n}\n\nasync function toReplayEntry(\n entry: LedgerEntryRecord,\n decrypt: boolean,\n identity: LedgerIdentityContext,\n armour: LedgerArmourContract\n): Promise<LedgerReplayEntry> {\n if (entry.payload.type === \"plain\") {\n return {\n entryId: entry.entryId,\n kind: entry.kind,\n author: entry.author,\n authoredAt: entry.authoredAt,\n meta: entry.meta,\n payload: {\n type: \"plain\",\n data: cloneValue(entry.payload.data)\n },\n verified: true\n };\n }\n\n if (decrypt && identity.decryptor) {\n return {\n entryId: entry.entryId,\n kind: entry.kind,\n author: entry.author,\n authoredAt: entry.authoredAt,\n meta: entry.meta,\n payload: {\n type: \"decrypted\",\n original: \"encrypted\",\n data: await armour.decrypt({\n payload: entry.payload,\n decryptor: identity.decryptor\n })\n },\n verified: true,\n decrypted: true\n };\n }\n\n return {\n entryId: entry.entryId,\n kind: entry.kind,\n author: entry.author,\n authoredAt: entry.authoredAt,\n meta: entry.meta,\n payload: {\n type: \"encrypted\",\n scheme: entry.payload.scheme,\n mode: entry.payload.mode,\n encoding: entry.payload.encoding,\n data: entry.payload.data\n },\n verified: true,\n decrypted: false\n };\n}\n\nfunction createGenesisCommitDraft(\n timestamp: string,\n metadata: Record<string, unknown> | null\n): UnsignedLedgerCommit {\n return {\n parentCommitId: null,\n committedAt: timestamp,\n metadata: {\n genesis: true,\n spec: LEDGER_SPEC,\n ...(metadata ?? {})\n },\n entryIds: []\n };\n}\n\nexport async function createLedger<P>(\n config: CreateLedgerConfig<P>\n): Promise<LedgerInstance<P>> {\n const now = config.now ?? (() => new Date().toISOString());\n const protocol = config.protocol ?? createDefaultProtocolContract();\n const seal = config.seal ?? createDefaultSealContract();\n const armour = config.armour ?? createDefaultArmourContract();\n const replayPolicy = config.replayPolicy;\n const state = createInitialState(config.initialProjection);\n const listeners = new Set<(state: Readonly<LedgerState<P>>) => void>();\n\n function notify() {\n for (const listener of listeners) {\n listener(state);\n }\n }\n\n async function persist() {\n if (!config.storage) return;\n const snapshot: LedgerPersistenceSnapshot = {\n container: state.container ? cloneValue(state.container) : null,\n staged: cloneValue(state.staged)\n };\n await config.storage.save(snapshot);\n }\n\n async function buildCommitRecord(\n unsignedCommit: UnsignedLedgerCommit\n ): Promise<LedgerCommitRecord> {\n const subjectBytes = protocol.getCommitSubjectBytes(unsignedCommit);\n const commitId = await protocol.deriveCommitId(unsignedCommit);\n const sealProof = await seal.createCommitProof({\n commit: unsignedCommit,\n commitId,\n subjectBytes,\n signer: config.identity.signer\n });\n\n return {\n ...unsignedCommit,\n commitId,\n seal: sealProof\n };\n }\n\n async function verifySnapshot(\n container: LedgerContainer | null,\n staged: LedgerEntryRecord[],\n options?: LedgerVerifyOptions\n ): Promise<LedgerVerificationResult> {\n if (!container) {\n return {\n valid: true,\n committedHistoryValid: true,\n commitChainValid: true,\n commitProofsValid: true,\n entriesValid: true,\n entryProofsValid: true,\n payloadHashesValid: true,\n proofsValid: true,\n invalidCommitIds: [],\n invalidEntryIds: []\n };\n }\n\n const invalidCommitIds = new Set<string>();\n const invalidEntryIds = new Set<string>();\n let commitChainValid = true;\n let commitProofsValid = true;\n let entriesValid = true;\n let entryProofsValid = true;\n let payloadHashesValid = true;\n let proofsValid = true;\n let committedEntriesValid = true;\n let committedEntryProofsValid = true;\n let committedPayloadHashesValid = true;\n\n const containerValidation = protocol.validateContainer(container);\n if (!containerValidation.ok) {\n commitChainValid = false;\n }\n\n const reachableCommitIds = new Set<string>();\n const reachableEntryIds = new Set<string>();\n\n for (const [commitId, commit] of Object.entries(container.commits)) {\n try {\n const derivedCommitId = await protocol.deriveCommitId({\n parentCommitId: commit.parentCommitId,\n committedAt: commit.committedAt,\n metadata: commit.metadata,\n entryIds: commit.entryIds\n });\n if (derivedCommitId !== commitId) {\n invalidCommitIds.add(commitId);\n commitChainValid = false;\n }\n } catch {\n invalidCommitIds.add(commitId);\n commitChainValid = false;\n }\n\n if (commit.parentCommitId !== null && !container.commits[commit.parentCommitId]) {\n invalidCommitIds.add(commitId);\n commitChainValid = false;\n }\n\n if (options?.includeProofs !== false) {\n try {\n const proofValid = await seal.verifyCommitProof({\n commit,\n subjectBytes: protocol.getCommitSubjectBytes({\n parentCommitId: commit.parentCommitId,\n committedAt: commit.committedAt,\n metadata: commit.metadata,\n entryIds: commit.entryIds\n }),\n proof: commit.seal\n });\n if (!proofValid) {\n invalidCommitIds.add(commitId);\n commitProofsValid = false;\n proofsValid = false;\n }\n } catch {\n invalidCommitIds.add(commitId);\n commitProofsValid = false;\n proofsValid = false;\n }\n }\n\n for (const entryId of commit.entryIds) {\n if (!container.entries[entryId]) {\n invalidEntryIds.add(entryId);\n entriesValid = false;\n }\n }\n }\n\n try {\n const chain = protocol.getCommitChain(container);\n for (const commitId of chain) {\n reachableCommitIds.add(commitId);\n for (const entryId of container.commits[commitId]?.entryIds ?? []) {\n reachableEntryIds.add(entryId);\n }\n }\n } catch {\n invalidCommitIds.add(container.head);\n commitChainValid = false;\n committedEntriesValid = false;\n committedEntryProofsValid = false;\n committedPayloadHashesValid = false;\n }\n\n const entriesToVerify = [\n ...Object.entries(container.entries).map(([recordKey, entry]) => ({\n recordKey,\n entry\n })),\n ...staged.map((entry) => ({ recordKey: null, entry }))\n ];\n\n for (const { recordKey, entry } of entriesToVerify) {\n const isReachableCommittedEntry =\n (recordKey !== null && reachableEntryIds.has(recordKey)) ||\n reachableEntryIds.has(entry.entryId);\n\n try {\n const derivedEntryId = await protocol.deriveEntryId(entry);\n if (derivedEntryId !== entry.entryId) {\n invalidEntryIds.add(entry.entryId);\n entriesValid = false;\n if (isReachableCommittedEntry) {\n committedEntriesValid = false;\n }\n }\n } catch {\n invalidEntryIds.add(entry.entryId);\n entriesValid = false;\n if (isReachableCommittedEntry) {\n committedEntriesValid = false;\n }\n }\n\n const subjectBytes = buildUnsignedEntrySubject({\n kind: entry.kind,\n authoredAt: entry.authoredAt,\n author: entry.author,\n meta: entry.meta,\n payload: entry.payload\n });\n\n if (options?.includeProofs !== false) {\n try {\n const proofValid = await seal.verifyEntryProof({\n entry,\n subjectBytes,\n proof: entry.seal\n });\n if (!proofValid) {\n invalidEntryIds.add(entry.entryId);\n entriesValid = false;\n entryProofsValid = false;\n proofsValid = false;\n if (isReachableCommittedEntry) {\n committedEntriesValid = false;\n committedEntryProofsValid = false;\n }\n }\n } catch {\n invalidEntryIds.add(entry.entryId);\n entriesValid = false;\n entryProofsValid = false;\n proofsValid = false;\n if (isReachableCommittedEntry) {\n committedEntriesValid = false;\n committedEntryProofsValid = false;\n }\n }\n }\n\n if (entry.payload.type === \"encrypted\" && options?.includePayloadHashes !== false) {\n try {\n const payloadHash = await createSealHash(toCiphertextBytes(entry.payload));\n if (payloadHash !== entry.payload.payloadHash) {\n invalidEntryIds.add(entry.entryId);\n entriesValid = false;\n payloadHashesValid = false;\n if (isReachableCommittedEntry) {\n committedEntriesValid = false;\n committedPayloadHashesValid = false;\n }\n }\n } catch {\n invalidEntryIds.add(entry.entryId);\n entriesValid = false;\n payloadHashesValid = false;\n if (isReachableCommittedEntry) {\n committedEntriesValid = false;\n committedPayloadHashesValid = false;\n }\n }\n }\n }\n\n for (const entryId of reachableEntryIds) {\n if (!container.entries[entryId]) {\n committedEntriesValid = false;\n committedEntryProofsValid = false;\n committedPayloadHashesValid = false;\n }\n }\n\n const committedHistoryValid =\n commitChainValid &&\n commitProofsValid &&\n committedEntriesValid &&\n committedEntryProofsValid &&\n committedPayloadHashesValid &&\n containerValidation.ok;\n\n return {\n valid: committedHistoryValid,\n committedHistoryValid,\n commitChainValid,\n commitProofsValid,\n entriesValid,\n entryProofsValid,\n payloadHashesValid,\n proofsValid,\n invalidCommitIds: sortStrings(invalidCommitIds),\n invalidEntryIds: sortStrings(invalidEntryIds)\n };\n }\n\n async function verifyCurrent(\n options?: LedgerVerifyOptions\n ): Promise<LedgerVerificationResult> {\n return verifySnapshot(state.container, state.staged, options);\n }\n\n async function rebuildProjection(options?: LedgerReplayOptions): Promise<P> {\n const merged = mergeReplayOptions(\n replayPolicy,\n options,\n !!config.identity.decryptor\n );\n\n if (merged.verify) {\n const verification = await verifyCurrent();\n state.verification = {\n valid: verification.valid,\n checkedAt: now()\n };\n notify();\n if (!verification.valid) {\n throw new Error(\"Ledger verification failed.\");\n }\n }\n\n let orderedCommitted: LedgerEntryRecord[] = [];\n if (state.container) {\n try {\n orderedCommitted = getCommittedEntriesInOrder(state.container, protocol);\n } catch (error) {\n if (merged.verify) {\n throw error;\n }\n }\n }\n const orderedEntries = [...orderedCommitted, ...state.staged];\n const slice = getProjectionSlice(\n orderedEntries,\n merged.fromEntryId,\n merged.toEntryId\n );\n\n let projection = createEmptyProjection(config.initialProjection);\n for (const entry of slice) {\n projection = config.projector(\n projection,\n await toReplayEntry(entry, merged.decrypt, config.identity, armour)\n );\n }\n\n state.projection = projection;\n notify();\n return projection;\n }\n\n async function buildEntryRecord(input: LedgerAppendInput): Promise<LedgerEntryRecord> {\n assertAppendInput(input);\n protocol.canonicalizePayload(input.payload);\n\n const payloadValue = normalizePayloadInput(input.payload);\n const meta = normalizeMeta(input.meta);\n const authoredAt = now();\n const author = await config.identity.authorResolver();\n\n const payload: LedgerPayloadRecord =\n input.protection?.type === \"recipients\"\n ? {\n type: \"encrypted\",\n scheme: \"age\",\n mode: \"recipients\",\n encoding: input.protection.encoding ?? \"armor\",\n ...(await armour.encrypt({\n recipients: config.identity.recipientResolver\n ? await config.identity.recipientResolver(input.protection.recipients)\n : input.protection.recipients,\n data: textEncoder.encode(protocol.canonicalizePayload(payloadValue)),\n encoding: input.protection.encoding ?? \"armor\"\n }))\n }\n : {\n type: \"plain\",\n data: cloneValue(payloadValue)\n };\n\n const unsignedEntry: UnsignedLedgerEntry = {\n kind: input.kind,\n authoredAt,\n author,\n meta,\n payload\n };\n const subjectBytes = buildUnsignedEntrySubject(unsignedEntry);\n const sealProof = await seal.createEntryProof({\n entry: unsignedEntry,\n subjectBytes,\n signer: config.identity.signer\n });\n const draft: LedgerEntryRecord = {\n entryId: \"\",\n ...unsignedEntry,\n seal: sealProof\n };\n\n return {\n ...draft,\n entryId: await protocol.deriveEntryId(draft)\n };\n }\n\n function assertContainerExists(): LedgerContainer {\n if (!state.container) {\n throw new Error(\"Ledger has not been created or loaded.\");\n }\n return state.container;\n }\n\n async function stageEntries(\n inputs: LedgerAppendInput[]\n ): Promise<LedgerAppendResult[]> {\n const container = assertContainerExists();\n const existingIds = new Set<string>([\n ...Object.keys(container.entries),\n ...state.staged.map((entry) => entry.entryId)\n ]);\n const entries: LedgerEntryRecord[] = [];\n\n for (const input of inputs) {\n const entry = await buildEntryRecord(input);\n if (existingIds.has(entry.entryId)) {\n throw new Error(`Entry ${entry.entryId} already exists.`);\n }\n existingIds.add(entry.entryId);\n entries.push(entry);\n }\n\n const baseCount = state.staged.length;\n state.staged = [...state.staged, ...entries];\n const results = entries.map((entry, index) => ({\n entry,\n stagedCount: baseCount + index + 1\n }));\n\n if (config.autoCommit && entries.length > 0) {\n await commit();\n return results;\n }\n\n await rebuildProjection();\n await persist();\n\n return results;\n }\n\n async function create(params?: CreateLedgerParams): Promise<void> {\n const genesis = await buildCommitRecord(\n createGenesisCommitDraft(now(), normalizeMeta(params?.metadata))\n );\n\n state.container = {\n format: LEDGER_FORMAT,\n version: LEDGER_VERSION,\n commits: {\n [genesis.commitId]: genesis\n },\n entries: {},\n head: genesis.commitId\n };\n state.staged = [];\n state.verification = null;\n\n await rebuildProjection();\n await persist();\n }\n\n async function load(container: LedgerContainer): Promise<void> {\n assertContainerInput(container);\n state.container = cloneValue(container);\n state.staged = [];\n state.verification = null;\n await rebuildProjection();\n await persist();\n }\n\n async function loadFromStorage(): Promise<boolean> {\n if (!config.storage) {\n return false;\n }\n\n const snapshot = await config.storage.load();\n if (!snapshot) {\n return false;\n }\n\n if (snapshot.container) {\n assertContainerInput(snapshot.container);\n }\n for (const stagedEntry of snapshot.staged) {\n const errors = validateEntryShape(stagedEntry);\n if (errors.length > 0) {\n throw new Error(errors.join(\"; \"));\n }\n }\n\n state.container = snapshot.container ? cloneValue(snapshot.container) : null;\n state.staged = cloneValue(snapshot.staged);\n state.verification = null;\n await rebuildProjection();\n return true;\n }\n\n async function append(input: LedgerAppendInput): Promise<LedgerAppendResult> {\n const [result] = await stageEntries([input]);\n return result;\n }\n\n async function appendMany(\n inputs: LedgerAppendInput[]\n ): Promise<LedgerAppendResult[]> {\n if (inputs.length === 0) {\n return [];\n }\n return stageEntries(inputs);\n }\n\n async function commit(input?: LedgerCommitInput): Promise<LedgerCommitResult> {\n const container = assertContainerExists();\n if (state.staged.length === 0) {\n throw new Error(\"No staged entries to commit.\");\n }\n\n const staged = cloneValue(state.staged);\n const entries = { ...container.entries };\n for (const entry of staged) {\n entries[entry.entryId] = entry;\n }\n\n const unsignedCommit: UnsignedLedgerCommit = {\n parentCommitId: container.head,\n committedAt: now(),\n metadata: normalizeMeta(input?.metadata),\n entryIds: staged.map((entry) => entry.entryId)\n };\n const commitRecord = await buildCommitRecord(unsignedCommit);\n\n state.container = {\n format: container.format,\n version: container.version,\n commits: {\n ...container.commits,\n [commitRecord.commitId]: commitRecord\n },\n entries,\n head: commitRecord.commitId\n };\n state.staged = [];\n\n await rebuildProjection();\n await persist();\n\n return {\n commit: cloneValue(commitRecord),\n committedEntries: staged,\n committedEntryIds: staged.map((entry) => entry.entryId)\n };\n }\n\n async function replay(options?: LedgerReplayOptions): Promise<P> {\n return rebuildProjection(options);\n }\n\n async function recompute(): Promise<P> {\n return rebuildProjection();\n }\n\n async function verify(\n options?: LedgerVerifyOptions\n ): Promise<LedgerVerificationResult> {\n return verifyCurrent(options);\n }\n\n async function exportContainer(): Promise<LedgerContainer> {\n const container = assertContainerExists();\n return cloneValue(container);\n }\n\n async function importContainer(container: LedgerContainer): Promise<void> {\n await load(container);\n }\n\n function getState(): Readonly<LedgerState<P>> {\n return state;\n }\n\n function subscribe(\n listener: (state: Readonly<LedgerState<P>>) => void\n ): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n async function clearStaged(): Promise<void> {\n state.staged = [];\n await rebuildProjection();\n await persist();\n }\n\n async function destroy(): Promise<void> {\n state.container = null;\n state.staged = [];\n state.projection = createEmptyProjection(config.initialProjection);\n state.verification = null;\n notify();\n if (config.storage?.clear) {\n await config.storage.clear();\n }\n }\n\n return {\n create,\n load,\n loadFromStorage,\n append,\n appendMany,\n commit,\n replay,\n recompute,\n verify,\n export: exportContainer,\n import: importContainer,\n getState,\n subscribe,\n clearStaged,\n destroy\n };\n}\n\nexport type {\n CreateLedgerConfig,\n CreateLedgerParams,\n LedgerProjector,\n LedgerStorageAdapter\n};\n"],"names":["protocolDeriveEntryId","protocolDeriveCommitId","protocolGetCommitChain","protocolValidateLedger","commit"],"mappings":"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"}
|
package/dist/ledger.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateLedgerConfig, CreateLedgerParams, LedgerInstance, LedgerProjector, LedgerStorageAdapter } from "./types.js";
|
|
2
|
+
export declare function createLedger<P>(config: CreateLedgerConfig<P>): Promise<LedgerInstance<P>>;
|
|
3
|
+
export type { CreateLedgerConfig, CreateLedgerParams, LedgerProjector, LedgerStorageAdapter };
|
|
4
|
+
//# sourceMappingURL=ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAYlB,cAAc,EAGd,eAAe,EAOf,oBAAoB,EAKrB,MAAM,YAAY,CAAC;AAuhBpB,wBAAsB,YAAY,CAAC,CAAC,EAClC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAkmB5B;AAED,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACrB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
declare module "@ternent/seal-cli" {
|
|
2
|
+
export function createSealHash(
|
|
3
|
+
bytes: Uint8Array | ArrayBuffer
|
|
4
|
+
): Promise<`sha256:${string}`>;
|
|
5
|
+
|
|
6
|
+
export function createSealProof(input: {
|
|
7
|
+
createdAt?: string;
|
|
8
|
+
signer: { identity: unknown };
|
|
9
|
+
subject: {
|
|
10
|
+
kind: "file" | "manifest" | "artifact";
|
|
11
|
+
path: string;
|
|
12
|
+
hash: `sha256:${string}`;
|
|
13
|
+
};
|
|
14
|
+
}): Promise<unknown>;
|
|
15
|
+
|
|
16
|
+
export function verifySealProofAgainstBytes(
|
|
17
|
+
proof: unknown,
|
|
18
|
+
bytes: Uint8Array | ArrayBuffer
|
|
19
|
+
): Promise<{
|
|
20
|
+
valid: boolean;
|
|
21
|
+
hashMatch: boolean;
|
|
22
|
+
signatureValid: boolean;
|
|
23
|
+
keyId: string;
|
|
24
|
+
algorithm: string;
|
|
25
|
+
subjectHash: `sha256:${string}`;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import type { SerializedIdentity } from '../../identity-v2/src/index.ts';
|
|
2
|
+
export type SealProof = {
|
|
3
|
+
version: string;
|
|
4
|
+
type: "seal-proof";
|
|
5
|
+
algorithm: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
subject: {
|
|
8
|
+
kind: "file" | "manifest" | "artifact";
|
|
9
|
+
path: string;
|
|
10
|
+
hash: `sha256:${string}`;
|
|
11
|
+
};
|
|
12
|
+
signer: {
|
|
13
|
+
publicKey: string;
|
|
14
|
+
keyId: string;
|
|
15
|
+
};
|
|
16
|
+
signature: string;
|
|
17
|
+
};
|
|
18
|
+
export type SealSigner = {
|
|
19
|
+
identity: SerializedIdentity;
|
|
20
|
+
};
|
|
21
|
+
export type LedgerDecryptor = {
|
|
22
|
+
identity: SerializedIdentity;
|
|
23
|
+
};
|
|
24
|
+
export type LedgerRecipientResolver = (recipients: string[]) => Promise<string[]> | string[];
|
|
25
|
+
export type LedgerIdentityContext = {
|
|
26
|
+
signer: SealSigner;
|
|
27
|
+
authorResolver: () => Promise<string> | string;
|
|
28
|
+
recipientResolver?: LedgerRecipientResolver;
|
|
29
|
+
decryptor?: LedgerDecryptor;
|
|
30
|
+
};
|
|
31
|
+
export type LedgerPlainPayloadRecord = {
|
|
32
|
+
type: "plain";
|
|
33
|
+
data: unknown;
|
|
34
|
+
};
|
|
35
|
+
export type LedgerEncryptedPayloadRecord = {
|
|
36
|
+
type: "encrypted";
|
|
37
|
+
scheme: "age";
|
|
38
|
+
mode: "recipients";
|
|
39
|
+
encoding: "armor" | "binary";
|
|
40
|
+
data: string;
|
|
41
|
+
payloadHash: `sha256:${string}` | string;
|
|
42
|
+
};
|
|
43
|
+
export type LedgerPayloadRecord = LedgerPlainPayloadRecord | LedgerEncryptedPayloadRecord;
|
|
44
|
+
export type LedgerEntryRecord = {
|
|
45
|
+
entryId: string;
|
|
46
|
+
kind: string;
|
|
47
|
+
authoredAt: string;
|
|
48
|
+
author: string;
|
|
49
|
+
meta: Record<string, unknown> | null;
|
|
50
|
+
payload: LedgerPayloadRecord;
|
|
51
|
+
seal: SealProof;
|
|
52
|
+
};
|
|
53
|
+
export type LedgerCommitRecord = {
|
|
54
|
+
commitId: string;
|
|
55
|
+
parentCommitId: string | null;
|
|
56
|
+
committedAt: string;
|
|
57
|
+
metadata: Record<string, unknown> | null;
|
|
58
|
+
entryIds: string[];
|
|
59
|
+
seal: SealProof;
|
|
60
|
+
};
|
|
61
|
+
export type LedgerUnsignedCommitRecord = Omit<LedgerCommitRecord, "commitId" | "seal">;
|
|
62
|
+
export type LedgerContainer = {
|
|
63
|
+
format: "concord-ledger";
|
|
64
|
+
version: "1";
|
|
65
|
+
commits: Record<string, LedgerCommitRecord>;
|
|
66
|
+
entries: Record<string, LedgerEntryRecord>;
|
|
67
|
+
head: string;
|
|
68
|
+
};
|
|
69
|
+
export type LedgerVerificationSnapshot = {
|
|
70
|
+
valid: boolean;
|
|
71
|
+
checkedAt: string;
|
|
72
|
+
};
|
|
73
|
+
export type LedgerState<P> = {
|
|
74
|
+
container: LedgerContainer | null;
|
|
75
|
+
staged: LedgerEntryRecord[];
|
|
76
|
+
projection: P;
|
|
77
|
+
verification: LedgerVerificationSnapshot | null;
|
|
78
|
+
};
|
|
79
|
+
export type LedgerProtectionInput = {
|
|
80
|
+
type: "none";
|
|
81
|
+
} | {
|
|
82
|
+
type: "recipients";
|
|
83
|
+
recipients: string[];
|
|
84
|
+
encoding?: "armor" | "binary";
|
|
85
|
+
};
|
|
86
|
+
export type LedgerAppendInput = {
|
|
87
|
+
kind: string;
|
|
88
|
+
payload?: unknown;
|
|
89
|
+
meta?: Record<string, unknown>;
|
|
90
|
+
protection?: LedgerProtectionInput;
|
|
91
|
+
};
|
|
92
|
+
export type LedgerAppendResult = {
|
|
93
|
+
entry: LedgerEntryRecord;
|
|
94
|
+
stagedCount: number;
|
|
95
|
+
};
|
|
96
|
+
export type LedgerCommitInput = {
|
|
97
|
+
metadata?: Record<string, unknown>;
|
|
98
|
+
};
|
|
99
|
+
export type LedgerCommitResult = {
|
|
100
|
+
commit: LedgerCommitRecord;
|
|
101
|
+
committedEntries: LedgerEntryRecord[];
|
|
102
|
+
committedEntryIds: string[];
|
|
103
|
+
};
|
|
104
|
+
export type LedgerReplayOptions = {
|
|
105
|
+
fromEntryId?: string;
|
|
106
|
+
toEntryId?: string;
|
|
107
|
+
verify?: boolean;
|
|
108
|
+
decrypt?: boolean;
|
|
109
|
+
};
|
|
110
|
+
export type LedgerVerifyOptions = {
|
|
111
|
+
includeProofs?: boolean;
|
|
112
|
+
includePayloadHashes?: boolean;
|
|
113
|
+
};
|
|
114
|
+
export type LedgerReplayEntry = {
|
|
115
|
+
entryId: string;
|
|
116
|
+
kind: string;
|
|
117
|
+
author: string;
|
|
118
|
+
authoredAt: string;
|
|
119
|
+
meta: Record<string, unknown> | null;
|
|
120
|
+
payload: {
|
|
121
|
+
type: "plain";
|
|
122
|
+
data: unknown;
|
|
123
|
+
};
|
|
124
|
+
verified: true;
|
|
125
|
+
} | {
|
|
126
|
+
entryId: string;
|
|
127
|
+
kind: string;
|
|
128
|
+
author: string;
|
|
129
|
+
authoredAt: string;
|
|
130
|
+
meta: Record<string, unknown> | null;
|
|
131
|
+
payload: {
|
|
132
|
+
type: "encrypted";
|
|
133
|
+
scheme: "age";
|
|
134
|
+
mode: "recipients";
|
|
135
|
+
encoding: "armor" | "binary";
|
|
136
|
+
data: string;
|
|
137
|
+
};
|
|
138
|
+
verified: true;
|
|
139
|
+
decrypted: false;
|
|
140
|
+
} | {
|
|
141
|
+
entryId: string;
|
|
142
|
+
kind: string;
|
|
143
|
+
author: string;
|
|
144
|
+
authoredAt: string;
|
|
145
|
+
meta: Record<string, unknown> | null;
|
|
146
|
+
payload: {
|
|
147
|
+
type: "decrypted";
|
|
148
|
+
original: "encrypted";
|
|
149
|
+
data: unknown;
|
|
150
|
+
};
|
|
151
|
+
verified: true;
|
|
152
|
+
decrypted: true;
|
|
153
|
+
};
|
|
154
|
+
export type LedgerProjector<P> = (projection: P, entry: LedgerReplayEntry) => P;
|
|
155
|
+
export type LedgerVerificationResult = {
|
|
156
|
+
valid: boolean;
|
|
157
|
+
committedHistoryValid: boolean;
|
|
158
|
+
commitChainValid: boolean;
|
|
159
|
+
commitProofsValid: boolean;
|
|
160
|
+
entriesValid: boolean;
|
|
161
|
+
entryProofsValid: boolean;
|
|
162
|
+
payloadHashesValid: boolean;
|
|
163
|
+
proofsValid: boolean;
|
|
164
|
+
invalidCommitIds: string[];
|
|
165
|
+
invalidEntryIds: string[];
|
|
166
|
+
};
|
|
167
|
+
export type LedgerPersistenceSnapshot = {
|
|
168
|
+
container: LedgerContainer | null;
|
|
169
|
+
staged: LedgerEntryRecord[];
|
|
170
|
+
};
|
|
171
|
+
export type LedgerStorageAdapter = {
|
|
172
|
+
name: string;
|
|
173
|
+
load(): Promise<LedgerPersistenceSnapshot | null>;
|
|
174
|
+
save(snapshot: LedgerPersistenceSnapshot): Promise<void>;
|
|
175
|
+
clear?(): Promise<void>;
|
|
176
|
+
};
|
|
177
|
+
export type LedgerReplayPolicy = {
|
|
178
|
+
verify?: boolean;
|
|
179
|
+
decrypt?: boolean;
|
|
180
|
+
};
|
|
181
|
+
export type LedgerProtocolContract = {
|
|
182
|
+
canonicalizePayload: (value: unknown) => string;
|
|
183
|
+
getEntrySubjectBytes: (entry: Omit<LedgerEntryRecord, "entryId" | "seal">) => Uint8Array;
|
|
184
|
+
getCommitSubjectBytes: (commit: LedgerUnsignedCommitRecord) => Uint8Array;
|
|
185
|
+
deriveEntryId: (entry: LedgerEntryRecord) => Promise<string>;
|
|
186
|
+
deriveCommitId: (commit: LedgerUnsignedCommitRecord) => Promise<string>;
|
|
187
|
+
getCommitChain: (container: LedgerContainer) => string[];
|
|
188
|
+
validateContainer: (container: LedgerContainer) => {
|
|
189
|
+
ok: boolean;
|
|
190
|
+
errors: string[];
|
|
191
|
+
};
|
|
192
|
+
};
|
|
193
|
+
export type LedgerSealContract = {
|
|
194
|
+
createEntryProof: (input: {
|
|
195
|
+
entry: Omit<LedgerEntryRecord, "entryId" | "seal">;
|
|
196
|
+
subjectBytes: Uint8Array;
|
|
197
|
+
signer: SealSigner;
|
|
198
|
+
}) => Promise<SealProof>;
|
|
199
|
+
verifyEntryProof: (input: {
|
|
200
|
+
entry: LedgerEntryRecord;
|
|
201
|
+
subjectBytes: Uint8Array;
|
|
202
|
+
proof: SealProof;
|
|
203
|
+
}) => Promise<boolean>;
|
|
204
|
+
createCommitProof: (input: {
|
|
205
|
+
commit: LedgerUnsignedCommitRecord;
|
|
206
|
+
commitId: string;
|
|
207
|
+
subjectBytes: Uint8Array;
|
|
208
|
+
signer: SealSigner;
|
|
209
|
+
}) => Promise<SealProof>;
|
|
210
|
+
verifyCommitProof: (input: {
|
|
211
|
+
commit: LedgerCommitRecord;
|
|
212
|
+
subjectBytes: Uint8Array;
|
|
213
|
+
proof: SealProof;
|
|
214
|
+
}) => Promise<boolean>;
|
|
215
|
+
};
|
|
216
|
+
export type LedgerArmourContract = {
|
|
217
|
+
encrypt: (input: {
|
|
218
|
+
recipients: string[];
|
|
219
|
+
data: Uint8Array;
|
|
220
|
+
encoding: "armor" | "binary";
|
|
221
|
+
}) => Promise<{
|
|
222
|
+
data: string;
|
|
223
|
+
payloadHash: `sha256:${string}` | string;
|
|
224
|
+
}>;
|
|
225
|
+
decrypt: (input: {
|
|
226
|
+
payload: LedgerEncryptedPayloadRecord;
|
|
227
|
+
decryptor: LedgerDecryptor;
|
|
228
|
+
}) => Promise<unknown>;
|
|
229
|
+
};
|
|
230
|
+
export type CreateLedgerParams = {
|
|
231
|
+
metadata?: Record<string, unknown>;
|
|
232
|
+
};
|
|
233
|
+
export type CreateLedgerConfig<P> = {
|
|
234
|
+
identity: LedgerIdentityContext;
|
|
235
|
+
initialProjection: P;
|
|
236
|
+
projector: LedgerProjector<P>;
|
|
237
|
+
storage?: LedgerStorageAdapter;
|
|
238
|
+
protocol?: LedgerProtocolContract;
|
|
239
|
+
seal?: LedgerSealContract;
|
|
240
|
+
armour?: LedgerArmourContract;
|
|
241
|
+
now?: () => string;
|
|
242
|
+
autoCommit?: boolean;
|
|
243
|
+
replayPolicy?: LedgerReplayPolicy;
|
|
244
|
+
};
|
|
245
|
+
export type LedgerInstance<P> = {
|
|
246
|
+
create(params?: CreateLedgerParams): Promise<void>;
|
|
247
|
+
load(container: LedgerContainer): Promise<void>;
|
|
248
|
+
loadFromStorage(): Promise<boolean>;
|
|
249
|
+
append(input: LedgerAppendInput): Promise<LedgerAppendResult>;
|
|
250
|
+
appendMany(inputs: LedgerAppendInput[]): Promise<LedgerAppendResult[]>;
|
|
251
|
+
commit(input?: LedgerCommitInput): Promise<LedgerCommitResult>;
|
|
252
|
+
replay(options?: LedgerReplayOptions): Promise<P>;
|
|
253
|
+
recompute(): Promise<P>;
|
|
254
|
+
verify(options?: LedgerVerifyOptions): Promise<LedgerVerificationResult>;
|
|
255
|
+
export(): Promise<LedgerContainer>;
|
|
256
|
+
import(container: LedgerContainer): Promise<void>;
|
|
257
|
+
getState(): Readonly<LedgerState<P>>;
|
|
258
|
+
subscribe(listener: (state: Readonly<LedgerState<P>>) => void): () => void;
|
|
259
|
+
clearStaged(): Promise<void>;
|
|
260
|
+
destroy(): Promise<void>;
|
|
261
|
+
};
|
|
262
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ternent/ledger",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Append-only state engine for Concord",
|
|
5
|
+
"license": "ISC",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"SPEC.md"
|
|
10
|
+
],
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"main": "dist/index.js",
|
|
15
|
+
"module": "dist/index.js",
|
|
16
|
+
"types": "dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@ternent/armour": "0.1.3",
|
|
26
|
+
"@ternent/concord-protocol": "0.1.1",
|
|
27
|
+
"@ternent/seal-cli": "0.3.4",
|
|
28
|
+
"@ternent/identity": "0.3.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^24.3.0",
|
|
32
|
+
"typescript": "^5.6.3",
|
|
33
|
+
"vite": "^4.5.3",
|
|
34
|
+
"vite-plugin-dts": "^1.7.3",
|
|
35
|
+
"vitest": "^1.6.0"
|
|
36
|
+
},
|
|
37
|
+
"scripts": {
|
|
38
|
+
"build": "pnpm --filter @ternent/rage build && vite build",
|
|
39
|
+
"test": "pnpm --filter @ternent/rage build && vitest run"
|
|
40
|
+
}
|
|
41
|
+
}
|