@proteinjs/user-server 1.5.4 → 1.7.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 (67) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/generated/index.d.ts +1 -4
  3. package/dist/generated/index.d.ts.map +1 -1
  4. package/dist/generated/index.js +4 -5
  5. package/dist/generated/index.js.map +1 -1
  6. package/dist/src/authorization/userCache.d.ts.map +1 -1
  7. package/dist/src/authorization/userCache.js +18 -3
  8. package/dist/src/authorization/userCache.js.map +1 -1
  9. package/dist/src/routes/avatar.d.ts +19 -0
  10. package/dist/src/routes/avatar.d.ts.map +1 -0
  11. package/dist/src/routes/avatar.js +108 -0
  12. package/dist/src/routes/avatar.js.map +1 -0
  13. package/dist/src/routes/devLogin.d.ts +15 -5
  14. package/dist/src/routes/devLogin.d.ts.map +1 -1
  15. package/dist/src/routes/devLogin.js +61 -13
  16. package/dist/src/routes/devLogin.js.map +1 -1
  17. package/dist/src/services/Signup.d.ts +16 -1
  18. package/dist/src/services/Signup.d.ts.map +1 -1
  19. package/dist/src/services/Signup.js +49 -15
  20. package/dist/src/services/Signup.js.map +1 -1
  21. package/dist/src/services/UpdateUserInfo.d.ts +40 -2
  22. package/dist/src/services/UpdateUserInfo.d.ts.map +1 -1
  23. package/dist/src/services/UpdateUserInfo.js +183 -12
  24. package/dist/src/services/UpdateUserInfo.js.map +1 -1
  25. package/dist/test/DevLogin.test.d.ts +2 -0
  26. package/dist/test/DevLogin.test.d.ts.map +1 -0
  27. package/dist/test/DevLogin.test.js +261 -0
  28. package/dist/test/DevLogin.test.js.map +1 -0
  29. package/dist/test/UpdateUserInfoAvatar.test.d.ts +2 -0
  30. package/dist/test/UpdateUserInfoAvatar.test.d.ts.map +1 -0
  31. package/dist/test/UpdateUserInfoAvatar.test.js +337 -0
  32. package/dist/test/UpdateUserInfoAvatar.test.js.map +1 -0
  33. package/dist/test/UpdateUserInfoSessionRefresh.test.d.ts +2 -0
  34. package/dist/test/UpdateUserInfoSessionRefresh.test.d.ts.map +1 -0
  35. package/dist/test/UpdateUserInfoSessionRefresh.test.js +94 -0
  36. package/dist/test/UpdateUserInfoSessionRefresh.test.js.map +1 -0
  37. package/dist/test/UserCacheMissingAccount.test.d.ts +2 -0
  38. package/dist/test/UserCacheMissingAccount.test.d.ts.map +1 -0
  39. package/dist/test/UserCacheMissingAccount.test.js +104 -0
  40. package/dist/test/UserCacheMissingAccount.test.js.map +1 -0
  41. package/dist/test/UserServerTestEnvironment.d.ts +26 -0
  42. package/dist/test/UserServerTestEnvironment.d.ts.map +1 -0
  43. package/dist/test/UserServerTestEnvironment.js +202 -0
  44. package/dist/test/UserServerTestEnvironment.js.map +1 -0
  45. package/dist/test/avatarRoute.test.d.ts +2 -0
  46. package/dist/test/avatarRoute.test.d.ts.map +1 -0
  47. package/dist/test/avatarRoute.test.js +222 -0
  48. package/dist/test/avatarRoute.test.js.map +1 -0
  49. package/generated/index.ts +4 -5
  50. package/jest.config.js +4 -1
  51. package/package.json +8 -5
  52. package/src/authorization/userCache.ts +17 -2
  53. package/src/heic-decode.d.ts +13 -0
  54. package/src/routes/avatar.ts +57 -0
  55. package/src/routes/devLogin.ts +50 -7
  56. package/src/services/Signup.ts +42 -11
  57. package/src/services/UpdateUserInfo.ts +124 -13
  58. package/test/DevLogin.test.ts +159 -0
  59. package/test/UpdateUserInfoAvatar.test.ts +174 -0
  60. package/test/UpdateUserInfoSessionRefresh.test.ts +37 -0
  61. package/test/UserCacheMissingAccount.test.ts +42 -0
  62. package/test/UserServerTestEnvironment.ts +97 -0
  63. package/test/avatarRoute.test.ts +111 -0
  64. package/test/emulatorLock.globalSetup.js +11 -0
  65. package/test/emulatorLock.globalTeardown.js +8 -0
  66. package/test/emulatorLock.js +124 -0
  67. package/test/fixtures/fixture.heic +0 -0
