@emilia-protocol/gate 0.18.2 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +56 -0
- package/README.md +64 -0
- package/action-refusal-statement.js +1 -0
- package/coverage-reconciliation-attestation.js +1 -0
- package/dist/action-refusal-statement.d.ts +109 -0
- package/dist/action-refusal-statement.d.ts.map +1 -0
- package/dist/action-refusal-statement.js +333 -0
- package/dist/action-refusal-statement.js.map +1 -0
- package/dist/coverage-reconciliation-attestation.d.ts +29 -0
- package/dist/coverage-reconciliation-attestation.d.ts.map +1 -0
- package/dist/coverage-reconciliation-attestation.js +111 -0
- package/dist/coverage-reconciliation-attestation.js.map +1 -0
- package/dist/gate-qualification-v2.d.ts +4 -0
- package/dist/gate-qualification-v2.d.ts.map +1 -1
- package/dist/gate-qualification-v2.js +39 -47
- package/dist/gate-qualification-v2.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/loss-allocation-schedule.d.ts +53 -0
- package/dist/loss-allocation-schedule.d.ts.map +1 -0
- package/dist/loss-allocation-schedule.js +351 -0
- package/dist/loss-allocation-schedule.js.map +1 -0
- package/dist/loss-experience-feed.d.ts +82 -0
- package/dist/loss-experience-feed.d.ts.map +1 -0
- package/dist/loss-experience-feed.js +314 -0
- package/dist/loss-experience-feed.js.map +1 -0
- package/dist/open-exposure-ledger-postgres.d.ts +40 -0
- package/dist/open-exposure-ledger-postgres.d.ts.map +1 -0
- package/dist/open-exposure-ledger-postgres.js +577 -0
- package/dist/open-exposure-ledger-postgres.js.map +1 -0
- package/dist/open-exposure-ledger.d.ts +243 -0
- package/dist/open-exposure-ledger.d.ts.map +1 -0
- package/dist/open-exposure-ledger.js +794 -0
- package/dist/open-exposure-ledger.js.map +1 -0
- package/dist/receipt-census.d.ts +21 -0
- package/dist/receipt-census.d.ts.map +1 -0
- package/dist/receipt-census.js +162 -0
- package/dist/receipt-census.js.map +1 -0
- package/dist/reliance-program.d.ts +88 -0
- package/dist/reliance-program.d.ts.map +1 -0
- package/dist/reliance-program.js +437 -0
- package/dist/reliance-program.js.map +1 -0
- package/dist/reliance-risk-crypto.d.ts +28 -0
- package/dist/reliance-risk-crypto.d.ts.map +1 -0
- package/dist/reliance-risk-crypto.js +110 -0
- package/dist/reliance-risk-crypto.js.map +1 -0
- package/dist/remedy-program.d.ts.map +1 -1
- package/dist/remedy-program.js +28 -18
- package/dist/remedy-program.js.map +1 -1
- package/loss-allocation-schedule.js +1 -0
- package/loss-experience-feed.js +1 -0
- package/open-exposure-ledger-postgres.js +1 -0
- package/open-exposure-ledger.js +1 -0
- package/package.json +42 -2
- package/receipt-census.js +1 -0
- package/reliance-program.js +3 -0
- package/src/action-refusal-statement.ts +396 -0
- package/src/coverage-reconciliation-attestation.ts +107 -0
- package/src/gate-qualification-v2.ts +56 -46
- package/src/index.ts +7 -0
- package/src/loss-allocation-schedule.ts +427 -0
- package/src/loss-experience-feed.ts +398 -0
- package/src/open-exposure-ledger-postgres.ts +701 -0
- package/src/open-exposure-ledger.ts +1213 -0
- package/src/receipt-census.ts +163 -0
- package/src/reliance-program.ts +499 -0
- package/src/reliance-risk-crypto.ts +114 -0
- package/src/remedy-program.ts +28 -17
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Deployment-bound PostgreSQL adapter for the Open Exposure Ledger.
|
|
5
|
+
*
|
|
6
|
+
* Each mutation is one PostgreSQL function call. Authentication is the
|
|
7
|
+
* PostgreSQL session principal plus its private tenant/authority mapping; the
|
|
8
|
+
* application credential field is deliberately never serialized to SQL.
|
|
9
|
+
*/
|
|
10
|
+
import crypto from 'node:crypto';
|
|
11
|
+
import { OPEN_EXPOSURE_HISTORY_VERSION, OPEN_EXPOSURE_LEDGER_VERSION, } from './open-exposure-ledger.js';
|
|
12
|
+
export const OPEN_EXPOSURE_POSTGRES_SQL = Object.freeze({
|
|
13
|
+
registerCeiling: 'SELECT open_exposure_private.register_ceiling($1::jsonb) AS result',
|
|
14
|
+
reserve: 'SELECT open_exposure_private.reserve($1::jsonb) AS result',
|
|
15
|
+
beginInvocation: 'SELECT open_exposure_private.begin_invocation($1::jsonb) AS result',
|
|
16
|
+
markIndeterminate: 'SELECT open_exposure_private.mark_indeterminate($1::jsonb) AS result',
|
|
17
|
+
reconcile: 'SELECT open_exposure_private.reconcile($1::jsonb) AS result',
|
|
18
|
+
read: 'SELECT open_exposure_private.read_exposure($1::jsonb) AS result',
|
|
19
|
+
history: 'SELECT open_exposure_private.read_history($1::jsonb) AS result',
|
|
20
|
+
sumOpen: 'SELECT open_exposure_private.sum_open($1::jsonb) AS result',
|
|
21
|
+
listAging: 'SELECT open_exposure_private.list_aging($1::jsonb) AS result',
|
|
22
|
+
listDeadlines: 'SELECT open_exposure_private.list_deadlines($1::jsonb) AS result',
|
|
23
|
+
});
|
|
24
|
+
export class OpenExposurePostgresProtocolError extends Error {
|
|
25
|
+
constructor(message, options) {
|
|
26
|
+
super(message, options);
|
|
27
|
+
this.name = 'OpenExposurePostgresProtocolError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const SHA256 = /^sha256:[0-9a-f]{64}$/;
|
|
31
|
+
const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9:_.@/-]{0,511}$/;
|
|
32
|
+
const CURRENCY = /^[A-Z]{3}$/;
|
|
33
|
+
const OPERATION_TOKEN = /^open-exposure-op:v1:[A-Za-z0-9_-]{32,128}$/;
|
|
34
|
+
const RECONCILIATION_TOKEN = /^open-exposure-reconcile:v1:[A-Za-z0-9_-]{32,128}$/;
|
|
35
|
+
const INVOCATION_PERMIT = /^open-exposure-invoke:v1:[0-9a-f]{64}$/;
|
|
36
|
+
const CAID = /^caid:1:[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[1-9][0-9]*:jcs-sha256:[A-Za-z0-9_-]{43}$/;
|
|
37
|
+
const STATUSES = new Set([
|
|
38
|
+
'RESERVED', 'INVOKING', 'INDETERMINATE',
|
|
39
|
+
'CLOSED_COMMITTED', 'CLOSED_PROVEN_NOT_COMMITTED',
|
|
40
|
+
]);
|
|
41
|
+
const REASONS = new Set([
|
|
42
|
+
'unauthenticated', 'wrong_authority', 'authority_separation_required',
|
|
43
|
+
'ceiling_not_configured', 'ceiling_exceeded', 'ceiling_id_conflict',
|
|
44
|
+
'ceiling_scope_conflict', 'exposure_exists', 'exposure_not_found',
|
|
45
|
+
'operation_token_conflict', 'immutable_binding_conflict', 'invocation_expired',
|
|
46
|
+
'reconciliation_token_conflict',
|
|
47
|
+
'state_conflict', 'reconciliation_required', 'already_closed',
|
|
48
|
+
]);
|
|
49
|
+
function plain(value) {
|
|
50
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
51
|
+
return false;
|
|
52
|
+
const prototype = Object.getPrototypeOf(value);
|
|
53
|
+
return prototype === Object.prototype || prototype === null;
|
|
54
|
+
}
|
|
55
|
+
function protocol(condition, message) {
|
|
56
|
+
if (!condition)
|
|
57
|
+
throw new OpenExposurePostgresProtocolError(message);
|
|
58
|
+
}
|
|
59
|
+
function frozenCopy(value) {
|
|
60
|
+
const copy = structuredClone(value);
|
|
61
|
+
const freeze = (candidate) => {
|
|
62
|
+
if (candidate !== null && typeof candidate === 'object' && !Object.isFrozen(candidate)) {
|
|
63
|
+
for (const child of Object.values(candidate))
|
|
64
|
+
freeze(child);
|
|
65
|
+
Object.freeze(candidate);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
freeze(copy);
|
|
69
|
+
return copy;
|
|
70
|
+
}
|
|
71
|
+
function canonical(value) {
|
|
72
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'string') {
|
|
73
|
+
return JSON.stringify(value);
|
|
74
|
+
}
|
|
75
|
+
if (typeof value === 'number') {
|
|
76
|
+
protocol(Number.isFinite(value), 'cannot hash a non-finite number');
|
|
77
|
+
return JSON.stringify(value);
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(value))
|
|
80
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
81
|
+
protocol(plain(value), 'cannot hash a non-plain object');
|
|
82
|
+
return `{${Object.keys(value).sort().map((key) => (`${JSON.stringify(key)}:${canonical(value[key])}`)).join(',')}}`;
|
|
83
|
+
}
|
|
84
|
+
function digest(domain, value) {
|
|
85
|
+
return `sha256:${crypto.createHash('sha256')
|
|
86
|
+
.update(domain)
|
|
87
|
+
.update('\0')
|
|
88
|
+
.update(canonical(value))
|
|
89
|
+
.digest('hex')}`;
|
|
90
|
+
}
|
|
91
|
+
function tokenDigest(token) {
|
|
92
|
+
return digest('EP-OPEN-EXPOSURE-TOKEN-v1', token);
|
|
93
|
+
}
|
|
94
|
+
function text(value, field, pattern = IDENTIFIER) {
|
|
95
|
+
protocol(typeof value === 'string' && pattern.test(value), `database returned invalid ${field}`);
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
function nullableText(value, field, pattern = IDENTIFIER) {
|
|
99
|
+
if (value === null)
|
|
100
|
+
return null;
|
|
101
|
+
return text(value, field, pattern);
|
|
102
|
+
}
|
|
103
|
+
function iso(value, field) {
|
|
104
|
+
protocol(typeof value === 'string', `database returned invalid ${field}`);
|
|
105
|
+
const parsed = Date.parse(value);
|
|
106
|
+
protocol(Number.isFinite(parsed) && new Date(parsed).toISOString() === value, `database returned non-canonical ${field}`);
|
|
107
|
+
return value;
|
|
108
|
+
}
|
|
109
|
+
function integer(value, field) {
|
|
110
|
+
const candidate = typeof value === 'string' ? Number(value) : value;
|
|
111
|
+
protocol(Number.isSafeInteger(candidate) && Number(candidate) >= 0, `database returned invalid ${field}`);
|
|
112
|
+
return Number(candidate);
|
|
113
|
+
}
|
|
114
|
+
function minor(value, field, allowZero = false) {
|
|
115
|
+
protocol(typeof value === 'string' && /^(?:0|[1-9][0-9]{0,18})$/.test(value), `database returned invalid ${field}`);
|
|
116
|
+
const parsed = BigInt(value);
|
|
117
|
+
protocol(parsed <= 9223372036854775807n && (allowZero ? parsed >= 0n : parsed > 0n), `database returned out-of-range ${field}`);
|
|
118
|
+
return parsed;
|
|
119
|
+
}
|
|
120
|
+
function digestArray(value, field) {
|
|
121
|
+
protocol(Array.isArray(value), `database returned invalid ${field}`);
|
|
122
|
+
const parsed = value.map((entry, index) => text(entry, `${field}[${index}]`, SHA256));
|
|
123
|
+
protocol(new Set(parsed).size === parsed.length, `database returned duplicate ${field}`);
|
|
124
|
+
return frozenCopy(parsed);
|
|
125
|
+
}
|
|
126
|
+
function parseCeiling(value) {
|
|
127
|
+
protocol(plain(value), 'database returned invalid ceiling');
|
|
128
|
+
protocol(value.version === OPEN_EXPOSURE_LEDGER_VERSION, 'database returned unsupported ceiling version');
|
|
129
|
+
protocol(['TENANT', 'PROGRAM', 'COUNTERPARTY', 'ACTION_CLASS'].includes(String(value.scope)), 'database returned invalid ceiling scope');
|
|
130
|
+
return frozenCopy({
|
|
131
|
+
'@version': OPEN_EXPOSURE_LEDGER_VERSION,
|
|
132
|
+
tenantId: text(value.tenant_id, 'ceiling tenant_id'),
|
|
133
|
+
ceilingId: text(value.ceiling_id, 'ceiling ceiling_id'),
|
|
134
|
+
scope: value.scope,
|
|
135
|
+
scopeValue: value.scope === 'TENANT' && value.scope_value === '*'
|
|
136
|
+
? '*'
|
|
137
|
+
: text(value.scope_value, 'ceiling scope_value'),
|
|
138
|
+
currency: text(value.currency, 'ceiling currency', CURRENCY),
|
|
139
|
+
windowStart: iso(value.window_start, 'ceiling window_start'),
|
|
140
|
+
windowEnd: iso(value.window_end, 'ceiling window_end'),
|
|
141
|
+
limitMinor: minor(value.limit_minor, 'ceiling limit_minor', true),
|
|
142
|
+
policyDigest: text(value.policy_digest, 'ceiling policy_digest', SHA256),
|
|
143
|
+
ceilingDigest: text(value.ceiling_digest, 'ceiling ceiling_digest', SHA256),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function parseRecord(value) {
|
|
147
|
+
protocol(plain(value), 'database returned invalid exposure record');
|
|
148
|
+
protocol(value.version === OPEN_EXPOSURE_LEDGER_VERSION, 'database returned unsupported record version');
|
|
149
|
+
protocol(typeof value.status === 'string' && STATUSES.has(value.status), 'database returned invalid exposure status');
|
|
150
|
+
protocol(value.reconciliation_outcome === null
|
|
151
|
+
|| ['COMMITTED', 'PROVEN_NOT_COMMITTED', 'INDETERMINATE'].includes(String(value.reconciliation_outcome)), 'database returned invalid reconciliation outcome');
|
|
152
|
+
return frozenCopy({
|
|
153
|
+
'@version': OPEN_EXPOSURE_LEDGER_VERSION,
|
|
154
|
+
tenantId: text(value.tenant_id, 'tenant_id'),
|
|
155
|
+
exposureId: text(value.exposure_id, 'exposure_id'),
|
|
156
|
+
operationTokenDigest: text(value.operation_token_digest, 'operation_token_digest', SHA256),
|
|
157
|
+
reservationDigest: text(value.reservation_digest, 'reservation_digest', SHA256),
|
|
158
|
+
programId: text(value.program_id, 'program_id'),
|
|
159
|
+
programVersion: text(value.program_version, 'program_version'),
|
|
160
|
+
programSourceDigest: text(value.program_source_digest, 'program_source_digest', SHA256),
|
|
161
|
+
programDigest: text(value.program_digest, 'program_digest', SHA256),
|
|
162
|
+
caid: text(value.caid, 'caid', CAID),
|
|
163
|
+
actionDigest: text(value.action_digest, 'action_digest', SHA256),
|
|
164
|
+
admissionSnapshotDigest: text(value.admission_snapshot_digest, 'admission_snapshot_digest', SHA256),
|
|
165
|
+
authorizationDigest: text(value.authorization_digest, 'authorization_digest', SHA256),
|
|
166
|
+
authorizationExpiresAt: iso(value.authorization_expires_at, 'authorization_expires_at'),
|
|
167
|
+
counterpartyId: text(value.counterparty_id, 'counterparty_id'),
|
|
168
|
+
actionClass: text(value.action_class, 'action_class'),
|
|
169
|
+
amountMinor: minor(value.amount_minor, 'amount_minor'),
|
|
170
|
+
currency: text(value.currency, 'currency', CURRENCY),
|
|
171
|
+
windowStart: iso(value.window_start, 'window_start'),
|
|
172
|
+
windowEnd: iso(value.window_end, 'window_end'),
|
|
173
|
+
reservedAt: iso(value.reserved_at, 'reserved_at'),
|
|
174
|
+
invokeBy: iso(value.invoke_by, 'invoke_by'),
|
|
175
|
+
reconcileBy: iso(value.reconcile_by, 'reconcile_by'),
|
|
176
|
+
originAuthorityId: text(value.origin_authority_id, 'origin_authority_id'),
|
|
177
|
+
executorAuthorityId: text(value.executor_authority_id, 'executor_authority_id'),
|
|
178
|
+
reconciliationAuthorityId: text(value.reconciliation_authority_id, 'reconciliation_authority_id'),
|
|
179
|
+
reservationEvidenceDigest: text(value.reservation_evidence_digest, 'reservation_evidence_digest', SHA256),
|
|
180
|
+
ceilingDigests: digestArray(value.ceiling_digests, 'ceiling_digests'),
|
|
181
|
+
revision: integer(value.revision, 'revision'),
|
|
182
|
+
status: value.status,
|
|
183
|
+
invokedAt: value.invoked_at === null ? null : iso(value.invoked_at, 'invoked_at'),
|
|
184
|
+
invocationPermitDigest: nullableText(value.invocation_permit_digest, 'invocation_permit_digest', SHA256),
|
|
185
|
+
indeterminateEvidenceDigest: nullableText(value.indeterminate_evidence_digest, 'indeterminate_evidence_digest', SHA256),
|
|
186
|
+
reconciliationOutcome: value.reconciliation_outcome,
|
|
187
|
+
reconciliationEvidenceDigest: nullableText(value.reconciliation_evidence_digest, 'reconciliation_evidence_digest', SHA256),
|
|
188
|
+
lastChangedAt: iso(value.last_changed_at, 'last_changed_at'),
|
|
189
|
+
predecessorRecordDigest: nullableText(value.predecessor_record_digest, 'predecessor_record_digest', SHA256),
|
|
190
|
+
recordDigest: text(value.record_digest, 'record_digest', SHA256),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function parseHistoryEntry(value) {
|
|
194
|
+
protocol(plain(value), 'database returned invalid history entry');
|
|
195
|
+
protocol(value.version === OPEN_EXPOSURE_HISTORY_VERSION, 'database returned unsupported history version');
|
|
196
|
+
protocol([
|
|
197
|
+
'RESERVED', 'INVOKING', 'INDETERMINATE', 'RECONCILED_INDETERMINATE',
|
|
198
|
+
'CLOSED_COMMITTED', 'CLOSED_PROVEN_NOT_COMMITTED',
|
|
199
|
+
].includes(String(value.event)), 'database returned invalid history event');
|
|
200
|
+
return frozenCopy({
|
|
201
|
+
'@version': OPEN_EXPOSURE_HISTORY_VERSION,
|
|
202
|
+
tenantId: text(value.tenant_id, 'history tenant_id'),
|
|
203
|
+
exposureId: text(value.exposure_id, 'history exposure_id'),
|
|
204
|
+
sequence: integer(value.sequence, 'history sequence'),
|
|
205
|
+
event: value.event,
|
|
206
|
+
programVersion: text(value.program_version, 'history program_version'),
|
|
207
|
+
programSourceDigest: text(value.program_source_digest, 'history program_source_digest', SHA256),
|
|
208
|
+
programDigest: text(value.program_digest, 'history program_digest', SHA256),
|
|
209
|
+
caid: text(value.caid, 'history caid', CAID),
|
|
210
|
+
actionDigest: text(value.action_digest, 'history action_digest', SHA256),
|
|
211
|
+
admissionSnapshotDigest: text(value.admission_snapshot_digest, 'history admission_snapshot_digest', SHA256),
|
|
212
|
+
authorizationDigest: text(value.authorization_digest, 'history authorization_digest', SHA256),
|
|
213
|
+
authorizationExpiresAt: iso(value.authorization_expires_at, 'history authorization_expires_at'),
|
|
214
|
+
invocationPermitDigest: nullableText(value.invocation_permit_digest, 'history invocation_permit_digest', SHA256),
|
|
215
|
+
recordDigest: text(value.record_digest, 'history record_digest', SHA256),
|
|
216
|
+
evidenceDigest: text(value.evidence_digest, 'history evidence_digest', SHA256),
|
|
217
|
+
recordedAt: iso(value.recorded_at, 'history recorded_at'),
|
|
218
|
+
predecessorEntryDigest: nullableText(value.predecessor_entry_digest, 'history predecessor_entry_digest', SHA256),
|
|
219
|
+
entryDigest: text(value.entry_digest, 'history entry_digest', SHA256),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
function parseBreakdowns(value, field) {
|
|
223
|
+
protocol(Array.isArray(value), `database returned invalid ${field}`);
|
|
224
|
+
const parsed = value.map((entry) => {
|
|
225
|
+
protocol(plain(entry), `database returned invalid ${field} entry`);
|
|
226
|
+
return { key: text(entry.key, `${field} key`), amountMinor: minor(entry.amount_minor, `${field} amount`, true) };
|
|
227
|
+
});
|
|
228
|
+
for (let index = 1; index < parsed.length; index += 1) {
|
|
229
|
+
protocol(parsed[index - 1].key < parsed[index].key, `database returned unsorted ${field}`);
|
|
230
|
+
}
|
|
231
|
+
return frozenCopy(parsed);
|
|
232
|
+
}
|
|
233
|
+
function parseRefusal(value) {
|
|
234
|
+
protocol(value.ok === false && typeof value.reason === 'string'
|
|
235
|
+
&& REASONS.has(value.reason), 'database returned invalid refusal');
|
|
236
|
+
return { ok: false, reason: value.reason };
|
|
237
|
+
}
|
|
238
|
+
function wireAuth(auth) {
|
|
239
|
+
protocol(auth && typeof auth === 'object', 'auth is required');
|
|
240
|
+
protocol(['POLICY_ADMIN', 'ORIGIN', 'EXECUTOR', 'RECONCILER', 'READER'].includes(auth.role), 'auth role is invalid');
|
|
241
|
+
protocol(IDENTIFIER.test(auth.authorityId), 'auth authorityId is invalid');
|
|
242
|
+
return { authority_kind: auth.role, authority_id: auth.authorityId };
|
|
243
|
+
}
|
|
244
|
+
function validateBindingInput(input) {
|
|
245
|
+
protocol(IDENTIFIER.test(input.programVersion), 'programVersion is invalid');
|
|
246
|
+
protocol(CAID.test(input.caid), 'caid is invalid');
|
|
247
|
+
for (const [field, value] of Object.entries({
|
|
248
|
+
programSourceDigest: input.programSourceDigest,
|
|
249
|
+
programDigest: input.programDigest,
|
|
250
|
+
actionDigest: input.actionDigest,
|
|
251
|
+
admissionSnapshotDigest: input.admissionSnapshotDigest,
|
|
252
|
+
authorizationDigest: input.authorizationDigest,
|
|
253
|
+
}))
|
|
254
|
+
protocol(SHA256.test(value), `${field} is invalid`);
|
|
255
|
+
const authorizationExpiresAt = Date.parse(input.authorizationExpiresAt);
|
|
256
|
+
protocol(Number.isFinite(authorizationExpiresAt)
|
|
257
|
+
&& new Date(authorizationExpiresAt).toISOString() === input.authorizationExpiresAt, 'authorizationExpiresAt is invalid');
|
|
258
|
+
}
|
|
259
|
+
function wireBinding(input) {
|
|
260
|
+
validateBindingInput(input);
|
|
261
|
+
return {
|
|
262
|
+
program_version: input.programVersion,
|
|
263
|
+
program_source_digest: input.programSourceDigest,
|
|
264
|
+
program_digest: input.programDigest,
|
|
265
|
+
caid: input.caid,
|
|
266
|
+
action_digest: input.actionDigest,
|
|
267
|
+
admission_snapshot_digest: input.admissionSnapshotDigest,
|
|
268
|
+
authorization_digest: input.authorizationDigest,
|
|
269
|
+
authorization_expires_at: input.authorizationExpiresAt,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function wireReservation(input, auth) {
|
|
273
|
+
protocol(OPERATION_TOKEN.test(input.operationToken), 'operationToken is invalid');
|
|
274
|
+
protocol(typeof input.amountMinor === 'bigint' && input.amountMinor > 0n, 'amountMinor is invalid');
|
|
275
|
+
const invokeBy = Date.parse(input.invokeBy);
|
|
276
|
+
const windowEnd = Date.parse(input.windowEnd);
|
|
277
|
+
const authorizationExpiresAt = Date.parse(input.authorizationExpiresAt);
|
|
278
|
+
protocol(Number.isFinite(invokeBy) && new Date(invokeBy).toISOString() === input.invokeBy, 'invokeBy is invalid');
|
|
279
|
+
protocol(Number.isFinite(windowEnd) && new Date(windowEnd).toISOString() === input.windowEnd, 'windowEnd is invalid');
|
|
280
|
+
protocol(invokeBy <= windowEnd && invokeBy <= authorizationExpiresAt, 'invokeBy exceeds its immutable bound');
|
|
281
|
+
const operationTokenDigest = tokenDigest(input.operationToken);
|
|
282
|
+
const body = {
|
|
283
|
+
version: OPEN_EXPOSURE_LEDGER_VERSION,
|
|
284
|
+
tenant_id: input.tenantId,
|
|
285
|
+
exposure_id: input.exposureId,
|
|
286
|
+
operation_token_digest: operationTokenDigest,
|
|
287
|
+
program_id: input.programId,
|
|
288
|
+
...wireBinding(input),
|
|
289
|
+
counterparty_id: input.counterpartyId,
|
|
290
|
+
action_class: input.actionClass,
|
|
291
|
+
amount_minor: input.amountMinor.toString(10),
|
|
292
|
+
currency: input.currency,
|
|
293
|
+
window_start: input.windowStart,
|
|
294
|
+
window_end: input.windowEnd,
|
|
295
|
+
reserved_at: input.reservedAt,
|
|
296
|
+
invoke_by: input.invokeBy,
|
|
297
|
+
reconcile_by: input.reconcileBy,
|
|
298
|
+
origin_authority_id: input.originAuthorityId,
|
|
299
|
+
executor_authority_id: input.executorAuthorityId,
|
|
300
|
+
reconciliation_authority_id: input.reconciliationAuthorityId,
|
|
301
|
+
reservation_evidence_digest: input.reservationEvidenceDigest,
|
|
302
|
+
...wireAuth(auth),
|
|
303
|
+
};
|
|
304
|
+
return {
|
|
305
|
+
...body,
|
|
306
|
+
reservation_digest: digest('EP-OPEN-EXPOSURE-RESERVATION-WIRE-v1', body),
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function wireCeiling(input, auth) {
|
|
310
|
+
protocol(typeof input.limitMinor === 'bigint' && input.limitMinor >= 0n, 'limitMinor is invalid');
|
|
311
|
+
const body = {
|
|
312
|
+
version: OPEN_EXPOSURE_LEDGER_VERSION,
|
|
313
|
+
tenant_id: input.tenantId,
|
|
314
|
+
ceiling_id: input.ceilingId,
|
|
315
|
+
scope: input.scope,
|
|
316
|
+
scope_value: input.scopeValue,
|
|
317
|
+
currency: input.currency,
|
|
318
|
+
window_start: input.windowStart,
|
|
319
|
+
window_end: input.windowEnd,
|
|
320
|
+
limit_minor: input.limitMinor.toString(10),
|
|
321
|
+
policy_digest: input.policyDigest,
|
|
322
|
+
...wireAuth(auth),
|
|
323
|
+
};
|
|
324
|
+
return { ...body, ceiling_digest: digest('EP-OPEN-EXPOSURE-CEILING-WIRE-v1', body) };
|
|
325
|
+
}
|
|
326
|
+
function roleRefusal(auth, expected) {
|
|
327
|
+
return auth.role === expected ? null : { ok: false, reason: 'wrong_authority' };
|
|
328
|
+
}
|
|
329
|
+
export function createOpenExposurePostgresLedger(options) {
|
|
330
|
+
protocol(options && typeof options.query === 'function', 'query is required');
|
|
331
|
+
protocol(typeof options.tenantId === 'string' && IDENTIFIER.test(options.tenantId), 'tenantId is invalid');
|
|
332
|
+
function tenantRefusal(tenantId) {
|
|
333
|
+
return tenantId === options.tenantId ? null : { ok: false, reason: 'unauthenticated' };
|
|
334
|
+
}
|
|
335
|
+
async function rpc(sql, payload) {
|
|
336
|
+
const result = await options.query(sql, [JSON.stringify(payload)]);
|
|
337
|
+
protocol(result && result.rowCount === 1 && Array.isArray(result.rows)
|
|
338
|
+
&& result.rows.length === 1 && plain(result.rows[0]), 'ledger RPC returned no single result row');
|
|
339
|
+
let raw = result.rows[0].result;
|
|
340
|
+
if (typeof raw === 'string') {
|
|
341
|
+
try {
|
|
342
|
+
raw = JSON.parse(raw);
|
|
343
|
+
}
|
|
344
|
+
catch (cause) {
|
|
345
|
+
throw new OpenExposurePostgresProtocolError('ledger RPC returned invalid JSON', { cause });
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
protocol(plain(raw), 'ledger RPC returned an invalid result envelope');
|
|
349
|
+
return raw;
|
|
350
|
+
}
|
|
351
|
+
async function recordMutation(sql, payload) {
|
|
352
|
+
const envelope = await rpc(sql, payload);
|
|
353
|
+
if (envelope.ok === false)
|
|
354
|
+
return parseRefusal(envelope);
|
|
355
|
+
protocol(envelope.ok === true && typeof envelope.replayed === 'boolean', 'ledger RPC returned invalid mutation result');
|
|
356
|
+
return {
|
|
357
|
+
ok: true,
|
|
358
|
+
replayed: envelope.replayed,
|
|
359
|
+
record: parseRecord(envelope.record),
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
async function beginMutation(payload) {
|
|
363
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.beginInvocation, payload);
|
|
364
|
+
if (envelope.ok === false)
|
|
365
|
+
return parseRefusal(envelope);
|
|
366
|
+
protocol(envelope.ok === true && envelope.replayed === false, 'ledger RPC returned an authorizing invocation replay');
|
|
367
|
+
const invocationPermit = text(envelope.invocation_permit, 'invocation_permit', INVOCATION_PERMIT);
|
|
368
|
+
return {
|
|
369
|
+
ok: true,
|
|
370
|
+
replayed: false,
|
|
371
|
+
invocationPermit,
|
|
372
|
+
record: parseRecord(envelope.record),
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
function referencePayload(input, auth) {
|
|
376
|
+
return {
|
|
377
|
+
version: OPEN_EXPOSURE_LEDGER_VERSION,
|
|
378
|
+
tenant_id: input.tenantId,
|
|
379
|
+
exposure_id: input.exposureId,
|
|
380
|
+
...wireAuth(auth),
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
return {
|
|
384
|
+
durable: true,
|
|
385
|
+
deploymentBound: true,
|
|
386
|
+
singleTenant: true,
|
|
387
|
+
authentication: 'postgres_session_principal',
|
|
388
|
+
atomicReserve: true,
|
|
389
|
+
appendOnlyHistory: true,
|
|
390
|
+
blindRelease: false,
|
|
391
|
+
reconciliationOnlyCloseout: true,
|
|
392
|
+
async registerCeiling(input, auth) {
|
|
393
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
394
|
+
if (tenantDenied)
|
|
395
|
+
return tenantDenied;
|
|
396
|
+
const roleDenied = roleRefusal(auth, 'POLICY_ADMIN');
|
|
397
|
+
if (roleDenied)
|
|
398
|
+
return roleDenied;
|
|
399
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.registerCeiling, wireCeiling(input, auth));
|
|
400
|
+
if (envelope.ok === false)
|
|
401
|
+
return parseRefusal(envelope);
|
|
402
|
+
protocol(envelope.ok === true && typeof envelope.replayed === 'boolean', 'ledger RPC returned invalid ceiling result');
|
|
403
|
+
return {
|
|
404
|
+
ok: true,
|
|
405
|
+
replayed: envelope.replayed,
|
|
406
|
+
ceiling: parseCeiling(envelope.ceiling),
|
|
407
|
+
};
|
|
408
|
+
},
|
|
409
|
+
async reserve(input, auth) {
|
|
410
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
411
|
+
if (tenantDenied)
|
|
412
|
+
return tenantDenied;
|
|
413
|
+
const roleDenied = roleRefusal(auth, 'ORIGIN');
|
|
414
|
+
if (roleDenied)
|
|
415
|
+
return roleDenied;
|
|
416
|
+
if (auth.authorityId !== input.originAuthorityId) {
|
|
417
|
+
return { ok: false, reason: 'wrong_authority' };
|
|
418
|
+
}
|
|
419
|
+
if (new Set([
|
|
420
|
+
input.originAuthorityId,
|
|
421
|
+
input.executorAuthorityId,
|
|
422
|
+
input.reconciliationAuthorityId,
|
|
423
|
+
]).size !== 3) {
|
|
424
|
+
return { ok: false, reason: 'authority_separation_required' };
|
|
425
|
+
}
|
|
426
|
+
return recordMutation(OPEN_EXPOSURE_POSTGRES_SQL.reserve, wireReservation(input, auth));
|
|
427
|
+
},
|
|
428
|
+
async beginInvocation(input, auth) {
|
|
429
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
430
|
+
if (tenantDenied)
|
|
431
|
+
return tenantDenied;
|
|
432
|
+
const roleDenied = roleRefusal(auth, 'EXECUTOR');
|
|
433
|
+
if (roleDenied)
|
|
434
|
+
return roleDenied;
|
|
435
|
+
protocol(OPERATION_TOKEN.test(input.operationToken), 'operationToken is invalid');
|
|
436
|
+
return beginMutation({
|
|
437
|
+
...referencePayload(input, auth),
|
|
438
|
+
operation_token_digest: tokenDigest(input.operationToken),
|
|
439
|
+
...wireBinding(input),
|
|
440
|
+
});
|
|
441
|
+
},
|
|
442
|
+
async markIndeterminate(input, auth) {
|
|
443
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
444
|
+
if (tenantDenied)
|
|
445
|
+
return tenantDenied;
|
|
446
|
+
const roleDenied = roleRefusal(auth, 'EXECUTOR');
|
|
447
|
+
if (roleDenied)
|
|
448
|
+
return roleDenied;
|
|
449
|
+
protocol(OPERATION_TOKEN.test(input.operationToken), 'operationToken is invalid');
|
|
450
|
+
return recordMutation(OPEN_EXPOSURE_POSTGRES_SQL.markIndeterminate, {
|
|
451
|
+
...referencePayload(input, auth),
|
|
452
|
+
operation_token_digest: tokenDigest(input.operationToken),
|
|
453
|
+
evidence_digest: input.evidenceDigest,
|
|
454
|
+
observed_at: input.observedAt,
|
|
455
|
+
});
|
|
456
|
+
},
|
|
457
|
+
async reconcile(input, auth) {
|
|
458
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
459
|
+
if (tenantDenied)
|
|
460
|
+
return tenantDenied;
|
|
461
|
+
const roleDenied = roleRefusal(auth, 'RECONCILER');
|
|
462
|
+
if (roleDenied)
|
|
463
|
+
return roleDenied;
|
|
464
|
+
protocol(OPERATION_TOKEN.test(input.operationToken), 'operationToken is invalid');
|
|
465
|
+
protocol(RECONCILIATION_TOKEN.test(input.reconciliationToken), 'reconciliationToken is invalid');
|
|
466
|
+
const reconciliationTokenDigest = tokenDigest(input.reconciliationToken);
|
|
467
|
+
const body = {
|
|
468
|
+
...referencePayload(input, auth),
|
|
469
|
+
operation_token_digest: tokenDigest(input.operationToken),
|
|
470
|
+
reconciliation_token_digest: reconciliationTokenDigest,
|
|
471
|
+
outcome: input.outcome,
|
|
472
|
+
evidence_digest: input.evidenceDigest,
|
|
473
|
+
observed_at: input.observedAt,
|
|
474
|
+
};
|
|
475
|
+
return recordMutation(OPEN_EXPOSURE_POSTGRES_SQL.reconcile, {
|
|
476
|
+
...body,
|
|
477
|
+
request_digest: digest('EP-OPEN-EXPOSURE-RECONCILIATION-WIRE-v1', body),
|
|
478
|
+
});
|
|
479
|
+
},
|
|
480
|
+
async read(input, auth) {
|
|
481
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
482
|
+
if (tenantDenied)
|
|
483
|
+
return tenantDenied;
|
|
484
|
+
const roleDenied = roleRefusal(auth, 'READER');
|
|
485
|
+
if (roleDenied)
|
|
486
|
+
return roleDenied;
|
|
487
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.read, referencePayload(input, auth));
|
|
488
|
+
if (envelope.ok === false)
|
|
489
|
+
return parseRefusal(envelope);
|
|
490
|
+
protocol(envelope.ok === true, 'ledger RPC returned invalid read result');
|
|
491
|
+
return { ok: true, record: envelope.record === null ? null : parseRecord(envelope.record) };
|
|
492
|
+
},
|
|
493
|
+
async history(input, auth) {
|
|
494
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
495
|
+
if (tenantDenied)
|
|
496
|
+
return tenantDenied;
|
|
497
|
+
const roleDenied = roleRefusal(auth, 'READER');
|
|
498
|
+
if (roleDenied)
|
|
499
|
+
return roleDenied;
|
|
500
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.history, referencePayload(input, auth));
|
|
501
|
+
if (envelope.ok === false)
|
|
502
|
+
return parseRefusal(envelope);
|
|
503
|
+
protocol(envelope.ok === true && Array.isArray(envelope.entries), 'ledger RPC returned invalid history result');
|
|
504
|
+
return { ok: true, entries: frozenCopy(envelope.entries.map(parseHistoryEntry)) };
|
|
505
|
+
},
|
|
506
|
+
async sumOpen(input, auth) {
|
|
507
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
508
|
+
if (tenantDenied)
|
|
509
|
+
return tenantDenied;
|
|
510
|
+
const roleDenied = roleRefusal(auth, 'READER');
|
|
511
|
+
if (roleDenied)
|
|
512
|
+
return roleDenied;
|
|
513
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.sumOpen, {
|
|
514
|
+
version: OPEN_EXPOSURE_LEDGER_VERSION,
|
|
515
|
+
tenant_id: input.tenantId,
|
|
516
|
+
currency: input.currency,
|
|
517
|
+
window_start: input.windowStart,
|
|
518
|
+
window_end: input.windowEnd,
|
|
519
|
+
program_id: input.programId ?? null,
|
|
520
|
+
counterparty_id: input.counterpartyId ?? null,
|
|
521
|
+
action_class: input.actionClass ?? null,
|
|
522
|
+
...wireAuth(auth),
|
|
523
|
+
});
|
|
524
|
+
if (envelope.ok === false)
|
|
525
|
+
return parseRefusal(envelope);
|
|
526
|
+
protocol(envelope.ok === true, 'ledger RPC returned invalid sum result');
|
|
527
|
+
return {
|
|
528
|
+
ok: true,
|
|
529
|
+
totalMinor: minor(envelope.total_minor, 'total_minor', true),
|
|
530
|
+
byProgram: parseBreakdowns(envelope.by_program, 'by_program'),
|
|
531
|
+
byCounterparty: parseBreakdowns(envelope.by_counterparty, 'by_counterparty'),
|
|
532
|
+
byActionClass: parseBreakdowns(envelope.by_action_class, 'by_action_class'),
|
|
533
|
+
byStatus: parseBreakdowns(envelope.by_status, 'by_status'),
|
|
534
|
+
};
|
|
535
|
+
},
|
|
536
|
+
async listAging(input, auth) {
|
|
537
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
538
|
+
if (tenantDenied)
|
|
539
|
+
return tenantDenied;
|
|
540
|
+
const roleDenied = roleRefusal(auth, 'READER');
|
|
541
|
+
if (roleDenied)
|
|
542
|
+
return roleDenied;
|
|
543
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.listAging, {
|
|
544
|
+
version: OPEN_EXPOSURE_LEDGER_VERSION,
|
|
545
|
+
tenant_id: input.tenantId,
|
|
546
|
+
as_of: input.asOf,
|
|
547
|
+
minimum_age_ms: input.minimumAgeMs,
|
|
548
|
+
limit: input.limit,
|
|
549
|
+
...wireAuth(auth),
|
|
550
|
+
});
|
|
551
|
+
if (envelope.ok === false)
|
|
552
|
+
return parseRefusal(envelope);
|
|
553
|
+
protocol(envelope.ok === true && Array.isArray(envelope.records), 'ledger RPC returned invalid aging result');
|
|
554
|
+
return { ok: true, records: frozenCopy(envelope.records.map(parseRecord)) };
|
|
555
|
+
},
|
|
556
|
+
async listDeadlines(input, auth) {
|
|
557
|
+
const tenantDenied = tenantRefusal(input.tenantId);
|
|
558
|
+
if (tenantDenied)
|
|
559
|
+
return tenantDenied;
|
|
560
|
+
const roleDenied = roleRefusal(auth, 'READER');
|
|
561
|
+
if (roleDenied)
|
|
562
|
+
return roleDenied;
|
|
563
|
+
const envelope = await rpc(OPEN_EXPOSURE_POSTGRES_SQL.listDeadlines, {
|
|
564
|
+
version: OPEN_EXPOSURE_LEDGER_VERSION,
|
|
565
|
+
tenant_id: input.tenantId,
|
|
566
|
+
due_at_or_before: input.dueAtOrBefore,
|
|
567
|
+
limit: input.limit,
|
|
568
|
+
...wireAuth(auth),
|
|
569
|
+
});
|
|
570
|
+
if (envelope.ok === false)
|
|
571
|
+
return parseRefusal(envelope);
|
|
572
|
+
protocol(envelope.ok === true && Array.isArray(envelope.records), 'ledger RPC returned invalid deadline result');
|
|
573
|
+
return { ok: true, records: frozenCopy(envelope.records.map(parseRecord)) };
|
|
574
|
+
},
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
//# sourceMappingURL=open-exposure-ledger-postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-exposure-ledger-postgres.js","sourceRoot":"","sources":["../src/open-exposure-ledger-postgres.ts"],"names":[],"mappings":"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"}
|