@prosopo/env 3.2.35 → 3.5.7

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/env@3.2.35 build:cjs
2
+ > @prosopo/env@3.5.7 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -7,9 +7,11 @@ ViteCommonJSConfig: .
7
7
  tsConfigPaths: [
8
8
  '/home/runner/work/captcha/captcha/packages/common/tsconfig.json',
9
9
  '/home/runner/work/captcha/captcha/packages/locale/tsconfig.json',
10
- '/home/runner/work/captcha/captcha/packages/types/tsconfig.json',
10
+ '/home/runner/work/captcha/captcha/packages/logger/tsconfig.json',
11
11
  '/home/runner/work/captcha/captcha/packages/util/tsconfig.json',
12
+ '/home/runner/work/captcha/captcha/packages/types/tsconfig.json',
12
13
  '/home/runner/work/captcha/captcha/packages/util-crypto/tsconfig.json',
14
+ '/home/runner/work/captcha/captcha/packages/ipinfo/tsconfig.json',
13
15
  '/home/runner/work/captcha/captcha/packages/database/tsconfig.json',
14
16
  '/home/runner/work/captcha/captcha/packages/types-database/tsconfig.json',
15
17
  '/home/runner/work/captcha/captcha/packages/user-access-policy/tsconfig.json',
@@ -24,9 +26,11 @@ ViteCommonJSConfig: .
24
26
  externals: [
25
27
  '@prosopo/common',
26
28
  '@prosopo/locale',
27
- '@prosopo/types',
29
+ '@prosopo/logger',
28
30
  '@prosopo/util',
31
+ '@prosopo/types',
29
32
  '@prosopo/util-crypto',
33
+ '@prosopo/ipinfo',
30
34
  '@prosopo/database',
31
35
  '@prosopo/types-database',
32
36
  '@prosopo/user-access-policy',
@@ -43,7 +47,7 @@ transforming...
43
47
  Build end
44
48
  ✓ 3 modules transformed.
45
49
  rendering chunks...
46
- dist/cjs/index.cjs 0.26 kB
47
- dist/cjs/provider.cjs 0.56 kB
48
- dist/cjs/env.cjs 4.01 kB
49
- ✓ built in 113ms
50
+ dist/cjs/index.cjs 0.32 kB
51
+ dist/cjs/provider.cjs 1.43 kB
52
+ dist/cjs/env.cjs 4.86 kB
53
+ ✓ built in 114ms
@@ -1,14 +1,16 @@
1
1
 
2
- > @prosopo/env@3.2.35 build:tsc
2
+ > @prosopo/env@3.5.7 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 4:57:34 PM - Projects in this build:
5
+ 8:15:16 AM - Projects in this build:
6
6
  * ../../dev/config/tsconfig.json
7
7
  * ../locale/tsconfig.json
8
8
  * ../util/tsconfig.json
9
+ * ../logger/tsconfig.json
9
10
  * ../util-crypto/tsconfig.json
10
11
  * ../types/tsconfig.json
11
12
  * ../common/tsconfig.json
13
+ * ../ipinfo/tsconfig.json
12
14
  * ../api-route/tsconfig.json
13
15
  * ../redis-client/tsconfig.json
14
16
  * ../api/tsconfig.json
@@ -19,35 +21,39 @@
19
21
  * ../types-env/tsconfig.json
20
22
  * tsconfig.json
21
23
 
22
- 4:57:34 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/dependencies.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
24
+ 8:15:16 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'
23
25
 
24
- 4:57:34 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
26
+ 8:15:16 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
25
27
 
26
- 4:57:34 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/verifyRecency.ts' is older than output '../util/tsconfig.tsbuildinfo'
28
+ 8:15:16 AM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
27
29
 
28
- 4:57:34 PM - 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'
30
+ 8:15:16 AM - Project '../logger/tsconfig.json' is up to date because newest input '../logger/src/index.ts' is older than output '../logger/tsconfig.tsbuildinfo'
29
31
 
30
- 4:57:34 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/procaptcha/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
32
+ 8:15:16 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'
31
33
 
32
- 4:57:34 PM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/logger.ts' is older than output '../common/tsconfig.tsbuildinfo'
34
+ 8:15:16 AM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/procaptcha/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
33
35
 
34
- 4:57:34 PM - Project '../api-route/tsconfig.json' is up to date because newest input '../api-route/src/index.ts' is older than output '../api-route/tsconfig.tsbuildinfo'
36
+ 8:15:16 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/error.ts' is older than output '../common/tsconfig.tsbuildinfo'
35
37
 
36
- 4:57:35 PM - 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'
38
+ 8:15:17 AM - Project '../ipinfo/tsconfig.json' is up to date because newest input '../ipinfo/src/IpInfoService.ts' is older than output '../ipinfo/tsconfig.tsbuildinfo'
37
39
 
38
- 4:57:35 PM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
40
+ 8:15:17 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'
39
41
 
40
- 4:57:35 PM - 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'
42
+ 8:15:17 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'
41
43
 
42
- 4:57:35 PM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/index.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
44
+ 8:15:17 AM - Project '../api/tsconfig.json' is up to date because newest input '../api/src/index.ts' is older than output '../api/tsconfig.tsbuildinfo'
43
45
 
44
- 4:57:35 PM - Project '../database/tsconfig.json' is up to date because newest input '../database/src/index.ts' is older than output '../database/tsconfig.tsbuildinfo'
46
+ 8:15:17 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'
45
47
 
46
- 4:57:35 PM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
48
+ 8:15:17 AM - Project '../types-database/tsconfig.json' is up to date because newest input '../types-database/src/types/bannedDomain.ts' is older than output '../types-database/tsconfig.tsbuildinfo'
47
49
 
48
- 4:57:35 PM - 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'
50
+ 8:15:17 AM - Project '../database/tsconfig.json' is up to date because newest input '../database/src/tests/integration/ipInfoPersistence.integration.test.ts' is older than output '../database/tsconfig.tsbuildinfo'
49
51
 
50
- 4:57:35 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
52
+ 8:15:17 AM - Project '../keyring/tsconfig.json' is up to date because newest input '../keyring/src/index.ts' is older than output '../keyring/tsconfig.tsbuildinfo'
51
53
 
52
- 4:57:35 PM - Building project '/home/runner/work/captcha/captcha/packages/env/tsconfig.json'...
54
+ 8:15:17 AM - Project '../types-env/tsconfig.json' is up to date because newest input '../types-env/src/index.ts' is older than output '../types-env/tsconfig.tsbuildinfo'
55
+
56
+ 8:15:17 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
57
+
58
+ 8:15:17 AM - Building project '/home/runner/work/captcha/captcha/packages/env/tsconfig.json'...
53
59
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/env@3.2.35 build
2
+ > @prosopo/env@3.5.7 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/env@3.2.35 build:cross-env
6
+ > @prosopo/env@3.5.7 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -11,9 +11,11 @@ ViteEsmConfig: .
11
11
  tsConfigPaths: [
12
12
  '/home/runner/work/captcha/captcha/packages/common/tsconfig.json',
13
13
  '/home/runner/work/captcha/captcha/packages/locale/tsconfig.json',
14
- '/home/runner/work/captcha/captcha/packages/types/tsconfig.json',
14
+ '/home/runner/work/captcha/captcha/packages/logger/tsconfig.json',
15
15
  '/home/runner/work/captcha/captcha/packages/util/tsconfig.json',
16
+ '/home/runner/work/captcha/captcha/packages/types/tsconfig.json',
16
17
  '/home/runner/work/captcha/captcha/packages/util-crypto/tsconfig.json',
18
+ '/home/runner/work/captcha/captcha/packages/ipinfo/tsconfig.json',
17
19
  '/home/runner/work/captcha/captcha/packages/database/tsconfig.json',
18
20
  '/home/runner/work/captcha/captcha/packages/types-database/tsconfig.json',
19
21
  '/home/runner/work/captcha/captcha/packages/user-access-policy/tsconfig.json',
@@ -28,9 +30,11 @@ ViteEsmConfig: .
28
30
  externals: [
29
31
  '@prosopo/common',
30
32
  '@prosopo/locale',
31
- '@prosopo/types',
33
+ '@prosopo/logger',
32
34
  '@prosopo/util',
35
+ '@prosopo/types',
33
36
  '@prosopo/util-crypto',
37
+ '@prosopo/ipinfo',
34
38
  '@prosopo/database',
35
39
  '@prosopo/types-database',
36
40
  '@prosopo/user-access-policy',
@@ -47,7 +51,7 @@ transforming...
47
51
  Build end
48
52
  ✓ 3 modules transformed.
49
53
  rendering chunks...
50
- dist/index.js 0.14 kB
51
- dist/provider.js 0.46 kB
52
- dist/env.js 3.86 kB
53
- ✓ built in 181ms
54
+ dist/index.js 0.18 kB
55
+ dist/provider.js 1.35 kB
56
+ dist/env.js 4.68 kB
57
+ ✓ built in 151ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,443 @@
1
1
  # @prosopo/env
2
2
 
3
+ ## 3.5.7
4
+ ### Patch Changes
5
+
6
+ - Updated dependencies [a1d60db]
7
+ - Updated dependencies [2392aaf]
8
+ - Updated dependencies [97cf7bd]
9
+ - Updated dependencies [6ca1125]
10
+ - Updated dependencies [32a591b]
11
+ - @prosopo/types@4.3.0
12
+ - @prosopo/logger@1.0.2
13
+ - @prosopo/common@3.1.38
14
+ - @prosopo/database@3.13.7
15
+ - @prosopo/ipinfo@0.2.14
16
+ - @prosopo/keyring@2.9.34
17
+ - @prosopo/types-env@2.9.16
18
+
19
+ ## 3.5.6
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [6c26669]
23
+ - Updated dependencies [f7f9ec5]
24
+ - @prosopo/types@4.2.1
25
+ - @prosopo/database@3.13.6
26
+ - @prosopo/ipinfo@0.2.13
27
+ - @prosopo/keyring@2.9.33
28
+ - @prosopo/types-env@2.9.15
29
+
30
+ ## 3.5.5
31
+ ### Patch Changes
32
+
33
+ - 0fd81af: Extract the logger into its own `@prosopo/logger` package, out of `@prosopo/common`. Consumers now import logger symbols from `@prosopo/logger`; `@prosopo/common` no longer re-exports them. Unused `@prosopo/common` dependencies pruned where the only usage was the logger.
34
+ - Updated dependencies [0fd81af]
35
+ - @prosopo/common@3.1.37
36
+ - @prosopo/database@3.13.5
37
+ - @prosopo/ipinfo@0.2.12
38
+ - @prosopo/logger@1.0.1
39
+ - @prosopo/types-env@2.9.14
40
+ - @prosopo/keyring@2.9.32
41
+
42
+ ## 3.5.4
43
+ ### Patch Changes
44
+
45
+ - Updated dependencies [20cae63]
46
+ - Updated dependencies [b2e1a5d]
47
+ - Updated dependencies [4d9923e]
48
+ - @prosopo/types@4.2.0
49
+ - @prosopo/database@3.13.4
50
+ - @prosopo/types-env@2.9.13
51
+ - @prosopo/ipinfo@0.2.11
52
+ - @prosopo/keyring@2.9.31
53
+
54
+ ## 3.5.3
55
+ ### Patch Changes
56
+
57
+ - Updated dependencies [d351362]
58
+ - @prosopo/types@4.1.4
59
+ - @prosopo/database@3.13.3
60
+ - @prosopo/ipinfo@0.2.10
61
+ - @prosopo/keyring@2.9.30
62
+ - @prosopo/types-env@2.9.12
63
+
64
+ ## 3.5.2
65
+ ### Patch Changes
66
+
67
+ - Updated dependencies [e2711ae]
68
+ - Updated dependencies [5786629]
69
+ - @prosopo/types@4.1.3
70
+ - @prosopo/database@3.13.2
71
+ - @prosopo/keyring@2.9.29
72
+ - @prosopo/common@3.1.36
73
+ - @prosopo/ipinfo@0.2.9
74
+ - @prosopo/types-env@2.9.11
75
+
76
+ ## 3.5.1
77
+ ### Patch Changes
78
+
79
+ - @prosopo/database@3.13.1
80
+ - @prosopo/keyring@2.9.28
81
+ - @prosopo/types@4.1.2
82
+ - @prosopo/types-env@2.9.10
83
+ - @prosopo/ipinfo@0.2.8
84
+
85
+ ## 3.5.0
86
+ ### Minor Changes
87
+
88
+ - 91958da: Puzzle captcha + maintenance mode hardening, plus a refactor of the
89
+ frictionless handler into focused modules.
90
+
91
+ - **Puzzle captcha now records checkbox-click coordinates like POW.** Adds an
92
+ optional `salt` field to `SubmitPuzzleCaptchaSolutionBody`; the puzzle
93
+ widget hashes the click coords into the salt and the server decodes them
94
+ into the puzzle record's `coords` field on submit. New `start(x, y)`
95
+ parameters on `procaptcha-puzzle` Manager + widget.
96
+ - **Fix puzzle "No session found" caused by stale Redis dedup.** The
97
+ `/frictionless` dedup path is now Mongo-authoritative — Redis is no
98
+ longer consulted as a session source. A concurrent `/captcha/{type}`
99
+ invalidation could previously race a fire-and-forget Redis repopulation
100
+ in the `/frictionless` dedup branch, leaving Redis pointing at a
101
+ Mongo-deleted session for the full 1-hour TTL. Stale pointers are now
102
+ evicted lazily.
103
+ - **Maintenance mode operates without MongoDB.** `/frictionless` and
104
+ `/captcha/{pow,puzzle}` short-circuit to dummy responses before any DB
105
+ call, and `Environment.isReady()` tolerates a Mongo connect failure when
106
+ `MAINTENANCE_MODE=true` so the provider can start with Mongo down.
107
+ - **Refactor `getFrictionlessCaptchaChallenge.ts` into focused modules** under
108
+ `getFrictionlessCaptchaChallenge/` (handler, sessionDedup, shortCircuit,
109
+ accessPolicy, decisionMachine, decryptSimdReadings, constants). Original
110
+ import path preserved via a re-export shim.
111
+ - **Move `RedisWriteQueue` from `@prosopo/provider` to `@prosopo/database`**
112
+ (where the Redis connection itself lives), and clear residual Redis
113
+ session keys at provider startup via `Environment.cleanup()` so a
114
+ previously-crashed run can't leak stale dedup pointers.
115
+ - Adds puzzle-type branch to access-policy handling in `/frictionless`.
116
+
117
+ ### Patch Changes
118
+
119
+ - Updated dependencies [91958da]
120
+ - @prosopo/database@3.13.0
121
+ - @prosopo/types@4.1.1
122
+ - @prosopo/common@3.1.35
123
+ - @prosopo/ipinfo@0.2.7
124
+ - @prosopo/keyring@2.9.27
125
+ - @prosopo/types-env@2.9.9
126
+
127
+ ## 3.4.9
128
+ ### Patch Changes
129
+
130
+ - Updated dependencies [6a741ce]
131
+ - @prosopo/types@4.1.0
132
+ - @prosopo/database@3.12.1
133
+ - @prosopo/ipinfo@0.2.6
134
+ - @prosopo/keyring@2.9.26
135
+ - @prosopo/types-env@2.9.8
136
+
137
+ ## 3.4.8
138
+ ### Patch Changes
139
+
140
+ - Updated dependencies [f9ea09d]
141
+ - Updated dependencies [3c0be68]
142
+ - Updated dependencies [f9ea09d]
143
+ - Updated dependencies [d865319]
144
+ - Updated dependencies [753304b]
145
+ - Updated dependencies [8bb7286]
146
+ - Updated dependencies [f9ea09d]
147
+ - Updated dependencies [4aae4e6]
148
+ - Updated dependencies [4993813]
149
+ - @prosopo/database@3.12.0
150
+ - @prosopo/types@4.0.0
151
+ - @prosopo/keyring@2.9.25
152
+ - @prosopo/common@3.1.34
153
+ - @prosopo/ipinfo@0.2.5
154
+ - @prosopo/types-env@2.9.7
155
+
156
+ ## 3.4.7
157
+ ### Patch Changes
158
+
159
+ - Updated dependencies [819ed95]
160
+ - Updated dependencies [33a6c57]
161
+ - @prosopo/types@3.16.1
162
+ - @prosopo/database@3.11.0
163
+ - @prosopo/types-env@2.9.6
164
+ - @prosopo/ipinfo@0.2.4
165
+ - @prosopo/keyring@2.9.24
166
+
167
+ ## 3.4.6
168
+ ### Patch Changes
169
+
170
+ - @prosopo/database@3.10.2
171
+ - @prosopo/types-env@2.9.5
172
+
173
+ ## 3.4.5
174
+ ### Patch Changes
175
+
176
+ - Updated dependencies [942701b]
177
+ - @prosopo/database@3.10.1
178
+
179
+ ## 3.4.4
180
+ ### Patch Changes
181
+
182
+ - Updated dependencies [74092d0]
183
+ - @prosopo/database@3.10.0
184
+ - @prosopo/types-env@2.9.4
185
+
186
+ ## 3.4.3
187
+ ### Patch Changes
188
+
189
+ - Updated dependencies [f6a4402]
190
+ - Updated dependencies [99dfb44]
191
+ - @prosopo/database@3.9.18
192
+ - @prosopo/types@3.16.0
193
+ - @prosopo/types-env@2.9.3
194
+ - @prosopo/ipinfo@0.2.3
195
+ - @prosopo/keyring@2.9.23
196
+
197
+ ## 3.4.2
198
+ ### Patch Changes
199
+
200
+ - Updated dependencies [3e54c0a]
201
+ - @prosopo/types@3.15.0
202
+ - @prosopo/database@3.9.17
203
+ - @prosopo/ipinfo@0.2.2
204
+ - @prosopo/keyring@2.9.22
205
+ - @prosopo/types-env@2.9.2
206
+
207
+ ## 3.4.1
208
+ ### Patch Changes
209
+
210
+ - Updated dependencies [946a8ba]
211
+ - Updated dependencies [5614814]
212
+ - @prosopo/types@3.14.1
213
+ - @prosopo/database@3.9.16
214
+ - @prosopo/types-env@2.9.1
215
+ - @prosopo/common@3.1.33
216
+ - @prosopo/ipinfo@0.2.1
217
+ - @prosopo/keyring@2.9.21
218
+
219
+ ## 3.4.0
220
+ ### Minor Changes
221
+
222
+ - 42650db: Add better spam rules and move ipinfo service to local instead of external
223
+
224
+ ### Patch Changes
225
+
226
+ - Updated dependencies [fc514dd]
227
+ - Updated dependencies [42650db]
228
+ - @prosopo/ipinfo@0.2.0
229
+ - @prosopo/types@3.14.0
230
+ - @prosopo/types-env@2.9.0
231
+ - @prosopo/database@3.9.15
232
+ - @prosopo/common@3.1.32
233
+ - @prosopo/keyring@2.9.20
234
+
235
+ ## 3.3.15
236
+ ### Patch Changes
237
+
238
+ - Updated dependencies [4a9c518]
239
+ - @prosopo/common@3.1.31
240
+ - @prosopo/database@3.9.14
241
+ - @prosopo/keyring@2.9.19
242
+ - @prosopo/types-env@2.8.15
243
+
244
+ ## 3.3.14
245
+ ### Patch Changes
246
+
247
+ - @prosopo/database@3.9.13
248
+ - @prosopo/keyring@2.9.18
249
+ - @prosopo/types@3.13.3
250
+ - @prosopo/types-env@2.8.14
251
+
252
+ ## 3.3.13
253
+ ### Patch Changes
254
+
255
+ - @prosopo/database@3.9.12
256
+ - @prosopo/keyring@2.9.17
257
+ - @prosopo/types@3.13.2
258
+ - @prosopo/types-env@2.8.13
259
+
260
+ ## 3.3.12
261
+ ### Patch Changes
262
+
263
+ - @prosopo/database@3.9.11
264
+ - @prosopo/keyring@2.9.16
265
+ - @prosopo/types@3.13.1
266
+ - @prosopo/types-env@2.8.12
267
+
268
+ ## 3.3.11
269
+ ### Patch Changes
270
+
271
+ - Updated dependencies [e6d9553]
272
+ - @prosopo/types@3.13.0
273
+ - @prosopo/database@3.9.10
274
+ - @prosopo/keyring@2.9.15
275
+ - @prosopo/types-env@2.8.11
276
+
277
+ ## 3.3.10
278
+ ### Patch Changes
279
+
280
+ - Updated dependencies [d5082a9]
281
+ - Updated dependencies [e1ea65f]
282
+ - Updated dependencies [c316257]
283
+ - @prosopo/types@3.12.3
284
+ - @prosopo/database@3.9.9
285
+ - @prosopo/keyring@2.9.14
286
+ - @prosopo/types-env@2.8.10
287
+
288
+ ## 3.3.9
289
+ ### Patch Changes
290
+
291
+ - Updated dependencies [adb89a6]
292
+ - @prosopo/database@3.9.8
293
+ - @prosopo/types@3.12.2
294
+ - @prosopo/types-env@2.8.9
295
+ - @prosopo/common@3.1.30
296
+ - @prosopo/keyring@2.9.13
297
+
298
+ ## 3.3.8
299
+ ### Patch Changes
300
+
301
+ - Updated dependencies [c5ee492]
302
+ - Updated dependencies [a90eb54]
303
+ - @prosopo/common@3.1.29
304
+ - @prosopo/types@3.12.1
305
+ - @prosopo/database@3.9.7
306
+ - @prosopo/keyring@2.9.12
307
+ - @prosopo/types-env@2.8.8
308
+
309
+ ## 3.3.7
310
+ ### Patch Changes
311
+
312
+ - Updated dependencies [676c5f2]
313
+ - Updated dependencies [feaca02]
314
+ - @prosopo/keyring@2.9.11
315
+ - @prosopo/types@3.12.0
316
+ - @prosopo/types-env@2.8.7
317
+ - @prosopo/database@3.9.6
318
+
319
+ ## 3.3.6
320
+ ### Patch Changes
321
+
322
+ - Updated dependencies [8148587]
323
+ - @prosopo/types@3.11.1
324
+ - @prosopo/database@3.9.5
325
+ - @prosopo/types-env@2.8.6
326
+ - @prosopo/keyring@2.9.10
327
+
328
+ ## 3.3.5
329
+ ### Patch Changes
330
+
331
+ - @prosopo/database@3.9.4
332
+ - @prosopo/types-env@2.8.5
333
+
334
+ ## 3.3.4
335
+ ### Patch Changes
336
+
337
+ - Updated dependencies [7f6ffc5]
338
+ - @prosopo/types@3.11.0
339
+ - @prosopo/database@3.9.3
340
+ - @prosopo/keyring@2.9.9
341
+ - @prosopo/types-env@2.8.4
342
+
343
+ ## 3.3.3
344
+ ### Patch Changes
345
+
346
+ - Updated dependencies [93fa086]
347
+ - @prosopo/database@3.9.2
348
+ - @prosopo/types@3.10.2
349
+ - @prosopo/types-env@2.8.3
350
+ - @prosopo/keyring@2.9.8
351
+
352
+ ## 3.3.2
353
+ ### Patch Changes
354
+
355
+ - Updated dependencies [cde7550]
356
+ - @prosopo/types@3.10.1
357
+ - @prosopo/database@3.9.1
358
+ - @prosopo/types-env@2.8.2
359
+ - @prosopo/keyring@2.9.7
360
+
361
+ ## 3.3.1
362
+ ### Patch Changes
363
+
364
+ - Updated dependencies [ad6d622]
365
+ - Updated dependencies [ced9f41]
366
+ - Updated dependencies [fa95c5f]
367
+ - @prosopo/database@3.9.0
368
+ - @prosopo/types@3.10.0
369
+ - @prosopo/types-env@2.8.1
370
+ - @prosopo/keyring@2.9.6
371
+
372
+ ## 3.3.0
373
+ ### Minor Changes
374
+
375
+ - ff58a70: Load the geolocation service at startup only
376
+
377
+ ### Patch Changes
378
+
379
+ - Updated dependencies [ff58a70]
380
+ - Updated dependencies [d329e63]
381
+ - @prosopo/types-env@2.8.0
382
+ - @prosopo/types@3.9.0
383
+ - @prosopo/database@3.8.0
384
+ - @prosopo/keyring@2.9.5
385
+
386
+ ## 3.2.42
387
+ ### Patch Changes
388
+
389
+ - Updated dependencies [3feeea4]
390
+ - @prosopo/database@3.7.0
391
+ - @prosopo/types-env@2.7.66
392
+
393
+ ## 3.2.41
394
+ ### Patch Changes
395
+
396
+ - Updated dependencies [d2431cd]
397
+ - @prosopo/types@3.8.4
398
+ - @prosopo/database@3.6.12
399
+ - @prosopo/types-env@2.7.65
400
+ - @prosopo/keyring@2.9.4
401
+
402
+ ## 3.2.40
403
+ ### Patch Changes
404
+
405
+ - @prosopo/database@3.6.11
406
+ - @prosopo/types-env@2.7.64
407
+
408
+ ## 3.2.39
409
+ ### Patch Changes
410
+
411
+ - Updated dependencies [bd6995b]
412
+ - @prosopo/types@3.8.3
413
+ - @prosopo/database@3.6.10
414
+ - @prosopo/keyring@2.9.3
415
+ - @prosopo/types-env@2.7.63
416
+
417
+ ## 3.2.38
418
+ ### Patch Changes
419
+
420
+ - Updated dependencies [9633e58]
421
+ - @prosopo/types@3.8.2
422
+ - @prosopo/database@3.6.9
423
+ - @prosopo/types-env@2.7.62
424
+ - @prosopo/keyring@2.9.2
425
+
426
+ ## 3.2.37
427
+ ### Patch Changes
428
+
429
+ - Updated dependencies [f52a5c1]
430
+ - @prosopo/database@3.6.8
431
+ - @prosopo/types@3.8.1
432
+ - @prosopo/types-env@2.7.61
433
+ - @prosopo/keyring@2.9.1
434
+
435
+ ## 3.2.36
436
+ ### Patch Changes
437
+
438
+ - @prosopo/database@3.6.7
439
+ - @prosopo/types-env@2.7.60
440
+
3
441
  ## 3.2.35
4
442
  ### Patch Changes
5
443
 
package/dist/cjs/env.cjs CHANGED
@@ -2,7 +2,9 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const common = require("@prosopo/common");
4
4
  const database = require("@prosopo/database");
5
+ const ipinfo = require("@prosopo/ipinfo");
5
6
  const keyring = require("@prosopo/keyring");
7
+ const logger = require("@prosopo/logger");
6
8
  const utilCrypto = require("@prosopo/util-crypto");
7
9
  class Environment {
8
10
  constructor(config, pair, authAccount) {
@@ -11,8 +13,8 @@ class Environment {
11
13
  this.defaultEnvironment = this.config.defaultEnvironment;
12
14
  this.pair = pair || keyring.getPair(config.account.secret);
13
15
  this.authAccount = authAccount;
14
- this.logger = common.getLogger(
15
- common.parseLogLevel(this.config.logLevel),
16
+ this.logger = logger.getLogger(
17
+ logger.parseLogLevel(this.config.logLevel),
16
18
  "ProsopoEnvironment"
17
19
  );
18
20
  this.keyring = new keyring.Keyring({
@@ -20,12 +22,20 @@ class Environment {
20
22
  });
21
23
  if (this.pair) this.keyring.addPair(this.pair);
22
24
  this.envId = utilCrypto.randomAsHex(32).slice(0, 32);
25
+ this.ipInfoService = new ipinfo.IpInfoService({
26
+ maxmindCityDbPath: this.config.maxmindCityDbPath ?? this.config.maxmindDbPath,
27
+ maxmindAsnDbPath: this.config.maxmindAsnDbPath,
28
+ ipapiUrl: this.config.ipApi?.baseUrl,
29
+ ipapiKey: this.config.ipApi?.apiKey,
30
+ logger: this.logger
31
+ });
23
32
  this.logger.info(() => ({
24
33
  msg: "Environment initialized",
25
34
  data: {
26
35
  envId: this.envId,
27
36
  defaultEnvironment: this.defaultEnvironment,
28
- logLevel: this.config.logLevel
37
+ logLevel: this.config.logLevel,
38
+ maxmindDbPath: this.config.maxmindDbPath || "not configured"
29
39
  }
30
40
  }));
31
41
  }
@@ -78,16 +88,21 @@ class Environment {
78
88
  this.pair.unlock(this.config.account.password);
79
89
  }
80
90
  await this.getSigner();
81
- if (!this.db) {
91
+ const maintenanceMode = isMaintenanceMode();
92
+ if (maintenanceMode) {
93
+ this.logger.warn(() => ({
94
+ msg: "MAINTENANCE_MODE=true — skipping DB import on startup"
95
+ }));
96
+ } else if (!this.db) {
82
97
  await this.importDatabase();
83
- }
84
- if (this.db && !this.db.connected) {
98
+ } else if (this.db && !this.db.connected) {
85
99
  this.logger.warn(() => ({
86
100
  msg: `Database connection is not ready (state: ${this.db?.connection?.readyState}), reconnecting...`
87
101
  }));
88
102
  await this.db.connect();
89
103
  this.logger.info(() => ({ msg: "Connected to db" }));
90
104
  }
105
+ await this.ipInfoService.initialize();
91
106
  this.ready = true;
92
107
  } catch (err) {
93
108
  throw new common.ProsopoEnvError("GENERAL.ENVIRONMENT_NOT_READY", {
@@ -126,4 +141,6 @@ class Environment {
126
141
  }
127
142
  }
128
143
  }
144
+ const isMaintenanceMode = () => process.env.MAINTENANCE_MODE?.toLowerCase() === "true";
129
145
  exports.Environment = Environment;
146
+ exports.isMaintenanceMode = isMaintenanceMode;
@@ -3,4 +3,5 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const env = require("./env.cjs");
4
4
  const provider = require("./provider.cjs");
5
5
  exports.Environment = env.Environment;
6
+ exports.isMaintenanceMode = env.isMaintenanceMode;
6
7
  exports.ProviderEnvironment = provider.ProviderEnvironment;
@@ -1,16 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const database = require("@prosopo/database");
3
4
  const types = require("@prosopo/types");
4
5
  const env = require("./env.cjs");
5
6
  class ProviderEnvironment extends env.Environment {
6
7
  cleanup() {
7
- this.getDb().cleanupScheduledTaskStatus(types.ScheduledTaskStatus.Running).catch((err) => {
8
+ const dbConnected = this.db?.connected ?? false;
9
+ if (!dbConnected || env.isMaintenanceMode()) {
10
+ this.logger.warn(() => ({
11
+ msg: "Skipping startup cleanup — DB not connected (maintenance mode or boot-time DB failure)"
12
+ }));
13
+ return;
14
+ }
15
+ this.db?.cleanupScheduledTaskStatus(types.ScheduledTaskStatus.Running).catch((err) => {
8
16
  this.logger.error(() => ({
9
17
  msg: "Failed to cleanup running scheduled tasks",
10
18
  err,
11
19
  data: { failedFuncName: this.cleanup.name }
12
20
  }));
13
21
  });
22
+ try {
23
+ const redisConnection = this.getDb().getRedisConnection();
24
+ const writeQueue = new database.RedisWriteQueue(redisConnection, this.logger);
25
+ writeQueue.clearAllSessionRecords().catch((err) => {
26
+ this.logger.error(() => ({
27
+ msg: "Failed to clear Redis session records at startup",
28
+ err,
29
+ data: { failedFuncName: this.cleanup.name }
30
+ }));
31
+ });
32
+ } catch (err) {
33
+ this.logger.warn(() => ({
34
+ msg: "Skipped Redis session cleanup — no Redis connection",
35
+ err
36
+ }));
37
+ }
14
38
  }
15
39
  }
16
40
  exports.ProviderEnvironment = ProviderEnvironment;
package/dist/env.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { type Logger } from "@prosopo/common";
2
1
  import { ProviderDatabase } from "@prosopo/database";
3
2
  import { Keyring } from "@prosopo/keyring";
3
+ import { type Logger } from "@prosopo/logger";
4
4
  import type { KeyringPair } from "@prosopo/types";
5
5
  import type { AssetsResolver, EnvironmentTypes } from "@prosopo/types";
6
6
  import type { ProsopoConfigOutput } from "@prosopo/types";
7
- import type { ProsopoEnvironment } from "@prosopo/types-env";
7
+ import type { IIpInfoService, ProsopoEnvironment } from "@prosopo/types-env";
8
8
  export declare class Environment implements ProsopoEnvironment {
9
9
  config: ProsopoConfigOutput;
10
10
  db: ProviderDatabase | undefined;
@@ -15,6 +15,7 @@ export declare class Environment implements ProsopoEnvironment {
15
15
  pair: KeyringPair | undefined;
16
16
  authAccount: KeyringPair | undefined;
17
17
  envId: string | undefined;
18
+ ipInfoService: IIpInfoService;
18
19
  ready: boolean;
19
20
  constructor(config: ProsopoConfigOutput, pair?: KeyringPair, authAccount?: KeyringPair);
20
21
  getSigner(): Promise<KeyringPair>;
@@ -24,4 +25,5 @@ export declare class Environment implements ProsopoEnvironment {
24
25
  isReady(): Promise<void>;
25
26
  importDatabase(): Promise<void>;
26
27
  }
28
+ export declare const isMaintenanceMode: () => boolean;
27
29
  //# 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":"AAcA,OAAO,EACN,KAAK,MAAM,EAIX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAW,MAAM,kBAAkB,CAAC;AACpD,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,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,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,KAAK,UAAS;gBAGb,MAAM,EAAE,mBAAmB,EAC3B,IAAI,CAAC,EAAE,WAAW,EAClB,WAAW,CAAC,EAAE,WAAW;IA0BpB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC;IAkBvC,KAAK,IAAI,gBAAgB;IASzB,iBAAiB,IAAI,cAAc;IASnC,OAAO,IAAI,WAAW;IAShB,OAAO;IA6BP,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAiCrC"}
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;gBAGb,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;IAwCP,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAiCrC;AAID,eAAO,MAAM,iBAAiB,QAAO,OACkB,CAAC"}
package/dist/env.js CHANGED
@@ -1,6 +1,8 @@
1
- import { getLogger, parseLogLevel, ProsopoEnvError } from "@prosopo/common";
1
+ import { ProsopoEnvError } from "@prosopo/common";
2
2
  import { ProviderDatabase } from "@prosopo/database";
3
+ import { IpInfoService } from "@prosopo/ipinfo";
3
4
  import { getPair, Keyring } from "@prosopo/keyring";
5
+ import { getLogger, parseLogLevel } from "@prosopo/logger";
4
6
  import { randomAsHex } from "@prosopo/util-crypto";
5
7
  class Environment {
6
8
  constructor(config, pair, authAccount) {
@@ -18,12 +20,20 @@ class Environment {
18
20
  });
19
21
  if (this.pair) this.keyring.addPair(this.pair);
20
22
  this.envId = randomAsHex(32).slice(0, 32);
23
+ this.ipInfoService = new IpInfoService({
24
+ maxmindCityDbPath: this.config.maxmindCityDbPath ?? this.config.maxmindDbPath,
25
+ maxmindAsnDbPath: this.config.maxmindAsnDbPath,
26
+ ipapiUrl: this.config.ipApi?.baseUrl,
27
+ ipapiKey: this.config.ipApi?.apiKey,
28
+ logger: this.logger
29
+ });
21
30
  this.logger.info(() => ({
22
31
  msg: "Environment initialized",
23
32
  data: {
24
33
  envId: this.envId,
25
34
  defaultEnvironment: this.defaultEnvironment,
26
- logLevel: this.config.logLevel
35
+ logLevel: this.config.logLevel,
36
+ maxmindDbPath: this.config.maxmindDbPath || "not configured"
27
37
  }
28
38
  }));
29
39
  }
@@ -76,16 +86,21 @@ class Environment {
76
86
  this.pair.unlock(this.config.account.password);
77
87
  }
78
88
  await this.getSigner();
79
- if (!this.db) {
89
+ const maintenanceMode = isMaintenanceMode();
90
+ if (maintenanceMode) {
91
+ this.logger.warn(() => ({
92
+ msg: "MAINTENANCE_MODE=true — skipping DB import on startup"
93
+ }));
94
+ } else if (!this.db) {
80
95
  await this.importDatabase();
81
- }
82
- if (this.db && !this.db.connected) {
96
+ } else if (this.db && !this.db.connected) {
83
97
  this.logger.warn(() => ({
84
98
  msg: `Database connection is not ready (state: ${this.db?.connection?.readyState}), reconnecting...`
85
99
  }));
86
100
  await this.db.connect();
87
101
  this.logger.info(() => ({ msg: "Connected to db" }));
88
102
  }
103
+ await this.ipInfoService.initialize();
89
104
  this.ready = true;
90
105
  } catch (err) {
91
106
  throw new ProsopoEnvError("GENERAL.ENVIRONMENT_NOT_READY", {
@@ -124,6 +139,8 @@ class Environment {
124
139
  }
125
140
  }
126
141
  }
142
+ const isMaintenanceMode = () => process.env.MAINTENANCE_MODE?.toLowerCase() === "true";
127
143
  export {
128
- Environment
144
+ Environment,
145
+ isMaintenanceMode
129
146
  };
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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"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
- import { Environment } from "./env.js";
1
+ import { Environment, isMaintenanceMode } from "./env.js";
2
2
  import { ProviderEnvironment } from "./provider.js";
3
3
  export {
4
4
  Environment,
5
- ProviderEnvironment
5
+ ProviderEnvironment,
6
+ isMaintenanceMode
6
7
  };
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,KAAK,mBAAmB,EAAuB,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,qBAAa,mBAAoB,SAAQ,WAAW;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IAEpC,OAAO,IAAI,IAAI;CAWf"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,mBAAmB,EAAuB,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAqB,MAAM,UAAU,CAAC;AAE1D,qBAAa,mBAAoB,SAAQ,WAAW;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IAEpC,OAAO,IAAI,IAAI;CA2Cf"}
package/dist/provider.js CHANGED
@@ -1,14 +1,38 @@
1
+ import { RedisWriteQueue } from "@prosopo/database";
1
2
  import { ScheduledTaskStatus } from "@prosopo/types";
2
- import { Environment } from "./env.js";
3
+ import { Environment, isMaintenanceMode } from "./env.js";
3
4
  class ProviderEnvironment extends Environment {
4
5
  cleanup() {
5
- this.getDb().cleanupScheduledTaskStatus(ScheduledTaskStatus.Running).catch((err) => {
6
+ const dbConnected = this.db?.connected ?? false;
7
+ if (!dbConnected || isMaintenanceMode()) {
8
+ this.logger.warn(() => ({
9
+ msg: "Skipping startup cleanup — DB not connected (maintenance mode or boot-time DB failure)"
10
+ }));
11
+ return;
12
+ }
13
+ this.db?.cleanupScheduledTaskStatus(ScheduledTaskStatus.Running).catch((err) => {
6
14
  this.logger.error(() => ({
7
15
  msg: "Failed to cleanup running scheduled tasks",
8
16
  err,
9
17
  data: { failedFuncName: this.cleanup.name }
10
18
  }));
11
19
  });
20
+ try {
21
+ const redisConnection = this.getDb().getRedisConnection();
22
+ const writeQueue = new RedisWriteQueue(redisConnection, this.logger);
23
+ writeQueue.clearAllSessionRecords().catch((err) => {
24
+ this.logger.error(() => ({
25
+ msg: "Failed to clear Redis session records at startup",
26
+ err,
27
+ data: { failedFuncName: this.cleanup.name }
28
+ }));
29
+ });
30
+ } catch (err) {
31
+ this.logger.warn(() => ({
32
+ msg: "Skipped Redis session cleanup — no Redis connection",
33
+ err
34
+ }));
35
+ }
12
36
  }
13
37
  }
14
38
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAcA,OAAO,EAA4B,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAGnD,OAAO;QACN,IAAI,CAAC,KAAK,EAAE;aACV,0BAA0B,CAAC,mBAAmB,CAAC,OAAO,CAAC;aACvD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxB,GAAG,EAAE,2CAA2C;gBAChD,GAAG;gBACH,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;aAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACD"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAA4B,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE1D,MAAM,OAAO,mBAAoB,SAAQ,WAAW;IAGnD,OAAO;QAIN,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,IAAI,KAAK,CAAC;QAChD,IAAI,CAAC,WAAW,IAAI,iBAAiB,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACvB,GAAG,EAAE,wFAAwF;aAC7F,CAAC,CAAC,CAAC;YACJ,OAAO;QACR,CAAC;QAED,IAAI,CAAC,EAAE;YACN,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,OAAO,CAAC;aACxD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxB,GAAG,EAAE,2CAA2C;gBAChD,GAAG;gBACH,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;aAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAMJ,IAAI,CAAC;YACJ,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,kBAAkB,EAAE,CAAC;YAC1D,MAAM,UAAU,GAAG,IAAI,eAAe,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACrE,UAAU,CAAC,sBAAsB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;oBACxB,GAAG,EAAE,kDAAkD;oBACvD,GAAG;oBACH,IAAI,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;iBAC3C,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACvB,GAAG,EAAE,qDAAqD;gBAC1D,GAAG;aACH,CAAC,CAAC,CAAC;QACL,CAAC;IACF,CAAC;CACD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env.maintenance.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.maintenance.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/env.maintenance.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,119 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ const { mockProviderDatabase, mockIpInfoInit } = vi.hoisted(() => ({
3
+ mockProviderDatabase: vi.fn(),
4
+ mockIpInfoInit: vi.fn().mockResolvedValue(undefined),
5
+ }));
6
+ vi.mock("@prosopo/database", () => ({
7
+ ProviderDatabase: mockProviderDatabase,
8
+ }));
9
+ vi.mock("@prosopo/ipinfo", () => ({
10
+ IpInfoService: vi.fn().mockImplementation(() => ({
11
+ initialize: mockIpInfoInit,
12
+ })),
13
+ }));
14
+ vi.mock("@prosopo/keyring", () => ({
15
+ Keyring: vi.fn().mockImplementation(() => ({
16
+ addPair: vi.fn((p) => p),
17
+ })),
18
+ getPair: vi.fn(() => ({
19
+ address: "addr",
20
+ isLocked: false,
21
+ unlock: vi.fn(),
22
+ })),
23
+ }));
24
+ import { Environment, isMaintenanceMode } from "../env.js";
25
+ const buildConfig = () => ({
26
+ defaultEnvironment: "test",
27
+ logLevel: "info",
28
+ account: { secret: "//Alice", password: undefined },
29
+ database: {
30
+ test: {
31
+ endpoint: "mongodb://127.0.0.1:27017",
32
+ dbname: "test",
33
+ authSource: "admin",
34
+ type: "mongo",
35
+ },
36
+ },
37
+ redisConnection: { url: "redis://localhost", password: "" },
38
+ maxmindDbPath: undefined,
39
+ ipApi: undefined,
40
+ });
41
+ const buildEnv = () => {
42
+ const config = buildConfig();
43
+ const env = new Environment(config, {
44
+ address: "addr",
45
+ isLocked: false,
46
+ unlock: vi.fn(),
47
+ });
48
+ env.logger = {
49
+ debug: vi.fn(),
50
+ info: vi.fn(),
51
+ warn: vi.fn(),
52
+ error: vi.fn(),
53
+ };
54
+ return env;
55
+ };
56
+ describe("Environment.isReady — maintenance mode startup tolerance", () => {
57
+ beforeEach(() => {
58
+ mockProviderDatabase.mockReset();
59
+ mockIpInfoInit.mockClear();
60
+ process.env.MAINTENANCE_MODE = undefined;
61
+ });
62
+ afterEach(() => {
63
+ process.env.MAINTENANCE_MODE = undefined;
64
+ });
65
+ it("throws when DB connect fails and maintenance mode is off", async () => {
66
+ mockProviderDatabase.mockImplementation(() => ({
67
+ connect: vi.fn().mockRejectedValue(new Error("ECONNREFUSED")),
68
+ connected: false,
69
+ connection: { readyState: 0 },
70
+ }));
71
+ const env = buildEnv();
72
+ await expect(env.isReady()).rejects.toMatchObject({
73
+ translationKey: "GENERAL.ENVIRONMENT_NOT_READY",
74
+ });
75
+ });
76
+ it("skips DB import entirely when maintenance mode is on", async () => {
77
+ process.env.MAINTENANCE_MODE = "true";
78
+ const env = buildEnv();
79
+ await env.isReady();
80
+ expect(env.ready).toBe(true);
81
+ expect(mockProviderDatabase).not.toHaveBeenCalled();
82
+ expect(mockIpInfoInit).toHaveBeenCalled();
83
+ });
84
+ it("still completes the normal connect path when Mongo is up", async () => {
85
+ const connect = vi.fn().mockResolvedValue(undefined);
86
+ mockProviderDatabase.mockImplementation(() => ({
87
+ connect,
88
+ connected: true,
89
+ connection: { readyState: 1 },
90
+ }));
91
+ const env = buildEnv();
92
+ await env.isReady();
93
+ expect(env.ready).toBe(true);
94
+ expect(connect).toHaveBeenCalled();
95
+ });
96
+ });
97
+ describe("isMaintenanceMode", () => {
98
+ afterEach(() => {
99
+ process.env.MAINTENANCE_MODE = undefined;
100
+ });
101
+ it("returns true when MAINTENANCE_MODE=true", () => {
102
+ process.env.MAINTENANCE_MODE = "true";
103
+ expect(isMaintenanceMode()).toBe(true);
104
+ });
105
+ it("is case-insensitive", () => {
106
+ process.env.MAINTENANCE_MODE = "TRUE";
107
+ expect(isMaintenanceMode()).toBe(true);
108
+ });
109
+ it("returns false when unset", () => {
110
+ expect(isMaintenanceMode()).toBe(false);
111
+ });
112
+ it("returns false for any non-`true` value", () => {
113
+ process.env.MAINTENANCE_MODE = "false";
114
+ expect(isMaintenanceMode()).toBe(false);
115
+ process.env.MAINTENANCE_MODE = "1";
116
+ expect(isMaintenanceMode()).toBe(false);
117
+ });
118
+ });
119
+ //# sourceMappingURL=env.maintenance.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.maintenance.unit.test.js","sourceRoot":"","sources":["../../src/tests/env.maintenance.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAEzE,MAAM,EAAE,oBAAoB,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC7B,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;CACpD,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,gBAAgB,EAAE,oBAAoB;CACtC,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAChD,UAAU,EAAE,cAAc;KAC1B,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;KACxB,CAAC,CAAC;IACH,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QACrB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC;IAC1B,kBAAkB,EAAE,MAAM;IAC1B,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;IACnD,QAAQ,EAAE;QACT,IAAI,EAAE;YACL,QAAQ,EAAE,2BAA2B;YACrC,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,OAAO;YACnB,IAAI,EAAE,OAAO;SACb;KACD;IACD,eAAe,EAAE,EAAE,GAAG,EAAE,mBAAmB,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC3D,aAAa,EAAE,SAAS;IACxB,KAAK,EAAE,SAAS;CAChB,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,GAAG,EAAE;IACrB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,WAAW,CAC1B,MAAe,EACf;QACC,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE;KACN,CACV,CAAC;IACF,GAAG,CAAC,MAAM,GAAG;QACZ,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;QACd,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;QACb,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACL,CAAC;IACX,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,QAAQ,CAAC,0DAA0D,EAAE,GAAG,EAAE;IACzE,UAAU,CAAC,GAAG,EAAE;QACf,oBAAoB,CAAC,SAAS,EAAE,CAAC;QACjC,cAAc,CAAC,SAAS,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,oBAAoB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;YAC7D,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;SAC7B,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YACjD,cAAc,EAAE,+BAA+B;SAC/C,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACrE,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAEtC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAG7B,MAAM,CAAC,oBAAoB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACpD,MAAM,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACrD,oBAAoB,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO;YACP,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;SAC7B,CAAC,CAAC,CAAC;QAEJ,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;QACvB,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC;QACtC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC;QACtC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACjD,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,OAAO,CAAC;QACvC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC;QACnC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/env",
3
- "version": "3.2.35",
3
+ "version": "3.5.7",
4
4
  "description": "Path env prosopo environment",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -22,19 +22,21 @@
22
22
  "build:cross-env": "vite build --config vite.esm.config.ts",
23
23
  "build:tsc": "tsc --build --verbose",
24
24
  "build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
25
+ "test": "NODE_ENV=${NODE_ENV:-test}; npx vitest run --config ./vite.test.config.ts --mode $NODE_ENV",
25
26
  "typecheck": "tsc --project tsconfig.types.json"
26
27
  },
27
28
  "dependencies": {
28
- "@prosopo/common": "3.1.28",
29
- "@prosopo/database": "3.6.6",
30
- "@prosopo/keyring": "2.9.0",
31
- "@prosopo/types": "3.8.0",
32
- "@prosopo/types-env": "2.7.59",
33
- "@prosopo/util-crypto": "13.5.29",
34
- "dotenv": "16.4.5"
29
+ "@prosopo/ipinfo": "0.2.14",
30
+ "@prosopo/common": "3.1.38",
31
+ "@prosopo/logger": "1.0.2",
32
+ "@prosopo/database": "3.13.7",
33
+ "@prosopo/keyring": "2.9.34",
34
+ "@prosopo/types": "4.3.0",
35
+ "@prosopo/types-env": "2.9.16",
36
+ "@prosopo/util-crypto": "13.5.29"
35
37
  },
36
38
  "devDependencies": {
37
- "@prosopo/config": "3.3.0",
39
+ "@prosopo/config": "3.3.1",
38
40
  "@types/node": "22.10.2",
39
41
  "@vitest/coverage-v8": "3.2.4",
40
42
  "concurrently": "9.0.1",
@@ -48,5 +50,10 @@
48
50
  },
49
51
  "author": "Prosopo",
50
52
  "license": "Apache-2.0",
51
- "sideEffects": false
53
+ "sideEffects": false,
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "git+https://github.com/prosopo/captcha.git",
57
+ "directory": "packages/env"
58
+ }
52
59
  }
@@ -1,5 +1,3 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
1
  // Copyright 2021-2026 Prosopo (UK) Ltd.
4
2
  //
5
3
  // Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,19 +12,7 @@ import path from "node:path";
14
12
  // See the License for the specific language governing permissions and
15
13
  // limitations under the License.
16
14
  import { ViteTestConfig } from "@prosopo/config";
17
- import dotenv from "dotenv";
18
- process.env.NODE_ENV = "test";
19
- // if .env.test exists at this level, use it, otherwise use the one at the root
20
- const envFile = `.env.${process.env.NODE_ENV || "development"}`;
21
- let envPath = envFile;
22
- if (fs.existsSync(envFile)) {
23
- envPath = path.resolve(envFile);
24
- } else if (fs.existsSync(`../../${envFile}`)) {
25
- envPath = path.resolve(`../../${envFile}`);
26
- } else {
27
- throw new Error(`No ${envFile} file found`);
28
- }
29
15
 
30
- dotenv.config({ path: envPath });
16
+ process.env.NODE_ENV = "test";
31
17
 
32
18
  export default ViteTestConfig();