@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
@@ -0,0 +1,582 @@
1
+ /**
2
+ * Mongoose (v9) schema plugin: transparent field-level encryption.
3
+ *
4
+ * ```ts
5
+ * import { northstarCipherPlugin } from '@northstartech/cipher/mongoose'
6
+ *
7
+ * const todoSchema = new Schema({ title: String, email: String })
8
+ * todoSchema.plugin(northstarCipherPlugin, { cipher, fields: ['title', { path: 'email', searchable: 'email' }] })
9
+ * const Todo = model('Todo', todoSchema)
10
+ *
11
+ * await Todo.create({ title: 'Buy milk', email: 'ana@example.com' })
12
+ * const todos = await Todo.find() // one decrypt request per query
13
+ * const mine = await Todo.find().cipherWhere('email', 'ANA@example.com') // exact match on email_bidx
14
+ * ```
15
+ *
16
+ * ObjectIds exist before the insert, so `_id` is the record id. Validation always
17
+ * sees plaintext; setters (`lowercase`, `trim`, …) apply to plaintext and never
18
+ * to ciphertext. See README "Mongoose".
19
+ *
20
+ * Northstar Search: `search: { index: cipher.index('todos'), fields: ['title', 'email', 'done'] }`
21
+ * keeps an index in sync on `save()`, `insertMany()`, `doc.deleteOne()` and
22
+ * `findOneAndDelete()` (encrypted paths are indexed from their stored ciphertext,
23
+ * which the enclave decrypts); `Todo.cipherSearchDocuments(docs)` builds documents for a (re)index.
24
+ */
25
+ import mongoose, {} from 'mongoose';
26
+ import { CipherError } from '../errors.js';
27
+ import { CIPHERTEXT_PREFIX, INDEX_SUFFIX, PENDING_SENTINEL, PlaintextLedger, applySearchChange, configError, decryptValues, encryptValues, normalizeFieldSpec, normalizeSearchSync, plaintextOf, recordIdOf, requestError, searchDocumentOf, searchTokensFor, } from './shared.js';
28
+ export { CIPHERTEXT_PREFIX, PENDING_SENTINEL } from './shared.js';
29
+ const ledger = new PlaintextLedger();
30
+ /** Ciphertext → plaintext for update queries in flight (update validators run without a document). */
31
+ const inflight = new Map();
32
+ const pendingWhere = new WeakMap();
33
+ const OVERRIDDEN = Symbol.for('northstar-cipher.mongoose.overridden');
34
+ /** `nsc:v1:` + base64url("NSC" ‖ 0x01 ‖ 0x0…): text form of a v1 envelope. */
35
+ const ENVELOPE_PREFIX = `${CIPHERTEXT_PREFIX}TlNDAQ`;
36
+ const QUERY_OPS = ['countDocuments', 'distinct', 'estimatedDocumentCount', 'find', 'findOne', 'findOneAndReplace', 'findOneAndUpdate', 'replaceOne', 'updateMany', 'updateOne', 'deleteMany', 'deleteOne', 'findOneAndDelete'];
37
+ const UPDATE_OPS = ['updateOne', 'updateMany', 'findOneAndUpdate', 'replaceOne', 'findOneAndReplace'];
38
+ const NULL_FILTER_OPS = new Set(['$eq', '$ne', '$exists', '$type']);
39
+ function isDocument(v) {
40
+ return !!v && typeof v === 'object' && typeof v.$__getValue === 'function';
41
+ }
42
+ function getPath(obj, path) {
43
+ let cur = obj;
44
+ for (const k of path.split('.')) {
45
+ if (!cur || typeof cur !== 'object')
46
+ return undefined;
47
+ cur = cur[k];
48
+ }
49
+ return cur;
50
+ }
51
+ function setPath(obj, path, v) {
52
+ const keys = path.split('.');
53
+ let cur = obj;
54
+ for (const k of keys.slice(0, -1)) {
55
+ if (!cur[k] || typeof cur[k] !== 'object')
56
+ cur[k] = {};
57
+ cur = cur[k];
58
+ }
59
+ cur[keys[keys.length - 1]] = v;
60
+ }
61
+ function readRaw(d, path) {
62
+ return isDocument(d) ? d.$__getValue(path) : getPath(d, path);
63
+ }
64
+ function writeRaw(d, path, v) {
65
+ if (isDocument(d))
66
+ d.$__setValue(path, v);
67
+ else
68
+ setPath(d, path, v);
69
+ }
70
+ function looksEncrypted(v) {
71
+ return typeof v === 'string' && (v.startsWith(ENVELOPE_PREFIX) || v === PENDING_SENTINEL);
72
+ }
73
+ function isOperatorObject(v) {
74
+ return !!v && typeof v === 'object' && !Array.isArray(v) && Object.keys(v).length > 0 && Object.keys(v).every((k) => k.startsWith('$'));
75
+ }
76
+ function parseFields(spec) {
77
+ if (Array.isArray(spec)) {
78
+ return spec.map((s) => {
79
+ if (typeof s === 'string')
80
+ return [s, true];
81
+ if (!s || typeof s !== 'object' || typeof s.path !== 'string')
82
+ throw configError('Mongoose: field entries are paths or { path, searchable? }');
83
+ const { path, ...rest } = s;
84
+ return [path, Object.keys(rest).length ? rest : true];
85
+ });
86
+ }
87
+ if (spec && typeof spec === 'object')
88
+ return Object.entries(spec);
89
+ throw configError('Mongoose: options.fields is required');
90
+ }
91
+ /** Validators see plaintext; setters never touch ciphertext. */
92
+ function overrideSchemaType(schema, path) {
93
+ const st = schema.path(path);
94
+ if (!st || st[OVERRIDDEN])
95
+ return;
96
+ const plain = (scope, v) => {
97
+ const r = scope && typeof scope === 'object' ? ledger.resolve(scope, path, v) : v;
98
+ return r === v && typeof v === 'string' && inflight.has(v) ? inflight.get(v) : r;
99
+ };
100
+ const doValidate = st.doValidate;
101
+ const doValidateSync = st.doValidateSync;
102
+ const applySetters = st.applySetters;
103
+ st.doValidate = function (v, scope, o) {
104
+ return doValidate.call(this, plain(scope, v), scope, o);
105
+ };
106
+ st.doValidateSync = function (v, scope, o) {
107
+ return doValidateSync.call(this, plain(scope, v), scope, o);
108
+ };
109
+ st.applySetters = function (v, scope, ...rest) {
110
+ return looksEncrypted(v) ? v : applySetters.call(this, v, scope, ...rest);
111
+ };
112
+ st[OVERRIDDEN] = true;
113
+ }
114
+ /** Filters on ciphertext never match: refuse them (null/existence checks are fine). */
115
+ function assertFilter(plan, filter) {
116
+ if (!filter || typeof filter !== 'object')
117
+ return;
118
+ for (const [k, v] of Object.entries(filter)) {
119
+ if (k === '$and' || k === '$or' || k === '$nor') {
120
+ for (const x of Array.isArray(v) ? v : [v])
121
+ assertFilter(plan, x);
122
+ continue;
123
+ }
124
+ const f = plan.byPath.get(k);
125
+ if (!f)
126
+ continue;
127
+ const ok = v === null ||
128
+ (isOperatorObject(v) &&
129
+ Object.entries(v).every(([op, x]) => NULL_FILTER_OPS.has(op) && (op === '$exists' || op === '$type' || x === null)));
130
+ if (!ok)
131
+ throw requestError(`${k} is encrypted: only null/existence checks can filter it` + (f.indexPath ? ` (use .cipherWhere('${k}', value))` : ''));
132
+ }
133
+ }
134
+ async function decryptDocs(plan, collection, docs) {
135
+ const items = [];
136
+ const targets = [];
137
+ for (const d of docs) {
138
+ if (!d || typeof d !== 'object')
139
+ continue;
140
+ for (const f of plan.fields) {
141
+ const stored = readRaw(d, f.path);
142
+ if (stored === undefined)
143
+ continue;
144
+ const id = isDocument(d) ? d._id : d._id;
145
+ const lb = `${collection}.${f.path}${id === undefined ? '' : ` (_id=${String(id)})`}`;
146
+ if (stored !== null && (id === undefined || id === null))
147
+ throw requestError(`${lb}: select _id together with encrypted paths`);
148
+ items.push({ collection, field: f.path, recordId: stored === null ? '' : recordIdOf(id, lb), stored, label: lb });
149
+ targets.push({ d, path: f.path });
150
+ }
151
+ }
152
+ const plain = await decryptValues(plan.cipher, items, { purpose: plan.options.purpose, readLegacyPlaintext: plan.options.readLegacyPlaintext === true });
153
+ plain.forEach((p, i) => writeRaw(targets[i].d, targets[i].path, p));
154
+ }
155
+ /** Encrypt the given paths of documents (each bound to its `_id`) in ONE batch and store ciphertext without setters. */
156
+ async function encryptDocs(plan, collection, work) {
157
+ const items = [];
158
+ const targets = [];
159
+ for (const { doc, fields } of work) {
160
+ for (const f of fields) {
161
+ const v = ledger.resolve(doc, f.path, doc.$__getValue(f.path));
162
+ const lb = `${collection}.${f.path}`;
163
+ if (v === null || v === undefined) {
164
+ if (f.indexPath)
165
+ doc.$__setValue(f.indexPath, null);
166
+ continue;
167
+ }
168
+ items.push({ collection, field: f.path, recordId: recordIdOf(doc._id, lb), plaintext: plaintextOf(v, lb), normalization: f.normalization, label: `${lb} (_id=${String(doc._id)})` });
169
+ targets.push({ doc, f, plaintext: v });
170
+ }
171
+ }
172
+ const enc = await encryptValues(plan.cipher, items, { keyId: plan.options.keyId });
173
+ enc.forEach((e, i) => {
174
+ const { doc, f, plaintext } = targets[i];
175
+ doc.$__setValue(f.path, e.ciphertext);
176
+ ledger.set(doc, f.path, plaintext, e.ciphertext);
177
+ if (f.indexPath)
178
+ doc.$__setValue(f.indexPath, e.index ?? null);
179
+ });
180
+ for (const { doc, fields } of work) {
181
+ if (doc.isNew)
182
+ continue;
183
+ for (const f of fields) {
184
+ doc.markModified(f.path);
185
+ if (f.indexPath)
186
+ doc.markModified(f.indexPath);
187
+ }
188
+ }
189
+ }
190
+ function restoreDoc(doc) {
191
+ if (!isDocument(doc))
192
+ return;
193
+ for (const [path, e] of ledger.entries(doc))
194
+ if (doc.$__getValue(path) === e.ciphertext)
195
+ doc.$__setValue(path, e.plaintext);
196
+ ledger.clear(doc);
197
+ }
198
+ /** Find writes to encrypted paths in an update or replacement document (copy-on-write). */
199
+ function planUpdate(plan, update, replace) {
200
+ const out = { ...update };
201
+ const writes = [];
202
+ // `section` receives `$set`-style keys: a full dotted path, or a parent path holding a nested object.
203
+ const scanSection = (section, skipOperators) => {
204
+ for (const k of Object.keys(section)) {
205
+ if (skipOperators && k.startsWith('$'))
206
+ continue;
207
+ if (plan.indexPaths.has(k))
208
+ throw requestError(`${k} is a blind index managed by Northstar Cipher`);
209
+ for (const f of plan.fields) {
210
+ if (k === f.path) {
211
+ writes.push({
212
+ f,
213
+ value: section[k],
214
+ put: (c, i) => {
215
+ section[k] = c;
216
+ if (f.indexPath)
217
+ section[f.indexPath] = i;
218
+ },
219
+ });
220
+ }
221
+ else if (f.path.startsWith(`${k}.`)) {
222
+ const v = section[k];
223
+ if (!v || typeof v !== 'object' || Array.isArray(v))
224
+ continue;
225
+ const copy = { ...v };
226
+ section[k] = copy;
227
+ const rel = f.path.slice(k.length + 1);
228
+ if (getPath(copy, rel) === undefined)
229
+ continue;
230
+ writes.push({
231
+ f,
232
+ value: getPath(copy, rel),
233
+ put: (c, i) => {
234
+ setPath(copy, rel, c);
235
+ if (f.indexPath)
236
+ setPath(copy, f.indexPath.slice(k.length + 1), i);
237
+ },
238
+ });
239
+ }
240
+ else if (k.startsWith(`${f.path}.`))
241
+ throw requestError(`${f.path} is encrypted: it cannot be partially updated`);
242
+ }
243
+ }
244
+ };
245
+ if (replace) {
246
+ scanSection(out, false);
247
+ return { update: out, writes };
248
+ }
249
+ for (const [k, v] of Object.entries(update)) {
250
+ if (!k.startsWith('$') || !v || typeof v !== 'object')
251
+ continue;
252
+ if (k === '$set' || k === '$setOnInsert') {
253
+ const copy = { ...v };
254
+ out[k] = copy;
255
+ scanSection(copy, false);
256
+ }
257
+ else if (k === '$unset') {
258
+ const copy = { ...v };
259
+ out[k] = copy;
260
+ for (const p of Object.keys(copy))
261
+ if (plan.indexPaths.has(p))
262
+ throw requestError(`${p} is a blind index managed by Northstar Cipher`);
263
+ for (const f of plan.fields)
264
+ if (f.indexPath && f.path in copy)
265
+ copy[f.indexPath] = 1;
266
+ }
267
+ else {
268
+ for (const p of Object.keys(v)) {
269
+ const hit = plan.fields.find((f) => p === f.path || p.startsWith(`${f.path}.`) || f.path.startsWith(`${p}.`) || p === f.indexPath);
270
+ if (hit)
271
+ throw requestError(`${hit.path} is encrypted: ${k} cannot modify it`);
272
+ const to = k === '$rename' ? v[p] : undefined;
273
+ if (typeof to === 'string' && plan.fields.some((f) => to === f.path || to === f.indexPath || f.path.startsWith(`${to}.`))) {
274
+ throw requestError(`${to} is encrypted: $rename cannot target it`);
275
+ }
276
+ }
277
+ }
278
+ }
279
+ // Top-level keys without an operator are an implicit $set.
280
+ scanSection(out, true);
281
+ return { update: out, writes };
282
+ }
283
+ function pipelineTouches(plan, pipeline) {
284
+ const json = JSON.stringify(pipeline);
285
+ return plan.fields.some((f) => json.includes(`"${f.path}"`) || json.includes(`$${f.path}`) || (f.indexPath ? json.includes(`"${f.indexPath}"`) : false));
286
+ }
287
+ /**
288
+ * Mongoose schema plugin. `schema.plugin(northstarCipherPlugin, { cipher, fields })`.
289
+ * Apply before compiling the model.
290
+ */
291
+ export function northstarCipherPlugin(schema, options) {
292
+ if (!options?.cipher || typeof options.cipher.encryptManySettled !== 'function') {
293
+ throw configError('Mongoose: northstarCipherPlugin requires { cipher: NorthstarCipher, fields }');
294
+ }
295
+ const s = schema;
296
+ if (schema[OVERRIDDEN])
297
+ throw configError('Mongoose: northstarCipherPlugin is already applied to this schema');
298
+ if (!schema.path('_id'))
299
+ throw configError('Mongoose: encrypted schemas need an _id (it is the record id bound into the ciphertext)');
300
+ const fields = [];
301
+ for (const [path, spec] of parseFields(options.fields)) {
302
+ const lb = `Mongoose: ${path}`;
303
+ const st = schema.path(path);
304
+ if (!st)
305
+ throw configError(`${lb}: no such path`);
306
+ if (st.instance !== 'String')
307
+ throw configError(`${lb}: encrypted paths must be String (they store nsc:v1:… text)`);
308
+ if (path === '_id')
309
+ throw configError(`${lb}: _id cannot be encrypted`);
310
+ const parts = path.split('.');
311
+ for (let i = 1; i < parts.length; i++) {
312
+ if (s.pathType(parts.slice(0, i).join('.')) !== 'nested')
313
+ throw configError(`${lb}: only top-level and nested-object paths are supported (not subdocuments or arrays)`);
314
+ }
315
+ const n = normalizeFieldSpec(spec, lb);
316
+ let indexPath;
317
+ if (n.searchable) {
318
+ indexPath = n.indexField ?? `${path}${INDEX_SUFFIX}`;
319
+ const existing = schema.path(indexPath);
320
+ if (!existing)
321
+ schema.add({ [indexPath]: { type: String, index: true } });
322
+ else if (existing.instance !== 'String')
323
+ throw configError(`${lb}: index path ${indexPath} must be String`);
324
+ }
325
+ fields.push({ path, ...(n.normalization ? { normalization: n.normalization } : {}), ...(indexPath ? { indexPath } : {}) });
326
+ }
327
+ if (!fields.length)
328
+ throw configError('Mongoose: no encrypted paths listed');
329
+ const plan = {
330
+ cipher: options.cipher,
331
+ options,
332
+ fields,
333
+ byPath: new Map(fields.map((f) => [f.path, f])),
334
+ indexPaths: new Set(fields.flatMap((f) => (f.indexPath ? [f.indexPath] : []))),
335
+ };
336
+ for (const f of fields)
337
+ overrideSchemaType(schema, f.path);
338
+ schema[OVERRIDDEN] = true;
339
+ // ------------------------------------------------------- Northstar Search
340
+ const searchPaths = (paths) => {
341
+ for (const p of paths)
342
+ if (!schema.path(p))
343
+ throw configError(`Mongoose: ${p}: no such path (search fields)`);
344
+ return paths;
345
+ };
346
+ const sync = options.search ? normalizeSearchSync(options.search, 'Mongoose') : undefined;
347
+ if (sync)
348
+ searchPaths(sync.fields);
349
+ const searchDoc = (collection, d, paths) => {
350
+ const record = {};
351
+ const plans = paths.map((p) => {
352
+ record[p] = readRaw(d, p);
353
+ return { attr: p, ...(plan.byPath.has(p) ? { encrypted: { collection, field: p } } : {}) };
354
+ });
355
+ return searchDocumentOf(record, { id: readRaw(d, '_id'), fields: plans, label: collection });
356
+ };
357
+ /** Saves that touch indexed paths (noted before the write) and their documents (built before plaintext is restored). */
358
+ const searchTouched = new WeakSet();
359
+ const searchReady = new WeakMap();
360
+ const collectionOf = (d) => d.constructor.collection.collectionName;
361
+ const tokens = (collection, path, value) => {
362
+ const f = plan.byPath.get(path);
363
+ if (!f)
364
+ throw configError(`Mongoose: ${path} is not an encrypted path`);
365
+ if (!f.indexPath)
366
+ throw configError(`Mongoose: ${path} is not searchable (set searchable)`);
367
+ return searchTokensFor(plan.cipher, { collection, field: path, normalization: f.normalization, values: value, keyId: options.keyId, label: `${collection}.${path}` }).then((t) => ({
368
+ [f.indexPath]: { $in: t },
369
+ }));
370
+ };
371
+ // ---------------------------------------------------------------- queries
372
+ const inflightOf = new WeakMap();
373
+ s.query.cipherWhere = function (path, value) {
374
+ const f = plan.byPath.get(path);
375
+ if (!f?.indexPath)
376
+ throw configError(`Mongoose: ${path} is not a searchable encrypted path`);
377
+ const list = pendingWhere.get(this) ?? [];
378
+ list.push({ path, value });
379
+ pendingWhere.set(this, list);
380
+ return this;
381
+ };
382
+ // Registered first: resolve cipherWhere() into blind-index conditions before anything reads the filter.
383
+ s.pre(QUERY_OPS, { document: false, query: true }, async function () {
384
+ const list = pendingWhere.get(this);
385
+ if (list) {
386
+ pendingWhere.delete(this);
387
+ if (this.op === 'estimatedDocumentCount')
388
+ throw requestError('cipherWhere() cannot be combined with estimatedDocumentCount() (it ignores filters)');
389
+ const conds = await Promise.all(list.map((w) => tokens(this.model.collection.collectionName, w.path, w.value)));
390
+ this.and(conds);
391
+ }
392
+ assertFilter(plan, this.getFilter());
393
+ const sort = this.options?.sort;
394
+ if (sort && typeof sort === 'object') {
395
+ const key = (Array.isArray(sort) ? sort.map((x) => (Array.isArray(x) ? x[0] : x)) : Object.keys(sort)).find((k) => plan.byPath.has(String(k)));
396
+ if (key !== undefined)
397
+ throw requestError(`${String(key)} is encrypted: sorting by it is not supported`);
398
+ }
399
+ if (this.op === 'distinct' && plan.byPath.has(String(this._distinct)))
400
+ throw requestError(`${String(this._distinct)} is encrypted: distinct() would return ciphertext`);
401
+ });
402
+ s.pre(UPDATE_OPS, { document: false, query: true }, async function () {
403
+ const op = String(this.op);
404
+ const raw = this.getUpdate();
405
+ if (!raw || typeof raw !== 'object')
406
+ return;
407
+ if (Array.isArray(raw)) {
408
+ if (pipelineTouches(plan, raw))
409
+ throw requestError('aggregation-pipeline updates cannot write encrypted paths');
410
+ return;
411
+ }
412
+ const { update, writes } = planUpdate(plan, raw, op === 'replaceOne' || op === 'findOneAndReplace');
413
+ if (!writes.length) {
414
+ this.setUpdate(update);
415
+ return;
416
+ }
417
+ const collection = this.model.collection.collectionName;
418
+ const filter = this.getFilter();
419
+ const qopts = this.getOptions();
420
+ let id = filter._id;
421
+ if (id === undefined || id === null || isOperatorObject(id)) {
422
+ if (op === 'updateMany')
423
+ throw requestError(`updateMany cannot write encrypted paths (each document needs its own ciphertext); update documents individually`);
424
+ // Same filter and sort as the update, so the pinned document is the one MongoDB would have picked.
425
+ const lookup = this.model.findOne(filter).select({ _id: 1 }).session(qopts.session ?? null);
426
+ if (this.options?.sort)
427
+ lookup.sort(this.options.sort);
428
+ const found = (await lookup.lean().exec());
429
+ // No match: a fresh id makes an upsert insert exactly the document its ciphertext is bound to, and a plain update a no-op.
430
+ id = found?._id ?? new mongoose.Types.ObjectId();
431
+ this.setQuery({ $and: [filter, { _id: id }] });
432
+ }
433
+ const items = [];
434
+ const targets = [];
435
+ for (const w of writes) {
436
+ const lb = `${collection}.${w.f.path} (_id=${String(id)})`;
437
+ // Apply the path's setters/casting to the plaintext, as Mongoose's update casting would (it skips ciphertext).
438
+ const st = this.model.schema.path(w.f.path);
439
+ const value = w.value === null || w.value === undefined || !st ? w.value : st.applySetters(w.value, this);
440
+ if (value === null || value === undefined) {
441
+ w.put(null, null);
442
+ continue;
443
+ }
444
+ items.push({ collection, field: w.f.path, recordId: recordIdOf(id, lb), plaintext: plaintextOf(value, lb), normalization: w.f.normalization, label: lb });
445
+ targets.push(w);
446
+ }
447
+ const enc = await encryptValues(plan.cipher, items, { keyId: options.keyId });
448
+ enc.forEach((e, i) => {
449
+ targets[i].put(e.ciphertext, e.index ?? null);
450
+ inflight.set(e.ciphertext, items[i].plaintext);
451
+ });
452
+ inflightOf.set(this, enc.map((e) => e.ciphertext));
453
+ this.setUpdate(update);
454
+ });
455
+ const clearInflight = (q) => {
456
+ for (const c of inflightOf.get(q) ?? [])
457
+ inflight.delete(c);
458
+ inflightOf.delete(q);
459
+ };
460
+ s.post(UPDATE_OPS, { document: false, query: true }, function (_res) {
461
+ clearInflight(this);
462
+ });
463
+ s.post(UPDATE_OPS, { document: false, query: true, errorHandler: true }, function (err, _res, next) {
464
+ clearInflight(this);
465
+ next(err);
466
+ });
467
+ s.post('find', { document: false, query: true }, async function (docs) {
468
+ if (Array.isArray(docs) && docs.length)
469
+ await decryptDocs(plan, this.model.collection.collectionName, docs);
470
+ });
471
+ s.post(['findOne', 'findOneAndUpdate', 'findOneAndReplace', 'findOneAndDelete'], { document: false, query: true }, async function (res) {
472
+ if (!res || typeof res !== 'object')
473
+ return;
474
+ const r = res;
475
+ const doc = !isDocument(r) && 'lastErrorObject' in r && 'value' in r ? r.value : r;
476
+ if (doc)
477
+ await decryptDocs(plan, this.model.collection.collectionName, [doc]);
478
+ });
479
+ // -------------------------------------------------------------- documents
480
+ s.pre('save', { document: true, query: false }, async function () {
481
+ const doc = this;
482
+ const pending = fields.filter((f) => (doc.isNew ? doc.$__getValue(f.path) !== undefined : doc.isModified(f.path)));
483
+ if (!pending.length)
484
+ return;
485
+ await encryptDocs(plan, doc.constructor.collection.collectionName, [{ doc, fields: pending }]);
486
+ });
487
+ if (sync) {
488
+ s.pre('save', { document: true, query: false }, function () {
489
+ if (this.isNew || sync.fields.some((p) => this.isModified(p)))
490
+ searchTouched.add(this);
491
+ });
492
+ // Before plaintext is restored: encrypted paths written by this save still hold their ciphertext.
493
+ s.post('save', { document: true, query: false }, function (doc) {
494
+ if (!isDocument(doc) || !searchTouched.has(doc))
495
+ return;
496
+ searchTouched.delete(doc);
497
+ searchReady.set(doc, [searchDoc(collectionOf(doc), doc, sync.fields)]);
498
+ });
499
+ }
500
+ s.post('save', { document: true, query: false }, function (doc) {
501
+ restoreDoc(doc);
502
+ });
503
+ if (sync) {
504
+ s.post('save', { document: true, query: false }, async function (doc) {
505
+ const docs = doc && typeof doc === 'object' ? searchReady.get(doc) : undefined;
506
+ if (!docs)
507
+ return;
508
+ searchReady.delete(doc);
509
+ await applySearchChange(sync, { upsert: docs });
510
+ });
511
+ s.post('deleteOne', { document: true, query: false }, async function (doc) {
512
+ if (isDocument(doc))
513
+ await applySearchChange(sync, { delete: [recordIdOf(doc._id, collectionOf(doc))] });
514
+ });
515
+ s.post('findOneAndDelete', { document: false, query: true }, async function (res) {
516
+ const r = res;
517
+ const doc = r && !isDocument(r) && 'lastErrorObject' in r && 'value' in r ? r.value : r;
518
+ const id = doc ? readRaw(doc, '_id') : undefined;
519
+ if (id !== undefined && id !== null)
520
+ await applySearchChange(sync, { delete: [recordIdOf(id, this.model.collection.collectionName)] });
521
+ });
522
+ }
523
+ s.post('save', { document: true, query: false, errorHandler: true }, function (err, doc, next) {
524
+ restoreDoc(doc);
525
+ next(err);
526
+ });
527
+ s.pre('insertMany', async function (docs) {
528
+ const Model = this;
529
+ for (const f of fields)
530
+ overrideSchemaType(Model.schema, f.path);
531
+ const input = Array.isArray(docs) ? docs : [docs];
532
+ // Hydrate so every document has its _id (and setters/defaults applied to plaintext) before encryption.
533
+ const hydrated = input.map((d) => (d instanceof Model ? d : d && typeof d === 'object' ? new Model(d) : d));
534
+ const work = hydrated.filter(isDocument).map((doc) => ({ doc, fields: fields.filter((f) => doc.$__getValue(f.path) !== undefined) })).filter((w) => w.fields.length);
535
+ await encryptDocs(plan, Model.collection.collectionName, work);
536
+ return mongoose.overwriteMiddlewareArguments(hydrated);
537
+ });
538
+ s.post('insertMany', async function (docs) {
539
+ const list = Array.isArray(docs) ? docs : [docs];
540
+ // Before plaintext is restored: the inserted documents hold their ciphertext.
541
+ const indexed = sync ? list.filter(isDocument).map((d) => searchDoc(this.collection.collectionName, d, sync.fields)) : [];
542
+ for (const d of list)
543
+ restoreDoc(d);
544
+ if (sync && indexed.length)
545
+ await applySearchChange(sync, { upsert: indexed });
546
+ });
547
+ s.post('insertMany', { errorHandler: true }, function (err, docs, next) {
548
+ for (const d of Array.isArray(docs) ? docs : [docs])
549
+ restoreDoc(d);
550
+ for (const d of (err?.insertedDocs ?? []))
551
+ restoreDoc(d);
552
+ next(err);
553
+ });
554
+ s.pre('bulkWrite', function (ops) {
555
+ for (const op of Array.isArray(ops) ? ops : []) {
556
+ const [kind, body] = Object.entries((op ?? {}))[0] ?? [];
557
+ const payload = kind === 'insertOne' ? body?.document : kind === 'replaceOne' ? body?.replacement : kind === 'updateOne' || kind === 'updateMany' ? body?.update : undefined;
558
+ if (!payload || typeof payload !== 'object')
559
+ continue;
560
+ const json = JSON.stringify(payload);
561
+ const hit = fields.find((f) => json.includes(`"${f.path}"`) || (f.indexPath && json.includes(`"${f.indexPath}"`)) || f.path.split('.').every((p) => json.includes(`"${p}"`)));
562
+ if (hit)
563
+ throw requestError(`bulkWrite cannot write encrypted path ${hit.path}; use save(), insertMany() or updateOne()`);
564
+ }
565
+ });
566
+ // ---------------------------------------------------------------- statics
567
+ s.static('cipherFilter', function (path, value) {
568
+ return tokens(this.collection.collectionName, path, value);
569
+ });
570
+ s.static('cipherDecrypt', async function (docs) {
571
+ await decryptDocs(plan, this.collection.collectionName, Array.isArray(docs) ? docs : [docs]);
572
+ return docs;
573
+ });
574
+ s.static('cipherSearchDocuments', function (docs, paths) {
575
+ const fp = paths ? searchPaths(paths) : sync?.fields;
576
+ if (!fp)
577
+ throw configError('Mongoose: cipherSearchDocuments(docs, fields): pass the paths to index (or configure search)');
578
+ return (Array.isArray(docs) ? docs : [docs]).map((d) => searchDoc(this.collection.collectionName, d, fp));
579
+ });
580
+ }
581
+ export { CipherError };
582
+ //# sourceMappingURL=mongoose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongoose.js","sourceRoot":"","sources":["../../src/integrations/mongoose.ts"],"names":[],"mappings":"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"}