@northstartech/cipher 0.0.0-stage → 1.0.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.
Files changed (41) hide show
  1. package/README.md +541 -2
  2. package/dist/client.d.ts +237 -0
  3. package/dist/client.js +555 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/crypto.d.ts +72 -0
  6. package/dist/crypto.js +244 -0
  7. package/dist/crypto.js.map +1 -0
  8. package/dist/encoding.d.ts +17 -0
  9. package/dist/encoding.js +79 -0
  10. package/dist/encoding.js.map +1 -0
  11. package/dist/errors.d.ts +14 -0
  12. package/dist/errors.js +22 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.js +6 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/integrations/drizzle.d.ts +96 -0
  18. package/dist/integrations/drizzle.js +285 -0
  19. package/dist/integrations/drizzle.js.map +1 -0
  20. package/dist/integrations/mongoose.d.ts +72 -0
  21. package/dist/integrations/mongoose.js +582 -0
  22. package/dist/integrations/mongoose.js.map +1 -0
  23. package/dist/integrations/prisma.d.ts +65 -0
  24. package/dist/integrations/prisma.js +588 -0
  25. package/dist/integrations/prisma.js.map +1 -0
  26. package/dist/integrations/sequelize.d.ts +62 -0
  27. package/dist/integrations/sequelize.js +677 -0
  28. package/dist/integrations/sequelize.js.map +1 -0
  29. package/dist/integrations/shared.d.ts +268 -0
  30. package/dist/integrations/shared.js +513 -0
  31. package/dist/integrations/shared.js.map +1 -0
  32. package/dist/integrations/typeorm.d.ts +109 -0
  33. package/dist/integrations/typeorm.js +457 -0
  34. package/dist/integrations/typeorm.js.map +1 -0
  35. package/dist/object.d.ts +53 -0
  36. package/dist/object.js +226 -0
  37. package/dist/object.js.map +1 -0
  38. package/dist/search.d.ts +250 -0
  39. package/dist/search.js +258 -0
  40. package/dist/search.js.map +1 -0
  41. package/package.json +101 -4
