@proteinjs/db-driver-spanner 1.23.5 → 1.24.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 (51) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/generated/test/index.d.ts.map +1 -1
  3. package/dist/generated/test/index.js +15 -1
  4. package/dist/generated/test/index.js.map +1 -1
  5. package/dist/src/SpannerSchemaOperations.d.ts.map +1 -1
  6. package/dist/src/SpannerSchemaOperations.js +4 -1
  7. package/dist/src/SpannerSchemaOperations.js.map +1 -1
  8. package/dist/test/ColumnEncryption.test.d.ts +2 -0
  9. package/dist/test/ColumnEncryption.test.d.ts.map +1 -0
  10. package/dist/test/ColumnEncryption.test.js +482 -0
  11. package/dist/test/ColumnEncryption.test.js.map +1 -0
  12. package/dist/test/EncryptedSearch.test.d.ts +2 -0
  13. package/dist/test/EncryptedSearch.test.d.ts.map +1 -0
  14. package/dist/test/EncryptedSearch.test.js +455 -0
  15. package/dist/test/EncryptedSearch.test.js.map +1 -0
  16. package/dist/test/EncryptionLifecycleWalker.test.d.ts +2 -0
  17. package/dist/test/EncryptionLifecycleWalker.test.d.ts.map +1 -0
  18. package/dist/test/EncryptionLifecycleWalker.test.js +408 -0
  19. package/dist/test/EncryptionLifecycleWalker.test.js.map +1 -0
  20. package/dist/test/EncryptionPerf.test.d.ts +2 -0
  21. package/dist/test/EncryptionPerf.test.d.ts.map +1 -0
  22. package/dist/test/EncryptionPerf.test.js +278 -0
  23. package/dist/test/EncryptionPerf.test.js.map +1 -0
  24. package/dist/test/EncryptionSortAndUnique.test.d.ts +2 -0
  25. package/dist/test/EncryptionSortAndUnique.test.d.ts.map +1 -0
  26. package/dist/test/EncryptionSortAndUnique.test.js +229 -0
  27. package/dist/test/EncryptionSortAndUnique.test.js.map +1 -0
  28. package/dist/test/index.d.ts +1 -0
  29. package/dist/test/index.d.ts.map +1 -1
  30. package/dist/test/index.js +1 -0
  31. package/dist/test/index.js.map +1 -1
  32. package/dist/test/util/columnEncryptionTestHarness.d.ts +23 -0
  33. package/dist/test/util/columnEncryptionTestHarness.d.ts.map +1 -0
  34. package/dist/test/util/columnEncryptionTestHarness.js +136 -0
  35. package/dist/test/util/columnEncryptionTestHarness.js.map +1 -0
  36. package/dist/test/util/columnEncryptionTestTables.d.ts +75 -0
  37. package/dist/test/util/columnEncryptionTestTables.d.ts.map +1 -0
  38. package/dist/test/util/columnEncryptionTestTables.js +124 -0
  39. package/dist/test/util/columnEncryptionTestTables.js.map +1 -0
  40. package/dist/test/util/serviceUpdateVerbsTestTables.d.ts +2 -2
  41. package/generated/test/index.ts +15 -1
  42. package/package.json +6 -6
  43. package/src/SpannerSchemaOperations.ts +4 -1
  44. package/test/ColumnEncryption.test.ts +252 -0
  45. package/test/EncryptedSearch.test.ts +247 -0
  46. package/test/EncryptionLifecycleWalker.test.ts +223 -0
  47. package/test/EncryptionPerf.test.ts +156 -0
  48. package/test/EncryptionSortAndUnique.test.ts +130 -0
  49. package/test/index.ts +1 -0
  50. package/test/util/columnEncryptionTestHarness.ts +54 -0
  51. package/test/util/columnEncryptionTestTables.ts +115 -0
