@prosopo/env 3.2.35 → 3.5.8

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.8 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 101ms
@@ -1,14 +1,16 @@
1
1
 
2
- > @prosopo/env@3.2.35 build:tsc
2
+ > @prosopo/env@3.5.8 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 4:57:34 PM - Projects in this build:
5
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 AM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/util.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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 AM - Project '../common/tsconfig.json' is up to date because newest input '../common/src/index.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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 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
+ 10:14:01 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'
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
+ 10:14:01 AM - Project '../database/tsconfig.json' is up to date because newest input '../database/src/tests/unit/databases/centralDbStreamer.unit.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
+ 10:14:01 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
+ 10:14:02 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
+
56
+ 10:14:02 AM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
57
+
58
+ 10:14:02 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.8 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.8 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 150ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,454 @@
1
1
  # @prosopo/env
2
2
 
3
+ ## 3.5.8
4
+ ### Patch Changes
5
+
6
+ - Updated dependencies [9b18b31]
7
+ - Updated dependencies [b03dad1]
8
+ - @prosopo/ipinfo@0.2.15
9
+ - @prosopo/types@4.3.1
10
+ - @prosopo/database@3.13.8
11
+ - @prosopo/keyring@2.9.35
12
+ - @prosopo/types-env@2.9.17
13
+
14
+ ## 3.5.7
15
+ ### Patch Changes
16
+
17
+ - Updated dependencies [a1d60db]
18
+ - Updated dependencies [2392aaf]
19
+ - Updated dependencies [97cf7bd]
20
+ - Updated dependencies [6ca1125]
21
+ - Updated dependencies [32a591b]
22
+ - @prosopo/types@4.3.0
23
+ - @prosopo/logger@1.0.2
24
+ - @prosopo/common@3.1.38
25
+ - @prosopo/database@3.13.7
26
+ - @prosopo/ipinfo@0.2.14
27
+ - @prosopo/keyring@2.9.34
28
+ - @prosopo/types-env@2.9.16
29
+
30
+ ## 3.5.6
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies [6c26669]
34
+ - Updated dependencies [f7f9ec5]
35
+ - @prosopo/types@4.2.1
36
+ - @prosopo/database@3.13.6
37
+ - @prosopo/ipinfo@0.2.13
38
+ - @prosopo/keyring@2.9.33
39
+ - @prosopo/types-env@2.9.15
40
+
41
+ ## 3.5.5
42
+ ### Patch Changes
43
+
44
+ - 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.
45
+ - Updated dependencies [0fd81af]
46
+ - @prosopo/common@3.1.37
47
+ - @prosopo/database@3.13.5
48
+ - @prosopo/ipinfo@0.2.12
49
+ - @prosopo/logger@1.0.1
50
+ - @prosopo/types-env@2.9.14
51
+ - @prosopo/keyring@2.9.32
52
+
53
+ ## 3.5.4
54
+ ### Patch Changes
55
+
56
+ - Updated dependencies [20cae63]
57
+ - Updated dependencies [b2e1a5d]
58
+ - Updated dependencies [4d9923e]
59
+ - @prosopo/types@4.2.0
60
+ - @prosopo/database@3.13.4
61
+ - @prosopo/types-env@2.9.13
62
+ - @prosopo/ipinfo@0.2.11
63
+ - @prosopo/keyring@2.9.31
64
+
65
+ ## 3.5.3
66
+ ### Patch Changes
67
+
68
+ - Updated dependencies [d351362]
69
+ - @prosopo/types@4.1.4
70
+ - @prosopo/database@3.13.3
71
+ - @prosopo/ipinfo@0.2.10
72
+ - @prosopo/keyring@2.9.30
73
+ - @prosopo/types-env@2.9.12
74
+
75
+ ## 3.5.2
76
+ ### Patch Changes
77
+
78
+ - Updated dependencies [e2711ae]
79
+ - Updated dependencies [5786629]
80
+ - @prosopo/types@4.1.3
81
+ - @prosopo/database@3.13.2
82
+ - @prosopo/keyring@2.9.29
83
+ - @prosopo/common@3.1.36
84
+ - @prosopo/ipinfo@0.2.9
85
+ - @prosopo/types-env@2.9.11
86
+
87
+ ## 3.5.1
88
+ ### Patch Changes
89
+
90
+ - @prosopo/database@3.13.1
91
+ - @prosopo/keyring@2.9.28
92
+ - @prosopo/types@4.1.2
93
+ - @prosopo/types-env@2.9.10
94
+ - @prosopo/ipinfo@0.2.8
95
+
96
+ ## 3.5.0
97
+ ### Minor Changes
98
+
99
+ - 91958da: Puzzle captcha + maintenance mode hardening, plus a refactor of the
100
+ frictionless handler into focused modules.
101
+
102
+ - **Puzzle captcha now records checkbox-click coordinates like POW.** Adds an
103
+ optional `salt` field to `SubmitPuzzleCaptchaSolutionBody`; the puzzle
104
+ widget hashes the click coords into the salt and the server decodes them
105
+ into the puzzle record's `coords` field on submit. New `start(x, y)`
106
+ parameters on `procaptcha-puzzle` Manager + widget.
107
+ - **Fix puzzle "No session found" caused by stale Redis dedup.** The
108
+ `/frictionless` dedup path is now Mongo-authoritative — Redis is no
109
+ longer consulted as a session source. A concurrent `/captcha/{type}`
110
+ invalidation could previously race a fire-and-forget Redis repopulation
111
+ in the `/frictionless` dedup branch, leaving Redis pointing at a
112
+ Mongo-deleted session for the full 1-hour TTL. Stale pointers are now
113
+ evicted lazily.
114
+ - **Maintenance mode operates without MongoDB.** `/frictionless` and
115
+ `/captcha/{pow,puzzle}` short-circuit to dummy responses before any DB
116
+ call, and `Environment.isReady()` tolerates a Mongo connect failure when
117
+ `MAINTENANCE_MODE=true` so the provider can start with Mongo down.
118
+ - **Refactor `getFrictionlessCaptchaChallenge.ts` into focused modules** under
119
+ `getFrictionlessCaptchaChallenge/` (handler, sessionDedup, shortCircuit,
120
+ accessPolicy, decisionMachine, decryptSimdReadings, constants). Original
121
+ import path preserved via a re-export shim.
122
+ - **Move `RedisWriteQueue` from `@prosopo/provider` to `@prosopo/database`**
123
+ (where the Redis connection itself lives), and clear residual Redis
124
+ session keys at provider startup via `Environment.cleanup()` so a
125
+ previously-crashed run can't leak stale dedup pointers.
126
+ - Adds puzzle-type branch to access-policy handling in `/frictionless`.
127
+
128
+ ### Patch Changes
129
+
130
+ - Updated dependencies [91958da]
131
+ - @prosopo/database@3.13.0
132
+ - @prosopo/types@4.1.1
133
+ - @prosopo/common@3.1.35
134
+ - @prosopo/ipinfo@0.2.7
135
+ - @prosopo/keyring@2.9.27
136
+ - @prosopo/types-env@2.9.9
137
+
138
+ ## 3.4.9
139
+ ### Patch Changes
140
+
141
+ - Updated dependencies [6a741ce]
142
+ - @prosopo/types@4.1.0
143
+ - @prosopo/database@3.12.1
144
+ - @prosopo/ipinfo@0.2.6
145
+ - @prosopo/keyring@2.9.26
146
+ - @prosopo/types-env@2.9.8
147
+
148
+ ## 3.4.8
149
+ ### Patch Changes
150
+
151
+ - Updated dependencies [f9ea09d]
152
+ - Updated dependencies [3c0be68]
153
+ - Updated dependencies [f9ea09d]
154
+ - Updated dependencies [d865319]
155
+ - Updated dependencies [753304b]
156
+ - Updated dependencies [8bb7286]
157
+ - Updated dependencies [f9ea09d]
158
+ - Updated dependencies [4aae4e6]
159
+ - Updated dependencies [4993813]
160
+ - @prosopo/database@3.12.0
161
+ - @prosopo/types@4.0.0
162
+ - @prosopo/keyring@2.9.25
163
+ - @prosopo/common@3.1.34
164
+ - @prosopo/ipinfo@0.2.5
165
+ - @prosopo/types-env@2.9.7
166
+
167
+ ## 3.4.7
168
+ ### Patch Changes
169
+
170
+ - Updated dependencies [819ed95]
171
+ - Updated dependencies [33a6c57]
172
+ - @prosopo/types@3.16.1
173
+ - @prosopo/database@3.11.0
174
+ - @prosopo/types-env@2.9.6
175
+ - @prosopo/ipinfo@0.2.4
176
+ - @prosopo/keyring@2.9.24
177
+
178
+ ## 3.4.6
179
+ ### Patch Changes
180
+
181
+ - @prosopo/database@3.10.2
182
+ - @prosopo/types-env@2.9.5
183
+
184
+ ## 3.4.5
185
+ ### Patch Changes
186
+
187
+ - Updated dependencies [942701b]
188
+ - @prosopo/database@3.10.1
189
+
190
+ ## 3.4.4
191
+ ### Patch Changes
192
+
193
+ - Updated dependencies [74092d0]
194
+ - @prosopo/database@3.10.0
195
+ - @prosopo/types-env@2.9.4
196
+
197
+ ## 3.4.3
198
+ ### Patch Changes
199
+
200
+ - Updated dependencies [f6a4402]
201
+ - Updated dependencies [99dfb44]
202
+ - @prosopo/database@3.9.18
203
+ - @prosopo/types@3.16.0
204
+ - @prosopo/types-env@2.9.3
205
+ - @prosopo/ipinfo@0.2.3
206
+ - @prosopo/keyring@2.9.23
207
+
208
+ ## 3.4.2
209
+ ### Patch Changes
210
+
211
+ - Updated dependencies [3e54c0a]
212
+ - @prosopo/types@3.15.0
213
+ - @prosopo/database@3.9.17
214
+ - @prosopo/ipinfo@0.2.2
215
+ - @prosopo/keyring@2.9.22
216
+ - @prosopo/types-env@2.9.2
217
+
218
+ ## 3.4.1
219
+ ### Patch Changes
220
+
221
+ - Updated dependencies [946a8ba]
222
+ - Updated dependencies [5614814]
223
+ - @prosopo/types@3.14.1
224
+ - @prosopo/database@3.9.16
225
+ - @prosopo/types-env@2.9.1
226
+ - @prosopo/common@3.1.33
227
+ - @prosopo/ipinfo@0.2.1
228
+ - @prosopo/keyring@2.9.21
229
+
230
+ ## 3.4.0
231
+ ### Minor Changes
232
+
233
+ - 42650db: Add better spam rules and move ipinfo service to local instead of external
234
+
235
+ ### Patch Changes
236
+
237
+ - Updated dependencies [fc514dd]
238
+ - Updated dependencies [42650db]
239
+ - @prosopo/ipinfo@0.2.0
240
+ - @prosopo/types@3.14.0
241
+ - @prosopo/types-env@2.9.0
242
+ - @prosopo/database@3.9.15
243
+ - @prosopo/common@3.1.32
244
+ - @prosopo/keyring@2.9.20
245
+
246
+ ## 3.3.15
247
+ ### Patch Changes
248
+
249
+ - Updated dependencies [4a9c518]
250
+ - @prosopo/common@3.1.31
251
+ - @prosopo/database@3.9.14
252
+ - @prosopo/keyring@2.9.19
253
+ - @prosopo/types-env@2.8.15
254
+
255
+ ## 3.3.14
256
+ ### Patch Changes
257
+
258
+ - @prosopo/database@3.9.13
259
+ - @prosopo/keyring@2.9.18
260
+ - @prosopo/types@3.13.3
261
+ - @prosopo/types-env@2.8.14
262
+
263
+ ## 3.3.13
264
+ ### Patch Changes
265
+
266
+ - @prosopo/database@3.9.12
267
+ - @prosopo/keyring@2.9.17
268
+ - @prosopo/types@3.13.2
269
+ - @prosopo/types-env@2.8.13
270
+
271
+ ## 3.3.12
272
+ ### Patch Changes
273
+
274
+ - @prosopo/database@3.9.11
275
+ - @prosopo/keyring@2.9.16
276
+ - @prosopo/types@3.13.1
277
+ - @prosopo/types-env@2.8.12
278
+
279
+ ## 3.3.11
280
+ ### Patch Changes
281
+
282
+ - Updated dependencies [e6d9553]
283
+ - @prosopo/types@3.13.0
284
+ - @prosopo/database@3.9.10
285
+ - @prosopo/keyring@2.9.15
286
+ - @prosopo/types-env@2.8.11
287
+
288
+ ## 3.3.10
289
+ ### Patch Changes
290
+
291
+ - Updated dependencies [d5082a9]
292
+ - Updated dependencies [e1ea65f]
293
+ - Updated dependencies [c316257]
294
+ - @prosopo/types@3.12.3
295
+ - @prosopo/database@3.9.9
296
+ - @prosopo/keyring@2.9.14
297
+ - @prosopo/types-env@2.8.10
298
+
299
+ ## 3.3.9
300
+ ### Patch Changes
301
+
302
+ - Updated dependencies [adb89a6]
303
+ - @prosopo/database@3.9.8
304
+ - @prosopo/types@3.12.2
305
+ - @prosopo/types-env@2.8.9
306
+ - @prosopo/common@3.1.30
307
+ - @prosopo/keyring@2.9.13
308
+
309
+ ## 3.3.8
310
+ ### Patch Changes
311
+
312
+ - Updated dependencies [c5ee492]
313
+ - Updated dependencies [a90eb54]
314
+ - @prosopo/common@3.1.29
315
+ - @prosopo/types@3.12.1
316
+ - @prosopo/database@3.9.7
317
+ - @prosopo/keyring@2.9.12
318
+ - @prosopo/types-env@2.8.8
319
+
320
+ ## 3.3.7
321
+ ### Patch Changes
322
+
323
+ - Updated dependencies [676c5f2]
324
+ - Updated dependencies [feaca02]
325
+ - @prosopo/keyring@2.9.11
326
+ - @prosopo/types@3.12.0
327
+ - @prosopo/types-env@2.8.7
328
+ - @prosopo/database@3.9.6
329
+
330
+ ## 3.3.6
331
+ ### Patch Changes
332
+
333
+ - Updated dependencies [8148587]
334
+ - @prosopo/types@3.11.1
335
+ - @prosopo/database@3.9.5
336
+ - @prosopo/types-env@2.8.6
337
+ - @prosopo/keyring@2.9.10
338
+
339
+ ## 3.3.5
340
+ ### Patch Changes
341
+
342
+ - @prosopo/database@3.9.4
343
+ - @prosopo/types-env@2.8.5
344
+
345
+ ## 3.3.4
346
+ ### Patch Changes
347
+
348
+ - Updated dependencies [7f6ffc5]
349
+ - @prosopo/types@3.11.0
350
+ - @prosopo/database@3.9.3
351
+ - @prosopo/keyring@2.9.9
352
+ - @prosopo/types-env@2.8.4
353
+
354
+ ## 3.3.3
355
+ ### Patch Changes
356
+
357
+ - Updated dependencies [93fa086]
358
+ - @prosopo/database@3.9.2
359
+ - @prosopo/types@3.10.2
360
+ - @prosopo/types-env@2.8.3
361
+ - @prosopo/keyring@2.9.8
362
+
363
+ ## 3.3.2
364
+ ### Patch Changes
365
+
366
+ - Updated dependencies [cde7550]
367
+ - @prosopo/types@3.10.1
368
+ - @prosopo/database@3.9.1
369
+ - @prosopo/types-env@2.8.2
370
+ - @prosopo/keyring@2.9.7
371
+
372
+ ## 3.3.1
373
+ ### Patch Changes
374
+
375
+ - Updated dependencies [ad6d622]
376
+ - Updated dependencies [ced9f41]
377
+ - Updated dependencies [fa95c5f]
378
+ - @prosopo/database@3.9.0
379
+ - @prosopo/types@3.10.0
380
+ - @prosopo/types-env@2.8.1
381
+ - @prosopo/keyring@2.9.6
382
+
383
+ ## 3.3.0
384
+ ### Minor Changes
385
+
386
+ - ff58a70: Load the geolocation service at startup only
387
+
388
+ ### Patch Changes
389
+
390
+ - Updated dependencies [ff58a70]
391
+ - Updated dependencies [d329e63]
392
+ - @prosopo/types-env@2.8.0
393
+ - @prosopo/types@3.9.0
394
+ - @prosopo/database@3.8.0
395
+ - @prosopo/keyring@2.9.5
396
+
397
+ ## 3.2.42
398
+ ### Patch Changes
399
+
400
+ - Updated dependencies [3feeea4]
401
+ - @prosopo/database@3.7.0
402
+ - @prosopo/types-env@2.7.66
403
+
404
+ ## 3.2.41
405
+ ### Patch Changes
406
+
407
+ - Updated dependencies [d2431cd]
408
+ - @prosopo/types@3.8.4
409
+ - @prosopo/database@3.6.12
410
+ - @prosopo/types-env@2.7.65
411
+ - @prosopo/keyring@2.9.4
412
+
413
+ ## 3.2.40
414
+ ### Patch Changes
415
+
416
+ - @prosopo/database@3.6.11
417
+ - @prosopo/types-env@2.7.64
418
+
419
+ ## 3.2.39
420
+ ### Patch Changes
421
+
422
+ - Updated dependencies [bd6995b]
423
+ - @prosopo/types@3.8.3
424
+ - @prosopo/database@3.6.10
425
+ - @prosopo/keyring@2.9.3
426
+ - @prosopo/types-env@2.7.63
427
+
428
+ ## 3.2.38
429
+ ### Patch Changes
430
+
431
+ - Updated dependencies [9633e58]
432
+ - @prosopo/types@3.8.2
433
+ - @prosopo/database@3.6.9
434
+ - @prosopo/types-env@2.7.62
435
+ - @prosopo/keyring@2.9.2
436
+
437
+ ## 3.2.37
438
+ ### Patch Changes
439
+
440
+ - Updated dependencies [f52a5c1]
441
+ - @prosopo/database@3.6.8
442
+ - @prosopo/types@3.8.1
443
+ - @prosopo/types-env@2.7.61
444
+ - @prosopo/keyring@2.9.1
445
+
446
+ ## 3.2.36
447
+ ### Patch Changes
448
+
449
+ - @prosopo/database@3.6.7
450
+ - @prosopo/types-env@2.7.60
451
+
3
452
  ## 3.2.35
