@terreno/api 0.14.0 → 0.14.2
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.
- package/dist/__tests__/versionCheckPlugin.test.js +119 -0
- package/dist/betterAuthSetup.js +13 -3
- package/dist/config.js +12 -3
- package/dist/errors.js +5 -2
- package/dist/example.js +3 -0
- package/dist/expressServer.test.js +231 -0
- package/dist/realtime/changeStreamWatcher.js +6 -2
- package/dist/realtime/realtime.test.js +1785 -0
- package/dist/requestContext.test.js +143 -0
- package/package.json +1 -1
- package/src/__tests__/versionCheckPlugin.test.ts +81 -0
- package/src/betterAuthSetup.ts +13 -3
- package/src/config.ts +13 -3
- package/src/errors.ts +24 -18
- package/src/example.ts +3 -0
- package/src/expressServer.test.ts +176 -0
- package/src/realtime/changeStreamWatcher.ts +6 -2
- package/src/realtime/realtime.test.ts +1415 -1
- package/src/requestContext.test.ts +125 -0
|
@@ -291,6 +291,65 @@ var versionCheckPlugin_1 = require("../versionCheckPlugin");
|
|
|
291
291
|
}
|
|
292
292
|
});
|
|
293
293
|
}); });
|
|
294
|
+
(0, bun_test_1.it)("handles numeric version parameter directly", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
295
|
+
var res;
|
|
296
|
+
return __generator(this, function (_a) {
|
|
297
|
+
switch (_a.label) {
|
|
298
|
+
case 0: return [4 /*yield*/, versionConfig_1.VersionConfig.create({
|
|
299
|
+
webRequiredVersion: 100,
|
|
300
|
+
webWarningVersion: 150,
|
|
301
|
+
})];
|
|
302
|
+
case 1:
|
|
303
|
+
_a.sent();
|
|
304
|
+
return [4 /*yield*/, app.get("/version-check?version=50&platform=web")];
|
|
305
|
+
case 2:
|
|
306
|
+
res = _a.sent();
|
|
307
|
+
(0, bun_test_1.expect)(res.status).toBe(200);
|
|
308
|
+
(0, bun_test_1.expect)(res.body.status).toBe("required");
|
|
309
|
+
return [2 /*return*/];
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
}); });
|
|
313
|
+
(0, bun_test_1.it)("returns default warning message when warningMessage not set", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
314
|
+
var res;
|
|
315
|
+
return __generator(this, function (_a) {
|
|
316
|
+
switch (_a.label) {
|
|
317
|
+
case 0: return [4 /*yield*/, versionConfig_1.VersionConfig.create({
|
|
318
|
+
webRequiredVersion: 0,
|
|
319
|
+
webWarningVersion: 100,
|
|
320
|
+
})];
|
|
321
|
+
case 1:
|
|
322
|
+
_a.sent();
|
|
323
|
+
return [4 /*yield*/, app.get("/version-check").query({ platform: "web", version: 50 })];
|
|
324
|
+
case 2:
|
|
325
|
+
res = _a.sent();
|
|
326
|
+
(0, bun_test_1.expect)(res.status).toBe(200);
|
|
327
|
+
(0, bun_test_1.expect)(res.body.status).toBe("warning");
|
|
328
|
+
(0, bun_test_1.expect)(res.body.message).toBe("A new version is available. Please update for the best experience.");
|
|
329
|
+
return [2 /*return*/];
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}); });
|
|
333
|
+
(0, bun_test_1.it)("returns default required message when requiredMessage not set", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
334
|
+
var res;
|
|
335
|
+
return __generator(this, function (_a) {
|
|
336
|
+
switch (_a.label) {
|
|
337
|
+
case 0: return [4 /*yield*/, versionConfig_1.VersionConfig.create({
|
|
338
|
+
webRequiredVersion: 100,
|
|
339
|
+
webWarningVersion: 150,
|
|
340
|
+
})];
|
|
341
|
+
case 1:
|
|
342
|
+
_a.sent();
|
|
343
|
+
return [4 /*yield*/, app.get("/version-check").query({ platform: "web", version: 50 })];
|
|
344
|
+
case 2:
|
|
345
|
+
res = _a.sent();
|
|
346
|
+
(0, bun_test_1.expect)(res.status).toBe(200);
|
|
347
|
+
(0, bun_test_1.expect)(res.body.status).toBe("required");
|
|
348
|
+
(0, bun_test_1.expect)(res.body.message).toBe("This version is no longer supported. Please update to continue.");
|
|
349
|
+
return [2 /*return*/];
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}); });
|
|
294
353
|
(0, bun_test_1.it)("version equal to required returns warning not required", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
295
354
|
var res;
|
|
296
355
|
return __generator(this, function (_a) {
|
|
@@ -310,4 +369,64 @@ var versionCheckPlugin_1 = require("../versionCheckPlugin");
|
|
|
310
369
|
}
|
|
311
370
|
});
|
|
312
371
|
}); });
|
|
372
|
+
(0, bun_test_1.it)("uses default messages when warningMessage/requiredMessage are not set", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
373
|
+
var warningRes, requiredRes;
|
|
374
|
+
return __generator(this, function (_a) {
|
|
375
|
+
switch (_a.label) {
|
|
376
|
+
case 0: return [4 /*yield*/, versionConfig_1.VersionConfig.create({
|
|
377
|
+
webRequiredVersion: 100,
|
|
378
|
+
webWarningVersion: 200,
|
|
379
|
+
})];
|
|
380
|
+
case 1:
|
|
381
|
+
_a.sent();
|
|
382
|
+
return [4 /*yield*/, app.get("/version-check").query({ platform: "web", version: 150 })];
|
|
383
|
+
case 2:
|
|
384
|
+
warningRes = _a.sent();
|
|
385
|
+
(0, bun_test_1.expect)(warningRes.body.status).toBe("warning");
|
|
386
|
+
(0, bun_test_1.expect)(warningRes.body.message).toBe("A new version is available. Please update for the best experience.");
|
|
387
|
+
return [4 /*yield*/, app.get("/version-check").query({ platform: "web", version: 50 })];
|
|
388
|
+
case 3:
|
|
389
|
+
requiredRes = _a.sent();
|
|
390
|
+
(0, bun_test_1.expect)(requiredRes.body.status).toBe("required");
|
|
391
|
+
(0, bun_test_1.expect)(requiredRes.body.message).toBe("This version is no longer supported. Please update to continue.");
|
|
392
|
+
return [2 /*return*/];
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}); });
|
|
396
|
+
(0, bun_test_1.it)("handles numeric version parameter", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
397
|
+
var res;
|
|
398
|
+
return __generator(this, function (_a) {
|
|
399
|
+
switch (_a.label) {
|
|
400
|
+
case 0: return [4 /*yield*/, app.get("/version-check?version=50&platform=web")];
|
|
401
|
+
case 1:
|
|
402
|
+
res = _a.sent();
|
|
403
|
+
(0, bun_test_1.expect)(res.status).toBe(200);
|
|
404
|
+
return [2 /*return*/];
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
}); });
|
|
408
|
+
});
|
|
409
|
+
(0, bun_test_1.describe)("VersionCheckPlugin direct usage", function () {
|
|
410
|
+
(0, bun_test_1.it)("can be instantiated and register called directly on an express app", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
411
|
+
var express, plugin, expressApp, testApp, res;
|
|
412
|
+
return __generator(this, function (_a) {
|
|
413
|
+
switch (_a.label) {
|
|
414
|
+
case 0:
|
|
415
|
+
express = require("express");
|
|
416
|
+
plugin = new versionCheckPlugin_1.VersionCheckPlugin();
|
|
417
|
+
(0, bun_test_1.expect)(plugin).toBeDefined();
|
|
418
|
+
(0, bun_test_1.expect)(plugin).toBeInstanceOf(versionCheckPlugin_1.VersionCheckPlugin);
|
|
419
|
+
(0, bun_test_1.expect)(typeof plugin.register).toBe("function");
|
|
420
|
+
expressApp = express();
|
|
421
|
+
plugin.register(expressApp);
|
|
422
|
+
testApp = (0, supertest_1.default)(expressApp);
|
|
423
|
+
return [4 /*yield*/, testApp.get("/version-check")];
|
|
424
|
+
case 1:
|
|
425
|
+
res = _a.sent();
|
|
426
|
+
(0, bun_test_1.expect)(res.status).toBe(200);
|
|
427
|
+
(0, bun_test_1.expect)(res.body.status).toBe("ok");
|
|
428
|
+
return [2 /*return*/];
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
}); });
|
|
313
432
|
});
|
package/dist/betterAuthSetup.js
CHANGED
|
@@ -61,6 +61,7 @@ var better_auth_1 = require("better-auth");
|
|
|
61
61
|
var mongodb_1 = require("better-auth/adapters/mongodb");
|
|
62
62
|
var node_1 = require("better-auth/node");
|
|
63
63
|
var mongoose_1 = __importDefault(require("mongoose"));
|
|
64
|
+
var errors_1 = require("./errors");
|
|
64
65
|
var logger_1 = require("./logger");
|
|
65
66
|
var plugins_1 = require("./plugins");
|
|
66
67
|
var requestContext_1 = require("./requestContext");
|
|
@@ -72,11 +73,17 @@ var createBetterAuth = function (options) {
|
|
|
72
73
|
var config = options.config, mongoClient = options.mongoClient;
|
|
73
74
|
var secret = config.secret || process.env.BETTER_AUTH_SECRET;
|
|
74
75
|
if (!secret) {
|
|
75
|
-
throw new
|
|
76
|
+
throw new errors_1.APIError({
|
|
77
|
+
status: 500,
|
|
78
|
+
title: "BETTER_AUTH_SECRET must be set in env or config.secret must be provided.",
|
|
79
|
+
});
|
|
76
80
|
}
|
|
77
81
|
var baseURL = config.baseURL || process.env.BETTER_AUTH_URL;
|
|
78
82
|
if (!baseURL) {
|
|
79
|
-
throw new
|
|
83
|
+
throw new errors_1.APIError({
|
|
84
|
+
status: 500,
|
|
85
|
+
title: "BETTER_AUTH_URL must be set in env or config.baseURL must be provided.",
|
|
86
|
+
});
|
|
80
87
|
}
|
|
81
88
|
var basePath = (_a = config.basePath) !== null && _a !== void 0 ? _a : "/api/auth";
|
|
82
89
|
var socialProviders = {};
|
|
@@ -258,7 +265,10 @@ var getMongoClientFromMongoose = function () {
|
|
|
258
265
|
var connection = mongoose_1.default.connection;
|
|
259
266
|
var client = connection.client;
|
|
260
267
|
if (!client) {
|
|
261
|
-
throw new
|
|
268
|
+
throw new errors_1.APIError({
|
|
269
|
+
status: 500,
|
|
270
|
+
title: "Mongoose is not connected. Ensure MongoDB connection is established first.",
|
|
271
|
+
});
|
|
262
272
|
}
|
|
263
273
|
return client;
|
|
264
274
|
};
|
package/dist/config.js
CHANGED
|
@@ -70,6 +70,7 @@ var __values = (this && this.__values) || function(o) {
|
|
|
70
70
|
};
|
|
71
71
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
72
72
|
exports.Config = void 0;
|
|
73
|
+
var errors_1 = require("./errors");
|
|
73
74
|
var overrides = new Map();
|
|
74
75
|
var cachedEnv = null;
|
|
75
76
|
var envLoader = null;
|
|
@@ -83,7 +84,7 @@ var REGISTRY = Object.create(null);
|
|
|
83
84
|
var register = function (key, registration) {
|
|
84
85
|
if (registration === void 0) { registration = {}; }
|
|
85
86
|
if (REGISTRY[key]) {
|
|
86
|
-
throw new
|
|
87
|
+
throw new errors_1.APIError({ status: 500, title: "Config key \"".concat(key, "\" registered more than once") });
|
|
87
88
|
}
|
|
88
89
|
REGISTRY[key] = registration;
|
|
89
90
|
};
|
|
@@ -124,7 +125,11 @@ var getNumber = function (key) {
|
|
|
124
125
|
// whereas parseFloat would silently truncate to 5000.
|
|
125
126
|
var parsed = Number(raw);
|
|
126
127
|
if (!Number.isFinite(parsed)) {
|
|
127
|
-
throw new
|
|
128
|
+
throw new errors_1.APIError({
|
|
129
|
+
error: new Error("Config key \"".concat(key, "\" is not a valid number: ").concat(JSON.stringify(raw))),
|
|
130
|
+
status: 500,
|
|
131
|
+
title: "Config key \"".concat(key, "\" is not a valid number"),
|
|
132
|
+
});
|
|
128
133
|
}
|
|
129
134
|
return parsed;
|
|
130
135
|
};
|
|
@@ -150,7 +155,11 @@ var getJSON = function (key) {
|
|
|
150
155
|
return JSON.parse(raw);
|
|
151
156
|
}
|
|
152
157
|
catch (error) {
|
|
153
|
-
throw new
|
|
158
|
+
throw new errors_1.APIError({
|
|
159
|
+
error: new Error("Config key \"".concat(key, "\" is not valid JSON: ").concat(error.message)),
|
|
160
|
+
status: 500,
|
|
161
|
+
title: "Config key \"".concat(key, "\" is not valid JSON"),
|
|
162
|
+
});
|
|
154
163
|
}
|
|
155
164
|
};
|
|
156
165
|
/**
|
package/dist/errors.js
CHANGED
|
@@ -150,7 +150,10 @@ var errorsPlugin = function (schema) {
|
|
|
150
150
|
about: { description: "Link to documentation about this error", type: String },
|
|
151
151
|
type: { description: "Link describing the error type", type: String },
|
|
152
152
|
},
|
|
153
|
-
meta: {
|
|
153
|
+
meta: {
|
|
154
|
+
description: "Non-standard meta information about the error",
|
|
155
|
+
type: mongoose_1.Schema.Types.Mixed,
|
|
156
|
+
},
|
|
154
157
|
source: {
|
|
155
158
|
header: { description: "HTTP header that caused the error", type: String },
|
|
156
159
|
parameter: { description: "Query parameter that caused the error", type: String },
|
|
@@ -161,7 +164,7 @@ var errorsPlugin = function (schema) {
|
|
|
161
164
|
},
|
|
162
165
|
status: { description: "HTTP status code for this error", type: Number },
|
|
163
166
|
title: { description: "Short summary of the error", required: true, type: String },
|
|
164
|
-
});
|
|
167
|
+
}, { _id: false, strict: "throw" });
|
|
165
168
|
schema.add({ apiErrors: errorSchema });
|
|
166
169
|
};
|
|
167
170
|
exports.errorsPlugin = errorsPlugin;
|
package/dist/example.js
CHANGED
|
@@ -71,6 +71,9 @@ var userSchema = new mongoose_1.Schema({
|
|
|
71
71
|
// biome-ignore lint/suspicious/noExplicitAny: passport-local-mongoose's plugin type is incompatible with mongoose Schema generics
|
|
72
72
|
userSchema.plugin(passport_local_mongoose_1.default, { usernameField: "email" });
|
|
73
73
|
userSchema.plugin(plugins_1.createdUpdatedPlugin);
|
|
74
|
+
userSchema.plugin(plugins_1.isDeletedPlugin);
|
|
75
|
+
userSchema.plugin(plugins_1.findOneOrNone);
|
|
76
|
+
userSchema.plugin(plugins_1.findExactlyOne);
|
|
74
77
|
userSchema.plugin(plugins_1.baseUserPlugin);
|
|
75
78
|
var UserModel = (0, mongoose_1.model)("User", userSchema);
|
|
76
79
|
var schema = new mongoose_1.Schema({
|
|
@@ -10,6 +10,39 @@ var __assign = (this && this.__assign) || function () {
|
|
|
10
10
|
};
|
|
11
11
|
return __assign.apply(this, arguments);
|
|
12
12
|
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
13
46
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
47
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
48
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -965,6 +998,204 @@ var tests_1 = require("./tests");
|
|
|
965
998
|
}
|
|
966
999
|
});
|
|
967
1000
|
}); });
|
|
1001
|
+
(0, bun_test_1.it)("fires warning timeout callback when script is slow", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1002
|
+
var func, _a;
|
|
1003
|
+
return __generator(this, function (_b) {
|
|
1004
|
+
switch (_b.label) {
|
|
1005
|
+
case 0:
|
|
1006
|
+
func = (0, bun_test_1.mock)(function () { return new Promise(function (resolve) { return originalSetTimeout(function () { return resolve("done"); }, 200); }); });
|
|
1007
|
+
_b.label = 1;
|
|
1008
|
+
case 1:
|
|
1009
|
+
_b.trys.push([1, 3, , 4]);
|
|
1010
|
+
return [4 /*yield*/, (0, expressServer_1.wrapScript)(func, { terminateTimeout: 0.3 })];
|
|
1011
|
+
case 2:
|
|
1012
|
+
_b.sent();
|
|
1013
|
+
return [3 /*break*/, 4];
|
|
1014
|
+
case 3:
|
|
1015
|
+
_a = _b.sent();
|
|
1016
|
+
return [3 /*break*/, 4];
|
|
1017
|
+
case 4:
|
|
1018
|
+
(0, bun_test_1.expect)(process.exit).toHaveBeenCalledWith(0);
|
|
1019
|
+
return [2 /*return*/];
|
|
1020
|
+
}
|
|
1021
|
+
});
|
|
1022
|
+
}); });
|
|
1023
|
+
});
|
|
1024
|
+
(0, bun_test_1.describe)("setupServer with listen (skipListen false)", function () {
|
|
1025
|
+
var originalEnv = process.env;
|
|
1026
|
+
(0, bun_test_1.beforeEach)(function () {
|
|
1027
|
+
process.env = __assign(__assign({}, originalEnv), { PORT: "0", REFRESH_TOKEN_SECRET: "test-refresh-secret", SESSION_SECRET: "test-session-secret", TOKEN_EXPIRES_IN: "1h", TOKEN_ISSUER: "test-issuer", TOKEN_SECRET: "test-secret" });
|
|
1028
|
+
});
|
|
1029
|
+
(0, bun_test_1.afterEach)(function () {
|
|
1030
|
+
process.env = originalEnv;
|
|
1031
|
+
});
|
|
1032
|
+
(0, bun_test_1.it)("starts the server when skipListen is false", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1033
|
+
var addRoutes, express, originalListen, app;
|
|
1034
|
+
return __generator(this, function (_a) {
|
|
1035
|
+
switch (_a.label) {
|
|
1036
|
+
case 0:
|
|
1037
|
+
addRoutes = function () { };
|
|
1038
|
+
return [4 /*yield*/, Promise.resolve().then(function () { return __importStar(require("express")); })];
|
|
1039
|
+
case 1:
|
|
1040
|
+
express = _a.sent();
|
|
1041
|
+
originalListen = express.default.application.listen;
|
|
1042
|
+
// biome-ignore lint/suspicious/noExplicitAny: mocking Express internals requires type escape
|
|
1043
|
+
express.default.application.listen = (0, bun_test_1.mock)(function () {
|
|
1044
|
+
var args = [];
|
|
1045
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
1046
|
+
args[_i] = arguments[_i];
|
|
1047
|
+
}
|
|
1048
|
+
var cb = args.find(function (a) { return typeof a === "function"; });
|
|
1049
|
+
if (cb) {
|
|
1050
|
+
cb();
|
|
1051
|
+
}
|
|
1052
|
+
return this;
|
|
1053
|
+
});
|
|
1054
|
+
try {
|
|
1055
|
+
app = (0, expressServer_1.setupServer)({
|
|
1056
|
+
addRoutes: addRoutes,
|
|
1057
|
+
skipListen: false,
|
|
1058
|
+
userModel: tests_1.UserModel,
|
|
1059
|
+
});
|
|
1060
|
+
(0, bun_test_1.expect)(app).toBeDefined();
|
|
1061
|
+
}
|
|
1062
|
+
finally {
|
|
1063
|
+
express.default.application.listen = originalListen;
|
|
1064
|
+
}
|
|
1065
|
+
return [2 /*return*/];
|
|
1066
|
+
}
|
|
1067
|
+
});
|
|
1068
|
+
}); });
|
|
1069
|
+
(0, bun_test_1.it)("handles listen error with invalid port", function () {
|
|
1070
|
+
process.env.PORT = "-1";
|
|
1071
|
+
var addRoutes = function () { };
|
|
1072
|
+
// Using an invalid port should trigger the catch block and process.exit(1)
|
|
1073
|
+
var originalExit = process.exit;
|
|
1074
|
+
process.exit = (function () { });
|
|
1075
|
+
try {
|
|
1076
|
+
(0, expressServer_1.setupServer)({
|
|
1077
|
+
addRoutes: addRoutes,
|
|
1078
|
+
skipListen: false,
|
|
1079
|
+
userModel: tests_1.UserModel,
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
catch (_a) {
|
|
1083
|
+
// May throw
|
|
1084
|
+
}
|
|
1085
|
+
process.exit = originalExit;
|
|
1086
|
+
});
|
|
1087
|
+
});
|
|
1088
|
+
(0, bun_test_1.describe)("setupServer with listen", function () {
|
|
1089
|
+
var originalEnv = process.env;
|
|
1090
|
+
var http = require("node:http");
|
|
1091
|
+
var activeServer = null;
|
|
1092
|
+
var originalListen = null;
|
|
1093
|
+
(0, bun_test_1.beforeEach)(function () {
|
|
1094
|
+
process.env = __assign(__assign({}, originalEnv), { PORT: "0", REFRESH_TOKEN_SECRET: "test-refresh-secret", SESSION_SECRET: "test-session-secret", TOKEN_EXPIRES_IN: "1h", TOKEN_ISSUER: "test-issuer", TOKEN_SECRET: "test-secret" });
|
|
1095
|
+
originalListen = http.Server.prototype.listen;
|
|
1096
|
+
http.Server.prototype.listen = function () {
|
|
1097
|
+
var args = [];
|
|
1098
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
1099
|
+
args[_i] = arguments[_i];
|
|
1100
|
+
}
|
|
1101
|
+
activeServer = this;
|
|
1102
|
+
return originalListen.apply(this, args);
|
|
1103
|
+
};
|
|
1104
|
+
});
|
|
1105
|
+
(0, bun_test_1.afterEach)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1106
|
+
return __generator(this, function (_a) {
|
|
1107
|
+
switch (_a.label) {
|
|
1108
|
+
case 0:
|
|
1109
|
+
process.env = originalEnv;
|
|
1110
|
+
http.Server.prototype.listen = originalListen;
|
|
1111
|
+
if (!activeServer) return [3 /*break*/, 2];
|
|
1112
|
+
return [4 /*yield*/, new Promise(function (resolve) { return activeServer.close(function () { return resolve(); }); })];
|
|
1113
|
+
case 1:
|
|
1114
|
+
_a.sent();
|
|
1115
|
+
activeServer = null;
|
|
1116
|
+
_a.label = 2;
|
|
1117
|
+
case 2: return [2 /*return*/];
|
|
1118
|
+
}
|
|
1119
|
+
});
|
|
1120
|
+
}); });
|
|
1121
|
+
(0, bun_test_1.it)("starts listening on a port when skipListen is false", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1122
|
+
var addRoutes, app;
|
|
1123
|
+
return __generator(this, function (_a) {
|
|
1124
|
+
switch (_a.label) {
|
|
1125
|
+
case 0:
|
|
1126
|
+
addRoutes = function () { };
|
|
1127
|
+
app = (0, expressServer_1.setupServer)({
|
|
1128
|
+
addRoutes: addRoutes,
|
|
1129
|
+
skipListen: false,
|
|
1130
|
+
userModel: tests_1.UserModel,
|
|
1131
|
+
});
|
|
1132
|
+
(0, bun_test_1.expect)(app).toBeDefined();
|
|
1133
|
+
return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 100); })];
|
|
1134
|
+
case 1:
|
|
1135
|
+
_a.sent();
|
|
1136
|
+
return [2 /*return*/];
|
|
1137
|
+
}
|
|
1138
|
+
});
|
|
1139
|
+
}); });
|
|
1140
|
+
});
|
|
1141
|
+
(0, bun_test_1.describe)("wrapScript timeout callbacks", function () {
|
|
1142
|
+
var originalEnv = process.env;
|
|
1143
|
+
var originalExit = process.exit;
|
|
1144
|
+
var originalSetTimeout = globalThis.setTimeout;
|
|
1145
|
+
var timerIds = [];
|
|
1146
|
+
var timerCallbacks = [];
|
|
1147
|
+
(0, bun_test_1.beforeEach)(function () {
|
|
1148
|
+
process.env = __assign(__assign({}, process.env), { REFRESH_TOKEN_SECRET: "test-refresh-secret", SESSION_SECRET: "test-session-secret", TOKEN_EXPIRES_IN: "1h", TOKEN_ISSUER: "test-issuer", TOKEN_SECRET: "test-secret" });
|
|
1149
|
+
process.exit = (0, bun_test_1.mock)(function () {
|
|
1150
|
+
throw new Error("__EXIT__");
|
|
1151
|
+
});
|
|
1152
|
+
timerCallbacks.length = 0;
|
|
1153
|
+
timerIds.length = 0;
|
|
1154
|
+
globalThis.setTimeout = (function (cb, delay) {
|
|
1155
|
+
timerCallbacks.push({ callback: cb, delay: delay });
|
|
1156
|
+
var id = originalSetTimeout(cb, delay);
|
|
1157
|
+
timerIds.push(id);
|
|
1158
|
+
return id;
|
|
1159
|
+
});
|
|
1160
|
+
});
|
|
1161
|
+
(0, bun_test_1.afterEach)(function () {
|
|
1162
|
+
var e_2, _a;
|
|
1163
|
+
try {
|
|
1164
|
+
for (var timerIds_2 = __values(timerIds), timerIds_2_1 = timerIds_2.next(); !timerIds_2_1.done; timerIds_2_1 = timerIds_2.next()) {
|
|
1165
|
+
var id = timerIds_2_1.value;
|
|
1166
|
+
clearTimeout(id);
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
1170
|
+
finally {
|
|
1171
|
+
try {
|
|
1172
|
+
if (timerIds_2_1 && !timerIds_2_1.done && (_a = timerIds_2.return)) _a.call(timerIds_2);
|
|
1173
|
+
}
|
|
1174
|
+
finally { if (e_2) throw e_2.error; }
|
|
1175
|
+
}
|
|
1176
|
+
globalThis.setTimeout = originalSetTimeout;
|
|
1177
|
+
process.exit = originalExit;
|
|
1178
|
+
process.env = originalEnv;
|
|
1179
|
+
});
|
|
1180
|
+
(0, bun_test_1.it)("registers warn and terminate timeouts with correct delays", function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1181
|
+
var func, warnTimer, closeTimer;
|
|
1182
|
+
return __generator(this, function (_a) {
|
|
1183
|
+
switch (_a.label) {
|
|
1184
|
+
case 0:
|
|
1185
|
+
func = function () { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
|
|
1186
|
+
return [2 /*return*/, "ok"];
|
|
1187
|
+
}); }); };
|
|
1188
|
+
return [4 /*yield*/, (0, bun_test_1.expect)((0, expressServer_1.wrapScript)(func, { terminateTimeout: 100 })).rejects.toThrow("__EXIT__")];
|
|
1189
|
+
case 1:
|
|
1190
|
+
_a.sent();
|
|
1191
|
+
warnTimer = timerCallbacks.find(function (t) { return t.delay === 50000; });
|
|
1192
|
+
closeTimer = timerCallbacks.find(function (t) { return t.delay === 100000; });
|
|
1193
|
+
(0, bun_test_1.expect)(warnTimer).toBeDefined();
|
|
1194
|
+
(0, bun_test_1.expect)(closeTimer).toBeDefined();
|
|
1195
|
+
return [2 /*return*/];
|
|
1196
|
+
}
|
|
1197
|
+
});
|
|
1198
|
+
}); });
|
|
968
1199
|
});
|
|
969
1200
|
(0, bun_test_1.describe)("setupServer error handling", function () {
|
|
970
1201
|
var originalEnv = process.env;
|
|
@@ -124,6 +124,7 @@ exports.stopChangeStreamWatcher = exports.startChangeStreamWatcher = exports.emi
|
|
|
124
124
|
var Sentry = __importStar(require("@sentry/bun"));
|
|
125
125
|
var luxon_1 = require("luxon");
|
|
126
126
|
var mongoose_1 = __importDefault(require("mongoose"));
|
|
127
|
+
var errors_1 = require("../errors");
|
|
127
128
|
var logger_1 = require("../logger");
|
|
128
129
|
var permissions_1 = require("../permissions");
|
|
129
130
|
var queryMatcher_1 = require("./queryMatcher");
|
|
@@ -546,7 +547,10 @@ var startChangeStreamWatcher = function (io, config, debug) {
|
|
|
546
547
|
];
|
|
547
548
|
var nativeDb = mongoose_1.default.connection.db;
|
|
548
549
|
if (!nativeDb) {
|
|
549
|
-
throw new
|
|
550
|
+
throw new errors_1.APIError({
|
|
551
|
+
status: 500,
|
|
552
|
+
title: "MongoDB connection not available for change stream",
|
|
553
|
+
});
|
|
550
554
|
}
|
|
551
555
|
var options = {
|
|
552
556
|
batchSize: (_c = config.batchSize) !== null && _c !== void 0 ? _c : 50,
|
|
@@ -558,7 +562,7 @@ var startChangeStreamWatcher = function (io, config, debug) {
|
|
|
558
562
|
};
|
|
559
563
|
changeWatcher = nativeDb.watch(pipeline, options);
|
|
560
564
|
if (!changeWatcher) {
|
|
561
|
-
throw new
|
|
565
|
+
throw new errors_1.APIError({ status: 500, title: "Failed to create change stream watcher" });
|
|
562
566
|
}
|
|
563
567
|
changeWatcher.on("change", function (rawChange) { return __awaiter(void 0, void 0, void 0, function () {
|
|
564
568
|
var change, collectionName, docId, entry, method, fullDocument, isHardDelete, rooms, collectionTag, collection, event_1, rooms_1, rooms_1_1, room, e_4_1, metadata, error_4;
|