@validpay/node-sdk 0.1.0 → 0.3.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/LICENSE +21 -0
- package/README.md +340 -52
- package/dist/client.d.ts +38 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +560 -0
- package/dist/client.js.map +1 -0
- package/dist/crypto.d.ts +20 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +126 -0
- package/dist/crypto.js.map +1 -0
- package/dist/index.d.ts +5 -24
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -33
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +159 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/dist/webhookSignature.d.ts +70 -0
- package/dist/webhookSignature.d.ts.map +1 -0
- package/dist/webhookSignature.js +107 -0
- package/dist/webhookSignature.js.map +1 -0
- package/package.json +55 -26
package/dist/client.js
ADDED
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
import { generateKey, encrypt, decrypt, commitmentHash, splitKey as splitKeyFn, combineKeyShares, encryptFields, buildKeyMap, decryptFields, } from "./crypto.js";
|
|
2
|
+
import { ValidPayError, } from "./types.js";
|
|
3
|
+
const DEFAULT_BASE_URL = "https://api.validpay.io";
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
5
|
+
export class ValidPayClient {
|
|
6
|
+
apiKey;
|
|
7
|
+
baseUrl;
|
|
8
|
+
timeout;
|
|
9
|
+
fetchImpl;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
if (!options.apiKey) {
|
|
12
|
+
throw new ValidPayError("invalid_config", "apiKey is required");
|
|
13
|
+
}
|
|
14
|
+
this.apiKey = options.apiKey;
|
|
15
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
16
|
+
this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
17
|
+
this.fetchImpl = options.fetch ?? fetch;
|
|
18
|
+
}
|
|
19
|
+
// === Core ===
|
|
20
|
+
async createIntent(params) {
|
|
21
|
+
if (!params.documentType) {
|
|
22
|
+
throw new ValidPayError("invalid_argument", "documentType is required");
|
|
23
|
+
}
|
|
24
|
+
validateTimeLock(params.validFrom, params.validUntil);
|
|
25
|
+
const key = generateKey();
|
|
26
|
+
const plaintext = JSON.stringify(params.payload);
|
|
27
|
+
const encrypted_payload = encrypt(plaintext, key);
|
|
28
|
+
const commitment_hash = commitmentHash(plaintext);
|
|
29
|
+
const body = {
|
|
30
|
+
document_type: params.documentType,
|
|
31
|
+
encrypted_payload,
|
|
32
|
+
commitment_hash,
|
|
33
|
+
};
|
|
34
|
+
if (params.validFrom !== undefined)
|
|
35
|
+
body["valid_from"] = params.validFrom;
|
|
36
|
+
if (params.validUntil !== undefined)
|
|
37
|
+
body["valid_until"] = params.validUntil;
|
|
38
|
+
const data = await this.request("POST", "/v1/intent", {
|
|
39
|
+
body,
|
|
40
|
+
auth: true,
|
|
41
|
+
});
|
|
42
|
+
if (!data?.retrieval_id) {
|
|
43
|
+
throw new ValidPayError("invalid_response", "API response missing retrieval_id", {
|
|
44
|
+
details: data,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return { retrievalId: data.retrieval_id, key };
|
|
48
|
+
}
|
|
49
|
+
async createIntentBatch(items) {
|
|
50
|
+
if (!Array.isArray(items) || items.length === 0) {
|
|
51
|
+
throw new ValidPayError("invalid_argument", "items must contain at least 1 item");
|
|
52
|
+
}
|
|
53
|
+
if (items.length > 100) {
|
|
54
|
+
throw new ValidPayError("invalid_argument", `items must contain at most 100 items (got ${items.length})`);
|
|
55
|
+
}
|
|
56
|
+
const keys = [];
|
|
57
|
+
const requestItems = [];
|
|
58
|
+
items.forEach((item, idx) => {
|
|
59
|
+
if (!item.documentType) {
|
|
60
|
+
throw new ValidPayError("invalid_argument", `items[${idx}].documentType is required`);
|
|
61
|
+
}
|
|
62
|
+
if (!("payload" in item)) {
|
|
63
|
+
throw new ValidPayError("invalid_argument", `items[${idx}].payload is required`);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
validateTimeLock(item.validFrom, item.validUntil);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
if (e instanceof ValidPayError) {
|
|
70
|
+
throw new ValidPayError("invalid_argument", `items[${idx}]: ${e.message}`);
|
|
71
|
+
}
|
|
72
|
+
throw e;
|
|
73
|
+
}
|
|
74
|
+
const k = generateKey();
|
|
75
|
+
keys.push(k);
|
|
76
|
+
const plaintext = JSON.stringify(item.payload);
|
|
77
|
+
const req = {
|
|
78
|
+
document_type: item.documentType,
|
|
79
|
+
encrypted_payload: encrypt(plaintext, k),
|
|
80
|
+
commitment_hash: commitmentHash(plaintext),
|
|
81
|
+
};
|
|
82
|
+
if (item.validFrom !== undefined)
|
|
83
|
+
req["valid_from"] = item.validFrom;
|
|
84
|
+
if (item.validUntil !== undefined)
|
|
85
|
+
req["valid_until"] = item.validUntil;
|
|
86
|
+
requestItems.push(req);
|
|
87
|
+
});
|
|
88
|
+
const data = await this.request("POST", "/v1/intent/batch", {
|
|
89
|
+
body: { intents: requestItems },
|
|
90
|
+
auth: true,
|
|
91
|
+
});
|
|
92
|
+
if (!Array.isArray(data?.results) || data.results.length !== keys.length) {
|
|
93
|
+
throw new ValidPayError("invalid_response", "API response missing results array of expected length", { details: data });
|
|
94
|
+
}
|
|
95
|
+
return data.results.map((row, i) => {
|
|
96
|
+
if (!row?.retrieval_id) {
|
|
97
|
+
throw new ValidPayError("invalid_response", `results[${i}] missing retrieval_id`, {
|
|
98
|
+
details: data,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return { retrievalId: row.retrieval_id, key: keys[i] };
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async verifyIntent(retrievalId, key) {
|
|
105
|
+
if (!retrievalId) {
|
|
106
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
107
|
+
}
|
|
108
|
+
if (!key) {
|
|
109
|
+
throw new ValidPayError("invalid_argument", "key is required");
|
|
110
|
+
}
|
|
111
|
+
const data = await this.request("GET", `/v1/intent/${encodeURIComponent(retrievalId)}`, { auth: false });
|
|
112
|
+
if (!data || typeof data !== "object") {
|
|
113
|
+
throw new ValidPayError("invalid_response", "API response missing intent body", {
|
|
114
|
+
details: data,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (data.status === "revoked" || !data.encrypted_payload) {
|
|
118
|
+
const reasonSuffix = data.revocation_reason ? `: ${data.revocation_reason}` : "";
|
|
119
|
+
throw new ValidPayError("intent_revoked", `Intent ${retrievalId} has been revoked${reasonSuffix}`, {
|
|
120
|
+
details: {
|
|
121
|
+
intent_id: data.intent_id,
|
|
122
|
+
status: data.status,
|
|
123
|
+
revoked_at: data.revoked_at,
|
|
124
|
+
revocation_reason: data.revocation_reason,
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (data.selective_disclosure) {
|
|
129
|
+
throw new ValidPayError("selective_disclosure_required", "This intent uses selective field disclosure. Use verifySelectiveIntent(retrievalId, key, role) instead.");
|
|
130
|
+
}
|
|
131
|
+
if (data.split_key) {
|
|
132
|
+
throw new ValidPayError("split_key_required", `Intent ${retrievalId} uses split-key protection. Use verifySplitKeyIntent(retrievalId, shareA) instead.`);
|
|
133
|
+
}
|
|
134
|
+
const decrypted = decrypt(data.encrypted_payload, key);
|
|
135
|
+
const integrityVerified = checkCommitment(data.commitment_hash, decrypted);
|
|
136
|
+
let payload;
|
|
137
|
+
try {
|
|
138
|
+
payload = JSON.parse(decrypted);
|
|
139
|
+
}
|
|
140
|
+
catch (cause) {
|
|
141
|
+
throw new ValidPayError("invalid_payload", "Decrypted payload is not valid JSON", {
|
|
142
|
+
cause,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
return buildVerifyResult(data, payload, integrityVerified);
|
|
146
|
+
}
|
|
147
|
+
// === Split-key (Patent C) ===
|
|
148
|
+
async createSplitKeyIntent(params) {
|
|
149
|
+
if (!params.documentType) {
|
|
150
|
+
throw new ValidPayError("invalid_argument", "documentType is required");
|
|
151
|
+
}
|
|
152
|
+
validateTimeLock(params.validFrom, params.validUntil);
|
|
153
|
+
const fullKey = generateKey();
|
|
154
|
+
const [shareA, shareB] = splitKeyFn(fullKey);
|
|
155
|
+
const plaintext = JSON.stringify(params.payload);
|
|
156
|
+
const encrypted_payload = encrypt(plaintext, fullKey);
|
|
157
|
+
const commitment_hash = commitmentHash(plaintext);
|
|
158
|
+
const body = {
|
|
159
|
+
document_type: params.documentType,
|
|
160
|
+
encrypted_payload,
|
|
161
|
+
commitment_hash,
|
|
162
|
+
split_key: true,
|
|
163
|
+
key_fragment_b: shareB,
|
|
164
|
+
};
|
|
165
|
+
if (params.validFrom !== undefined)
|
|
166
|
+
body["valid_from"] = params.validFrom;
|
|
167
|
+
if (params.validUntil !== undefined)
|
|
168
|
+
body["valid_until"] = params.validUntil;
|
|
169
|
+
const data = await this.request("POST", "/v1/intent", {
|
|
170
|
+
body,
|
|
171
|
+
auth: true,
|
|
172
|
+
});
|
|
173
|
+
if (!data?.retrieval_id) {
|
|
174
|
+
throw new ValidPayError("invalid_response", "API response missing retrieval_id", {
|
|
175
|
+
details: data,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return { retrievalId: data.retrieval_id, key: shareA };
|
|
179
|
+
}
|
|
180
|
+
async verifySplitKeyIntent(retrievalId, shareA) {
|
|
181
|
+
if (!retrievalId) {
|
|
182
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
183
|
+
}
|
|
184
|
+
if (!shareA) {
|
|
185
|
+
throw new ValidPayError("invalid_argument", "shareA is required");
|
|
186
|
+
}
|
|
187
|
+
const data = await this.request("GET", `/v1/intent/${encodeURIComponent(retrievalId)}`, { auth: false });
|
|
188
|
+
if (data.status === "revoked" || !data.encrypted_payload) {
|
|
189
|
+
const reasonSuffix = data.revocation_reason ? `: ${data.revocation_reason}` : "";
|
|
190
|
+
throw new ValidPayError("intent_revoked", `Intent ${retrievalId} has been revoked${reasonSuffix}`, {
|
|
191
|
+
details: {
|
|
192
|
+
intent_id: data.intent_id,
|
|
193
|
+
status: data.status,
|
|
194
|
+
revoked_at: data.revoked_at,
|
|
195
|
+
revocation_reason: data.revocation_reason,
|
|
196
|
+
},
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
const frag = await this.request("GET", `/v1/intent/${encodeURIComponent(retrievalId)}/fragment`, { auth: false });
|
|
200
|
+
if (frag?.error) {
|
|
201
|
+
throw new ValidPayError(frag.error, `Fragment retrieval failed: ${frag.error}`, {
|
|
202
|
+
details: frag,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
if (!frag?.fragment_b) {
|
|
206
|
+
throw new ValidPayError("missing_fragment", "Server did not return key fragment", {
|
|
207
|
+
details: frag,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
const fullKey = combineKeyShares(shareA, frag.fragment_b);
|
|
211
|
+
const decrypted = decrypt(data.encrypted_payload, fullKey);
|
|
212
|
+
const integrityVerified = checkCommitment(data.commitment_hash, decrypted);
|
|
213
|
+
let payload;
|
|
214
|
+
try {
|
|
215
|
+
payload = JSON.parse(decrypted);
|
|
216
|
+
}
|
|
217
|
+
catch (cause) {
|
|
218
|
+
throw new ValidPayError("invalid_payload", "Decrypted payload is not valid JSON", {
|
|
219
|
+
cause,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return buildVerifyResult(data, payload, integrityVerified);
|
|
223
|
+
}
|
|
224
|
+
// === Selective disclosure (Patent E) ===
|
|
225
|
+
async createSelectiveIntent(params) {
|
|
226
|
+
if (!params.documentType) {
|
|
227
|
+
throw new ValidPayError("invalid_argument", "documentType is required");
|
|
228
|
+
}
|
|
229
|
+
if (!params.payload || Object.keys(params.payload).length === 0) {
|
|
230
|
+
throw new ValidPayError("invalid_argument", "payload must be a non-empty object");
|
|
231
|
+
}
|
|
232
|
+
if (!params.disclosurePolicy || Object.keys(params.disclosurePolicy).length === 0) {
|
|
233
|
+
throw new ValidPayError("invalid_argument", "disclosurePolicy must be a non-empty object");
|
|
234
|
+
}
|
|
235
|
+
validateTimeLock(params.validFrom, params.validUntil);
|
|
236
|
+
for (const [role, fields] of Object.entries(params.disclosurePolicy)) {
|
|
237
|
+
if (!Array.isArray(fields)) {
|
|
238
|
+
throw new ValidPayError("invalid_argument", `disclosurePolicy['${role}'] must be an array`);
|
|
239
|
+
}
|
|
240
|
+
for (const f of fields) {
|
|
241
|
+
if (!(f in params.payload)) {
|
|
242
|
+
throw new ValidPayError("invalid_argument", `Field '${f}' in role '${role}' not found in payload`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
const masterKey = generateKey();
|
|
247
|
+
const { encryptedFields, fieldKeys } = encryptFields(params.payload);
|
|
248
|
+
const keyMap = buildKeyMap(fieldKeys, params.disclosurePolicy);
|
|
249
|
+
const encrypted_key_map = encrypt(JSON.stringify(keyMap), masterKey);
|
|
250
|
+
const fullPlaintext = JSON.stringify(params.payload);
|
|
251
|
+
const commitment_hash = commitmentHash(fullPlaintext);
|
|
252
|
+
let qrKey = masterKey;
|
|
253
|
+
let key_fragment_b;
|
|
254
|
+
if (params.splitKey) {
|
|
255
|
+
const [shareA, shareB] = splitKeyFn(masterKey);
|
|
256
|
+
qrKey = shareA;
|
|
257
|
+
key_fragment_b = shareB;
|
|
258
|
+
}
|
|
259
|
+
const body = {
|
|
260
|
+
document_type: params.documentType,
|
|
261
|
+
encrypted_payload: JSON.stringify(encryptedFields),
|
|
262
|
+
commitment_hash,
|
|
263
|
+
selective_disclosure: true,
|
|
264
|
+
disclosure_policy: JSON.stringify(params.disclosurePolicy),
|
|
265
|
+
encrypted_key_map,
|
|
266
|
+
split_key: !!params.splitKey,
|
|
267
|
+
};
|
|
268
|
+
if (key_fragment_b !== undefined)
|
|
269
|
+
body["key_fragment_b"] = key_fragment_b;
|
|
270
|
+
if (params.validFrom !== undefined)
|
|
271
|
+
body["valid_from"] = params.validFrom;
|
|
272
|
+
if (params.validUntil !== undefined)
|
|
273
|
+
body["valid_until"] = params.validUntil;
|
|
274
|
+
const data = await this.request("POST", "/v1/intent", {
|
|
275
|
+
body,
|
|
276
|
+
auth: true,
|
|
277
|
+
});
|
|
278
|
+
if (!data?.retrieval_id) {
|
|
279
|
+
throw new ValidPayError("invalid_response", "API response missing retrieval_id", {
|
|
280
|
+
details: data,
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
return { retrievalId: data.retrieval_id, key: qrKey };
|
|
284
|
+
}
|
|
285
|
+
async verifySelectiveIntent(retrievalId, key, role = "full") {
|
|
286
|
+
if (!retrievalId) {
|
|
287
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
288
|
+
}
|
|
289
|
+
if (!key) {
|
|
290
|
+
throw new ValidPayError("invalid_argument", "key is required");
|
|
291
|
+
}
|
|
292
|
+
const data = await this.request("GET", `/v1/intent/${encodeURIComponent(retrievalId)}`, { auth: false });
|
|
293
|
+
if (data.status === "revoked" || !data.encrypted_payload) {
|
|
294
|
+
const reasonSuffix = data.revocation_reason ? `: ${data.revocation_reason}` : "";
|
|
295
|
+
throw new ValidPayError("intent_revoked", `Intent ${retrievalId} has been revoked${reasonSuffix}`, {
|
|
296
|
+
details: {
|
|
297
|
+
intent_id: data.intent_id,
|
|
298
|
+
status: data.status,
|
|
299
|
+
revoked_at: data.revoked_at,
|
|
300
|
+
revocation_reason: data.revocation_reason,
|
|
301
|
+
},
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
let masterKey = key;
|
|
305
|
+
if (data.split_key) {
|
|
306
|
+
const frag = await this.request("GET", `/v1/intent/${encodeURIComponent(retrievalId)}/fragment`, { auth: false });
|
|
307
|
+
if (frag?.error) {
|
|
308
|
+
throw new ValidPayError(frag.error, `Fragment retrieval failed: ${frag.error}`, {
|
|
309
|
+
details: frag,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
if (!frag?.fragment_b) {
|
|
313
|
+
throw new ValidPayError("missing_fragment", "Server did not return key fragment", {
|
|
314
|
+
details: frag,
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
masterKey = combineKeyShares(key, frag.fragment_b);
|
|
318
|
+
}
|
|
319
|
+
if (!data.encrypted_key_map) {
|
|
320
|
+
throw new ValidPayError("invalid_response", "Selective disclosure intent missing encrypted_key_map");
|
|
321
|
+
}
|
|
322
|
+
const keyMapJson = decrypt(data.encrypted_key_map, masterKey);
|
|
323
|
+
let keyMap;
|
|
324
|
+
try {
|
|
325
|
+
keyMap = JSON.parse(keyMapJson);
|
|
326
|
+
}
|
|
327
|
+
catch (cause) {
|
|
328
|
+
throw new ValidPayError("invalid_payload", "Decrypted key map is not valid JSON", {
|
|
329
|
+
cause,
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
if (!(role in keyMap)) {
|
|
333
|
+
const available = Object.keys(keyMap).sort().join(", ");
|
|
334
|
+
throw new ValidPayError("invalid_role", `Role '${role}' is not defined in this document's disclosure policy. Available roles: ${available}`);
|
|
335
|
+
}
|
|
336
|
+
const fieldKeys = keyMap[role];
|
|
337
|
+
let encryptedFields;
|
|
338
|
+
try {
|
|
339
|
+
encryptedFields = JSON.parse(data.encrypted_payload);
|
|
340
|
+
}
|
|
341
|
+
catch (cause) {
|
|
342
|
+
throw new ValidPayError("invalid_payload", "Encrypted payload is not a valid JSON envelope", { cause });
|
|
343
|
+
}
|
|
344
|
+
const payload = decryptFields(encryptedFields, fieldKeys);
|
|
345
|
+
let integrityVerified = false;
|
|
346
|
+
if (data.commitment_hash && role === "full") {
|
|
347
|
+
const allKeys = keyMap["full"] ?? {};
|
|
348
|
+
const fullPayload = decryptFields(encryptedFields, allKeys);
|
|
349
|
+
const actual = commitmentHash(JSON.stringify(fullPayload));
|
|
350
|
+
if (actual !== data.commitment_hash) {
|
|
351
|
+
throw new ValidPayError("integrity_failure", "INTEGRITY VERIFICATION FAILED — the decrypted payload does not match the commitment hash stored at issuance.");
|
|
352
|
+
}
|
|
353
|
+
integrityVerified = true;
|
|
354
|
+
}
|
|
355
|
+
return buildVerifyResult(data, payload, integrityVerified);
|
|
356
|
+
}
|
|
357
|
+
// === Revocation (Patent H) ===
|
|
358
|
+
async revokeIntent(retrievalId, reason) {
|
|
359
|
+
if (!retrievalId) {
|
|
360
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
361
|
+
}
|
|
362
|
+
const data = await this.request("PATCH", `/v1/intent/${encodeURIComponent(retrievalId)}/revoke`, { body: reason ? { reason } : {}, auth: true });
|
|
363
|
+
return {
|
|
364
|
+
intentId: data?.intent_id ?? retrievalId,
|
|
365
|
+
status: data?.status ?? "revoked",
|
|
366
|
+
revokedAt: data?.revoked_at,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
async reinstateIntent(retrievalId, reason) {
|
|
370
|
+
if (!retrievalId) {
|
|
371
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
372
|
+
}
|
|
373
|
+
const data = await this.request("PATCH", `/v1/intent/${encodeURIComponent(retrievalId)}/reinstate`, { body: reason ? { reason } : {}, auth: true });
|
|
374
|
+
return {
|
|
375
|
+
intentId: data?.intent_id ?? retrievalId,
|
|
376
|
+
status: data?.status ?? "active",
|
|
377
|
+
reinstatedAt: data?.reinstated_at,
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
async getRevocationHistory(retrievalId) {
|
|
381
|
+
if (!retrievalId) {
|
|
382
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
383
|
+
}
|
|
384
|
+
const data = await this.request("GET", `/v1/intent/${encodeURIComponent(retrievalId)}/revocations`, { auth: true });
|
|
385
|
+
if (!Array.isArray(data?.events))
|
|
386
|
+
return [];
|
|
387
|
+
return data.events.map((e) => ({
|
|
388
|
+
id: e.id,
|
|
389
|
+
action: e.action,
|
|
390
|
+
reason: e.reason,
|
|
391
|
+
performedAt: e.performed_at,
|
|
392
|
+
}));
|
|
393
|
+
}
|
|
394
|
+
// === Audit / list (Prompt 080) ===
|
|
395
|
+
/**
|
|
396
|
+
* List the intents this API key has created. Returns metadata only —
|
|
397
|
+
* the AES payload + key are NEVER part of the response, by design.
|
|
398
|
+
* Use this for audit, reconciliation, and "did this intent get
|
|
399
|
+
* scanned?" dashboards.
|
|
400
|
+
*/
|
|
401
|
+
async listIntents(params = {}) {
|
|
402
|
+
const qs = new URLSearchParams();
|
|
403
|
+
if (params.limit !== undefined)
|
|
404
|
+
qs.set("limit", String(params.limit));
|
|
405
|
+
if (params.offset !== undefined)
|
|
406
|
+
qs.set("offset", String(params.offset));
|
|
407
|
+
if (params.since !== undefined)
|
|
408
|
+
qs.set("since", params.since);
|
|
409
|
+
if (params.until !== undefined)
|
|
410
|
+
qs.set("until", params.until);
|
|
411
|
+
if (params.status !== undefined)
|
|
412
|
+
qs.set("status", params.status);
|
|
413
|
+
if (params.documentType !== undefined)
|
|
414
|
+
qs.set("document_type", params.documentType);
|
|
415
|
+
if (params.order !== undefined)
|
|
416
|
+
qs.set("order", params.order);
|
|
417
|
+
const path = qs.size > 0 ? `/v1/intents?${qs.toString()}` : "/v1/intents";
|
|
418
|
+
const data = await this.request("GET", path, { auth: true });
|
|
419
|
+
return {
|
|
420
|
+
intents: (data?.intents ?? []).map(mapMetadata),
|
|
421
|
+
total: data?.total ?? 0,
|
|
422
|
+
limit: data?.limit ?? params.limit ?? 50,
|
|
423
|
+
offset: data?.offset ?? params.offset ?? 0,
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Fetch metadata for a single intent. Distinct from `verifyIntent` —
|
|
428
|
+
* this endpoint never returns ciphertext or key material, so it's
|
|
429
|
+
* safe to call from any service that just needs status / verification
|
|
430
|
+
* counts / revocation state.
|
|
431
|
+
*/
|
|
432
|
+
async getIntent(retrievalId) {
|
|
433
|
+
if (!retrievalId) {
|
|
434
|
+
throw new ValidPayError("invalid_argument", "retrievalId is required");
|
|
435
|
+
}
|
|
436
|
+
const data = await this.request("GET", `/v1/intents/${encodeURIComponent(retrievalId)}`, { auth: true });
|
|
437
|
+
return mapMetadata(data);
|
|
438
|
+
}
|
|
439
|
+
// === Health ===
|
|
440
|
+
async health() {
|
|
441
|
+
return this.request("GET", "/health", {
|
|
442
|
+
auth: false,
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
// === HTTP ===
|
|
446
|
+
async request(method, path, opts) {
|
|
447
|
+
const url = `${this.baseUrl}${path}`;
|
|
448
|
+
const headers = { Accept: "application/json" };
|
|
449
|
+
if (opts.auth)
|
|
450
|
+
headers["Authorization"] = `Bearer ${this.apiKey}`;
|
|
451
|
+
if (opts.body !== undefined)
|
|
452
|
+
headers["Content-Type"] = "application/json";
|
|
453
|
+
const controller = new AbortController();
|
|
454
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
455
|
+
let response;
|
|
456
|
+
try {
|
|
457
|
+
response = await this.fetchImpl(url, {
|
|
458
|
+
method,
|
|
459
|
+
headers,
|
|
460
|
+
body: opts.body !== undefined ? JSON.stringify(opts.body) : undefined,
|
|
461
|
+
signal: controller.signal,
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
catch (cause) {
|
|
465
|
+
throw new ValidPayError("network_error", `Request to ${url} failed`, { cause });
|
|
466
|
+
}
|
|
467
|
+
finally {
|
|
468
|
+
clearTimeout(timer);
|
|
469
|
+
}
|
|
470
|
+
const text = await response.text();
|
|
471
|
+
let json = undefined;
|
|
472
|
+
if (text) {
|
|
473
|
+
try {
|
|
474
|
+
json = JSON.parse(text);
|
|
475
|
+
}
|
|
476
|
+
catch {
|
|
477
|
+
// leave undefined
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
if (!response.ok) {
|
|
481
|
+
const errBody = (json ?? text);
|
|
482
|
+
const code = typeof errBody === "object" && errBody && typeof errBody.error === "string"
|
|
483
|
+
? errBody.error
|
|
484
|
+
: "http_error";
|
|
485
|
+
throw new ValidPayError(code, `ValidPay API ${method} ${path} failed: ${response.status}`, { status: response.status, details: errBody });
|
|
486
|
+
}
|
|
487
|
+
return json;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
// === Helpers ===
|
|
491
|
+
function checkCommitment(expected, plaintext) {
|
|
492
|
+
if (!expected)
|
|
493
|
+
return false;
|
|
494
|
+
const actual = commitmentHash(plaintext);
|
|
495
|
+
if (actual !== expected) {
|
|
496
|
+
throw new ValidPayError("integrity_failure", "INTEGRITY VERIFICATION FAILED — the decrypted payload does not match the commitment hash stored at issuance.");
|
|
497
|
+
}
|
|
498
|
+
return true;
|
|
499
|
+
}
|
|
500
|
+
function computeTimeLockStatus(validFrom, validUntil) {
|
|
501
|
+
if (!validFrom && !validUntil)
|
|
502
|
+
return null;
|
|
503
|
+
const now = Date.now();
|
|
504
|
+
if (validFrom) {
|
|
505
|
+
const t = Date.parse(validFrom);
|
|
506
|
+
if (!Number.isNaN(t) && now < t)
|
|
507
|
+
return "not_yet_valid";
|
|
508
|
+
}
|
|
509
|
+
if (validUntil) {
|
|
510
|
+
const t = Date.parse(validUntil);
|
|
511
|
+
if (!Number.isNaN(t) && now > t)
|
|
512
|
+
return "expired";
|
|
513
|
+
}
|
|
514
|
+
return "valid";
|
|
515
|
+
}
|
|
516
|
+
function validateTimeLock(validFrom, validUntil) {
|
|
517
|
+
if (validFrom !== undefined && Number.isNaN(Date.parse(validFrom))) {
|
|
518
|
+
throw new ValidPayError("invalid_argument", `validFrom is not a valid ISO-8601: ${validFrom}`);
|
|
519
|
+
}
|
|
520
|
+
if (validUntil !== undefined && Number.isNaN(Date.parse(validUntil))) {
|
|
521
|
+
throw new ValidPayError("invalid_argument", `validUntil is not a valid ISO-8601: ${validUntil}`);
|
|
522
|
+
}
|
|
523
|
+
if (validFrom !== undefined && validUntil !== undefined) {
|
|
524
|
+
if (Date.parse(validFrom) >= Date.parse(validUntil)) {
|
|
525
|
+
throw new ValidPayError("invalid_argument", "validFrom must be before validUntil");
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
function buildVerifyResult(data, payload, integrityVerified) {
|
|
530
|
+
return {
|
|
531
|
+
intentId: data.intent_id,
|
|
532
|
+
payload,
|
|
533
|
+
issuer: data.issuer,
|
|
534
|
+
issuerVerified: data.issuer_verified,
|
|
535
|
+
registeredAt: data.registered_at,
|
|
536
|
+
status: data.status,
|
|
537
|
+
integrityVerified,
|
|
538
|
+
validFrom: data.valid_from ?? null,
|
|
539
|
+
validUntil: data.valid_until ?? null,
|
|
540
|
+
timeLockStatus: computeTimeLockStatus(data.valid_from, data.valid_until),
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
function mapMetadata(raw) {
|
|
544
|
+
return {
|
|
545
|
+
retrievalId: raw.retrieval_id,
|
|
546
|
+
documentType: raw.document_type,
|
|
547
|
+
status: raw.status,
|
|
548
|
+
createdAt: raw.created_at,
|
|
549
|
+
revokedAt: raw.revoked_at,
|
|
550
|
+
revocationReason: raw.revocation_reason,
|
|
551
|
+
validFrom: raw.valid_from,
|
|
552
|
+
validUntil: raw.valid_until,
|
|
553
|
+
commitmentHash: raw.commitment_hash,
|
|
554
|
+
splitKey: raw.split_key,
|
|
555
|
+
selectiveDisclosure: raw.selective_disclosure,
|
|
556
|
+
verificationCount: raw.verification_count,
|
|
557
|
+
lastVerifiedAt: raw.last_verified_at,
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/crypto.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire format (matches the Python SDK so blobs are interoperable):
|
|
3
|
+
* base64(iv[12] || authTag[16] || ciphertext)
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateKey(): string;
|
|
6
|
+
export declare function encrypt(plaintext: string, key: string): string;
|
|
7
|
+
export declare function decrypt(blob: string, key: string): string;
|
|
8
|
+
export declare function commitmentHash(plaintext: string): string;
|
|
9
|
+
export declare function splitKey(key: string): [string, string];
|
|
10
|
+
export declare function combineKeyShares(shareA: string, shareB: string): string;
|
|
11
|
+
/** Encrypt each field of payload with its own AES key (Selective Disclosure). */
|
|
12
|
+
export declare function encryptFields(payload: Record<string, unknown>): {
|
|
13
|
+
encryptedFields: Record<string, string>;
|
|
14
|
+
fieldKeys: Record<string, string>;
|
|
15
|
+
};
|
|
16
|
+
/** Build per-role key map; "full" role always added with all keys. */
|
|
17
|
+
export declare function buildKeyMap(fieldKeys: Record<string, string>, disclosurePolicy: Record<string, string[]>): Record<string, Record<string, string>>;
|
|
18
|
+
/** Decrypt only fields with keys; others become "[REDACTED]". */
|
|
19
|
+
export declare function decryptFields(encryptedFields: Record<string, string>, fieldKeys: Record<string, string>): Record<string, unknown>;
|
|
20
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAQA;;;GAGG;AAEH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAkBD,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAO9D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAkCzD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAQtD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAQvE;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B;IAAE,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAUhF;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACzC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWxC;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAC3B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezB"}
|