@proteinjs/db-driver-spanner 1.23.5 → 1.25.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 (61) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/generated/test/index.d.ts.map +1 -1
  3. package/dist/generated/test/index.js +17 -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/ReferenceColumnAdoptWidth.test.d.ts +2 -0
  29. package/dist/test/ReferenceColumnAdoptWidth.test.d.ts.map +1 -0
  30. package/dist/test/ReferenceColumnAdoptWidth.test.js +244 -0
  31. package/dist/test/ReferenceColumnAdoptWidth.test.js.map +1 -0
  32. package/dist/test/index.d.ts +1 -0
  33. package/dist/test/index.d.ts.map +1 -1
  34. package/dist/test/index.js +1 -0
  35. package/dist/test/index.js.map +1 -1
  36. package/dist/test/util/columnEncryptionTestHarness.d.ts +23 -0
  37. package/dist/test/util/columnEncryptionTestHarness.d.ts.map +1 -0
  38. package/dist/test/util/columnEncryptionTestHarness.js +136 -0
  39. package/dist/test/util/columnEncryptionTestHarness.js.map +1 -0
  40. package/dist/test/util/columnEncryptionTestTables.d.ts +75 -0
  41. package/dist/test/util/columnEncryptionTestTables.d.ts.map +1 -0
  42. package/dist/test/util/columnEncryptionTestTables.js +124 -0
  43. package/dist/test/util/columnEncryptionTestTables.js.map +1 -0
  44. package/dist/test/util/referenceAdoptWidthTestTables.d.ts +24 -0
  45. package/dist/test/util/referenceAdoptWidthTestTables.d.ts.map +1 -0
  46. package/dist/test/util/referenceAdoptWidthTestTables.js +35 -0
  47. package/dist/test/util/referenceAdoptWidthTestTables.js.map +1 -0
  48. package/dist/test/util/serviceUpdateVerbsTestTables.d.ts +2 -2
  49. package/generated/test/index.ts +17 -1
  50. package/package.json +6 -6
  51. package/src/SpannerSchemaOperations.ts +4 -1
  52. package/test/ColumnEncryption.test.ts +252 -0
  53. package/test/EncryptedSearch.test.ts +247 -0
  54. package/test/EncryptionLifecycleWalker.test.ts +223 -0
  55. package/test/EncryptionPerf.test.ts +156 -0
  56. package/test/EncryptionSortAndUnique.test.ts +130 -0
  57. package/test/ReferenceColumnAdoptWidth.test.ts +155 -0
  58. package/test/index.ts +1 -0
  59. package/test/util/columnEncryptionTestHarness.ts +54 -0
  60. package/test/util/columnEncryptionTestTables.ts +115 -0
  61. package/test/util/referenceAdoptWidthTestTables.ts +23 -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":"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"}
@@ -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"}