@@ -0,0 +1,261 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var sha256_1 = __importDefault(require("crypto-js/sha256"));
43
+ var db_1 = require("@proteinjs/db");
44
+ var user_1 = require("@proteinjs/user");
45
+ var devLogin_1 = require("../src/routes/devLogin");
46
+ var UserServerTestEnvironment_1 = require("./UserServerTestEnvironment");
47
+ var testEnv = new UserServerTestEnvironment_1.UserServerTestEnvironment();
48
+ /**
49
+ * `GET /dev/login` multi-user dev bootstrap. The route mints a session for the account named by
50
+ * `?email=` (absent → `DEV_AUTO_LOGIN_EMAIL`), auto-creating a missing account through the normal
51
+ * signup creation path (`Signup.createAccount`) so parallel agent-driven verification can
52
+ * self-serve distinct users. Two rails under test:
53
+ * - Double gate: `DEVELOPMENT` AND `DEV_AUTO_LOGIN_EMAIL` both present, else 404 (unchanged).
54
+ * - Domain rail: a `?email=` param must share `DEV_AUTO_LOGIN_EMAIL`'s domain — even a dev server
55
+ * must not mint sessions (much less accounts) for arbitrary domains. Others 400.
56
+ */
57
+ var ENV_EMAIL = 'dev@test.local';
58
+ var invokeDevLogin = function (query) { return __awaiter(void 0, void 0, void 0, function () {
59
+ var outcome, request, response;
60
+ return __generator(this, function (_a) {
61
+ switch (_a.label) {
62
+ case 0:
63
+ outcome = { sessionSaved: false };
64
+ request = {
65
+ query: query,
66
+ login: function (email, done) {
67
+ outcome.loggedInAs = email;
68
+ done();
69
+ },
70
+ session: {
71
+ save: function (done) {
72
+ outcome.sessionSaved = true;
73
+ done();
74
+ },
75
+ },
76
+ };
77
+ response = {
78
+ status: function (code) {
79
+ outcome.status = code;
80
+ return this;
81
+ },
82
+ send: function (body) {
83
+ outcome.body = body;
84
+ },
85
+ redirect: function (path) {
86
+ outcome.redirect = path;
87
+ },
88
+ };
89
+ return [4 /*yield*/, devLogin_1.devLogin.onRequest(request, response)];
90
+ case 1:
91
+ _a.sent();
92
+ return [2 /*return*/, outcome];
93
+ }
94
+ });
95
+ }); };
96
+ var getUserRow = function (email) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
97
+ switch (_a.label) {
98
+ case 0: return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { email: email })];
99
+ case 1: return [2 /*return*/, _a.sent()];
100
+ }
101
+ }); }); };
102
+ describe('devLogin route', function () {
103
+ var originalEnv = {
104
+ DEVELOPMENT: process.env.DEVELOPMENT,
105
+ DEV_AUTO_LOGIN_EMAIL: process.env.DEV_AUTO_LOGIN_EMAIL,
106
+ };
107
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
108
+ return __generator(this, function (_a) {
109
+ switch (_a.label) {
110
+ case 0: return [4 /*yield*/, testEnv.beforeAll()];
111
+ case 1:
112
+ _a.sent();
113
+ return [2 /*return*/];
114
+ }
115
+ });
116
+ }); });
117
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
118
+ return __generator(this, function (_a) {
119
+ switch (_a.label) {
120
+ case 0: return [4 /*yield*/, testEnv.afterAll()];
121
+ case 1:
122
+ _a.sent();
123
+ return [2 /*return*/];
124
+ }
125
+ });
126
+ }); });
127
+ beforeEach(function () {
128
+ process.env.DEVELOPMENT = 'true';
129
+ process.env.DEV_AUTO_LOGIN_EMAIL = ENV_EMAIL;
130
+ });
131
+ afterEach(function () {
132
+ for (var _i = 0, _a = Object.entries(originalEnv); _i < _a.length; _i++) {
133
+ var _b = _a[_i], key = _b[0], value = _b[1];
134
+ if (value === undefined) {
135
+ delete process.env[key];
136
+ }
137
+ else {
138
+ process.env[key] = value;
139
+ }
140
+ }
141
+ });
142
+ it('pins the default path: no ?email → session for DEV_AUTO_LOGIN_EMAIL, redirect to /', function () { return __awaiter(void 0, void 0, void 0, function () {
143
+ var outcome;
144
+ return __generator(this, function (_a) {
145
+ switch (_a.label) {
146
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Dev Default', email: ENV_EMAIL })];
147
+ case 1:
148
+ _a.sent();
149
+ return [4 /*yield*/, invokeDevLogin()];
150
+ case 2:
151
+ outcome = _a.sent();
152
+ expect(outcome.loggedInAs).toBe(ENV_EMAIL);
153
+ expect(outcome.sessionSaved).toBe(true);
154
+ expect(outcome.redirect).toBe('/');
155
+ expect(outcome.status).toBeUndefined();
156
+ return [2 /*return*/];
157
+ }
158
+ });
159
+ }); });
160
+ it('?email selects an existing same-domain account for the session', function () { return __awaiter(void 0, void 0, void 0, function () {
161
+ var outcome;
162
+ return __generator(this, function (_a) {
163
+ switch (_a.label) {
164
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Agent Two', email: 'agent2@test.local' })];
165
+ case 1:
166
+ _a.sent();
167
+ return [4 /*yield*/, invokeDevLogin({ email: 'agent2@test.local' })];
168
+ case 2:
169
+ outcome = _a.sent();
170
+ expect(outcome.loggedInAs).toBe('agent2@test.local');
171
+ expect(outcome.sessionSaved).toBe(true);
172
+ expect(outcome.redirect).toBe('/');
173
+ return [2 /*return*/];
174
+ }
175
+ });
176
+ }); });
177
+ it('?email for a nonexistent same-domain account creates it as a normal test user, then logs in', function () { return __awaiter(void 0, void 0, void 0, function () {
178
+ var _a, outcome, created;
179
+ return __generator(this, function (_b) {
180
+ switch (_b.label) {
181
+ case 0:
182
+ _a = expect;
183
+ return [4 /*yield*/, getUserRow('agent3@test.local')];
184
+ case 1:
185
+ _a.apply(void 0, [_b.sent()]).toBeUndefined();
186
+ return [4 /*yield*/, invokeDevLogin({ email: 'agent3@test.local' })];
187
+ case 2:
188
+ outcome = _b.sent();
189
+ expect(outcome.loggedInAs).toBe('agent3@test.local');
190
+ expect(outcome.sessionSaved).toBe(true);
191
+ expect(outcome.redirect).toBe('/');
192
+ return [4 /*yield*/, getUserRow('agent3@test.local')];
193
+ case 3:
194
+ created = _b.sent();
195
+ expect(created).toBeDefined();
196
+ expect(created.password).toBe((0, sha256_1.default)('test').toString());
197
+ expect(created.roles).toEqual([]);
198
+ expect(created.name).toBeTruthy();
199
+ return [2 /*return*/];
200
+ }
201
+ });
202
+ }); });
203
+ it('rejects a ?email outside the DEV_AUTO_LOGIN_EMAIL domain with 400 — no session, no account', function () { return __awaiter(void 0, void 0, void 0, function () {
204
+ var outcome, _a;
205
+ return __generator(this, function (_b) {
206
+ switch (_b.label) {
207
+ case 0: return [4 /*yield*/, invokeDevLogin({ email: 'intruder@evil.example' })];
208
+ case 1:
209
+ outcome = _b.sent();
210
+ expect(outcome.status).toBe(400);
211
+ expect(outcome.loggedInAs).toBeUndefined();
212
+ expect(outcome.sessionSaved).toBe(false);
213
+ expect(outcome.redirect).toBeUndefined();
214
+ _a = expect;
215
+ return [4 /*yield*/, getUserRow('intruder@evil.example')];
216
+ case 2:
217
+ _a.apply(void 0, [_b.sent()]).toBeUndefined();
218
+ return [2 /*return*/];
219
+ }
220
+ });
221
+ }); });
222
+ it('404s when DEVELOPMENT is unset, even with a ?email', function () { return __awaiter(void 0, void 0, void 0, function () {
223
+ var outcome, _a;
224
+ return __generator(this, function (_b) {
225
+ switch (_b.label) {
226
+ case 0:
227
+ delete process.env.DEVELOPMENT;
228
+ return [4 /*yield*/, invokeDevLogin({ email: 'agent4@test.local' })];
229
+ case 1:
230
+ outcome = _b.sent();
231
+ expect(outcome.status).toBe(404);
232
+ expect(outcome.loggedInAs).toBeUndefined();
233
+ _a = expect;
234
+ return [4 /*yield*/, getUserRow('agent4@test.local')];
235
+ case 2:
236
+ _a.apply(void 0, [_b.sent()]).toBeUndefined();
237
+ return [2 /*return*/];
238
+ }
239
+ });
240
+ }); });
241
+ it('404s when DEV_AUTO_LOGIN_EMAIL is unset, even with a ?email', function () { return __awaiter(void 0, void 0, void 0, function () {
242
+ var outcome, _a;
243
+ return __generator(this, function (_b) {
244
+ switch (_b.label) {
245
+ case 0:
246
+ delete process.env.DEV_AUTO_LOGIN_EMAIL;
247
+ return [4 /*yield*/, invokeDevLogin({ email: 'agent5@test.local' })];
248
+ case 1:
249
+ outcome = _b.sent();
250
+ expect(outcome.status).toBe(404);
251
+ expect(outcome.loggedInAs).toBeUndefined();
252
+ _a = expect;
253
+ return [4 /*yield*/, getUserRow('agent5@test.local')];
254
+ case 2:
255
+ _a.apply(void 0, [_b.sent()]).toBeUndefined();
256
+ return [2 /*return*/];
257
+ }
258
+ });
259
+ }); });
260
+ });
261
+ //# sourceMappingURL=DevLogin.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevLogin.test.js","sourceRoot":"","sources":["../../test/DevLogin.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=UpdateUserInfoAvatar.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateUserInfoAvatar.test.d.ts","sourceRoot":"","sources":["../../test/UpdateUserInfoAvatar.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,337 @@
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 __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ var fs_1 = __importDefault(require("fs"));
43
+ var path_1 = __importDefault(require("path"));
44
+ var sharp_1 = __importDefault(require("sharp"));
45
+ var db_1 = require("@proteinjs/db");
46
+ var db_file_1 = require("@proteinjs/db-file");
47
+ var user_1 = require("@proteinjs/user");
48
+ var UserServerTestEnvironment_1 = require("./UserServerTestEnvironment");
49
+ var UpdateUserInfo_1 = require("../src/services/UpdateUserInfo");
50
+ var testEnv = new UserServerTestEnvironment_1.UserServerTestEnvironment();
51
+ /** JPEG magic bytes (SOI + marker prefix). */
52
+ var isJpeg = function (buffer) { return buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff; };
53
+ var getFileRow = function (fileId) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
54
+ switch (_a.label) {
55
+ case 0: return [4 /*yield*/, (0, user_1.getScopedDbAsSystem)().get(db_file_1.tables.File, { id: fileId })];
56
+ case 1: return [2 /*return*/, _a.sent()];
57
+ }
58
+ }); }); };
59
+ /**
60
+ * Avatars are photo OR emoji — exactly one active — stored as 512x512 JPEG, previous photo file
61
+ * deleted on every change, and the server session cache refreshed in the same stroke (the same
62
+ * helper that fixes the updateName rename-staleness wart). All assertions are outcomes: rows,
63
+ * bytes, cache reads.
64
+ */
65
+ describe('UpdateUserInfo avatar mutations', function () {
66
+ var service = new UpdateUserInfo_1.UpdateUserInfo();
67
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
68
+ return __generator(this, function (_a) {
69
+ switch (_a.label) {
70
+ case 0: return [4 /*yield*/, testEnv.beforeAll()];
71
+ case 1:
72
+ _a.sent();
73
+ return [2 /*return*/];
74
+ }
75
+ });
76
+ }); });
77
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
78
+ return __generator(this, function (_a) {
79
+ switch (_a.label) {
80
+ case 0: return [4 /*yield*/, testEnv.afterAll()];
81
+ case 1:
82
+ _a.sent();
83
+ return [2 /*return*/];
84
+ }
85
+ });
86
+ }); });
87
+ it('updateAvatarPhoto stores a 512x512 JPEG file and points the user row at it', function () { return __awaiter(void 0, void 0, void 0, function () {
88
+ var user, png, updated, row, file, bytes, _a, _b, metadata;
89
+ return __generator(this, function (_c) {
90
+ switch (_c.label) {
91
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Photo user', email: 'photo@test.local' })];
92
+ case 1:
93
+ user = _c.sent();
94
+ testEnv.actAs(user);
95
+ return [4 /*yield*/, (0, sharp_1.default)({
96
+ create: { width: 800, height: 600, channels: 3, background: { r: 200, g: 80, b: 40 } },
97
+ })
98
+ .png()
99
+ .toBuffer()];
100
+ case 2:
101
+ png = _c.sent();
102
+ return [4 /*yield*/, service.updateAvatarPhoto(png.toString('base64'), 'image/png')];
103
+ case 3:
104
+ updated = _c.sent();
105
+ // Returned user: photo active, emoji null, no password hash.
106
+ expect(updated.avatarFileId).toBeTruthy();
107
+ expect(updated.avatarEmoji).toBeFalsy();
108
+ expect(updated.password).toBeUndefined();
109
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { id: user.id })];
110
+ case 4:
111
+ row = _c.sent();
112
+ expect(row.avatarFileId).toBe(updated.avatarFileId);
113
+ expect(row.avatarEmoji).toBeFalsy();
114
+ return [4 /*yield*/, getFileRow(row.avatarFileId)];
115
+ case 5:
116
+ file = _c.sent();
117
+ expect(file).toBeTruthy();
118
+ expect(file.type).toBe('image/jpeg');
119
+ _b = (_a = Buffer).from;
120
+ return [4 /*yield*/, new db_file_1.FileStorage().getFileData(file.id)];
121
+ case 6:
122
+ bytes = _b.apply(_a, [_c.sent(), 'base64']);
123
+ expect(isJpeg(bytes)).toBe(true);
124
+ expect(file.size).toBe(bytes.length);
125
+ return [4 /*yield*/, (0, sharp_1.default)(bytes).metadata()];
126
+ case 7:
127
+ metadata = _c.sent();
128
+ expect(metadata.width).toBe(512);
129
+ expect(metadata.height).toBe(512);
130
+ // Session cache refreshed in the same stroke.
131
+ expect(new user_1.UserRepo().getUser().avatarFileId).toBe(row.avatarFileId);
132
+ return [2 /*return*/];
133
+ }
134
+ });
135
+ }); });
136
+ it('a second updateAvatarPhoto deletes the previous avatar file', function () { return __awaiter(void 0, void 0, void 0, function () {
137
+ var user, png, first, second, _a, _b, _c;
138
+ return __generator(this, function (_d) {
139
+ switch (_d.label) {
140
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Replacer', email: 'replace@test.local' })];
141
+ case 1:
142
+ user = _d.sent();
143
+ testEnv.actAs(user);
144
+ return [4 /*yield*/, (0, sharp_1.default)({ create: { width: 300, height: 300, channels: 3, background: { r: 0, g: 120, b: 200 } } })
145
+ .png()
146
+ .toBuffer()];
147
+ case 2:
148
+ png = _d.sent();
149
+ return [4 /*yield*/, service.updateAvatarPhoto(png.toString('base64'), 'image/png')];
150
+ case 3:
151
+ first = _d.sent();
152
+ return [4 /*yield*/, service.updateAvatarPhoto(png.toString('base64'), 'image/png')];
153
+ case 4:
154
+ second = _d.sent();
155
+ expect(second.avatarFileId).not.toBe(first.avatarFileId);
156
+ // The prior file is gone — row and bytes.
157
+ _a = expect;
158
+ return [4 /*yield*/, getFileRow(first.avatarFileId)];
159
+ case 5:
160
+ // The prior file is gone — row and bytes.
161
+ _a.apply(void 0, [_d.sent()]).toBeFalsy();
162
+ _b = expect;
163
+ return [4 /*yield*/, new db_file_1.FileStorage().getFileData(first.avatarFileId)];
164
+ case 6:
165
+ _b.apply(void 0, [_d.sent()]).toBe('');
166
+ // The new one is intact.
167
+ _c = expect;
168
+ return [4 /*yield*/, getFileRow(second.avatarFileId)];
169
+ case 7:
170
+ // The new one is intact.
171
+ _c.apply(void 0, [_d.sent()]).toBeTruthy();
172
+ return [2 /*return*/];
173
+ }
174
+ });
175
+ }); });
176
+ it('updateAvatarPhoto normalizes HEIC (default iPhone camera format) to JPEG', function () { return __awaiter(void 0, void 0, void 0, function () {
177
+ var user, heic, updated, bytes, _a, _b, metadata;
178
+ return __generator(this, function (_c) {
179
+ switch (_c.label) {
180
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'iPhone user', email: 'heic@test.local' })];
181
+ case 1:
182
+ user = _c.sent();
183
+ testEnv.actAs(user);
184
+ heic = fs_1.default.readFileSync(path_1.default.join(__dirname, 'fixtures', 'fixture.heic'));
185
+ return [4 /*yield*/, service.updateAvatarPhoto(heic.toString('base64'), 'image/heic')];
186
+ case 2:
187
+ updated = _c.sent();
188
+ _b = (_a = Buffer).from;
189
+ return [4 /*yield*/, new db_file_1.FileStorage().getFileData(updated.avatarFileId)];
190
+ case 3:
191
+ bytes = _b.apply(_a, [_c.sent(), 'base64']);
192
+ expect(isJpeg(bytes)).toBe(true);
193
+ return [4 /*yield*/, (0, sharp_1.default)(bytes).metadata()];
194
+ case 4:
195
+ metadata = _c.sent();
196
+ expect(metadata.width).toBe(512);
197
+ expect(metadata.height).toBe(512);
198
+ return [2 /*return*/];
199
+ }
200
+ });
201
+ }); });
202
+ it('updateAvatarEmoji sets the emoji, nulls the photo, and deletes the previous photo file', function () { return __awaiter(void 0, void 0, void 0, function () {
203
+ var user, png, withPhoto, updated, row, _a;
204
+ return __generator(this, function (_b) {
205
+ switch (_b.label) {
206
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Emoji user', email: 'emoji@test.local' })];
207
+ case 1:
208
+ user = _b.sent();
209
+ testEnv.actAs(user);
210
+ return [4 /*yield*/, (0, sharp_1.default)({ create: { width: 64, height: 64, channels: 3, background: { r: 9, g: 9, b: 9 } } })
211
+ .png()
212
+ .toBuffer()];
213
+ case 2:
214
+ png = _b.sent();
215
+ return [4 /*yield*/, service.updateAvatarPhoto(png.toString('base64'), 'image/png')];
216
+ case 3:
217
+ withPhoto = _b.sent();
218
+ return [4 /*yield*/, service.updateAvatarEmoji('🦞')];
219
+ case 4:
220
+ updated = _b.sent();
221
+ // Exactly-one invariant, in the row and the returned user.
222
+ expect(updated.avatarEmoji).toBe('🦞');
223
+ expect(updated.avatarFileId).toBeFalsy();
224
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { id: user.id })];
225
+ case 5:
226
+ row = _b.sent();
227
+ expect(row.avatarEmoji).toBe('🦞');
228
+ expect(row.avatarFileId).toBeFalsy();
229
+ // Previous photo file deleted; session cache refreshed.
230
+ _a = expect;
231
+ return [4 /*yield*/, getFileRow(withPhoto.avatarFileId)];
232
+ case 6:
233
+ // Previous photo file deleted; session cache refreshed.
234
+ _a.apply(void 0, [_b.sent()]).toBeFalsy();
235
+ expect(new user_1.UserRepo().getUser().avatarEmoji).toBe('🦞');
236
+ return [2 /*return*/];
237
+ }
238
+ });
239
+ }); });
240
+ it('accepts multi-codepoint emoji (ZWJ sequences)', function () { return __awaiter(void 0, void 0, void 0, function () {
241
+ var user, updated;
242
+ return __generator(this, function (_a) {
243
+ switch (_a.label) {
244
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Astronaut', email: 'zwj@test.local' })];
245
+ case 1:
246
+ user = _a.sent();
247
+ testEnv.actAs(user);
248
+ return [4 /*yield*/, service.updateAvatarEmoji('👩‍🚀')];
249
+ case 2:
250
+ updated = _a.sent();
251
+ expect(updated.avatarEmoji).toBe('👩‍🚀');
252
+ return [2 /*return*/];
253
+ }
254
+ });
255
+ }); });
256
+ it('clearAvatar removes both representations and the stored photo file', function () { return __awaiter(void 0, void 0, void 0, function () {
257
+ var user, png, withPhoto, updated, row, _a;
258
+ return __generator(this, function (_b) {
259
+ switch (_b.label) {
260
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Clearer', email: 'clear@test.local' })];
261
+ case 1:
262
+ user = _b.sent();
263
+ testEnv.actAs(user);
264
+ return [4 /*yield*/, (0, sharp_1.default)({ create: { width: 64, height: 64, channels: 3, background: { r: 1, g: 2, b: 3 } } })
265
+ .png()
266
+ .toBuffer()];
267
+ case 2:
268
+ png = _b.sent();
269
+ return [4 /*yield*/, service.updateAvatarPhoto(png.toString('base64'), 'image/png')];
270
+ case 3:
271
+ withPhoto = _b.sent();
272
+ return [4 /*yield*/, service.clearAvatar()];
273
+ case 4:
274
+ updated = _b.sent();
275
+ expect(updated.avatarEmoji).toBeFalsy();
276
+ expect(updated.avatarFileId).toBeFalsy();
277
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { id: user.id })];
278
+ case 5:
279
+ row = _b.sent();
280
+ expect(row.avatarEmoji).toBeFalsy();
281
+ expect(row.avatarFileId).toBeFalsy();
282
+ _a = expect;
283
+ return [4 /*yield*/, getFileRow(withPhoto.avatarFileId)];
284
+ case 6:
285
+ _a.apply(void 0, [_b.sent()]).toBeFalsy();
286
+ expect(new user_1.UserRepo().getUser().avatarFileId).toBeFalsy();
287
+ return [2 /*return*/];
288
+ }
289
+ });
290
+ }); });
291
+ it('rejects oversized photos before transforming, and unsupported types', function () { return __awaiter(void 0, void 0, void 0, function () {
292
+ var user, oversized, row;
293
+ return __generator(this, function (_a) {
294
+ switch (_a.label) {
295
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Rejected', email: 'reject@test.local' })];
296
+ case 1:
297
+ user = _a.sent();
298
+ testEnv.actAs(user);
299
+ oversized = Buffer.alloc(10 * 1024 * 1024 + 1);
300
+ return [4 /*yield*/, expect(service.updateAvatarPhoto(oversized.toString('base64'), 'image/png')).rejects.toThrow(/too large/)];
301
+ case 2:
302
+ _a.sent();
303
+ return [4 /*yield*/, expect(service.updateAvatarPhoto(Buffer.alloc(10).toString('base64'), 'image/gif')).rejects.toThrow(/Unsupported avatar image type/)];
304
+ case 3:
305
+ _a.sent();
306
+ return [4 /*yield*/, (0, db_1.getDbAsSystem)().get(user_1.tables.User, { id: user.id })];
307
+ case 4:
308
+ row = _a.sent();
309
+ expect(row.avatarFileId).toBeFalsy();
310
+ expect(row.avatarEmoji).toBeFalsy();
311
+ return [2 /*return*/];
312
+ }
313
+ });
314
+ }); });
315
+ it('rejects non-emoji strings as avatar emoji', function () { return __awaiter(void 0, void 0, void 0, function () {
316
+ var user;
317
+ return __generator(this, function (_a) {
318
+ switch (_a.label) {
319
+ case 0: return [4 /*yield*/, testEnv.createUser({ name: 'Wordy', email: 'wordy@test.local' })];
320
+ case 1:
321
+ user = _a.sent();
322
+ testEnv.actAs(user);
323
+ return [4 /*yield*/, expect(service.updateAvatarEmoji('hello')).rejects.toThrow(/single short emoji/)];
324
+ case 2:
325
+ _a.sent();
326
+ return [4 /*yield*/, expect(service.updateAvatarEmoji('')).rejects.toThrow(/single short emoji/)];
327
+ case 3:
328
+ _a.sent();
329
+ return [4 /*yield*/, expect(service.updateAvatarEmoji('🦞🦞🦞🦞🦞🦞🦞🦞🦞')).rejects.toThrow(/single short emoji/)];
330
+ case 4:
331
+ _a.sent();
332
+ return [2 /*return*/];
333
+ }
334
+ });
335
+ }); });
336
+ });
337
+ //# sourceMappingURL=UpdateUserInfoAvatar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateUserInfoAvatar.test.js","sourceRoot":"","sources":["../../test/UpdateUserInfoAvatar.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=UpdateUserInfoSessionRefresh.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateUserInfoSessionRefresh.test.d.ts","sourceRoot":"","sources":["../../test/UpdateUserInfoSessionRefresh.test.ts"],"names":[],"mappings":""}