@prosopo/env 3.6.9 → 3.6.11
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/.turbo/turbo-build$colon$cjs.log +3 -3
- package/.turbo/turbo-build$colon$tsc.log +20 -20
- package/.turbo/turbo-build.log +4 -4
- package/CHANGELOG.md +26 -0
- package/dist/cjs/env.cjs +58 -19
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +58 -19
- package/dist/env.js.map +1 -1
- package/dist/tests/env.maintenance.unit.test.js +26 -2
- package/dist/tests/env.maintenance.unit.test.js.map +1 -1
- package/package.json +8 -8
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/env@3.6.
|
|
2
|
+
> @prosopo/env@3.6.11 build:cjs
|
|
3
3
|
> NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
|
|
4
4
|
|
|
5
5
|
ViteCommonJSConfig: .
|
|
@@ -49,5 +49,5 @@ Build end
|
|
|
49
49
|
rendering chunks...
|
|
50
50
|
[2mdist/cjs/[22m[36mindex.cjs [39m[1m[2m0.32 kB[22m[1m[22m
|
|
51
51
|
[2mdist/cjs/[22m[36mprovider.cjs [39m[1m[2m1.43 kB[22m[1m[22m
|
|
52
|
-
[2mdist/cjs/[22m[36menv.cjs [39m[1m[
|
|
53
|
-
[32m✓ built in
|
|
52
|
+
[2mdist/cjs/[22m[36menv.cjs [39m[1m[2m6.95 kB[22m[1m[22m
|
|
53
|
+
[32m✓ built in 87ms[39m
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/env@3.6.
|
|
2
|
+
> @prosopo/env@3.6.11 build:tsc
|
|
3
3
|
> tsc --build --verbose
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
10:35:19 AM - Projects in this build:
|
|
6
6
|
* ../../dev/config/tsconfig.json
|
|
7
7
|
* ../locale/tsconfig.json
|
|
8
8
|
* ../util/tsconfig.json
|
|
@@ -21,39 +21,39 @@
|
|
|
21
21
|
* ../types-env/tsconfig.json
|
|
22
22
|
* tsconfig.json
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
10:35:19 AM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
10:35:19 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
10:35:19 AM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
10:35:19 AM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
10:35:19 AM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
10:35:19 AM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/provider/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
10:35:19 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/error.ts' is older than output '../common/tsconfig.tsbuildinfo'
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
10:35:19 AM - Project '../ipinfo/tsconfig.json' is up to date because newest input '../ipinfo/src/IpInfoService.ts' is older than output '../ipinfo/tsconfig.tsbuildinfo'
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
10:35:19 AM - Project '../api-route/tsconfig.json' is up to date because newest input '../api-route/src/apiRoutes.ts' is older than output '../api-route/tsconfig.tsbuildinfo'
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
10:35:19 AM - Project '../redis-client/tsconfig.json' is up to date because newest input '../redis-client/src/index.ts' is older than output '../redis-client/tsconfig.tsbuildinfo'
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
10:35:20 AM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
10:35:20 AM - Project '../user-access-policy/tsconfig.json' is up to date because newest input '../user-access-policy/src/transformRule.ts' is older than output '../user-access-policy/tsconfig.tsbuildinfo'
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
10:35:20 AM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/types/captcha.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
10:35:20 AM - Project '../database/tsconfig.json' is up to date because newest input '../database/src/tests/mongoGlobalSetup.ts' is older than output '../database/tsconfig.tsbuildinfo'
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
10:35:20 AM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
10:35:20 AM - Project '../types-env/tsconfig.json' is up to date because newest input '../types-env/src/env.ts' is older than output '../types-env/tsconfig.tsbuildinfo'
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
10:35:20 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
10:35:20 AM - Building project '/home/runner/work/captcha/captcha/packages/env/tsconfig.json'...
|
|
59
59
|
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @prosopo/env@3.6.
|
|
2
|
+
> @prosopo/env@3.6.11 build
|
|
3
3
|
> npm run build:cross-env -- --mode ${NODE_ENV:-development}
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
> @prosopo/env@3.6.
|
|
6
|
+
> @prosopo/env@3.6.11 build:cross-env
|
|
7
7
|
> vite build --config vite.esm.config.ts --mode production
|
|
8
8
|
|
|
9
9
|
ViteEsmConfig: .
|
|
@@ -53,5 +53,5 @@ Build end
|
|
|
53
53
|
rendering chunks...
|
|
54
54
|
[2mdist/[22m[36mindex.js [39m[1m[2m0.18 kB[22m[1m[22m
|
|
55
55
|
[2mdist/[22m[36mprovider.js [39m[1m[2m1.35 kB[22m[1m[22m
|
|
56
|
-
[2mdist/[22m[36menv.js [39m[1m[
|
|
57
|
-
[32m✓ built in
|
|
56
|
+
[2mdist/[22m[36menv.js [39m[1m[2m6.77 kB[22m[1m[22m
|
|
57
|
+
[32m✓ built in 146ms[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @prosopo/env
|
|
2
2
|
|
|
3
|
+
## 3.6.11
|
|
4
|
+
### Patch Changes
|
|
5
|
+
|
|
6
|
+
- 550d20a: Keep the provider admin endpoints working while `MAINTENANCE_MODE` is on. Previously the admin/access-rule router was skipped entirely at boot in maintenance mode — `Environment.isReady()` never connected the DB, so `env.getDb()` threw and the DB-backed `Tasks` couldn't be constructed — which meant adding/removing site keys (access rules), detector keys and decision machines all 404'd on a node in maintenance mode.
|
|
7
|
+
|
|
8
|
+
Now, in maintenance mode `Environment.isReady()` creates the `ProviderDatabase` handle and connects in the **background** (without awaiting), so a slow or unavailable Mongo/Redis socket still can't gate boot, but `env.getDb()` returns a usable handle and the admin endpoints register and function. The captcha request path is unchanged — it still short-circuits to a maintenance "pass" before touching the DB. `blockMiddleware` now has an explicit maintenance-mode skip (it previously relied on `env.getDb()` throwing to no-op) so the blocklist/Redis lookup stays off the captcha hot path.
|
|
9
|
+
- Updated dependencies [85e8857]
|
|
10
|
+
- @prosopo/types@4.9.8
|
|
11
|
+
- @prosopo/common@3.1.44
|
|
12
|
+
- @prosopo/database@3.15.11
|
|
13
|
+
- @prosopo/ipinfo@0.2.35
|
|
14
|
+
- @prosopo/keyring@2.9.55
|
|
15
|
+
- @prosopo/types-env@2.10.10
|
|
16
|
+
- @prosopo/logger@2.0.2
|
|
17
|
+
|
|
18
|
+
## 3.6.10
|
|
19
|
+
### Patch Changes
|
|
20
|
+
|
|
21
|
+
- Updated dependencies [494883f]
|
|
22
|
+
- Updated dependencies [8bde5df]
|
|
23
|
+
- @prosopo/database@3.15.10
|
|
24
|
+
- @prosopo/types@4.9.7
|
|
25
|
+
- @prosopo/types-env@2.10.9
|
|
26
|
+
- @prosopo/ipinfo@0.2.34
|
|
27
|
+
- @prosopo/keyring@2.9.54
|
|
28
|
+
|
|
3
29
|
## 3.6.9
|
|
4
30
|
### Patch Changes
|
|
5
31
|
|
package/dist/cjs/env.cjs
CHANGED
|
@@ -91,8 +91,11 @@ class Environment {
|
|
|
91
91
|
const maintenanceMode = isMaintenanceMode();
|
|
92
92
|
if (maintenanceMode) {
|
|
93
93
|
this.logger.warn(() => ({
|
|
94
|
-
msg: "MAINTENANCE_MODE=true —
|
|
94
|
+
msg: "MAINTENANCE_MODE=true — connecting to DB in the background so admin endpoints stay available; captcha path short-circuits"
|
|
95
95
|
}));
|
|
96
|
+
if (!this.db) {
|
|
97
|
+
this.connectDatabaseInBackground();
|
|
98
|
+
}
|
|
96
99
|
} else if (!this.db) {
|
|
97
100
|
await this.importDatabase();
|
|
98
101
|
} else if (this.db && !this.db.connected) {
|
|
@@ -102,7 +105,7 @@ class Environment {
|
|
|
102
105
|
await this.db.connect();
|
|
103
106
|
this.logger.info(() => ({ msg: "Connected to db" }));
|
|
104
107
|
}
|
|
105
|
-
if (this.db && !this.datasetId) {
|
|
108
|
+
if (!maintenanceMode && this.db && !this.datasetId) {
|
|
106
109
|
try {
|
|
107
110
|
this.datasetId = await this.db.getMostRecentDatasetId();
|
|
108
111
|
if (this.datasetId) {
|
|
@@ -131,25 +134,35 @@ class Environment {
|
|
|
131
134
|
});
|
|
132
135
|
}
|
|
133
136
|
}
|
|
137
|
+
// Build the ProviderDatabase handle from config WITHOUT connecting. Returns
|
|
138
|
+
// undefined when no database is configured for the current environment.
|
|
139
|
+
buildDatabase() {
|
|
140
|
+
if (!this.config.database) {
|
|
141
|
+
return void 0;
|
|
142
|
+
}
|
|
143
|
+
const dbConfig = this.config.database[this.defaultEnvironment];
|
|
144
|
+
if (!dbConfig) {
|
|
145
|
+
return void 0;
|
|
146
|
+
}
|
|
147
|
+
return new database.ProviderDatabase({
|
|
148
|
+
mongo: {
|
|
149
|
+
url: dbConfig.endpoint,
|
|
150
|
+
dbname: dbConfig.dbname,
|
|
151
|
+
authSource: dbConfig.authSource
|
|
152
|
+
},
|
|
153
|
+
redis: {
|
|
154
|
+
url: this.config.redisConnection.url,
|
|
155
|
+
password: this.config.redisConnection.password
|
|
156
|
+
},
|
|
157
|
+
logger: this.logger
|
|
158
|
+
});
|
|
159
|
+
}
|
|
134
160
|
async importDatabase() {
|
|
135
161
|
try {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
mongo: {
|
|
141
|
-
url: dbConfig.endpoint,
|
|
142
|
-
dbname: dbConfig.dbname,
|
|
143
|
-
authSource: dbConfig.authSource
|
|
144
|
-
},
|
|
145
|
-
redis: {
|
|
146
|
-
url: this.config.redisConnection.url,
|
|
147
|
-
password: this.config.redisConnection.password
|
|
148
|
-
},
|
|
149
|
-
logger: this.logger
|
|
150
|
-
});
|
|
151
|
-
await this.db.connect();
|
|
152
|
-
}
|
|
162
|
+
const db = this.buildDatabase();
|
|
163
|
+
if (db) {
|
|
164
|
+
this.db = db;
|
|
165
|
+
await this.db.connect();
|
|
153
166
|
}
|
|
154
167
|
} catch (error) {
|
|
155
168
|
throw new common.ProsopoEnvError("DATABASE.DATABASE_IMPORT_FAILED", {
|
|
@@ -160,6 +173,32 @@ class Environment {
|
|
|
160
173
|
});
|
|
161
174
|
}
|
|
162
175
|
}
|
|
176
|
+
// Create the DB handle and kick off the connection WITHOUT awaiting it, so
|
|
177
|
+
// startup is never gated on the DB socket. Used in maintenance mode: the
|
|
178
|
+
// captcha request path never touches the DB (it short-circuits), but the
|
|
179
|
+
// admin endpoints do, so the handle must exist. A failed connection is
|
|
180
|
+
// logged rather than thrown — admin queries will surface the error (or
|
|
181
|
+
// succeed once the socket recovers) when they actually run.
|
|
182
|
+
connectDatabaseInBackground() {
|
|
183
|
+
try {
|
|
184
|
+
const db = this.buildDatabase();
|
|
185
|
+
if (!db) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
this.db = db;
|
|
189
|
+
db.connect().catch((error) => {
|
|
190
|
+
this.logger.warn(() => ({
|
|
191
|
+
msg: "Background DB connection failed in maintenance mode; admin endpoints will retry on demand",
|
|
192
|
+
data: { error }
|
|
193
|
+
}));
|
|
194
|
+
});
|
|
195
|
+
} catch (error) {
|
|
196
|
+
this.logger.warn(() => ({
|
|
197
|
+
msg: "Failed to create DB handle in maintenance mode; admin endpoints will be unavailable until restart",
|
|
198
|
+
data: { error }
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
163
202
|
}
|
|
164
203
|
const isMaintenanceMode = () => process.env.MAINTENANCE_MODE?.toLowerCase() === "true";
|
|
165
204
|
exports.Environment = Environment;
|
package/dist/env.d.ts
CHANGED
|
@@ -24,7 +24,9 @@ export declare class Environment implements ProsopoEnvironment {
|
|
|
24
24
|
getAssetsResolver(): AssetsResolver;
|
|
25
25
|
getPair(): KeyringPair;
|
|
26
26
|
isReady(): Promise<void>;
|
|
27
|
+
buildDatabase(): ProviderDatabase | undefined;
|
|
27
28
|
importDatabase(): Promise<void>;
|
|
29
|
+
connectDatabaseInBackground(): void;
|
|
28
30
|
}
|
|
29
31
|
export declare const isMaintenanceMode: () => boolean;
|
|
30
32
|
//# sourceMappingURL=env.d.ts.map
|
package/dist/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,OAAO,EAAW,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAA4B,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7E,qBAAa,WAAY,YAAW,kBAAkB;IACrD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,EAAE,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACjC,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,aAAa,EAAE,cAAc,CAAC;IAC9B,KAAK,UAAS;IACd,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;gBAG7B,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,WAAW;IAsCpB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAkBvC,KAAK,IAAI,gBAAgB;IASzB,iBAAiB,IAAI,cAAc;IASnC,OAAO,IAAI,WAAW;IAShB,OAAO;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,OAAO,EAAW,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,KAAK,MAAM,EAA4B,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7E,qBAAa,WAAY,YAAW,kBAAkB;IACrD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,EAAE,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACjC,kBAAkB,EAAE,gBAAgB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,SAAS,CAAC;IAC9B,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,aAAa,EAAE,cAAc,CAAC;IAC9B,KAAK,UAAS;IACd,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;gBAG7B,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,WAAW;IAsCpB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAkBvC,KAAK,IAAI,gBAAgB;IASzB,iBAAiB,IAAI,cAAc;IASnC,OAAO,IAAI,WAAW;IAShB,OAAO;IA0Eb,aAAa,IAAI,gBAAgB,GAAG,SAAS;IAsBvC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA2BrC,2BAA2B,IAAI,IAAI;CAoBnC;AAID,eAAO,MAAM,iBAAiB,QAAO,OACkB,CAAC"}
|
package/dist/env.js
CHANGED
|
@@ -89,8 +89,11 @@ class Environment {
|
|
|
89
89
|
const maintenanceMode = isMaintenanceMode();
|
|
90
90
|
if (maintenanceMode) {
|
|
91
91
|
this.logger.warn(() => ({
|
|
92
|
-
msg: "MAINTENANCE_MODE=true —
|
|
92
|
+
msg: "MAINTENANCE_MODE=true — connecting to DB in the background so admin endpoints stay available; captcha path short-circuits"
|
|
93
93
|
}));
|
|
94
|
+
if (!this.db) {
|
|
95
|
+
this.connectDatabaseInBackground();
|
|
96
|
+
}
|
|
94
97
|
} else if (!this.db) {
|
|
95
98
|
await this.importDatabase();
|
|
96
99
|
} else if (this.db && !this.db.connected) {
|
|
@@ -100,7 +103,7 @@ class Environment {
|
|
|
100
103
|
await this.db.connect();
|
|
101
104
|
this.logger.info(() => ({ msg: "Connected to db" }));
|
|
102
105
|
}
|
|
103
|
-
if (this.db && !this.datasetId) {
|
|
106
|
+
if (!maintenanceMode && this.db && !this.datasetId) {
|
|
104
107
|
try {
|
|
105
108
|
this.datasetId = await this.db.getMostRecentDatasetId();
|
|
106
109
|
if (this.datasetId) {
|
|
@@ -129,25 +132,35 @@ class Environment {
|
|
|
129
132
|
});
|
|
130
133
|
}
|
|
131
134
|
}
|
|
135
|
+
// Build the ProviderDatabase handle from config WITHOUT connecting. Returns
|
|
136
|
+
// undefined when no database is configured for the current environment.
|
|
137
|
+
buildDatabase() {
|
|
138
|
+
if (!this.config.database) {
|
|
139
|
+
return void 0;
|
|
140
|
+
}
|
|
141
|
+
const dbConfig = this.config.database[this.defaultEnvironment];
|
|
142
|
+
if (!dbConfig) {
|
|
143
|
+
return void 0;
|
|
144
|
+
}
|
|
145
|
+
return new ProviderDatabase({
|
|
146
|
+
mongo: {
|
|
147
|
+
url: dbConfig.endpoint,
|
|
148
|
+
dbname: dbConfig.dbname,
|
|
149
|
+
authSource: dbConfig.authSource
|
|
150
|
+
},
|
|
151
|
+
redis: {
|
|
152
|
+
url: this.config.redisConnection.url,
|
|
153
|
+
password: this.config.redisConnection.password
|
|
154
|
+
},
|
|
155
|
+
logger: this.logger
|
|
156
|
+
});
|
|
157
|
+
}
|
|
132
158
|
async importDatabase() {
|
|
133
159
|
try {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
mongo: {
|
|
139
|
-
url: dbConfig.endpoint,
|
|
140
|
-
dbname: dbConfig.dbname,
|
|
141
|
-
authSource: dbConfig.authSource
|
|
142
|
-
},
|
|
143
|
-
redis: {
|
|
144
|
-
url: this.config.redisConnection.url,
|
|
145
|
-
password: this.config.redisConnection.password
|
|
146
|
-
},
|
|
147
|
-
logger: this.logger
|
|
148
|
-
});
|
|
149
|
-
await this.db.connect();
|
|
150
|
-
}
|
|
160
|
+
const db = this.buildDatabase();
|
|
161
|
+
if (db) {
|
|
162
|
+
this.db = db;
|
|
163
|
+
await this.db.connect();
|
|
151
164
|
}
|
|
152
165
|
} catch (error) {
|
|
153
166
|
throw new ProsopoEnvError("DATABASE.DATABASE_IMPORT_FAILED", {
|
|
@@ -158,6 +171,32 @@ class Environment {
|
|
|
158
171
|
});
|
|
159
172
|
}
|
|
160
173
|
}
|
|
174
|
+
// Create the DB handle and kick off the connection WITHOUT awaiting it, so
|
|
175
|
+
// startup is never gated on the DB socket. Used in maintenance mode: the
|
|
176
|
+
// captcha request path never touches the DB (it short-circuits), but the
|
|
177
|
+
// admin endpoints do, so the handle must exist. A failed connection is
|
|
178
|
+
// logged rather than thrown — admin queries will surface the error (or
|
|
179
|
+
// succeed once the socket recovers) when they actually run.
|
|
180
|
+
connectDatabaseInBackground() {
|
|
181
|
+
try {
|
|
182
|
+
const db = this.buildDatabase();
|
|
183
|
+
if (!db) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.db = db;
|
|
187
|
+
db.connect().catch((error) => {
|
|
188
|
+
this.logger.warn(() => ({
|
|
189
|
+
msg: "Background DB connection failed in maintenance mode; admin endpoints will retry on demand",
|
|
190
|
+
data: { error }
|
|
191
|
+
}));
|
|
192
|
+
});
|
|
193
|
+
} catch (error) {
|
|
194
|
+
this.logger.warn(() => ({
|
|
195
|
+
msg: "Failed to create DB handle in maintenance mode; admin endpoints will be unavailable until restart",
|
|
196
|
+
data: { error }
|
|
197
|
+
}));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
161
200
|
}
|
|
162
201
|
const isMaintenanceMode = () => process.env.MAINTENANCE_MODE?.toLowerCase() === "true";
|
|
163
202
|
export {
|
package/dist/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,14 +73,38 @@ describe("Environment.isReady — maintenance mode startup tolerance", () => {
|
|
|
73
73
|
translationKey: "GENERAL.ENVIRONMENT_NOT_READY",
|
|
74
74
|
});
|
|
75
75
|
});
|
|
76
|
-
it("
|
|
76
|
+
it("creates the DB handle and connects in the background when maintenance mode is on", async () => {
|
|
77
77
|
process.env.MAINTENANCE_MODE = "true";
|
|
78
|
+
const connect = vi.fn().mockResolvedValue(undefined);
|
|
79
|
+
mockProviderDatabase.mockImplementation(() => ({
|
|
80
|
+
connect,
|
|
81
|
+
connected: false,
|
|
82
|
+
connection: { readyState: 0 },
|
|
83
|
+
}));
|
|
78
84
|
const env = buildEnv();
|
|
79
85
|
await env.isReady();
|
|
80
86
|
expect(env.ready).toBe(true);
|
|
81
|
-
expect(mockProviderDatabase).
|
|
87
|
+
expect(mockProviderDatabase).toHaveBeenCalledTimes(1);
|
|
88
|
+
expect(connect).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect(env.db).toBeDefined();
|
|
82
90
|
expect(mockIpInfoInit).toHaveBeenCalled();
|
|
83
91
|
});
|
|
92
|
+
it("does not gate boot when the background DB connect fails in maintenance mode", async () => {
|
|
93
|
+
process.env.MAINTENANCE_MODE = "true";
|
|
94
|
+
const connect = vi.fn().mockRejectedValue(new Error("ECONNREFUSED"));
|
|
95
|
+
mockProviderDatabase.mockImplementation(() => ({
|
|
96
|
+
connect,
|
|
97
|
+
connected: false,
|
|
98
|
+
connection: { readyState: 0 },
|
|
99
|
+
}));
|
|
100
|
+
const env = buildEnv();
|
|
101
|
+
await expect(env.isReady()).resolves.toBeUndefined();
|
|
102
|
+
expect(env.ready).toBe(true);
|
|
103
|
+
expect(env.db).toBeDefined();
|
|
104
|
+
expect(connect).toHaveBeenCalledTimes(1);
|
|
105
|
+
await Promise.resolve();
|
|
106
|
+
expect(env.logger.warn).toHaveBeenCalled();
|
|
107
|
+
});
|
|
84
108
|
it("still completes the normal connect path when Mongo is up", async () => {
|
|
85
109
|
const connect = vi.fn().mockResolvedValue(undefined);
|
|
86
110
|
mockProviderDatabase.mockImplementation(() => ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.maintenance.unit.test.js","sourceRoot":"","sources":["../../src/tests/env.maintenance.unit.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"env.maintenance.unit.test.js","sourceRoot":"","sources":["../../src/tests/env.maintenance.unit.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/env",
|
|
3
|
-
"version": "3.6.
|
|
3
|
+
"version": "3.6.11",
|
|
4
4
|
"description": "Path env prosopo environment",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
"typecheck": "tsc --project tsconfig.types.json"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@prosopo/ipinfo": "0.2.
|
|
30
|
-
"@prosopo/common": "3.1.
|
|
31
|
-
"@prosopo/logger": "2.0.
|
|
32
|
-
"@prosopo/database": "3.15.
|
|
33
|
-
"@prosopo/keyring": "2.9.
|
|
34
|
-
"@prosopo/types": "4.9.
|
|
35
|
-
"@prosopo/types-env": "2.10.
|
|
29
|
+
"@prosopo/ipinfo": "0.2.35",
|
|
30
|
+
"@prosopo/common": "3.1.44",
|
|
31
|
+
"@prosopo/logger": "2.0.2",
|
|
32
|
+
"@prosopo/database": "3.15.11",
|
|
33
|
+
"@prosopo/keyring": "2.9.55",
|
|
34
|
+
"@prosopo/types": "4.9.8",
|
|
35
|
+
"@prosopo/types-env": "2.10.10",
|
|
36
36
|
"@prosopo/util-crypto": "13.5.30"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|