@@ -0,0 +1,482 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __generator = (this && this.__generator) || function (thisArg, body) {
35
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
36
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
37
+ function verb(n) { return function (v) { return step([n, v]); }; }
38
+ function step(op) {
39
+ if (f) throw new TypeError("Generator is already executing.");
40
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
41
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
42
+ if (y = 0, t) op = [op[0] & 2, t.value];
43
+ switch (op[0]) {
44
+ case 0: case 1: t = op; break;
45
+ case 4: _.label++; return { value: op[1], done: false };
46
+ case 5: _.label++; y = op[1]; op = [0]; continue;
47
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
48
+ default:
49
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
50
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
51
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
52
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
53
+ if (t[2]) _.ops.pop();
54
+ _.trys.pop(); continue;
55
+ }
56
+ op = body.call(thisArg, _);
57
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
58
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
59
+ }
60
+ };
61
+ Object.defineProperty(exports, "__esModule", { value: true });
62
+ var db_1 = require("@proteinjs/db");
63
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
64
+ var db_transaction_context_1 = require("@proteinjs/db-transaction-context");
65
+ var getDropTestTable_1 = require("./util/getDropTestTable");
66
+ var SpannerEmulatorProvisioner_1 = require("./util/SpannerEmulatorProvisioner");
67
+ var columnEncryptionTestTables_1 = require("./util/columnEncryptionTestTables");
68
+ var columnEncryptionTestHarness_1 = require("./util/columnEncryptionTestHarness");
69
+ var test_1 = require("@proteinjs/db/test");
70
+ require("../generated/test/index");
71
+ var spannerDriver = new db_driver_spanner_1.SpannerDriver({
72
+ projectId: 'proteinjs-test',
73
+ instanceName: 'proteinjs-test',
74
+ databaseName: 'test',
75
+ });
76
+ /** Key IO (DataKeyStore) rides the process's default driver — the getDbAsSystem idiom the
77
+ * migration ledger already uses. The driver test harness has no DefaultDbDriverFactory, so
78
+ * seed the global the same way the factory would (test-harness convention: runtime access
79
+ * to internals rather than widening the API). */
80
+ globalThis['__proteinjs_db_defaultDbDriver'] = spannerDriver;
81
+ var OWNER_A = 'enc-core-owner-a';
82
+ var OWNER_B = 'enc-core-owner-b';
83
+ /** Counts vault calls, so unwrap-once caching is asserted on OUTCOMES (vault traffic). */
84
+ var CountingMasterKeyProvider = /** @class */ (function () {
85
+ function CountingMasterKeyProvider() {
86
+ this.wrapCalls = 0;
87
+ this.unwrapCalls = 0;
88
+ this.delegate = new db_1.InMemoryMasterKeyProvider('column-encryption-test');
89
+ }
90
+ CountingMasterKeyProvider.prototype.wrapDataKey = function (material) {
91
+ return __awaiter(this, void 0, void 0, function () {
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0:
95
+ this.wrapCalls++;
96
+ return [4 /*yield*/, this.delegate.wrapDataKey(material)];
97
+ case 1: return [2 /*return*/, _a.sent()];
98
+ }
99
+ });
100
+ });
101
+ };
102
+ CountingMasterKeyProvider.prototype.unwrapDataKey = function (wrapped) {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ return __generator(this, function (_a) {
105
+ switch (_a.label) {
106
+ case 0:
107
+ this.unwrapCalls++;
108
+ return [4 /*yield*/, this.delegate.unwrapDataKey(wrapped)];
109
+ case 1: return [2 /*return*/, _a.sent()];
110
+ }
111
+ });
112
+ });
113
+ };
114
+ CountingMasterKeyProvider.prototype.getMasterKeyId = function () {
115
+ return 'counting-in-memory';
116
+ };
117
+ return CountingMasterKeyProvider;
118
+ }());
119
+ var masterKeyProvider = new CountingMasterKeyProvider();
120
+ var accessibleOwners = [OWNER_A];
121
+ var noteTable = new columnEncryptionTestTables_1.EncNoteTable();
122
+ var db = new db_1.Db(spannerDriver, undefined, new db_transaction_context_1.TransactionContext());
123
+ var envelope = new db_1.EncryptionEnvelope();
124
+ var rawColumn = function (tableName, id, columnName) { return __awaiter(void 0, void 0, void 0, function () {
125
+ var rows;
126
+ var _a;
127
+ return __generator(this, function (_b) {
128
+ switch (_b.label) {
129
+ case 0: return [4 /*yield*/, spannerDriver.runQuery(function () { return ({
130
+ sql: "SELECT `".concat(columnName, "` FROM `").concat(tableName, "` WHERE `id` = '").concat(id, "'"),
131
+ }); })];
132
+ case 1:
133
+ rows = _b.sent();
134
+ return [2 /*return*/, (_a = rows[0]) === null || _a === void 0 ? void 0 : _a[columnName]];
135
+ }
136
+ });
137
+ }); };
138
+ describe('Column encryption: the transparent seam', function () {
139
+ var dropTable = (0, getDropTestTable_1.getDropTestTable)(spannerDriver);
140
+ var tableManager = spannerDriver.getTableManager();
141
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
142
+ return __generator(this, function (_a) {
143
+ switch (_a.label) {
144
+ case 0: return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.ensureProvisioned({
145
+ projectId: 'proteinjs-test',
146
+ instanceName: 'proteinjs-test',
147
+ databaseName: 'test',
148
+ })];
149
+ case 1:
150
+ _a.sent();
151
+ (0, test_1.registerTestUser)();
152
+ (0, db_1.setDbEncryptionConfig)({
153
+ masterKeyProvider: masterKeyProvider,
154
+ getAccessibleKeyOwners: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
155
+ return [2 /*return*/, accessibleOwners];
156
+ }); }); },
157
+ });
158
+ return [4 /*yield*/, (0, columnEncryptionTestHarness_1.loadColumnEncryptionTestSchema)(tableManager, [noteTable])];
159
+ case 2:
160
+ _a.sent();
161
+ return [4 /*yield*/, (0, columnEncryptionTestHarness_1.purgeColumnEncryptionTestRows)(spannerDriver, [noteTable])];
162
+ case 3:
163
+ _a.sent();
164
+ return [2 /*return*/];
165
+ }
166
+ });
167
+ }); }, 120000);
168
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
169
+ var EncryptedColumns;
170
+ return __generator(this, function (_a) {
171
+ switch (_a.label) {
172
+ case 0:
173
+ (0, db_1.setDbEncryptionConfig)(undefined);
174
+ (0, test_1.clearTestUser)();
175
+ return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require('@proteinjs/db')); })];
176
+ case 1:
177
+ EncryptedColumns = (_a.sent()).EncryptedColumns;
178
+ return [4 /*yield*/, dropTable(new EncryptedColumns().tokenTableFor(noteTable))];
179
+ case 2:
180
+ _a.sent();
181
+ return [4 /*yield*/, dropTable(noteTable)];
182
+ case 3:
183
+ _a.sent();
184
+ return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.release()];
185
+ case 4:
186
+ _a.sent();
187
+ return [2 /*return*/];
188
+ }
189
+ });
190
+ }); }, 60000);
191
+ beforeEach(function () {
192
+ accessibleOwners = [OWNER_A];
193
+ });
194
+ test('round trip is transparent: callers write and read plaintext; the database stores a ciphertext envelope', function () { return __awaiter(void 0, void 0, void 0, function () {
195
+ var inserted, fetched, _i, _a, columnName, stored, parsed, _b;
196
+ return __generator(this, function (_c) {
197
+ switch (_c.label) {
198
+ case 0: return [4 /*yield*/, db.insert(noteTable, {
199
+ scope: OWNER_A,
200
+ title: 'Therapy notes — divorce',
201
+ label: 'personal',
202
+ body: 'The most sensitive words in the account.',
203
+ status: 'active',
204
+ })];
205
+ case 1:
206
+ inserted = _c.sent();
207
+ return [4 /*yield*/, db.get(noteTable, { id: inserted.id })];
208
+ case 2:
209
+ fetched = _c.sent();
210
+ expect(fetched.title).toBe('Therapy notes — divorce');
211
+ expect(fetched.label).toBe('personal');
212
+ expect(fetched.body).toBe('The most sensitive words in the account.');
213
+ expect(fetched.status).toBe('active');
214
+ _i = 0, _a = ['title', 'label', 'body'];
215
+ _c.label = 3;
216
+ case 3:
217
+ if (!(_i < _a.length)) return [3 /*break*/, 6];
218
+ columnName = _a[_i];
219
+ return [4 /*yield*/, rawColumn(noteTable.name, inserted.id, columnName)];
220
+ case 4:
221
+ stored = _c.sent();
222
+ expect(envelope.isEnvelope(stored)).toBe(true);
223
+ expect(stored).not.toContain('divorce');
224
+ expect(stored).not.toContain('sensitive');
225
+ parsed = envelope.parse(stored);
226
+ expect(parsed.owner).toBe(OWNER_A);
227
+ _c.label = 5;
228
+ case 5:
229
+ _i++;
230
+ return [3 /*break*/, 3];
231
+ case 6:
232
+ _b = expect;
233
+ return [4 /*yield*/, rawColumn(noteTable.name, inserted.id, 'status')];
234
+ case 7:
235
+ _b.apply(void 0, [_c.sent()]).toBe('active');
236
+ // Deserialized records carry no framework companion columns
237
+ expect(Object.keys(fetched).some(function (key) { return key.includes('__enc'); })).toBe(false);
238
+ return [4 /*yield*/, db.delete(noteTable, { id: inserted.id })];
239
+ case 8:
240
+ _c.sent();
241
+ return [2 /*return*/];
242
+ }
243
+ });
244
+ }); });
245
+ test('update through the seam: new ciphertext at rest, plaintext to callers', function () { return __awaiter(void 0, void 0, void 0, function () {
246
+ var inserted, updateCount, fetched, stored;
247
+ return __generator(this, function (_a) {
248
+ switch (_a.label) {
249
+ case 0: return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_A, title: 'Before', label: 'a', body: 'b' })];
250
+ case 1:
251
+ inserted = _a.sent();
252
+ return [4 /*yield*/, db.update(noteTable, { id: inserted.id, title: 'After the update' })];
253
+ case 2:
254
+ updateCount = _a.sent();
255
+ expect(updateCount).toBe(1);
256
+ return [4 /*yield*/, db.get(noteTable, { id: inserted.id })];
257
+ case 3:
258
+ fetched = _a.sent();
259
+ expect(fetched.title).toBe('After the update');
260
+ expect(fetched.label).toBe('a'); // untouched columns survive
261
+ return [4 /*yield*/, rawColumn(noteTable.name, inserted.id, 'title')];
262
+ case 4:
263
+ stored = _a.sent();
264
+ expect(envelope.isEnvelope(stored)).toBe(true);
265
+ expect(stored).not.toContain('After');
266
+ return [4 /*yield*/, db.delete(noteTable, { id: inserted.id })];
267
+ case 5:
268
+ _a.sent();
269
+ return [2 /*return*/];
270
+ }
271
+ });
272
+ }); });
273
+ test('null stays null: IS NULL / IS NOT NULL queries keep working natively', function () { return __awaiter(void 0, void 0, void 0, function () {
274
+ var withTitle, withoutTitle, _a, nullTitles;
275
+ return __generator(this, function (_b) {
276
+ switch (_b.label) {
277
+ case 0: return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_A, title: 'present', label: 'x', body: null })];
278
+ case 1:
279
+ withTitle = _b.sent();
280
+ return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_A, title: null, label: 'y', body: 'here' })];
281
+ case 2:
282
+ withoutTitle = _b.sent();
283
+ _a = expect;
284
+ return [4 /*yield*/, rawColumn(noteTable.name, withoutTitle.id, 'title')];
285
+ case 3:
286
+ _a.apply(void 0, [_b.sent()]).toBeNull();
287
+ return [4 /*yield*/, db.query(noteTable, new db_1.QueryBuilder(noteTable.name).condition({ field: 'title', operator: 'IS NULL' }))];
288
+ case 4:
289
+ nullTitles = _b.sent();
290
+ expect(nullTitles.some(function (row) { return row.id === withoutTitle.id; })).toBe(true);
291
+ expect(nullTitles.some(function (row) { return row.id === withTitle.id; })).toBe(false);
292
+ return [4 /*yield*/, db.delete(noteTable, { id: withTitle.id })];
293
+ case 5:
294
+ _b.sent();
295
+ return [4 /*yield*/, db.delete(noteTable, { id: withoutTitle.id })];
296
+ case 6:
297
+ _b.sent();
298
+ return [2 /*return*/];
299
+ }
300
+ });
301
+ }); });
302
+ test('adoption path: a pre-encryption plaintext row reads through the seam unchanged', function () { return __awaiter(void 0, void 0, void 0, function () {
303
+ var id, fetched;
304
+ return __generator(this, function (_a) {
305
+ switch (_a.label) {
306
+ case 0:
307
+ id = 'enc-adoption-row-1';
308
+ return [4 /*yield*/, spannerDriver.runDml(function () { return ({
309
+ sql: "INSERT INTO `".concat(noteTable.name, "` (`id`, `created`, `updated`, `scope`, `title`, `status`) ") +
310
+ "VALUES ('".concat(id, "', CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), '").concat(OWNER_A, "', 'legacy plaintext title', 'active')"),
311
+ }); })];
312
+ case 1:
313
+ _a.sent();
314
+ return [4 /*yield*/, db.get(noteTable, { id: id })];
315
+ case 2:
316
+ fetched = _a.sent();
317
+ expect(fetched.title).toBe('legacy plaintext title');
318
+ return [4 /*yield*/, db.delete(noteTable, { id: id })];
319
+ case 3:
320
+ _a.sent();
321
+ return [2 /*return*/];
322
+ }
323
+ });
324
+ }); });
325
+ test('scope-owner keying: each row encrypts under its scope owner; the vault is called once per key (unwrap caching)', function () { return __awaiter(void 0, void 0, void 0, function () {
326
+ var rowA, rowB, _a, _b, _c, _d, _e, _f, bothRows, _g, unwrapCallsBefore, i;
327
+ return __generator(this, function (_h) {
328
+ switch (_h.label) {
329
+ case 0: return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_A, title: 'a note', label: 'la', body: 'ba' })];
330
+ case 1:
331
+ rowA = _h.sent();
332
+ return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_B, title: 'b note', label: 'lb', body: 'bb' })];
333
+ case 2:
334
+ rowB = _h.sent();
335
+ _a = expect;
336
+ _c = (_b = envelope).parse;
337
+ return [4 /*yield*/, rawColumn(noteTable.name, rowA.id, 'title')];
338
+ case 3:
339
+ _a.apply(void 0, [_c.apply(_b, [_h.sent()]).owner]).toBe(OWNER_A);
340
+ _d = expect;
341
+ _f = (_e = envelope).parse;
342
+ return [4 /*yield*/, rawColumn(noteTable.name, rowB.id, 'title')];
343
+ case 4:
344
+ _d.apply(void 0, [_f.apply(_e, [_h.sent()]).owner]).toBe(OWNER_B);
345
+ return [4 /*yield*/, db.get(noteTable, { id: rowA.id })];
346
+ case 5:
347
+ _g = [_h.sent()];
348
+ return [4 /*yield*/, db.get(noteTable, { id: rowB.id })];
349
+ case 6:
350
+ bothRows = _g.concat([_h.sent()]);
351
+ expect(bothRows.map(function (row) { return row.title; })).toEqual(['a note', 'b note']);
352
+ unwrapCallsBefore = masterKeyProvider.unwrapCalls;
353
+ i = 0;
354
+ _h.label = 7;
355
+ case 7:
356
+ if (!(i < 5)) return [3 /*break*/, 11];
357
+ return [4 /*yield*/, db.get(noteTable, { id: rowA.id })];
358
+ case 8:
359
+ _h.sent();
360
+ return [4 /*yield*/, db.get(noteTable, { id: rowB.id })];
361
+ case 9:
362
+ _h.sent();
363
+ _h.label = 10;
364
+ case 10:
365
+ i++;
366
+ return [3 /*break*/, 7];
367
+ case 11:
368
+ expect(masterKeyProvider.unwrapCalls).toBe(unwrapCallsBefore);
369
+ return [4 /*yield*/, db.delete(noteTable, { id: rowA.id })];
370
+ case 12:
371
+ _h.sent();
372
+ return [4 /*yield*/, db.delete(noteTable, { id: rowB.id })];
373
+ case 13:
374
+ _h.sent();
375
+ return [2 /*return*/];
376
+ }
377
+ });
378
+ }); });
379
+ test('a shared-scope row keys by the scope owner, not the writer: config resolveKeyOwner decides', function () { return __awaiter(void 0, void 0, void 0, function () {
380
+ var sharedRow, _a, _b, _c;
381
+ return __generator(this, function (_d) {
382
+ switch (_d.label) {
383
+ case 0:
384
+ (0, db_1.setDbEncryptionConfig)({
385
+ masterKeyProvider: masterKeyProvider,
386
+ getAccessibleKeyOwners: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
387
+ return [2 /*return*/, accessibleOwners];
388
+ }); }); },
389
+ // The consumer's scope→owner mapping (thought-common's permission-source resolver in
390
+ // the app): here, rows whose scope starts with 'shared:' belong to OWNER_B.
391
+ resolveKeyOwner: function (_a) {
392
+ var record = _a.record;
393
+ return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_b) {
394
+ return [2 /*return*/, typeof record.scope === 'string' && record.scope.startsWith('shared:') ? OWNER_B : undefined];
395
+ }); });
396
+ },
397
+ });
398
+ return [4 /*yield*/, db.insert(noteTable, { scope: 'shared:tree-root', title: 'contributed text', label: 'l' })];
399
+ case 1:
400
+ sharedRow = _d.sent();
401
+ _a = expect;
402
+ _c = (_b = envelope).parse;
403
+ return [4 /*yield*/, rawColumn(noteTable.name, sharedRow.id, 'title')];
404
+ case 2:
405
+ _a.apply(void 0, [_c.apply(_b, [_d.sent()]).owner]).toBe(OWNER_B);
406
+ return [4 /*yield*/, db.delete(noteTable, { id: sharedRow.id })];
407
+ case 3:
408
+ _d.sent();
409
+ (0, db_1.setDbEncryptionConfig)({ masterKeyProvider: masterKeyProvider, getAccessibleKeyOwners: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
410
+ return [2 /*return*/, accessibleOwners];
411
+ }); }); } });
412
+ return [2 /*return*/];
413
+ }
414
+ });
415
+ }); });
416
+ test('crypto-shred: deleting an owner key makes their rows permanently unreadable, loudly', function () { return __awaiter(void 0, void 0, void 0, function () {
417
+ var shredOwner, row, deleted, survivor, _a;
418
+ return __generator(this, function (_b) {
419
+ switch (_b.label) {
420
+ case 0:
421
+ shredOwner = 'enc-core-shred-owner';
422
+ return [4 /*yield*/, db.insert(noteTable, { scope: shredOwner, title: 'to be shredded', label: 'x', body: 'y' })];
423
+ case 1:
424
+ row = _b.sent();
425
+ return [4 /*yield*/, new db_1.DataKeyStore().shredOwnerKeys(shredOwner)];
426
+ case 2:
427
+ deleted = _b.sent();
428
+ expect(deleted).toBeGreaterThanOrEqual(1);
429
+ return [4 /*yield*/, expect(db.get(noteTable, { id: row.id })).rejects.toThrow(db_1.EncryptionKeyUnavailableError)];
430
+ case 3:
431
+ _b.sent();
432
+ return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_A, title: 'still fine', label: 'ok' })];
433
+ case 4:
434
+ survivor = _b.sent();
435
+ _a = expect;
436
+ return [4 /*yield*/, db.get(noteTable, { id: survivor.id })];
437
+ case 5:
438
+ _a.apply(void 0, [(_b.sent()).title]).toBe('still fine');
439
+ return [4 /*yield*/, spannerDriver.runDml(function () { return ({
440
+ sql: "DELETE FROM `".concat(noteTable.name, "` WHERE `id` = '").concat(row.id, "'"),
441
+ }); })];
442
+ case 6:
443
+ _b.sent();
444
+ return [4 /*yield*/, db.delete(noteTable, { id: survivor.id })];
445
+ case 7:
446
+ _b.sent();
447
+ return [2 /*return*/];
448
+ }
449
+ });
450
+ }); });
451
+ test('transactions: encrypted writes and reads ride runTransaction like any other write', function () { return __awaiter(void 0, void 0, void 0, function () {
452
+ var result;
453
+ return __generator(this, function (_a) {
454
+ switch (_a.label) {
455
+ case 0: return [4 /*yield*/, db.runTransaction(function () { return __awaiter(void 0, void 0, void 0, function () {
456
+ var inserted;
457
+ return __generator(this, function (_a) {
458
+ switch (_a.label) {
459
+ case 0: return [4 /*yield*/, db.insert(noteTable, { scope: OWNER_A, title: 'txn title', label: 'txn' })];
460
+ case 1:
461
+ inserted = _a.sent();
462
+ return [4 /*yield*/, db.update(noteTable, { id: inserted.id, body: 'txn body' })];
463
+ case 2:
464
+ _a.sent();
465
+ return [4 /*yield*/, db.get(noteTable, { id: inserted.id })];
466
+ case 3: return [2 /*return*/, _a.sent()];
467
+ }
468
+ });
469
+ }); })];
470
+ case 1:
471
+ result = _a.sent();
472
+ expect(result.title).toBe('txn title');
473
+ expect(result.body).toBe('txn body');
474
+ return [4 /*yield*/, db.delete(noteTable, { id: result.id })];
475
+ case 2:
476
+ _a.sent();
477
+ return [2 /*return*/];
478
+ }
479
+ });
480
+ }); });
481
+ });
482
+ //# sourceMappingURL=ColumnEncryption.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnEncryption.test.js","sourceRoot":"","sources":["../../test/ColumnEncryption.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oCAUuB;AACvB,kEAA6D;AAC7D,4EAAuE;AACvE,4DAA2D;AAC3D,gFAA+E;AAC/E,gFAA0E;AAC1E,kFAAmH;AACnH,2CAAqE;AACrE,mCAAiC;AAEjC,IAAM,aAAa,GAAG,IAAI,iCAAa,CAAC;IACtC,SAAS,EAAE,gBAAgB;IAC3B,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,MAAM;CACrB,CAAC,CAAC;AAEH;;;kDAGkD;AACjD,UAAkB,CAAC,gCAAgC,CAAC,GAAG,aAAa,CAAC;AAEtE,IAAM,OAAO,GAAG,kBAAkB,CAAC;AACnC,IAAM,OAAO,GAAG,kBAAkB,CAAC;AAEnC,0FAA0F;AAC1F;IAAA;QACS,cAAS,GAAG,CAAC,CAAC;QACd,gBAAW,GAAG,CAAC,CAAC;QACf,aAAQ,GAAG,IAAI,8BAAyB,CAAC,wBAAwB,CAAC,CAAC;IAe7E,CAAC;IAbO,+CAAW,GAAjB,UAAkB,QAAgB;;;;;wBAChC,IAAI,CAAC,SAAS,EAAE,CAAC;wBACV,qBAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAA;4BAAhD,sBAAO,SAAyC,EAAC;;;;KAClD;IAEK,iDAAa,GAAnB,UAAoB,OAAe;;;;;wBACjC,IAAI,CAAC,WAAW,EAAE,CAAC;wBACZ,qBAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,EAAA;4BAAjD,sBAAO,SAA0C,EAAC;;;;KACnD;IAED,kDAAc,GAAd;QACE,OAAO,oBAAoB,CAAC;IAC9B,CAAC;IACH,gCAAC;AAAD,CAAC,AAlBD,IAkBC;AAED,IAAM,iBAAiB,GAAG,IAAI,yBAAyB,EAAE,CAAC;AAC1D,IAAI,gBAAgB,GAAa,CAAC,OAAO,CAAC,CAAC;AAE3C,IAAM,SAAS,GAAG,IAAI,yCAAY,EAAoB,CAAC;AACvD,IAAM,EAAE,GAAG,IAAI,OAAE,CAAC,aAAa,EAAE,SAAS,EAAE,IAAI,2CAAkB,EAAE,CAAC,CAAC;AACtE,IAAM,QAAQ,GAAG,IAAI,uBAAkB,EAAE,CAAC;AAE1C,IAAM,SAAS,GAAG,UAAO,SAAiB,EAAE,EAAU,EAAE,UAAkB;;;;;oBAC3D,qBAAM,aAAa,CAAC,QAAQ,CAAC,cAAM,OAAA,CAAC;oBAC/C,GAAG,EAAE,kBAAY,UAAU,qBAAa,SAAS,6BAAsB,EAAE,MAAG;iBAC7E,CAAC,EAF8C,CAE9C,CAAC,EAAA;;gBAFG,IAAI,GAAG,SAEV;gBACH,sBAAO,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAG,UAAU,CAAC,EAAC;;;KAC9B,CAAC;AAEF,QAAQ,CAAC,yCAAyC,EAAE;IAClD,IAAM,SAAS,GAAG,IAAA,mCAAgB,EAAC,aAAa,CAAC,CAAC;IAClD,IAAM,YAAY,GAAG,aAAa,CAAC,eAAe,EAAE,CAAC;IAErD,SAAS,CAAC;;;wBACR,qBAAM,uDAA0B,CAAC,iBAAiB,CAAC;wBACjD,SAAS,EAAE,gBAAgB;wBAC3B,YAAY,EAAE,gBAAgB;wBAC9B,YAAY,EAAE,MAAM;qBACrB,CAAC,EAAA;;oBAJF,SAIE,CAAC;oBACH,IAAA,uBAAgB,GAAE,CAAC;oBACnB,IAAA,0BAAqB,EAAC;wBACpB,iBAAiB,mBAAA;wBACjB,sBAAsB,EAAE;4BAAY,sBAAA,gBAAgB,EAAA;iCAAA;qBACrD,CAAC,CAAC;oBACH,qBAAM,IAAA,4DAA8B,EAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,EAAA;;oBAA/D,SAA+D,CAAC;oBAChE,qBAAM,IAAA,2DAA6B,EAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,EAAA;;oBAA/D,SAA+D,CAAC;;;;SACjE,EAAE,MAAM,CAAC,CAAC;IAEX,QAAQ,CAAC;;;;;oBACP,IAAA,0BAAqB,EAAC,SAAS,CAAC,CAAC;oBACjC,IAAA,oBAAa,GAAE,CAAC;oBACa,sFAAa,eAAe,QAAC;;oBAAlD,gBAAgB,GAAK,CAAA,SAA6B,CAAA,iBAAlC;oBACxB,qBAAM,SAAS,CAAC,IAAI,gBAAgB,EAAE,CAAC,aAAa,CAAC,SAAS,CAAE,CAAC,EAAA;;oBAAjE,SAAiE,CAAC;oBAClE,qBAAM,SAAS,CAAC,SAAS,CAAC,EAAA;;oBAA1B,SAA0B,CAAC;oBAC3B,qBAAM,uDAA0B,CAAC,OAAO,EAAE,EAAA;;oBAA1C,SAA0C,CAAC;;;;SAC5C,EAAE,KAAK,CAAC,CAAC;IAEV,UAAU,CAAC;QACT,gBAAgB,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wGAAwG,EAAE;;;;wBAC5F,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;wBAC1C,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,yBAAyB;wBAChC,KAAK,EAAE,UAAU;wBACjB,IAAI,EAAE,0CAA0C;wBAChD,MAAM,EAAE,QAAQ;qBACjB,CAAC,EAAA;;oBANI,QAAQ,GAAG,SAMf;oBAGc,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAtD,OAAO,GAAG,SAA4C;oBAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;oBACtD,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;oBACtE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;0BAGa,EAA1B,MAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;;;yBAA1B,CAAA,cAA0B,CAAA;oBAAxC,UAAU;oBACJ,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EAAA;;oBAAjE,MAAM,GAAG,SAAwD;oBACvE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;oBACxC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;oBACpC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAE,CAAC;oBACvC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;;oBANZ,IAA0B,CAAA;;;oBAQnD,KAAA,MAAM,CAAA;oBAAC,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAA;;oBAA7D,kBAAO,SAAsD,EAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAE9E,4DAA4D;oBAC5D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAArB,CAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAE9E,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA/C,SAA+C,CAAC;;;;SACjD,CAAC,CAAC;IAEH,IAAI,CAAC,uEAAuE,EAAE;;;;wBAC3D,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAA;;oBAAjG,QAAQ,GAAG,SAAsF;oBACnF,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,EAAA;;oBAAxF,WAAW,GAAG,SAA0E;oBAC9F,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAEZ,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAtD,OAAO,GAAG,SAA4C;oBAC5D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;oBAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B;oBAE9C,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;oBAA9D,MAAM,GAAG,SAAqD;oBACpE,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;oBAEtC,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA/C,SAA+C,CAAC;;;;SACjD,CAAC,CAAC;IAEH,IAAI,CAAC,sEAAsE,EAAE;;;;wBACzD,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAA;;oBAApG,SAAS,GAAG,SAAwF;oBACrF,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAA;;oBAApG,YAAY,GAAG,SAAqF;oBAE1G,KAAA,MAAM,CAAA;oBAAC,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;oBAAhE,kBAAO,SAAyD,EAAC,CAAC,QAAQ,EAAE,CAAC;oBAE1D,qBAAM,EAAE,CAAC,KAAK,CAC/B,SAAS,EACT,IAAI,iBAAY,CAAU,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAC7F,EAAA;;oBAHK,UAAU,GAAG,SAGlB;oBACD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,EAAE,KAAK,YAAY,CAAC,EAAE,EAA1B,CAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,EAAvB,CAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAEtE,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAhD,SAAgD,CAAC;oBACjD,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAnD,SAAmD,CAAC;;;;SACrD,CAAC,CAAC;IAEH,IAAI,CAAC,gFAAgF,EAAE;;;;;oBAC/E,EAAE,GAAG,oBAAoB,CAAC;oBAChC,qBAAM,aAAa,CAAC,MAAM,CAAC,cAAM,OAAA,CAAC;4BAChC,GAAG,EACD,uBAAiB,SAAS,CAAC,IAAI,gEAA0E;gCACzG,mBAAY,EAAE,2DAAiD,OAAO,2CAAwC;yBACjH,CAAC,EAJ+B,CAI/B,CAAC,EAAA;;oBAJH,SAIG,CAAC;oBAEY,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,IAAA,EAAE,CAAC,EAAA;;oBAAzC,OAAO,GAAG,SAA+B;oBAC/C,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;oBACrD,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,IAAA,EAAE,CAAC,EAAA;;oBAAlC,SAAkC,CAAC;;;;SACpC,CAAC,CAAC;IAEH,IAAI,CAAC,gHAAgH,EAAE;;;;wBACxG,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAA;;oBAA/F,IAAI,GAAG,SAAwF;oBACxF,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAA;;oBAA/F,IAAI,GAAG,SAAwF;oBAErG,KAAA,MAAM,CAAA;oBAAC,KAAA,CAAA,KAAA,QAAQ,CAAA,CAAC,KAAK,CAAA;oBAAC,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;oBAAvE,kBAAO,cAAe,SAAiD,EAAE,CAAC,KAAK,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAC/F,KAAA,MAAM,CAAA;oBAAC,KAAA,CAAA,KAAA,QAAQ,CAAA,CAAC,KAAK,CAAA;oBAAC,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;oBAAvE,kBAAO,cAAe,SAAiD,EAAE,CAAC,KAAK,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAI7E,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAA;;0BAAxC,SAAwC;oBAAE,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA9F,QAAQ,cAA8C,SAAwC,EAAC;oBACrG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,KAAK,EAAT,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;oBAGjE,iBAAiB,GAAG,iBAAiB,CAAC,WAAW,CAAC;oBAC/C,CAAC,GAAG,CAAC;;;yBAAE,CAAA,CAAC,GAAG,CAAC,CAAA;oBACnB,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAxC,SAAwC,CAAC;oBACzC,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAxC,SAAwC,CAAC;;;oBAFpB,CAAC,EAAE,CAAA;;;oBAI1B,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAE9D,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA3C,SAA2C,CAAC;oBAC5C,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA3C,SAA2C,CAAC;;;;SAC7C,CAAC,CAAC;IAEH,IAAI,CAAC,4FAA4F,EAAE;;;;;oBACjG,IAAA,0BAAqB,EAAC;wBACpB,iBAAiB,mBAAA;wBACjB,sBAAsB,EAAE;4BAAY,sBAAA,gBAAgB,EAAA;iCAAA;wBACpD,qFAAqF;wBACrF,4EAA4E;wBAC5E,eAAe,EAAE,UAAO,EAAU;gCAAR,MAAM,YAAA;;gCAC9B,sBAAA,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAA;;yBAAA;qBAC/F,CAAC,CAAC;oBAEe,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAA;;oBAA5G,SAAS,GAAG,SAAgG;oBAClH,KAAA,MAAM,CAAA;oBAAC,KAAA,CAAA,KAAA,QAAQ,CAAA,CAAC,KAAK,CAAA;oBAAC,qBAAM,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,CAAC,EAAA;;oBAA5E,kBAAO,cAAe,SAAsD,EAAE,CAAC,KAAK,EAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAEpG,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAhD,SAAgD,CAAC;oBACjD,IAAA,0BAAqB,EAAC,EAAE,iBAAiB,mBAAA,EAAE,sBAAsB,EAAE;4BAAY,sBAAA,gBAAgB,EAAA;iCAAA,EAAE,CAAC,CAAC;;;;SACpG,CAAC,CAAC;IAEH,IAAI,CAAC,qFAAqF,EAAE;;;;;oBACpF,UAAU,GAAG,sBAAsB,CAAC;oBAC9B,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,EAAA;;oBAAvG,GAAG,GAAG,SAAiG;oBAE7F,qBAAM,IAAI,iBAAY,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,EAAA;;oBAA7D,OAAO,GAAG,SAAmD;oBACnE,MAAM,CAAC,OAAO,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;oBAE1C,qBAAM,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,kCAA6B,CAAC,EAAA;;oBAA9F,SAA8F,CAAC;oBAG9E,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAA;;oBAA3F,QAAQ,GAAG,SAAgF;oBACjG,KAAA,MAAM,CAAA;oBAAE,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAApD,kBAAO,CAAC,SAA4C,CAAC,CAAC,KAAK,EAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAEhF,qBAAM,aAAa,CAAC,MAAM,CAAC,cAAM,OAAA,CAAC;4BAChC,GAAG,EAAE,uBAAiB,SAAS,CAAC,IAAI,6BAAsB,GAAG,CAAC,EAAE,MAAG;yBACpE,CAAC,EAF+B,CAE/B,CAAC,EAAA;;oBAFH,SAEG,CAAC;oBACJ,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA/C,SAA+C,CAAC;;;;SACjD,CAAC,CAAC;IAEH,IAAI,CAAC,mFAAmF,EAAE;;;;wBACzE,qBAAM,EAAE,CAAC,cAAc,CAAC;;;;wCACpB,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAA;;oCAA3F,QAAQ,GAAG,SAAgF;oCACjG,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAA;;oCAAjE,SAAiE,CAAC;oCAC3D,qBAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;wCAAnD,sBAAO,SAA4C,EAAC;;;yBACrD,CAAC,EAAA;;oBAJI,MAAM,GAAG,SAIb;oBACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACvC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACrC,qBAAM,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAA7C,SAA6C,CAAC;;;;SAC/C,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '../generated/test/index';
2
+ //# sourceMappingURL=EncryptedSearch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncryptedSearch.test.d.ts","sourceRoot":"","sources":["../../test/EncryptedSearch.test.ts"],"names":[],"mappings":"AAeA,OAAO,yBAAyB,CAAC"}