@ternent/ledger 0.1.3 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.js +8339 -0
- package/dist/browser.js.map +1 -0
- package/dist/index.js +30 -5
- package/dist/index.js.map +1 -1
- package/dist/ledger.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +12 -5
package/dist/index.js
CHANGED
|
@@ -1,11 +1,31 @@
|
|
|
1
1
|
import { canonicalStringify, getCommitSigningPayload, deriveEntryId, deriveCommitId, getCommitChain, validateLedger, getEntrySigningPayload } from "@ternent/concord-protocol";
|
|
2
|
-
import { initArmour, encryptForRecipients, decryptWithIdentity } from "@ternent/armour";
|
|
3
|
-
import { createSealProof, createSealHash, verifySealProofAgainstBytes } from "@ternent/seal-cli";
|
|
4
2
|
const LEDGER_FORMAT = "concord-ledger";
|
|
5
3
|
const LEDGER_VERSION = "1";
|
|
6
4
|
const LEDGER_SPEC = "@ternent/ledger@2";
|
|
7
5
|
const textEncoder = new TextEncoder();
|
|
8
6
|
const textDecoder = new TextDecoder();
|
|
7
|
+
let armourRuntimePromise = null;
|
|
8
|
+
let sealRuntimePromise = null;
|
|
9
|
+
async function loadArmourRuntime() {
|
|
10
|
+
if (!armourRuntimePromise) {
|
|
11
|
+
armourRuntimePromise = import("@ternent/armour").then((module) => ({
|
|
12
|
+
decryptWithIdentity: module.decryptWithIdentity,
|
|
13
|
+
encryptForRecipients: module.encryptForRecipients,
|
|
14
|
+
initArmour: module.initArmour
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
return await armourRuntimePromise;
|
|
18
|
+
}
|
|
19
|
+
async function loadSealRuntime() {
|
|
20
|
+
if (!sealRuntimePromise) {
|
|
21
|
+
sealRuntimePromise = import("@ternent/seal-cli").then((module) => ({
|
|
22
|
+
createSealHash: module.createSealHash,
|
|
23
|
+
createSealProof: module.createSealProof,
|
|
24
|
+
verifySealProofAgainstBytes: module.verifySealProofAgainstBytes
|
|
25
|
+
}));
|
|
26
|
+
}
|
|
27
|
+
return await sealRuntimePromise;
|
|
28
|
+
}
|
|
9
29
|
function cloneValue(value) {
|
|
10
30
|
if (typeof structuredClone === "function") {
|
|
11
31
|
return structuredClone(value);
|
|
@@ -241,6 +261,7 @@ function createDefaultProtocolContract() {
|
|
|
241
261
|
function createDefaultSealContract() {
|
|
242
262
|
return {
|
|
243
263
|
async createEntryProof(input) {
|
|
264
|
+
const { createSealHash, createSealProof } = await loadSealRuntime();
|
|
244
265
|
return await createSealProof({
|
|
245
266
|
createdAt: input.entry.authoredAt,
|
|
246
267
|
signer: input.signer,
|
|
@@ -252,6 +273,7 @@ function createDefaultSealContract() {
|
|
|
252
273
|
});
|
|
253
274
|
},
|
|
254
275
|
async verifyEntryProof(input) {
|
|
276
|
+
const { verifySealProofAgainstBytes } = await loadSealRuntime();
|
|
255
277
|
const result = await verifySealProofAgainstBytes(
|
|
256
278
|
input.proof,
|
|
257
279
|
input.subjectBytes
|
|
@@ -259,6 +281,7 @@ function createDefaultSealContract() {
|
|
|
259
281
|
return result.valid;
|
|
260
282
|
},
|
|
261
283
|
async createCommitProof(input) {
|
|
284
|
+
const { createSealHash, createSealProof } = await loadSealRuntime();
|
|
262
285
|
return await createSealProof({
|
|
263
286
|
createdAt: input.commit.committedAt,
|
|
264
287
|
signer: input.signer,
|
|
@@ -270,6 +293,7 @@ function createDefaultSealContract() {
|
|
|
270
293
|
});
|
|
271
294
|
},
|
|
272
295
|
async verifyCommitProof(input) {
|
|
296
|
+
const { verifySealProofAgainstBytes } = await loadSealRuntime();
|
|
273
297
|
const result = await verifySealProofAgainstBytes(
|
|
274
298
|
input.proof,
|
|
275
299
|
input.subjectBytes
|
|
@@ -281,6 +305,8 @@ function createDefaultSealContract() {
|
|
|
281
305
|
function createDefaultArmourContract() {
|
|
282
306
|
return {
|
|
283
307
|
async encrypt(input) {
|
|
308
|
+
const { createSealHash } = await loadSealRuntime();
|
|
309
|
+
const { encryptForRecipients, initArmour } = await loadArmourRuntime();
|
|
284
310
|
await initArmour();
|
|
285
311
|
const ciphertext = await encryptForRecipients({
|
|
286
312
|
recipients: input.recipients,
|
|
@@ -293,6 +319,7 @@ function createDefaultArmourContract() {
|
|
|
293
319
|
};
|
|
294
320
|
},
|
|
295
321
|
async decrypt(input) {
|
|
322
|
+
const { decryptWithIdentity, initArmour } = await loadArmourRuntime();
|
|
296
323
|
await initArmour();
|
|
297
324
|
const plaintext = await decryptWithIdentity({
|
|
298
325
|
identity: input.decryptor.identity,
|
|
@@ -636,6 +663,7 @@ async function createLedger(config) {
|
|
|
636
663
|
}
|
|
637
664
|
if (entry.payload.type === "encrypted" && options?.includePayloadHashes !== false) {
|
|
638
665
|
try {
|
|
666
|
+
const { createSealHash } = await loadSealRuntime();
|
|
639
667
|
const payloadHash = await createSealHash(toCiphertextBytes(entry.payload));
|
|
640
668
|
if (payloadHash !== entry.payload.payloadHash) {
|
|
641
669
|
invalidEntryIds.add(entry.entryId);
|
|
@@ -935,9 +963,6 @@ async function createLedger(config) {
|
|
|
935
963
|
state.projection = createEmptyProjection(config.initialProjection);
|
|
936
964
|
state.verification = null;
|
|
937
965
|
notify();
|
|
938
|
-
if (config.storage?.clear) {
|
|
939
|
-
await config.storage.clear();
|
|
940
|
-
}
|
|
941
966
|
}
|
|
942
967
|
return {
|
|
943
968
|
create,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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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"}
|
|
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 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();\nlet armourRuntimePromise: Promise<{\n decryptWithIdentity: typeof import(\"@ternent/armour\").decryptWithIdentity;\n encryptForRecipients: typeof import(\"@ternent/armour\").encryptForRecipients;\n initArmour: typeof import(\"@ternent/armour\").initArmour;\n}> | null = null;\nlet sealRuntimePromise: Promise<{\n createSealHash: typeof import(\"@ternent/seal-cli\").createSealHash;\n createSealProof: typeof import(\"@ternent/seal-cli\").createSealProof;\n verifySealProofAgainstBytes: typeof import(\"@ternent/seal-cli\").verifySealProofAgainstBytes;\n}> | null = null;\n\nasync function loadArmourRuntime() {\n if (!armourRuntimePromise) {\n armourRuntimePromise = import(\"@ternent/armour\").then((module) => ({\n decryptWithIdentity: module.decryptWithIdentity,\n encryptForRecipients: module.encryptForRecipients,\n initArmour: module.initArmour,\n }));\n }\n return await armourRuntimePromise;\n}\n\nasync function loadSealRuntime() {\n if (!sealRuntimePromise) {\n sealRuntimePromise = import(\"@ternent/seal-cli\").then((module) => ({\n createSealHash: module.createSealHash,\n createSealProof: module.createSealProof,\n verifySealProofAgainstBytes: module.verifySealProofAgainstBytes,\n }));\n }\n return await sealRuntimePromise;\n}\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 const { createSealHash, createSealProof } = await loadSealRuntime();\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 { verifySealProofAgainstBytes } = await loadSealRuntime();\n const result = await verifySealProofAgainstBytes(\n input.proof as never,\n input.subjectBytes\n );\n return result.valid;\n },\n async createCommitProof(input) {\n const { createSealHash, createSealProof } = await loadSealRuntime();\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 { verifySealProofAgainstBytes } = await loadSealRuntime();\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 const { createSealHash } = await loadSealRuntime();\n const { encryptForRecipients, initArmour } = await loadArmourRuntime();\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 const { decryptWithIdentity, initArmour } = await loadArmourRuntime();\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 { createSealHash } = await loadSealRuntime();\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 }\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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAYlB,cAAc,EAGd,eAAe,EAOf,oBAAoB,EAKrB,MAAM,YAAY,CAAC;AA8jBpB,wBAAsB,YAAY,CAAC,CAAC,EAClC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAgmB5B;AAED,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACrB,CAAC"}
|
package/dist/types.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ternent/ledger",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Append-only state engine for Concord",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
7
8
|
"files": [
|
|
8
9
|
"dist",
|
|
9
10
|
"SPEC.md"
|
|
@@ -19,13 +20,18 @@
|
|
|
19
20
|
"types": "./dist/index.d.ts",
|
|
20
21
|
"import": "./dist/index.js",
|
|
21
22
|
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./browser": {
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/browser.js",
|
|
27
|
+
"default": "./dist/browser.js"
|
|
22
28
|
}
|
|
23
29
|
},
|
|
24
30
|
"dependencies": {
|
|
25
|
-
"@ternent/armour": "0.1.
|
|
26
|
-
"@ternent/seal-cli": "0.3.
|
|
31
|
+
"@ternent/armour": "0.1.5",
|
|
32
|
+
"@ternent/seal-cli": "0.3.8",
|
|
27
33
|
"@ternent/concord-protocol": "0.1.1",
|
|
28
|
-
"@ternent/identity": "0.3.
|
|
34
|
+
"@ternent/identity": "0.3.1"
|
|
29
35
|
},
|
|
30
36
|
"devDependencies": {
|
|
31
37
|
"@types/node": "^24.3.0",
|
|
@@ -35,7 +41,8 @@
|
|
|
35
41
|
"vitest": "^1.6.0"
|
|
36
42
|
},
|
|
37
43
|
"scripts": {
|
|
38
|
-
"build": "pnpm --filter @ternent/rage build && vite build",
|
|
44
|
+
"build:browser": "pnpm --filter @ternent/rage build && vite build -c vite.browser.config.ts",
|
|
45
|
+
"build": "pnpm --filter @ternent/rage build && vite build && vite build -c vite.browser.config.ts",
|
|
39
46
|
"test": "pnpm --filter @ternent/rage build && vitest run"
|
|
40
47
|
}
|
|
41
48
|
}
|