package/dist/client.js ADDED
@@ -0,0 +1,555 @@
1
+ import { establishSession, open, parseCredential, peekJws, requestAad, responseAad, seal, sessionIdFor, signJws, verifyJws, } from './crypto.js';
2
+ import { b64u, fromUtf8, randomBytes, unb64u, utf8 } from './encoding.js';
3
+ import { CipherError, errorFromBody } from './errors.js';
4
+ import { EncryptedObject, invalidObject, openObject, sealObject } from './object.js';
5
+ import { SearchIndex, indexInfo } from './search.js';
6
+ const now = () => Math.floor(Date.now() / 1000);
7
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
8
+ function snake(k) {
9
+ return k.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);
10
+ }
11
+ /** Normalize a context: camelCase → snake_case keys, values to strings, drop undefined. */
12
+ export function wireContext(ctx) {
13
+ if (!ctx || typeof ctx !== 'object')
14
+ throw new CipherError('INVALID_CONTEXT', 'context is required');
15
+ const out = {};
16
+ for (const [k, v] of Object.entries(ctx)) {
17
+ if (v === undefined || v === null)
18
+ continue;
19
+ out[snake(k)] = String(v);
20
+ }
21
+ if (!out.collection || !out.field)
22
+ throw new CipherError('INVALID_CONTEXT', 'context requires collection and field');
23
+ return out;
24
+ }
25
+ function toBytes(p) {
26
+ return typeof p === 'string' ? utf8(p) : p;
27
+ }
28
+ /**
29
+ * Northstar Cipher client. Create one per process and share it.
30
+ *
31
+ * ```ts
32
+ * const cipher = new NorthstarCipher({ endpoint: process.env.NORTHSTAR_CIPHER_ENDPOINT, credential: process.env.NORTHSTAR_CIPHER_CREDENTIAL! })
33
+ * const { ciphertext } = await cipher.encrypt({ plaintext: 'G12345678', context: { collection: 'citizens', field: 'passport', recordId: '123' } })
34
+ * ```
35
+ */
36
+ export class NorthstarCipher {
37
+ endpoint;
38
+ keyId;
39
+ opts;
40
+ fetchImpl;
41
+ credential;
42
+ token;
43
+ tokenInFlight;
44
+ sessionValue;
45
+ sessionInFlight;
46
+ trustCache = new Map();
47
+ encryptQueue = [];
48
+ decryptQueue = [];
49
+ flushScheduled = false;
50
+ warnedBatch = false;
51
+ constructor(opts) {
52
+ if (!opts?.credential)
53
+ throw new CipherError('CONFIGURATION_ERROR', 'credential is required (NORTHSTAR_CIPHER_CREDENTIAL)');
54
+ this.opts = opts;
55
+ this.endpoint = (opts.endpoint ?? 'https://api.northstar.mx').replace(/\/+$/, '');
56
+ this.keyId = opts.keyId ?? 'default';
57
+ this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);
58
+ }
59
+ /** Create a client from `NORTHSTAR_CIPHER_*` environment variables (Node.js). */
60
+ static fromEnv(overrides = {}) {
61
+ const env = globalThis.process?.env ?? {};
62
+ return new NorthstarCipher({
63
+ endpoint: env.NORTHSTAR_CIPHER_ENDPOINT,
64
+ credential: env.NORTHSTAR_CIPHER_CREDENTIAL ?? '',
65
+ keyId: env.NORTHSTAR_CIPHER_KEY,
66
+ attestation: env.NORTHSTAR_CIPHER_ATTESTATION ?? 'auto',
67
+ trustAnchors: env.NORTHSTAR_CIPHER_TRUST_ANCHOR?.split(',').map((s) => s.trim()).filter(Boolean),
68
+ ...overrides,
69
+ });
70
+ }
71
+ cred() {
72
+ this.credential ??= parseCredential(this.opts.credential);
73
+ return this.credential;
74
+ }
75
+ async policy() {
76
+ const a = this.opts.attestation ?? 'auto';
77
+ if (a !== 'auto')
78
+ return a;
79
+ return (await this.cred()).env;
80
+ }
81
+ wire(e) {
82
+ try {
83
+ this.opts.debug?.onWire?.(e);
84
+ }
85
+ catch {
86
+ /* diagnostics must never break requests */
87
+ }
88
+ }
89
+ async http(path, init) {
90
+ const ctrl = new AbortController();
91
+ const t = setTimeout(() => ctrl.abort(), this.opts.timeoutMs ?? 30_000);
92
+ const body = JSON.stringify(init.body);
93
+ this.wire({ direction: 'request', method: 'POST', path, body });
94
+ try {
95
+ const res = await this.fetchImpl(this.endpoint + path, {
96
+ method: 'POST',
97
+ headers: { 'content-type': 'application/json', ...(init.bearer ? { authorization: `Bearer ${init.bearer}` } : {}) },
98
+ body,
99
+ signal: ctrl.signal,
100
+ });
101
+ const text = await res.text();
102
+ this.wire({ direction: 'response', method: 'POST', path, status: res.status, body: text });
103
+ let json = null;
104
+ try {
105
+ json = text ? JSON.parse(text) : null;
106
+ }
107
+ catch {
108
+ /* non-JSON error page */
109
+ }
110
+ return { status: res.status, json, text };
111
+ }
112
+ catch (e) {
113
+ throw new CipherError('NETWORK_ERROR', `could not reach Northstar Cipher at ${this.endpoint} (${e.message})`, { retryable: true });
114
+ }
115
+ finally {
116
+ clearTimeout(t);
117
+ }
118
+ }
119
+ async plain(path, body, bearer) {
120
+ const r = await this.http(path, { body, bearer });
121
+ if (r.status < 200 || r.status >= 300)
122
+ throw errorFromBody(r.status, r.json);
123
+ return r.json;
124
+ }
125
+ async getToken() {
126
+ if (this.token && this.token.expiresAt > now() + 30)
127
+ return this.token;
128
+ this.tokenInFlight ??= (async () => {
129
+ try {
130
+ const c = await this.cred();
131
+ const t = now();
132
+ const assertion = await signJws('nsc-assertion+jwt', c.id, { iss: c.id, sub: c.id, aud: 'northstar-cipher', iat: t, exp: t + 60, jti: b64u(randomBytes(16)) }, c.key);
133
+ const r = await this.plain('/v1/auth/token', { grant_type: 'client_assertion', assertion });
134
+ this.token = { value: r.access_token, expiresAt: now() + r.expires_in, scopes: r.scopes };
135
+ return this.token;
136
+ }
137
+ finally {
138
+ this.tokenInFlight = undefined;
139
+ }
140
+ })();
141
+ return this.tokenInFlight;
142
+ }
143
+ async verifierKey(kid) {
144
+ const cached = this.trustCache.get(kid);
145
+ if (cached)
146
+ return cached;
147
+ for (const a of this.opts.trustAnchors ?? []) {
148
+ const [k, pk] = a.split(':');
149
+ if (k === kid && pk) {
150
+ const key = unb64u(pk);
151
+ this.trustCache.set(kid, key);
152
+ return key;
153
+ }
154
+ }
155
+ if ((await this.policy()) === 'development' && !(this.opts.trustAnchors?.length)) {
156
+ const res = await this.fetchImpl(`${this.endpoint}/v1/attestation/trust`);
157
+ const t = (await res.json());
158
+ const k = t.keys?.find((x) => x.kid === kid);
159
+ if (k) {
160
+ console.warn('[northstar-cipher] development attestation: trusting the verifier key served by the gateway (trust on first use)');
161
+ const key = unb64u(k.public_key);
162
+ this.trustCache.set(kid, key);
163
+ return key;
164
+ }
165
+ }
166
+ throw new CipherError('ATTESTATION_FAILED', `attestation signed by an untrusted verifier key (${kid}); configure trustAnchors`);
167
+ }
168
+ async getSession() {
169
+ if (this.sessionValue && this.sessionValue.details.expiresAt.getTime() / 1000 > now() + 120)
170
+ return this.sessionValue;
171
+ this.sessionInFlight ??= (async () => {
172
+ try {
173
+ const policy = await this.policy();
174
+ if (policy === 'production' && !(this.opts.trustAnchors?.length)) {
175
+ throw new CipherError('CONFIGURATION_ERROR', 'production attestation requires pinned trustAnchors (NORTHSTAR_CIPHER_TRUST_ANCHOR)');
176
+ }
177
+ const token = await this.getToken();
178
+ const nonce = randomBytes(32);
179
+ const nonceB64 = b64u(nonce);
180
+ const ev = await this.plain('/v1/attestation/evidence', { nonce: nonceB64 }, token.value);
181
+ const { header } = peekJws(ev.attestation_token);
182
+ const claims = await verifyJws(ev.attestation_token, 'nsc-attestation+jwt', await this.verifierKey(header.kid));
183
+ const fail = (m) => {
184
+ throw new CipherError('ATTESTATION_FAILED', m);
185
+ };
186
+ if (claims.iss !== 'nsc-attestation-verifier' || claims.aud !== 'nsc-client')
187
+ fail('attestation token issuer/audience mismatch');
188
+ const t = now();
189
+ if (t + 60 < Number(claims.iat) || t > Number(claims.exp))
190
+ fail('attestation token is not fresh');
191
+ if (claims.nonce !== nonceB64)
192
+ fail('attestation nonce mismatch (stale or replayed evidence)');
193
+ if (claims.sub !== ev.instance_id)
194
+ fail('attestation is for a different enclave instance');
195
+ if (claims.session_pk !== ev.session_public_key)
196
+ fail('enclave session key is not bound to the attestation');
197
+ if (policy === 'production' && (claims.platform !== 'sev-snp' || claims.mode !== 'production')) {
198
+ fail(`production policy requires SEV-SNP attestation (got platform=${String(claims.platform)}, mode=${String(claims.mode)})`);
199
+ }
200
+ if (policy === 'development' && claims.platform !== 'simulated' && claims.platform !== 'sev-snp')
201
+ fail('unknown attestation platform');
202
+ const allowed = this.opts.allowedMeasurements ?? [];
203
+ if (allowed.length && !allowed.some((m) => m.toLowerCase() === String(claims.measurement).toLowerCase()))
204
+ fail('enclave measurement is not in the allowed list');
205
+ const { enc, keys } = await establishSession(unb64u(ev.session_public_key), ev.instance_id, nonce);
206
+ const r = await this.plain('/v1/sessions', { instance_id: ev.instance_id, nonce: nonceB64, enc: b64u(enc) }, token.value);
207
+ if (r.session_id !== sessionIdFor(ev.instance_id, keys.sid))
208
+ fail('enclave failed session key confirmation');
209
+ if (claims.platform === 'simulated')
210
+ console.warn('[northstar-cipher] connected to a SIMULATED enclave: local development only, no hardware isolation');
211
+ this.sessionValue = {
212
+ keys,
213
+ details: {
214
+ instanceId: ev.instance_id,
215
+ platform: claims.platform,
216
+ measurement: String(claims.measurement),
217
+ sessionId: r.session_id,
218
+ expiresAt: new Date(Math.min(r.expires_at, now() + 3600) * 1000),
219
+ scopes: token.scopes,
220
+ },
221
+ };
222
+ return this.sessionValue;
223
+ }
224
+ finally {
225
+ this.sessionInFlight = undefined;
226
+ }
227
+ })();
228
+ return this.sessionInFlight;
229
+ }
230
+ async callOnce(path, payload) {
231
+ const token = await this.getToken();
232
+ const s = await this.getSession();
233
+ const ts = Date.now();
234
+ const plain = utf8(JSON.stringify(payload));
235
+ const { nonce, ciphertext } = await seal(s.keys.c2s, requestAad(s.details.sessionId, 'POST', path, ts), plain);
236
+ plain.fill(0);
237
+ const r = await this.http(path, { body: { session_id: s.details.sessionId, nonce: b64u(nonce), timestamp: ts, ciphertext: b64u(ciphertext) }, bearer: token.value });
238
+ const sealed = r.json;
239
+ if (!sealed?.nonce || !sealed.ciphertext)
240
+ throw errorFromBody(r.status, r.json);
241
+ const opened = await open(s.keys.s2c, unb64u(sealed.nonce), responseAad(s.details.sessionId, nonce, r.status), unb64u(sealed.ciphertext));
242
+ const body = JSON.parse(fromUtf8(opened));
243
+ opened.fill(0);
244
+ if (r.status < 200 || r.status >= 300)
245
+ throw errorFromBody(r.status, body);
246
+ return body;
247
+ }
248
+ async call(path, payload) {
249
+ const max = this.opts.maxRetries ?? 2;
250
+ for (let attempt = 0;; attempt++) {
251
+ try {
252
+ return await this.callOnce(path, payload);
253
+ }
254
+ catch (e) {
255
+ const err = e instanceof CipherError ? e : new CipherError('INTERNAL', e.message);
256
+ const authRetry = err.code === 'AUTHENTICATION_FAILED' && attempt === 0;
257
+ if (attempt >= max || !(err.retryable || authRetry))
258
+ throw err;
259
+ if (err.code === 'SESSION_EXPIRED' || err.code === 'NETWORK_ERROR')
260
+ this.sessionValue = undefined;
261
+ else if (err.code === 'AUTHENTICATION_FAILED') {
262
+ this.token = undefined;
263
+ this.sessionValue = undefined;
264
+ }
265
+ else
266
+ await sleep(200 * 2 ** attempt);
267
+ }
268
+ }
269
+ }
270
+ // ---------------------------------------------------------------- batching
271
+ get batchMax() {
272
+ const b = this.opts.batching;
273
+ return typeof b === 'object' && b.maxItems ? Math.min(b.maxItems, 1000) : 1000;
274
+ }
275
+ schedule() {
276
+ if (this.flushScheduled)
277
+ return;
278
+ this.flushScheduled = true;
279
+ // Collect every call made in the current tick (e.g. a `rows.map(...)`).
280
+ setTimeout(() => {
281
+ this.flushScheduled = false;
282
+ void this.flush();
283
+ }, 0);
284
+ }
285
+ async flush() {
286
+ const enc = this.encryptQueue.splice(0);
287
+ const dec = this.decryptQueue.splice(0);
288
+ for (let i = 0; i < enc.length; i += this.batchMax)
289
+ void this.runEncrypt(enc.slice(i, i + this.batchMax));
290
+ const byPurpose = new Map();
291
+ for (const p of dec) {
292
+ const k = p.item.purpose ?? '';
293
+ byPurpose.set(k, [...(byPurpose.get(k) ?? []), p]);
294
+ }
295
+ for (const group of byPurpose.values()) {
296
+ for (let i = 0; i < group.length; i += this.batchMax)
297
+ void this.runDecrypt(group.slice(i, i + this.batchMax));
298
+ }
299
+ }
300
+ async runEncrypt(batch) {
301
+ try {
302
+ const results = await this.encryptManySettled(batch.map((b) => b.item));
303
+ results.forEach((r, i) => (r.ok ? batch[i].resolve(r.value) : batch[i].reject(r.error)));
304
+ }
305
+ catch (e) {
306
+ batch.forEach((b) => b.reject(e));
307
+ }
308
+ }
309
+ async runDecrypt(batch) {
310
+ try {
311
+ const results = await this.decryptManySettled(batch.map((b) => b.item), { purpose: batch[0]?.item.purpose });
312
+ results.forEach((r, i) => (r.ok ? batch[i].resolve(r.value) : batch[i].reject(r.error)));
313
+ }
314
+ catch (e) {
315
+ batch.forEach((b) => b.reject(e));
316
+ }
317
+ }
318
+ batchingEnabled() {
319
+ return this.opts.batching !== false;
320
+ }
321
+ // --------------------------------------------------------------- public API
322
+ /** Encrypt one value. Concurrent calls are coalesced into batch requests. */
323
+ encrypt(input) {
324
+ if (!this.batchingEnabled() || input.index)
325
+ return this.encryptDirect(input);
326
+ return new Promise((resolve, reject) => {
327
+ this.encryptQueue.push({ item: input, resolve, reject });
328
+ if (this.encryptQueue.length >= this.batchMax)
329
+ void this.flush();
330
+ else
331
+ this.schedule();
332
+ });
333
+ }
334
+ async encryptDirect(input) {
335
+ const r = await this.call('/v1/encrypt', this.encryptItem(input, true));
336
+ return { ciphertext: r.ciphertext, keyId: r.key_id, keyVersion: r.key_version, ...(r.index ? { index: r.index } : {}) };
337
+ }
338
+ encryptItem(input, withKey) {
339
+ return {
340
+ ...(withKey || input.keyId ? { key: input.keyId ?? this.keyId } : {}),
341
+ plaintext: b64u(toBytes(input.plaintext)),
342
+ context: wireContext(input.context),
343
+ ...(input.index ? { index: typeof input.index === 'object' && input.index.normalization ? { normalization: input.index.normalization } : {} } : {}),
344
+ };
345
+ }
346
+ /** Decrypt one value. Concurrent calls are coalesced into batch requests when permitted. */
347
+ decrypt(input) {
348
+ if (!this.batchingEnabled())
349
+ return this.decryptDirect(input);
350
+ return new Promise((resolve, reject) => {
351
+ this.decryptQueue.push({ item: input, resolve, reject });
352
+ if (this.decryptQueue.length >= this.batchMax)
353
+ void this.flush();
354
+ else
355
+ this.schedule();
356
+ });
357
+ }
358
+ async decryptDirect(input) {
359
+ const { bytes, keyId, keyVersion } = await this.decryptBytes(input);
360
+ return { plaintext: fromUtf8Lossy(bytes), bytes, keyId, keyVersion };
361
+ }
362
+ /** One `/v1/decrypt`, returning the plaintext as bytes only. */
363
+ async decryptBytes(input) {
364
+ const r = await this.call('/v1/decrypt', {
365
+ ciphertext: input.ciphertext,
366
+ context: wireContext(input.context),
367
+ ...(input.purpose ? { purpose: input.purpose } : {}),
368
+ });
369
+ return { bytes: unb64u(r.plaintext), keyId: r.key_id, keyVersion: r.key_version };
370
+ }
371
+ /**
372
+ * Encrypt an object of any size (protocol §13): a random 32-byte object key
373
+ * seals the bytes here (NSOB v1, AES-256-GCM blocks) and Cipher encrypts only
374
+ * that key for `context`, in one `/v1/encrypt`. The object never leaves this process.
375
+ *
376
+ * ```ts
377
+ * const context = { collection: 'documents', field: 'file_key', recordId: doc.id }
378
+ * const { wrappedKey, object } = await cipher.encryptObject({ plaintext: pdf, context })
379
+ * ```
380
+ */
381
+ async encryptObject(input) {
382
+ const objectKey = randomBytes(32);
383
+ try {
384
+ const object = await sealObject(objectKey, randomBytes(16), input.context, input.plaintext, input.blockLog2);
385
+ const wrapped = await this.encryptDirect({ plaintext: objectKey, context: input.context, keyId: input.keyId });
386
+ return new EncryptedObject(wrapped.ciphertext, object, wrapped.keyId, wrapped.keyVersion);
387
+ }
388
+ finally {
389
+ objectKey.fill(0);
390
+ }
391
+ }
392
+ /**
393
+ * Decrypt an object sealed by `encryptObject()`: Cipher decrypts its key for
394
+ * `context` in one `/v1/decrypt` (policy, purpose and audit as for any decrypt),
395
+ * then the bytes are opened here. Any tampering raises `INVALID_CIPHERTEXT`.
396
+ */
397
+ async decryptObject(input) {
398
+ const { bytes: objectKey } = await this.decryptBytes({ ciphertext: input.wrappedKey, context: input.context, purpose: input.purpose });
399
+ try {
400
+ // Another value's ciphertext, not a 32-byte object key: a wrong key, so the uniform error (§13.3).
401
+ if (objectKey.length !== 32)
402
+ throw invalidObject();
403
+ return await openObject(objectKey, input.context, input.object);
404
+ }
405
+ finally {
406
+ objectKey.fill(0);
407
+ }
408
+ }
409
+ /** Encrypt many values; throws the first item error. */
410
+ async encryptMany(items) {
411
+ return unwrapSettled(await this.encryptManySettled(items));
412
+ }
413
+ /** Encrypt many values, reporting per-item outcomes. */
414
+ async encryptManySettled(items) {
415
+ const out = [];
416
+ for (let i = 0; i < items.length; i += 1000) {
417
+ const chunk = items.slice(i, i + 1000);
418
+ const r = await this.call('/v1/encrypt/batch', { key: this.keyId, items: chunk.map((x) => this.encryptItem(x, false)) });
419
+ for (const x of r.results) {
420
+ out.push('error' in x ? { ok: false, error: new CipherError(x.error.code, x.error.message) } : { ok: true, value: { ciphertext: x.ciphertext, keyId: x.key_id, keyVersion: x.key_version, ...(x.index ? { index: x.index } : {}) } });
421
+ }
422
+ }
423
+ return out;
424
+ }
425
+ /** Decrypt many values; throws the first item error. */
426
+ async decryptMany(items, opts = {}) {
427
+ return unwrapSettled(await this.decryptManySettled(items, opts));
428
+ }
429
+ /**
430
+ * Decrypt many values, reporting per-item outcomes. Uses `/v1/decrypt/batch`
431
+ * when the credential holds `cipher.decrypt.batch`; otherwise falls back to
432
+ * individual requests (bounded concurrency).
433
+ */
434
+ async decryptManySettled(items, opts = {}) {
435
+ if (!items.length)
436
+ return [];
437
+ const token = await this.getToken();
438
+ if (!token.scopes.includes('cipher.decrypt.batch')) {
439
+ if (!this.warnedBatch && items.length > 1) {
440
+ this.warnedBatch = true;
441
+ console.warn('[northstar-cipher] this credential lacks cipher.decrypt.batch; decrypting items individually. Enable "Batch decrypt" in the console for list views.');
442
+ }
443
+ return mapLimit(items, 8, async (it) => {
444
+ try {
445
+ return { ok: true, value: await this.decryptDirect({ ...it, purpose: it.purpose ?? opts.purpose }) };
446
+ }
447
+ catch (e) {
448
+ return { ok: false, error: e };
449
+ }
450
+ });
451
+ }
452
+ const out = [];
453
+ for (let i = 0; i < items.length; i += 1000) {
454
+ const chunk = items.slice(i, i + 1000);
455
+ const r = await this.call('/v1/decrypt/batch', { ...(opts.purpose ? { purpose: opts.purpose } : {}), items: chunk.map((x) => ({ ciphertext: x.ciphertext, context: wireContext(x.context) })) });
456
+ for (const x of r.results) {
457
+ if ('error' in x)
458
+ out.push({ ok: false, error: new CipherError(x.error.code, x.error.message) });
459
+ else {
460
+ const bytes = unb64u(x.plaintext);
461
+ out.push({ ok: true, value: { plaintext: fromUtf8Lossy(bytes), bytes, keyId: x.key_id, keyVersion: x.key_version } });
462
+ }
463
+ }
464
+ }
465
+ return out;
466
+ }
467
+ /** Rewrap ciphertexts to the key's current version without exposing plaintext (`cipher.rewrap`). */
468
+ async rewrapMany(items, opts = {}) {
469
+ const out = [];
470
+ for (let i = 0; i < items.length; i += 1000) {
471
+ const r = await this.call('/v1/rewrap/batch', {
472
+ ...(opts.jobId ? { job_id: opts.jobId } : {}),
473
+ items: items.slice(i, i + 1000).map((x) => ({ ciphertext: x.ciphertext, context: wireContext(x.context) })),
474
+ });
475
+ for (const x of r.results)
476
+ out.push('error' in x ? { ok: false, error: new CipherError(x.error.code, x.error.message) } : { ok: true, value: { ciphertext: x.ciphertext, keyVersion: x.key_version, rewrapped: x.rewrapped } });
477
+ }
478
+ return out;
479
+ }
480
+ /** Compute blind indexes for existing ciphertext (backfill / reindex). */
481
+ async indexMany(items, opts = {}) {
482
+ const out = [];
483
+ for (let i = 0; i < items.length; i += 1000) {
484
+ const r = await this.call('/v1/indexes/batch', {
485
+ ...(opts.normalization ? { normalization: opts.normalization } : {}),
486
+ items: items.slice(i, i + 1000).map((x) => ({ ciphertext: x.ciphertext, context: wireContext(x.context) })),
487
+ });
488
+ for (const x of r.results)
489
+ out.push('error' in x ? { ok: false, error: new CipherError(x.error.code, x.error.message) } : { ok: true, value: x.index });
490
+ }
491
+ return out;
492
+ }
493
+ /**
494
+ * Exact-match search tokens. Returns one list per value: match a row when its
495
+ * stored blind index equals ANY token in the list (active + query-only index versions).
496
+ */
497
+ async searchTokens(input) {
498
+ const r = await this.call('/v1/indexes/token', {
499
+ ...(input.keyId ? { key: input.keyId } : {}),
500
+ collection: input.collection,
501
+ field: input.field,
502
+ ...(input.normalization ? { normalization: input.normalization } : {}),
503
+ values: input.values.map((v) => b64u(toBytes(v))),
504
+ });
505
+ return r.tokens;
506
+ }
507
+ /**
508
+ * A Northstar Search index (encrypted full-text search inside the enclave).
509
+ * Cheap: no request is made until a method of the index is called.
510
+ *
511
+ * ```ts
512
+ * const customers = cipher.index('customers')
513
+ * await customers.ensure({ language: 'spanish', fields: { name: 'text', city: 'keyword' } })
514
+ * await customers.upsert({ 42: { name: 'Ana García', city: 'CDMX' } })
515
+ * const { hits } = await customers.search({ q: 'ana garsia', filter: { city: 'CDMX' } })
516
+ * ```
517
+ */
518
+ index(name) {
519
+ return new SearchIndex({ call: (path, payload) => this.call(path, payload), keyId: this.keyId }, name);
520
+ }
521
+ /** Search indexes this credential may query or write. */
522
+ async searchIndexes() {
523
+ const r = await this.call('/v1/search/indexes/list', {});
524
+ return (r?.indexes ?? []).map(indexInfo);
525
+ }
526
+ /** Establish (or reuse) the attested session and describe it. */
527
+ async session() {
528
+ return { ...(await this.getSession()).details };
529
+ }
530
+ }
531
+ function fromUtf8Lossy(b) {
532
+ return new TextDecoder().decode(b);
533
+ }
534
+ function unwrapSettled(r) {
535
+ return r.map((x, i) => {
536
+ if (!x.ok) {
537
+ ;
538
+ x.error.index = i;
539
+ throw x.error;
540
+ }
541
+ return x.value;
542
+ });
543
+ }
544
+ async function mapLimit(items, limit, fn) {
545
+ const out = new Array(items.length);
546
+ let next = 0;
547
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, async () => {
548
+ while (next < items.length) {
549
+ const i = next++;
550
+ out[i] = await fn(items[i]);
551
+ }
552
+ }));
553
+ return out;
554
+ }
555
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}