4
453
  ### Patch Changes
5
454
 
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":"AAcA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAe,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKxE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,OAAO,WAAW;IAavB,YACC,MAA2B,EAC3B,IAAkB,EAClB,WAAyB;QAL1B,UAAK,GAAG,KAAK,CAAC;QAOb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC;QACzD,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,SAAS,CACtB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EACnC,oBAAoB,CACpB,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,IAAI,EAAE,SAAS;SACf,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAG1C,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC;YACtC,iBAAiB,EAChB,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa;YAC3D,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB;YAC9C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO;YACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM;YACnC,MAAM,EAAE,IAAI,CAAC,MAAM;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACvB,GAAG,EAAE,yBAAyB;YAC9B,IAAI,EAAE;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;gBAC3C,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,gBAAgB;aAC5D;SACD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS;QACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;gBACtD,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;aAChD,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACJ,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,eAAe,CAAC,2BAA2B,EAAE;gBACtD,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;aACvD,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK;QACJ,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,eAAe,CACxB,IAAI,KAAK,CAAC,2CAA2C,CAAC,CACtD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,EAAE,CAAC;IAChB,CAAC;IAED,iBAAiB;QAChB,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,eAAe,CACxB,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAClE,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED,OAAO;QACN,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,eAAe,CACxB,IAAI,KAAK,CAAC,6CAA6C,CAAC,CACxD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,8BAA8B,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO;QACR,CAAC;QACD,IAAI,CAAC;YACJ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YACD,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;YAEvB,MAAM,eAAe,GAAG,iBAAiB,EAAE,CAAC;YAK5C,IAAI,eAAe,EAAE,CAAC;gBACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBACvB,GAAG,EAAE,uDAAuD;iBAC5D,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACrB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7B,CAAC;iBAAM,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBACvB,GAAG,EAAE,4CAA4C,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,UAAU,oBAAoB;iBACpG,CAAC,CAAC,CAAC;gBACJ,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,eAAe,CAAC,+BAA+B,EAAE;gBAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;gBACvB,MAAM,EAAE,IAAI,CAAC,MAAM;aACnB,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,KAAK,CAAC,cAAc;QACnB,IAAI,CAAC;YACJ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/D,IAAI,QAAQ,EAAE,CAAC;oBACd,IAAI,CAAC,EAAE,GAAG,IAAI,gBAAgB,CAAC;wBAC9B,KAAK,EAAE;4BACN,GAAG,EAAE,QAAQ,CAAC,QAAQ;4BACtB,MAAM,EAAE,QAAQ,CAAC,MAAM;4BACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;yBAC/B;wBACD,KAAK,EAAE;4BACN,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG;4BACpC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ;yBAC9C;wBACD,MAAM,EAAE,IAAI,CAAC,MAAM;qBACnB,CAAC,CAAC;oBACH,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACzB,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,eAAe,CAAC,iCAAiC,EAAE;gBAC5D,OAAO,EAAE;oBACR,KAAK;oBACL,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;wBAChC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC;4BAC9C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,IAAI;4BACrD,CAAC,CAAC,SAAS;wBACZ,CAAC,CAAC,SAAS;iBACZ;aACD,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;CACD;AAID,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAY,EAAE,CAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC"}
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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/env",
3
- "version": "3.2.35",
3
+ "version": "3.5.8",
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.15",
30
+ "@prosopo/common": "3.1.38",
31
+ "@prosopo/logger": "1.0.2",
32
+ "@prosopo/database": "3.13.8",
33
+ "@prosopo/keyring": "2.9.35",
34
+ "@prosopo/types": "4.3.1",
35
+ "@prosopo/types-env": "2.9.17",
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();