@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.
@@ -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
  });
@@ -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 Error("BETTER_AUTH_SECRET must be set in env or config.secret must be provided.");
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 Error("BETTER_AUTH_URL must be set in env or config.baseURL must be provided.");
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 Error("Mongoose is not connected. Ensure MongoDB connection is established first.");
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 Error("Config key \"".concat(key, "\" registered more than once"));
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 Error("Config key \"".concat(key, "\" is not a valid number: ").concat(JSON.stringify(raw)));
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 Error("Config key \"".concat(key, "\" is not valid JSON: ").concat(error.message));
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: { description: "Non-standard meta information about the error", type: mongoose_1.Schema.Types.Mixed },
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 Error("MongoDB connection not available for change stream");
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 Error("Failed to create change stream watcher");
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;