@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,408 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ 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;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ var db_1 = require("@proteinjs/db");
55
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
56
+ var db_transaction_context_1 = require("@proteinjs/db-transaction-context");
57
+ var getDropTestTable_1 = require("./util/getDropTestTable");
58
+ var SpannerEmulatorProvisioner_1 = require("./util/SpannerEmulatorProvisioner");
59
+ var columnEncryptionTestTables_1 = require("./util/columnEncryptionTestTables");
60
+ var columnEncryptionTestHarness_1 = require("./util/columnEncryptionTestHarness");
61
+ var test_1 = require("@proteinjs/db/test");
62
+ require("../generated/test/index");
63
+ var spannerDriver = new db_driver_spanner_1.SpannerDriver({
64
+ projectId: 'proteinjs-test',
65
+ instanceName: 'proteinjs-test',
66
+ databaseName: 'test',
67
+ });
68
+ globalThis['__proteinjs_db_defaultDbDriver'] = spannerDriver;
69
+ var OWNER = 'enc-walk-owner-a';
70
+ var walkTable = new columnEncryptionTestTables_1.EncWalkRowTable();
71
+ var db = new db_1.Db(spannerDriver, undefined, new db_transaction_context_1.TransactionContext());
72
+ var systemDb = new db_1.Db(spannerDriver, undefined, new db_transaction_context_1.TransactionContext(), true);
73
+ var envelope = new db_1.EncryptionEnvelope();
74
+ var walker = new db_1.EncryptionLifecycleWalker();
75
+ /**
76
+ * The decrypt-out view of the walk table: the SAME physical table with the columns declared
77
+ * plaintext — how the schema looks after a deliberate reclassification flips the config.
78
+ * Deliberately NOT a registered loadable (the registry holds the encrypted declaration;
79
+ * name-based lookups only resolve column names/types, identical between the two).
80
+ */
81
+ var EncWalkRowDecryptedView = /** @class */ (function (_super) {
82
+ __extends(EncWalkRowDecryptedView, _super);
83
+ function EncWalkRowDecryptedView() {
84
+ var _this = _super !== null && _super.apply(this, arguments) || this;
85
+ _this.name = 'db_test_enc_walk_row';
86
+ _this.columns = (0, db_1.withRecordColumns)({
87
+ scope: new db_1.StringColumn('scope', {}, 36),
88
+ title: new db_1.StringColumn('title', { encrypted: false }, 'MAX'),
89
+ body: new db_1.StringColumn('body', { encrypted: false }, 'MAX'),
90
+ });
91
+ return _this;
92
+ }
93
+ return EncWalkRowDecryptedView;
94
+ }(db_1.Table));
95
+ var rawRows = function () { return __awaiter(void 0, void 0, void 0, function () {
96
+ return __generator(this, function (_a) {
97
+ switch (_a.label) {
98
+ case 0: return [4 /*yield*/, spannerDriver.runQuery(function () { return ({
99
+ sql: "SELECT `id`, `title`, `body` FROM `".concat(walkTable.name, "` ORDER BY `id`"),
100
+ }); })];
101
+ case 1: return [2 /*return*/, _a.sent()];
102
+ }
103
+ });
104
+ }); };
105
+ var seedPlaintextRow = function (id, title, body) { return __awaiter(void 0, void 0, void 0, function () {
106
+ return __generator(this, function (_a) {
107
+ switch (_a.label) {
108
+ case 0: return [4 /*yield*/, spannerDriver.runDml(function () { return ({
109
+ sql: "INSERT INTO `".concat(walkTable.name, "` (`id`, `created`, `updated`, `scope`, `title`, `body`) ") +
110
+ "VALUES ('".concat(id, "', CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP(), '").concat(OWNER, "', '").concat(title, "', '").concat(body, "')"),
111
+ }); })];
112
+ case 1:
113
+ _a.sent();
114
+ return [2 /*return*/];
115
+ }
116
+ });
117
+ }); };
118
+ var titleLike = function (pattern) {
119
+ return new db_1.QueryBuilder(walkTable.name).condition({ field: 'title', operator: 'LIKE', value: pattern });
120
+ };
121
+ /**
122
+ * The one reusable ONLINE backfill behind every config transition (encrypt-in-place
123
+ * adoption, add-searchable tokenization, decrypt-out, key rotation) — idempotent,
124
+ * resumable, migration-runner-shaped.
125
+ */
126
+ describe('Encryption lifecycle walker', function () {
127
+ var dropTable = (0, getDropTestTable_1.getDropTestTable)(spannerDriver);
128
+ var tableManager = spannerDriver.getTableManager();
129
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
130
+ return __generator(this, function (_a) {
131
+ switch (_a.label) {
132
+ case 0: return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.ensureProvisioned({
133
+ projectId: 'proteinjs-test',
134
+ instanceName: 'proteinjs-test',
135
+ databaseName: 'test',
136
+ })];
137
+ case 1:
138
+ _a.sent();
139
+ (0, test_1.registerTestUser)();
140
+ (0, db_1.setDbEncryptionConfig)({
141
+ masterKeyProvider: new db_1.InMemoryMasterKeyProvider('column-encryption-test'),
142
+ getAccessibleKeyOwners: function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
143
+ return [2 /*return*/, [OWNER]];
144
+ }); }); },
145
+ });
146
+ return [4 /*yield*/, (0, columnEncryptionTestHarness_1.loadColumnEncryptionTestSchema)(tableManager, [walkTable])];
147
+ case 2:
148
+ _a.sent();
149
+ return [4 /*yield*/, (0, columnEncryptionTestHarness_1.purgeColumnEncryptionTestRows)(spannerDriver, [walkTable])];
150
+ case 3:
151
+ _a.sent();
152
+ return [2 /*return*/];
153
+ }
154
+ });
155
+ }); }, 120000);
156
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
157
+ return __generator(this, function (_a) {
158
+ switch (_a.label) {
159
+ case 0:
160
+ (0, db_1.setDbEncryptionConfig)(undefined);
161
+ (0, test_1.clearTestUser)();
162
+ return [4 /*yield*/, dropTable(new db_1.EncryptedColumns().tokenTableFor(walkTable))];
163
+ case 1:
164
+ _a.sent();
165
+ return [4 /*yield*/, dropTable(walkTable)];
166
+ case 2:
167
+ _a.sent();
168
+ return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.release()];
169
+ case 3:
170
+ _a.sent();
171
+ return [2 /*return*/];
172
+ }
173
+ });
174
+ }); }, 120000);
175
+ afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
176
+ var tokenTable;
177
+ return __generator(this, function (_a) {
178
+ switch (_a.label) {
179
+ case 0: return [4 /*yield*/, spannerDriver.runDml(function () { return ({ sql: "DELETE FROM `".concat(walkTable.name, "` WHERE TRUE") }); })];
180
+ case 1:
181
+ _a.sent();
182
+ tokenTable = new db_1.EncryptedColumns().tokenTableFor(walkTable);
183
+ return [4 /*yield*/, spannerDriver.runDml(function () { return ({ sql: "DELETE FROM `".concat(tokenTable.name, "` WHERE TRUE") }); })];
184
+ case 2:
185
+ _a.sent();
186
+ return [2 /*return*/];
187
+ }
188
+ });
189
+ }); });
190
+ test('encrypt-in-place adoption: plaintext rows become envelopes, search works, live rows are skipped (idempotence)', function () { return __awaiter(void 0, void 0, void 0, function () {
191
+ var liveRow, summary, _i, _a, raw, found, _b, rerun;
192
+ return __generator(this, function (_c) {
193
+ switch (_c.label) {
194
+ case 0:
195
+ // the pre-encryption estate
196
+ return [4 /*yield*/, seedPlaintextRow('walk-adopt-1', 'meeting notes alpha', 'body one')];
197
+ case 1:
198
+ // the pre-encryption estate
199
+ _c.sent();
200
+ return [4 /*yield*/, seedPlaintextRow('walk-adopt-2', 'meeting notes beta', 'body two')];
201
+ case 2:
202
+ _c.sent();
203
+ return [4 /*yield*/, seedPlaintextRow('walk-adopt-3', 'unrelated title', 'body three')];
204
+ case 3:
205
+ _c.sent();
206
+ return [4 /*yield*/, db.insert(walkTable, { scope: OWNER, title: 'live row gamma', body: 'live body' })];
207
+ case 4:
208
+ liveRow = _c.sent();
209
+ return [4 /*yield*/, walker.walkTable(walkTable, 'encrypt', {
210
+ dbDriver: spannerDriver,
211
+ db: systemDb,
212
+ windowSize: 2, // exercise multi-window cursor paging
213
+ })];
214
+ case 5:
215
+ summary = _c.sent();
216
+ expect(summary.scanned).toBe(4);
217
+ expect(summary.rewritten).toBe(3); // the three plaintext rows; the live row skipped
218
+ _i = 0;
219
+ return [4 /*yield*/, rawRows()];
220
+ case 6:
221
+ _a = _c.sent();
222
+ _c.label = 7;
223
+ case 7:
224
+ if (!(_i < _a.length)) return [3 /*break*/, 9];
225
+ raw = _a[_i];
226
+ expect(envelope.isEnvelope(raw.title)).toBe(true);
227
+ expect(envelope.isEnvelope(raw.body)).toBe(true);
228
+ _c.label = 8;
229
+ case 8:
230
+ _i++;
231
+ return [3 /*break*/, 7];
232
+ case 9: return [4 /*yield*/, db.query(walkTable, titleLike('%meeting notes%'))];
233
+ case 10:
234
+ found = _c.sent();
235
+ expect(found.map(function (row) { return row.title; }).sort()).toEqual(['meeting notes alpha', 'meeting notes beta']);
236
+ // and values still read back exactly
237
+ _b = expect;
238
+ return [4 /*yield*/, db.get(walkTable, { id: 'walk-adopt-1' })];
239
+ case 11:
240
+ // and values still read back exactly
241
+ _b.apply(void 0, [(_c.sent()).body]).toBe('body one');
242
+ return [4 /*yield*/, walker.walkTable(walkTable, 'encrypt', { dbDriver: spannerDriver, db: systemDb })];
243
+ case 12:
244
+ rerun = _c.sent();
245
+ expect(rerun.scanned).toBe(4);
246
+ expect(rerun.rewritten).toBe(0);
247
+ void liveRow;
248
+ return [2 /*return*/];
249
+ }
250
+ });
251
+ }); });
252
+ test('resumability: a walk resumed from a cursor completes the remainder; done rows stay done', function () { return __awaiter(void 0, void 0, void 0, function () {
253
+ var partial, finish, _i, _a, raw;
254
+ return __generator(this, function (_b) {
255
+ switch (_b.label) {
256
+ case 0: return [4 /*yield*/, seedPlaintextRow('walk-resume-1', 'resume one', 'b')];
257
+ case 1:
258
+ _b.sent();
259
+ return [4 /*yield*/, seedPlaintextRow('walk-resume-2', 'resume two', 'b')];
260
+ case 2:
261
+ _b.sent();
262
+ return [4 /*yield*/, seedPlaintextRow('walk-resume-3', 'resume three', 'b')];
263
+ case 3:
264
+ _b.sent();
265
+ return [4 /*yield*/, walker.walkTable(walkTable, 'encrypt', {
266
+ dbDriver: spannerDriver,
267
+ db: systemDb,
268
+ startAfterId: 'walk-resume-1',
269
+ })];
270
+ case 4:
271
+ partial = _b.sent();
272
+ expect(partial.rewritten).toBe(2);
273
+ return [4 /*yield*/, walker.walkTable(walkTable, 'encrypt', { dbDriver: spannerDriver, db: systemDb })];
274
+ case 5:
275
+ finish = _b.sent();
276
+ expect(finish.rewritten).toBe(1); // only the row the partial walk never reached
277
+ _i = 0;
278
+ return [4 /*yield*/, rawRows()];
279
+ case 6:
280
+ _a = _b.sent();
281
+ _b.label = 7;
282
+ case 7:
283
+ if (!(_i < _a.length)) return [3 /*break*/, 9];
284
+ raw = _a[_i];
285
+ expect(envelope.isEnvelope(raw.title)).toBe(true);
286
+ _b.label = 8;
287
+ case 8:
288
+ _i++;
289
+ return [3 /*break*/, 7];
290
+ case 9: return [2 /*return*/];
291
+ }
292
+ });
293
+ }); });
294
+ test('decrypt-out reclassification: envelopes become plaintext, token rows are swept', function () { return __awaiter(void 0, void 0, void 0, function () {
295
+ var decryptedView, summary, _i, _a, raw, tokenTable, tokenCount;
296
+ return __generator(this, function (_b) {
297
+ switch (_b.label) {
298
+ case 0: return [4 /*yield*/, db.insert(walkTable, { scope: OWNER, title: 'soon public alpha', body: 'body a' })];
299
+ case 1:
300
+ _b.sent();
301
+ return [4 /*yield*/, db.insert(walkTable, { scope: OWNER, title: 'soon public beta', body: 'body b' })];
302
+ case 2:
303
+ _b.sent();
304
+ decryptedView = new EncWalkRowDecryptedView();
305
+ return [4 /*yield*/, walker.walkTable(decryptedView, 'decrypt', {
306
+ dbDriver: spannerDriver,
307
+ db: systemDb,
308
+ columns: ['title', 'body'],
309
+ })];
310
+ case 3:
311
+ summary = _b.sent();
312
+ expect(summary.rewritten).toBe(2);
313
+ _i = 0;
314
+ return [4 /*yield*/, rawRows()];
315
+ case 4:
316
+ _a = _b.sent();
317
+ _b.label = 5;
318
+ case 5:
319
+ if (!(_i < _a.length)) return [3 /*break*/, 7];
320
+ raw = _a[_i];
321
+ expect(envelope.isEnvelope(raw.title)).toBe(false);
322
+ expect(raw.title).toContain('soon public');
323
+ _b.label = 6;
324
+ case 6:
325
+ _i++;
326
+ return [3 /*break*/, 5];
327
+ case 7:
328
+ tokenTable = new db_1.EncryptedColumns().tokenTableFor(walkTable);
329
+ return [4 /*yield*/, spannerDriver.runQuery(function () { return ({
330
+ sql: "SELECT COUNT(*) as tokenCount FROM `".concat(tokenTable.name, "`"),
331
+ }); })];
332
+ case 8:
333
+ tokenCount = _b.sent();
334
+ expect(Number(tokenCount[0].tokenCount)).toBe(0);
335
+ return [2 /*return*/];
336
+ }
337
+ });
338
+ }); });
339
+ test('key rotation: rotate mints a new version, the walk rewrites envelopes to it, search stays exact, old version retires', function () { return __awaiter(void 0, void 0, void 0, function () {
340
+ var row1, row2, store, versionBefore, _a, _b, newVersion, _c, _d, summary, _i, _e, raw, rerun, _f, found;
341
+ return __generator(this, function (_g) {
342
+ switch (_g.label) {
343
+ case 0: return [4 /*yield*/, db.insert(walkTable, { scope: OWNER, title: 'rotation subject one', body: 'rb1' })];
344
+ case 1:
345
+ row1 = _g.sent();
346
+ return [4 /*yield*/, db.insert(walkTable, { scope: OWNER, title: 'rotation subject two', body: 'rb2' })];
347
+ case 2:
348
+ row2 = _g.sent();
349
+ store = new db_1.DataKeyStore();
350
+ _b = (_a = envelope).parse;
351
+ return [4 /*yield*/, rawRows()];
352
+ case 3:
353
+ versionBefore = _b.apply(_a, [(_g.sent())[0].title]).version;
354
+ return [4 /*yield*/, store.rotateKey(OWNER)];
355
+ case 4:
356
+ newVersion = _g.sent();
357
+ expect(newVersion).toBe(versionBefore + 1);
358
+ // during the rotation window (before the walk), reads and search still work
359
+ _c = expect;
360
+ return [4 /*yield*/, db.get(walkTable, { id: row1.id })];
361
+ case 5:
362
+ // during the rotation window (before the walk), reads and search still work
363
+ _c.apply(void 0, [(_g.sent()).title]).toBe('rotation subject one');
364
+ _d = expect;
365
+ return [4 /*yield*/, db.query(walkTable, titleLike('%rotation subject%'))];
366
+ case 6:
367
+ _d.apply(void 0, [(_g.sent()).length]).toBe(2);
368
+ return [4 /*yield*/, walker.walkTable(walkTable, 'rotate-keys', { dbDriver: spannerDriver, db: systemDb })];
369
+ case 7:
370
+ summary = _g.sent();
371
+ expect(summary.rewritten).toBe(2);
372
+ _i = 0;
373
+ return [4 /*yield*/, rawRows()];
374
+ case 8:
375
+ _e = _g.sent();
376
+ _g.label = 9;
377
+ case 9:
378
+ if (!(_i < _e.length)) return [3 /*break*/, 11];
379
+ raw = _e[_i];
380
+ expect(envelope.parse(raw.title).version).toBe(newVersion);
381
+ expect(envelope.parse(raw.body).version).toBe(newVersion);
382
+ _g.label = 10;
383
+ case 10:
384
+ _i++;
385
+ return [3 /*break*/, 9];
386
+ case 11: return [4 /*yield*/, walker.walkTable(walkTable, 'rotate-keys', { dbDriver: spannerDriver, db: systemDb })];
387
+ case 12:
388
+ rerun = _g.sent();
389
+ expect(rerun.rewritten).toBe(0);
390
+ // retire the old version: reads and search remain exact on the new key
391
+ return [4 /*yield*/, store.retireKeyVersion(OWNER, versionBefore)];
392
+ case 13:
393
+ // retire the old version: reads and search remain exact on the new key
394
+ _g.sent();
395
+ _f = expect;
396
+ return [4 /*yield*/, db.get(walkTable, { id: row2.id })];
397
+ case 14:
398
+ _f.apply(void 0, [(_g.sent()).title]).toBe('rotation subject two');
399
+ return [4 /*yield*/, db.query(walkTable, titleLike('%rotation subject%'))];
400
+ case 15:
401
+ found = _g.sent();
402
+ expect(found.length).toBe(2);
403
+ return [2 /*return*/];
404
+ }
405
+ });
406
+ }); });
407
+ });
408
+ //# sourceMappingURL=EncryptionLifecycleWalker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncryptionLifecycleWalker.test.js","sourceRoot":"","sources":["../../test/EncryptionLifecycleWalker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '../generated/test/index';
2
+ //# sourceMappingURL=EncryptionPerf.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EncryptionPerf.test.d.ts","sourceRoot":"","sources":["../../test/EncryptionPerf.test.ts"],"names":[],"mappings":"AAgBA,OAAO,yBAAyB,CAAC"}