@proteinjs/db-file 1.4.15 → 1.5.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 (64) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/generated/index.d.ts.map +1 -1
  3. package/dist/generated/index.js +3 -1
  4. package/dist/generated/index.js.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/DbFileStorageDriver.d.ts +2 -1
  10. package/dist/src/DbFileStorageDriver.d.ts.map +1 -1
  11. package/dist/src/DbFileStorageDriver.js +23 -7
  12. package/dist/src/DbFileStorageDriver.js.map +1 -1
  13. package/dist/src/FileStorage.d.ts +24 -6
  14. package/dist/src/FileStorage.d.ts.map +1 -1
  15. package/dist/src/FileStorage.js +57 -22
  16. package/dist/src/FileStorage.js.map +1 -1
  17. package/dist/src/FileStorageDriver.d.ts +26 -1
  18. package/dist/src/FileStorageDriver.d.ts.map +1 -1
  19. package/dist/src/FileStorageTableWatcher.d.ts +18 -0
  20. package/dist/src/FileStorageTableWatcher.d.ts.map +1 -0
  21. package/dist/src/FileStorageTableWatcher.js +96 -0
  22. package/dist/src/FileStorageTableWatcher.js.map +1 -0
  23. package/dist/src/routes/getFile.d.ts +11 -0
  24. package/dist/src/routes/getFile.d.ts.map +1 -1
  25. package/dist/src/routes/getFile.js +31 -15
  26. package/dist/src/routes/getFile.js.map +1 -1
  27. package/dist/src/tables/FileTable.d.ts +12 -4
  28. package/dist/src/tables/FileTable.d.ts.map +1 -1
  29. package/dist/src/tables/FileTable.js +5 -7
  30. package/dist/src/tables/FileTable.js.map +1 -1
  31. package/dist/test/FileMediaMetadata.test.d.ts +2 -0
  32. package/dist/test/FileMediaMetadata.test.d.ts.map +1 -0
  33. package/dist/test/FileMediaMetadata.test.js +154 -0
  34. package/dist/test/FileMediaMetadata.test.js.map +1 -0
  35. package/dist/test/FileStorageDeleteFile.test.d.ts +2 -0
  36. package/dist/test/FileStorageDeleteFile.test.d.ts.map +1 -0
  37. package/dist/test/FileStorageDeleteFile.test.js +259 -0
  38. package/dist/test/FileStorageDeleteFile.test.js.map +1 -0
  39. package/dist/test/FileTestEnvironment.d.ts +33 -0
  40. package/dist/test/FileTestEnvironment.d.ts.map +1 -0
  41. package/dist/test/FileTestEnvironment.js +229 -0
  42. package/dist/test/FileTestEnvironment.js.map +1 -0
  43. package/dist/test/GetFileRoute.test.d.ts +2 -0
  44. package/dist/test/GetFileRoute.test.d.ts.map +1 -0
  45. package/dist/test/GetFileRoute.test.js +432 -0
  46. package/dist/test/GetFileRoute.test.js.map +1 -0
  47. package/generated/index.ts +3 -1
  48. package/index.ts +1 -0
  49. package/jest.config.js +4 -0
  50. package/package.json +5 -3
  51. package/src/DbFileStorageDriver.ts +18 -8
  52. package/src/FileStorage.ts +48 -23
  53. package/src/FileStorageDriver.ts +24 -1
  54. package/src/FileStorageTableWatcher.ts +43 -0
  55. package/src/routes/getFile.ts +26 -8
  56. package/src/tables/FileTable.ts +14 -7
  57. package/test/FileMediaMetadata.test.ts +74 -0
  58. package/test/FileStorageDeleteFile.test.ts +128 -0
  59. package/test/FileTestEnvironment.ts +118 -0
  60. package/test/GetFileRoute.test.ts +258 -0
  61. package/test/emulatorLock.globalSetup.js +11 -0
  62. package/test/emulatorLock.globalTeardown.js +8 -0
  63. package/test/emulatorLock.js +124 -0
  64. package/test/setup.js +2 -0
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ var db_1 = require("@proteinjs/db");
40
+ var user_1 = require("@proteinjs/user");
41
+ var tables_1 = require("../src/tables/tables");
42
+ var FileStorage_1 = require("../src/FileStorage");
43
+ var DbFileStorageDriver_1 = require("../src/DbFileStorageDriver");
44
+ var FileTestEnvironment_1 = require("./FileTestEnvironment");
45
+ /**
46
+ * In-memory byte store shaped like the GoogleCloudStorageDriver: bytes keyed by file id,
47
+ * reads of a missing object fail loudly (GCS 404 semantics).
48
+ */
49
+ var TestMemoryFileStorageDriver = /** @class */ (function () {
50
+ function TestMemoryFileStorageDriver() {
51
+ this.store = new Map();
52
+ }
53
+ TestMemoryFileStorageDriver.prototype.createFile = function (file, fileData) {
54
+ return __awaiter(this, void 0, void 0, function () {
55
+ return __generator(this, function (_a) {
56
+ this.store.set(file.id, fileData);
57
+ return [2 /*return*/];
58
+ });
59
+ });
60
+ };
61
+ TestMemoryFileStorageDriver.prototype.getFileData = function (fileId) {
62
+ return __awaiter(this, void 0, void 0, function () {
63
+ var data;
64
+ return __generator(this, function (_a) {
65
+ data = this.store.get(fileId);
66
+ if (data === undefined) {
67
+ throw new Error("No such object: ".concat(fileId));
68
+ }
69
+ return [2 /*return*/, data];
70
+ });
71
+ });
72
+ };
73
+ TestMemoryFileStorageDriver.prototype.updateFileData = function (fileId, data) {
74
+ return __awaiter(this, void 0, void 0, function () {
75
+ return __generator(this, function (_a) {
76
+ this.store.set(fileId, data);
77
+ return [2 /*return*/];
78
+ });
79
+ });
80
+ };
81
+ TestMemoryFileStorageDriver.prototype.updateFile = function (_file) {
82
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
83
+ return [2 /*return*/];
84
+ }); });
85
+ };
86
+ TestMemoryFileStorageDriver.prototype.deleteFile = function (fileId) {
87
+ return __awaiter(this, void 0, void 0, function () {
88
+ return __generator(this, function (_a) {
89
+ this.store.delete(fileId);
90
+ return [2 /*return*/];
91
+ });
92
+ });
93
+ };
94
+ return TestMemoryFileStorageDriver;
95
+ }());
96
+ var testEnv = new FileTestEnvironment_1.FileTestEnvironment();
97
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
98
+ var user;
99
+ return __generator(this, function (_a) {
100
+ switch (_a.label) {
101
+ case 0: return [4 /*yield*/, testEnv.beforeAll()];
102
+ case 1:
103
+ _a.sent();
104
+ return [4 /*yield*/, testEnv.createUser({ name: 'File owner', email: 'file-owner@test.local' })];
105
+ case 2:
106
+ user = _a.sent();
107
+ testEnv.actAs(user);
108
+ return [2 /*return*/];
109
+ }
110
+ });
111
+ }); });
112
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
113
+ return __generator(this, function (_a) {
114
+ switch (_a.label) {
115
+ case 0: return [4 /*yield*/, testEnv.afterAll()];
116
+ case 1:
117
+ _a.sent();
118
+ return [2 /*return*/];
119
+ }
120
+ });
121
+ }); });
122
+ describe('FileStorage.deleteFile', function () {
123
+ var driver = new TestMemoryFileStorageDriver();
124
+ beforeAll(function () {
125
+ testEnv.setDriver(driver);
126
+ });
127
+ it('deletes the stored bytes along with the file row', function () { return __awaiter(void 0, void 0, void 0, function () {
128
+ var fileStorage, file, _a;
129
+ return __generator(this, function (_b) {
130
+ switch (_b.label) {
131
+ case 0:
132
+ fileStorage = new FileStorage_1.FileStorage();
133
+ return [4 /*yield*/, fileStorage.createFile({ name: 'a.txt', type: 'text/plain', size: 5 }, 'hello')];
134
+ case 1:
135
+ file = _b.sent();
136
+ expect(driver.store.has(file.id)).toBe(true);
137
+ return [4 /*yield*/, fileStorage.deleteFile(file.id)];
138
+ case 2:
139
+ _b.sent();
140
+ _a = expect;
141
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(tables_1.tables.File, { id: file.id })];
142
+ case 3:
143
+ _a.apply(void 0, [_b.sent()]).toBeUndefined();
144
+ expect(driver.store.has(file.id)).toBe(false);
145
+ return [2 /*return*/];
146
+ }
147
+ });
148
+ }); });
149
+ it('deletes the stored bytes when file rows are deleted directly through Db.delete (system sweep path)', function () { return __awaiter(void 0, void 0, void 0, function () {
150
+ var fileStorage, file, _a;
151
+ return __generator(this, function (_b) {
152
+ switch (_b.label) {
153
+ case 0:
154
+ fileStorage = new FileStorage_1.FileStorage();
155
+ return [4 /*yield*/, fileStorage.createFile({ name: 'b.txt', type: 'text/plain', size: 5 }, 'swept')];
156
+ case 1:
157
+ file = _b.sent();
158
+ expect(driver.store.has(file.id)).toBe(true);
159
+ return [4 /*yield*/, (0, user_1.getScopedDbAsSystem)().delete(tables_1.tables.File, { id: file.id })];
160
+ case 2:
161
+ _b.sent();
162
+ _a = expect;
163
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(tables_1.tables.File, { id: file.id })];
164
+ case 3:
165
+ _a.apply(void 0, [_b.sent()]).toBeUndefined();
166
+ expect(driver.store.has(file.id)).toBe(false);
167
+ return [2 /*return*/];
168
+ }
169
+ });
170
+ }); });
171
+ it('deletes the preview file bytes through the reference cascade', function () { return __awaiter(void 0, void 0, void 0, function () {
172
+ var fileStorage, preview, file, _a, _b;
173
+ return __generator(this, function (_c) {
174
+ switch (_c.label) {
175
+ case 0:
176
+ fileStorage = new FileStorage_1.FileStorage();
177
+ return [4 /*yield*/, fileStorage.createFile({ name: 'c.gif.preview', type: 'image/png', size: 4 }, 'PREV')];
178
+ case 1:
179
+ preview = _c.sent();
180
+ return [4 /*yield*/, fileStorage.createFile({
181
+ name: 'c.gif',
182
+ type: 'image/gif',
183
+ size: 4,
184
+ preview: new db_1.Reference(tables_1.tables.File.name, preview.id),
185
+ }, 'MAIN')];
186
+ case 2:
187
+ file = _c.sent();
188
+ return [4 /*yield*/, fileStorage.deleteFile(file.id)];
189
+ case 3:
190
+ _c.sent();
191
+ _a = expect;
192
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(tables_1.tables.File, { id: file.id })];
193
+ case 4:
194
+ _a.apply(void 0, [_c.sent()]).toBeUndefined();
195
+ _b = expect;
196
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(tables_1.tables.File, { id: preview.id })];
197
+ case 5:
198
+ _b.apply(void 0, [_c.sent()]).toBeUndefined();
199
+ expect(driver.store.has(file.id)).toBe(false);
200
+ expect(driver.store.has(preview.id)).toBe(false);
201
+ return [2 /*return*/];
202
+ }
203
+ });
204
+ }); });
205
+ });
206
+ describe('FileStorage.deleteFile with DbFileStorageDriver', function () {
207
+ beforeAll(function () {
208
+ // 4-byte chunks so a small payload exercises multi-chunk cleanup.
209
+ testEnv.setDriver(new DbFileStorageDriver_1.DbFileStorageDriver(4));
210
+ });
211
+ it('deletes all file_data chunk rows along with the file row', function () { return __awaiter(void 0, void 0, void 0, function () {
212
+ var fileStorage, file, chunksBefore, _a, _b;
213
+ return __generator(this, function (_c) {
214
+ switch (_c.label) {
215
+ case 0:
216
+ fileStorage = new FileStorage_1.FileStorage();
217
+ return [4 /*yield*/, fileStorage.createFile({ name: 'd.txt', type: 'text/plain', size: 11 }, 'hello world')];
218
+ case 1:
219
+ file = _c.sent();
220
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(tables_1.tables.FileData, { file: file.id })];
221
+ case 2:
222
+ chunksBefore = _c.sent();
223
+ expect(chunksBefore.length).toBeGreaterThan(1);
224
+ return [4 /*yield*/, fileStorage.deleteFile(file.id)];
225
+ case 3:
226
+ _c.sent();
227
+ _a = expect;
228
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(tables_1.tables.File, { id: file.id })];
229
+ case 4:
230
+ _a.apply(void 0, [_c.sent()]).toBeUndefined();
231
+ _b = expect;
232
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().query(tables_1.tables.FileData, { file: file.id })];
233
+ case 5:
234
+ _b.apply(void 0, [_c.sent()]).toHaveLength(0);
235
+ return [2 /*return*/];
236
+ }
237
+ });
238
+ }); });
239
+ it('deleteFile is idempotent: deleting bytes that are already gone succeeds', function () { return __awaiter(void 0, void 0, void 0, function () {
240
+ var fileStorage, file;
241
+ return __generator(this, function (_a) {
242
+ switch (_a.label) {
243
+ case 0:
244
+ fileStorage = new FileStorage_1.FileStorage();
245
+ return [4 /*yield*/, fileStorage.createFile({ name: 'e.txt', type: 'text/plain', size: 5 }, 'again')];
246
+ case 1:
247
+ file = _a.sent();
248
+ return [4 /*yield*/, fileStorage.deleteFile(file.id)];
249
+ case 2:
250
+ _a.sent();
251
+ return [4 /*yield*/, expect(FileStorage_1.FileStorage.getDriver().deleteFile(file.id)).resolves.toBeUndefined()];
252
+ case 3:
253
+ _a.sent();
254
+ return [2 /*return*/];
255
+ }
256
+ });
257
+ }); });
258
+ });
259
+ //# sourceMappingURL=FileStorageDeleteFile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileStorageDeleteFile.test.js","sourceRoot":"","sources":["../../test/FileStorageDeleteFile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { SpannerDriver } from '@proteinjs/db-driver-spanner';
2
+ import { User } from '@proteinjs/user';
3
+ import { FileStorageDriver } from '../src/FileStorageDriver';
4
+ /**
5
+ * Emulator-backed test environment for db-file integration tests (Spanner emulator on
6
+ * SPANNER_EMULATOR_HOST, provisioned on demand). Same shape as user-server's
7
+ * UserServerTestEnvironment: seed deterministic session storage + db driver + file storage driver
8
+ * into the SourceRepository cache, load the tables the suites touch, drop them on the way out.
9
+ */
10
+ export declare class FileTestEnvironment {
11
+ readonly spannerDriver: SpannerDriver;
12
+ private dropTestTable;
13
+ private userRepo;
14
+ beforeAll(): Promise<void>;
15
+ afterAll(): Promise<void>;
16
+ /**
17
+ * Make `driver` the resolved FileStorageDriver: seeds the DefaultFileStorageDriverFactory the
18
+ * driver resolution reads and clears the cached instance so the next resolution re-reads it.
19
+ */
20
+ setDriver(driver: FileStorageDriver): void;
21
+ /** Insert a user row (as system) and return it. */
22
+ createUser(args: {
23
+ name: string;
24
+ email: string;
25
+ roles?: string[];
26
+ }): Promise<User>;
27
+ /** Seed the session cache with `user` — the identity service calls and scoped db ops run under. */
28
+ actAs(user: User): void;
29
+ private objectCache;
30
+ private loadTables;
31
+ private dropTables;
32
+ }
33
+ //# sourceMappingURL=FileTestEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTestEnvironment.d.ts","sourceRoot":"","sources":["../../test/FileTestEnvironment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAI7D,OAAO,EAAwB,IAAI,EAAY,MAAM,iBAAiB,CAAC;AAGvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAqB7D;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,aAAa,gBAInB;IACH,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAkB;IAE5B,SAAS;IA0BT,QAAQ;IAMd;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,iBAAiB;IAKnC,mDAAmD;IAC7C,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxF,mGAAmG;IACnG,KAAK,CAAC,IAAI,EAAE,IAAI;IAIhB,OAAO,CAAC,WAAW;YAIL,UAAU;YAOV,UAAU;CAKzB"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
39
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
40
+ if (ar || !(i in from)) {
41
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
42
+ ar[i] = from[i];
43
+ }
44
+ }
45
+ return to.concat(ar || Array.prototype.slice.call(from));
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.FileTestEnvironment = void 0;
49
+ var db_1 = require("@proteinjs/db");
50
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
51
+ var test_1 = require("@proteinjs/db-driver-spanner/test");
52
+ var server_api_1 = require("@proteinjs/server-api");
53
+ var reflection_1 = require("@proteinjs/reflection");
54
+ var user_1 = require("@proteinjs/user");
55
+ var tables_1 = require("../src/tables/tables");
56
+ var FileStorage_1 = require("../src/FileStorage");
57
+ var FileStorageTableWatcher_1 = require("../src/FileStorageTableWatcher");
58
+ /** In-memory SessionDataStorage seeded into the SourceRepository cache (tests don't load the
59
+ * generated source graph, so `Session` would otherwise find no implementation). */
60
+ var TestSessionDataStorage = /** @class */ (function () {
61
+ function TestSessionDataStorage() {
62
+ this.environment = 'node';
63
+ }
64
+ TestSessionDataStorage.prototype.setData = function (data) {
65
+ TestSessionDataStorage.data = data;
66
+ };
67
+ TestSessionDataStorage.prototype.getData = function () {
68
+ return TestSessionDataStorage.data;
69
+ };
70
+ return TestSessionDataStorage;
71
+ }());
72
+ /**
73
+ * Emulator-backed test environment for db-file integration tests (Spanner emulator on
74
+ * SPANNER_EMULATOR_HOST, provisioned on demand). Same shape as user-server's
75
+ * UserServerTestEnvironment: seed deterministic session storage + db driver + file storage driver
76
+ * into the SourceRepository cache, load the tables the suites touch, drop them on the way out.
77
+ */
78
+ var FileTestEnvironment = /** @class */ (function () {
79
+ function FileTestEnvironment() {
80
+ this.spannerDriver = new db_driver_spanner_1.SpannerDriver({
81
+ projectId: 'proteinjs-test',
82
+ instanceName: 'proteinjs-test',
83
+ databaseName: 'test',
84
+ });
85
+ this.dropTestTable = (0, test_1.getDropTestTable)(this.spannerDriver);
86
+ this.userRepo = new user_1.UserRepo();
87
+ }
88
+ FileTestEnvironment.prototype.beforeAll = function () {
89
+ return __awaiter(this, void 0, void 0, function () {
90
+ var objectCache;
91
+ var _this = this;
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0:
95
+ // The emulator wipes its in-memory instances on any container restart (and CI service
96
+ // containers start empty) — self-provision so suites never depend on out-of-band setup.
97
+ return [4 /*yield*/, test_1.SpannerEmulatorProvisioner.ensureProvisioned({
98
+ projectId: 'proteinjs-test',
99
+ instanceName: 'proteinjs-test',
100
+ databaseName: 'test',
101
+ })];
102
+ case 1:
103
+ // The emulator wipes its in-memory instances on any container restart (and CI service
104
+ // containers start empty) — self-provision so suites never depend on out-of-band setup.
105
+ _a.sent();
106
+ objectCache = this.objectCache();
107
+ objectCache['@proteinjs/server-api/SessionDataStorage'] = [new TestSessionDataStorage()];
108
+ objectCache['@proteinjs/db/DefaultDbDriverFactory'] = [{ getDbDriver: function () { return _this.spannerDriver; } }];
109
+ // Tests import src directly (no generated source graph), so the table registry that
110
+ // cascade machinery resolves through (`tableByName`) must be seeded explicitly.
111
+ objectCache['@proteinjs/db/Table'] = __spreadArray(__spreadArray([], Object.values(user_1.tables), true), Object.values(tables_1.tables), true);
112
+ // The byte-deletion seam under test: prod loads it from the generated source graph.
113
+ objectCache['@proteinjs/db/TableWatcher'] = [new FileStorageTableWatcher_1.FileStorageTableWatcher()];
114
+ server_api_1.Session.setData({
115
+ sessionId: 'test-session',
116
+ user: 'guest',
117
+ data: {},
118
+ });
119
+ return [4 /*yield*/, this.loadTables(user_1.tables)];
120
+ case 2:
121
+ _a.sent();
122
+ return [4 /*yield*/, this.loadTables(tables_1.tables)];
123
+ case 3:
124
+ _a.sent();
125
+ return [2 /*return*/];
126
+ }
127
+ });
128
+ });
129
+ };
130
+ FileTestEnvironment.prototype.afterAll = function () {
131
+ return __awaiter(this, void 0, void 0, function () {
132
+ return __generator(this, function (_a) {
133
+ switch (_a.label) {
134
+ case 0: return [4 /*yield*/, this.dropTables(tables_1.tables)];
135
+ case 1:
136
+ _a.sent();
137
+ return [4 /*yield*/, this.dropTables(user_1.tables)];
138
+ case 2:
139
+ _a.sent();
140
+ test_1.SpannerEmulatorProvisioner.release();
141
+ return [2 /*return*/];
142
+ }
143
+ });
144
+ });
145
+ };
146
+ /**
147
+ * Make `driver` the resolved FileStorageDriver: seeds the DefaultFileStorageDriverFactory the
148
+ * driver resolution reads and clears the cached instance so the next resolution re-reads it.
149
+ */
150
+ FileTestEnvironment.prototype.setDriver = function (driver) {
151
+ this.objectCache()['@proteinjs/db-file/DefaultFileStorageDriverFactory'] = [{ getDriver: function () { return driver; } }];
152
+ FileStorage_1.FileStorage.driver = undefined;
153
+ };
154
+ /** Insert a user row (as system) and return it. */
155
+ FileTestEnvironment.prototype.createUser = function (args) {
156
+ var _a;
157
+ return __awaiter(this, void 0, void 0, function () {
158
+ return __generator(this, function (_b) {
159
+ switch (_b.label) {
160
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().insert(user_1.tables.User, {
161
+ name: args.name,
162
+ email: args.email,
163
+ password: 'test',
164
+ emailVerified: true,
165
+ roles: (_a = args.roles) !== null && _a !== void 0 ? _a : [],
166
+ })];
167
+ case 1: return [2 /*return*/, _b.sent()];
168
+ }
169
+ });
170
+ });
171
+ };
172
+ /** Seed the session cache with `user` — the identity service calls and scoped db ops run under. */
173
+ FileTestEnvironment.prototype.actAs = function (user) {
174
+ this.userRepo.setUser(user);
175
+ };
176
+ FileTestEnvironment.prototype.objectCache = function () {
177
+ return reflection_1.SourceRepository.get().objectCache;
178
+ };
179
+ FileTestEnvironment.prototype.loadTables = function (tables) {
180
+ return __awaiter(this, void 0, void 0, function () {
181
+ var dbDriver, _i, _a, table;
182
+ return __generator(this, function (_b) {
183
+ switch (_b.label) {
184
+ case 0:
185
+ dbDriver = db_1.Db.getDefaultDbDriver();
186
+ _i = 0, _a = Object.values(tables);
187
+ _b.label = 1;
188
+ case 1:
189
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
190
+ table = _a[_i];
191
+ return [4 /*yield*/, dbDriver.getTableManager().loadTable(table)];
192
+ case 2:
193
+ _b.sent();
194
+ _b.label = 3;
195
+ case 3:
196
+ _i++;
197
+ return [3 /*break*/, 1];
198
+ case 4: return [2 /*return*/];
199
+ }
200
+ });
201
+ });
202
+ };
203
+ FileTestEnvironment.prototype.dropTables = function (tables) {
204
+ return __awaiter(this, void 0, void 0, function () {
205
+ var _i, _a, table;
206
+ return __generator(this, function (_b) {
207
+ switch (_b.label) {
208
+ case 0:
209
+ _i = 0, _a = Object.values(tables);
210
+ _b.label = 1;
211
+ case 1:
212
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
213
+ table = _a[_i];
214
+ return [4 /*yield*/, this.dropTestTable(table)];
215
+ case 2:
216
+ _b.sent();
217
+ _b.label = 3;
218
+ case 3:
219
+ _i++;
220
+ return [3 /*break*/, 1];
221
+ case 4: return [2 /*return*/];
222
+ }
223
+ });
224
+ });
225
+ };
226
+ return FileTestEnvironment;
227
+ }());
228
+ exports.FileTestEnvironment = FileTestEnvironment;
229
+ //# sourceMappingURL=FileTestEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTestEnvironment.js","sourceRoot":"","sources":["../../test/FileTestEnvironment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GetFileRoute.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetFileRoute.test.d.ts","sourceRoot":"","sources":["../../test/GetFileRoute.test.ts"],"names":[],"mappings":""}