@serve.zone/dcrouter 13.28.0 → 13.30.0

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.
Files changed (39) hide show
  1. package/.smartconfig.json +32 -10
  2. package/dist_serve/bundle.js +609 -592
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.dcrouter.d.ts +7 -0
  5. package/dist_ts/classes.dcrouter.js +12 -2
  6. package/dist_ts/config/classes.route-config-manager.js +8 -7
  7. package/dist_ts/opsserver/classes.opsserver.js +4 -1
  8. package/dist_ts/opsserver/handlers/admin.handler.d.ts +21 -6
  9. package/dist_ts/opsserver/handlers/admin.handler.js +188 -29
  10. package/dist_ts/opsserver/handlers/target-profile.handler.js +3 -1
  11. package/dist_ts/opsserver/handlers/users.handler.js +2 -2
  12. package/dist_ts/plugins.d.ts +2 -0
  13. package/dist_ts/plugins.js +4 -1
  14. package/dist_ts/vpn/classes.vpn-manager.d.ts +2 -0
  15. package/dist_ts/vpn/classes.vpn-manager.js +41 -20
  16. package/dist_ts_interfaces/requests/admin.d.ts +38 -0
  17. package/dist_ts_interfaces/requests/users.d.ts +2 -5
  18. package/dist_ts_web/00_commitinfo_data.js +1 -1
  19. package/dist_ts_web/appstate.d.ts +17 -0
  20. package/dist_ts_web/appstate.js +27 -1
  21. package/dist_ts_web/elements/ops-dashboard.d.ts +4 -0
  22. package/dist_ts_web/elements/ops-dashboard.js +100 -3
  23. package/package.json +27 -34
  24. package/readme.md +15 -3
  25. package/ts/00_commitinfo_data.ts +1 -1
  26. package/ts/classes.dcrouter.ts +20 -1
  27. package/ts/config/classes.route-config-manager.ts +8 -6
  28. package/ts/opsserver/classes.opsserver.ts +3 -0
  29. package/ts/opsserver/handlers/admin.handler.ts +244 -32
  30. package/ts/opsserver/handlers/target-profile.handler.ts +2 -0
  31. package/ts/opsserver/handlers/users.handler.ts +1 -1
  32. package/ts/plugins.ts +7 -0
  33. package/ts/readme.md +1 -1
  34. package/ts/vpn/classes.vpn-manager.ts +56 -25
  35. package/ts_apiclient/readme.md +4 -4
  36. package/ts_web/00_commitinfo_data.ts +1 -1
  37. package/ts_web/appstate.ts +49 -0
  38. package/ts_web/elements/ops-dashboard.ts +100 -0
  39. package/ts_web/readme.md +5 -3
@@ -102,14 +102,16 @@ let OpsDashboard = (() => {
102
102
  });
103
103
  get loginState() { return this.#loginState_accessor_storage; }
104
104
  set loginState(value) { this.#loginState_accessor_storage = value; }
105
- #uiState_accessor_storage = (__runInitializers(this, _loginState_extraInitializers), __runInitializers(this, _uiState_initializers, {
105
+ bootstrapStepper = __runInitializers(this, _loginState_extraInitializers);
106
+ bootstrapCheckPromise;
107
+ #uiState_accessor_storage = __runInitializers(this, _uiState_initializers, {
106
108
  activeView: 'overview',
107
109
  activeSubview: null,
108
110
  sidebarCollapsed: false,
109
111
  autoRefresh: true,
110
112
  refreshInterval: 1000,
111
113
  theme: 'light',
112
- }));
114
+ });
113
115
  get uiState() { return this.#uiState_accessor_storage; }
114
116
  set uiState(value) { this.#uiState_accessor_storage = value; }
115
117
  #configState_accessor_storage = (__runInitializers(this, _uiState_extraInitializers), __runInitializers(this, _configState_initializers, {
@@ -356,6 +358,7 @@ let OpsDashboard = (() => {
356
358
  await simpleLogin.switchToSlottedContent();
357
359
  await appstate.statsStatePart.dispatchAction(appstate.fetchAllStatsAction, null);
358
360
  await appstate.configStatePart.dispatchAction(appstate.fetchConfigurationAction, null);
361
+ await this.ensureAdminBootstrap();
359
362
  }
360
363
  else {
361
364
  // Server rejected the JWT — clear state, show login
@@ -390,6 +393,7 @@ let OpsDashboard = (() => {
390
393
  await simpleLogin.switchToSlottedContent();
391
394
  await appstate.statsStatePart.dispatchAction(appstate.fetchAllStatsAction, null);
392
395
  await appstate.configStatePart.dispatchAction(appstate.fetchConfigurationAction, null);
396
+ await this.ensureAdminBootstrap();
393
397
  }
394
398
  else {
395
399
  form.setStatus('error', 'Login failed!');
@@ -397,6 +401,99 @@ let OpsDashboard = (() => {
397
401
  form.reset();
398
402
  }
399
403
  }
404
+ async ensureAdminBootstrap() {
405
+ if (!this.loginState.identity || this.bootstrapStepper?.isConnected) {
406
+ return;
407
+ }
408
+ if (this.bootstrapCheckPromise) {
409
+ return this.bootstrapCheckPromise;
410
+ }
411
+ this.bootstrapCheckPromise = (async () => {
412
+ try {
413
+ const status = await appstate.getAdminBootstrapStatus();
414
+ if (status.needsBootstrap) {
415
+ await this.showAdminBootstrapStepper(status);
416
+ }
417
+ }
418
+ catch (error) {
419
+ console.error('Admin bootstrap status check failed:', error);
420
+ }
421
+ finally {
422
+ this.bootstrapCheckPromise = undefined;
423
+ }
424
+ })();
425
+ return this.bootstrapCheckPromise;
426
+ }
427
+ async showAdminBootstrapStepper(statusArg) {
428
+ const { DeesStepper } = await import('@design.estate/dees-catalog');
429
+ this.bootstrapStepper = await DeesStepper.createAndShow({
430
+ cancelable: false,
431
+ steps: [
432
+ {
433
+ title: 'Create Persisted Admin',
434
+ content: html `
435
+ <div style="display: grid; gap: 16px; color: var(--dees-color-text-secondary); font-size: 14px; line-height: 1.5;">
436
+ <p style="margin: 0;">
437
+ This router is currently using the temporary bootstrap admin. Create the first persisted admin account to continue.
438
+ </p>
439
+ <dees-form>
440
+ <dees-input-text .key=${'email'} .label=${'Admin email'} .required=${true}></dees-input-text>
441
+ <dees-input-text .key=${'name'} .label=${'Display name'}></dees-input-text>
442
+ <dees-input-text .key=${'password'} .label=${'Password'} .required=${true} .isPasswordBool=${true}></dees-input-text>
443
+ <dees-input-text .key=${'passwordConfirm'} .label=${'Confirm password'} .required=${true} .isPasswordBool=${true}></dees-input-text>
444
+ <dees-input-checkbox
445
+ .key=${'enableIdpGlobalAuth'}
446
+ .label=${'Allow idp.global login for this email'}
447
+ .description=${statusArg.idpGlobalConfigured
448
+ ? 'The local account remains authoritative; idp.global only verifies identity.'
449
+ : 'Requires DCROUTER_IDP_GLOBAL_URL before idp.global logins can work.'}
450
+ ></dees-input-checkbox>
451
+ </dees-form>
452
+ </div>
453
+ `,
454
+ menuOptions: [
455
+ {
456
+ name: 'Create admin',
457
+ action: async (stepperArg) => {
458
+ const form = stepperArg.shadowRoot?.querySelector('.selected dees-form');
459
+ if (!form)
460
+ return;
461
+ const formData = await form.collectFormData();
462
+ const email = String(formData.email || '').trim();
463
+ const name = String(formData.name || '').trim();
464
+ const password = String(formData.password || '');
465
+ const passwordConfirm = String(formData.passwordConfirm || '');
466
+ if (!email || !password) {
467
+ form.setStatus?.('error', 'Email and password are required.');
468
+ return;
469
+ }
470
+ if (password !== passwordConfirm) {
471
+ form.setStatus?.('error', 'Passwords do not match.');
472
+ return;
473
+ }
474
+ try {
475
+ form.setStatus?.('pending', 'Creating persisted admin...');
476
+ await appstate.createInitialAdminUser({
477
+ email,
478
+ name,
479
+ password,
480
+ enableIdpGlobalAuth: Boolean(formData.enableIdpGlobalAuth),
481
+ });
482
+ form.setStatus?.('success', 'Persisted admin created.');
483
+ await stepperArg.destroy();
484
+ this.bootstrapStepper = undefined;
485
+ await appstate.usersStatePart.dispatchAction(appstate.fetchUsersAction, null);
486
+ }
487
+ catch (error) {
488
+ form.setStatus?.('error', error instanceof Error ? error.message : 'Failed to create admin.');
489
+ }
490
+ },
491
+ },
492
+ ],
493
+ },
494
+ ],
495
+ });
496
+ }
400
497
  static {
401
498
  __runInitializers(_classThis, _classExtraInitializers);
402
499
  }
@@ -404,4 +501,4 @@ let OpsDashboard = (() => {
404
501
  return OpsDashboard = _classThis;
405
502
  })();
406
503
  export { OpsDashboard };
407
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLWRhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtZGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsV0FBVyxFQUNYLEdBQUcsRUFDSCxVQUFVLEVBQ1YsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBRU4sTUFBTSw2QkFBNkIsQ0FBQztBQUdyQyx5QkFBeUI7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlELGdCQUFnQjtBQUNoQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELGNB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
504
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLWRhc2hib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtZGFzaGJvYXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsV0FBVyxFQUNYLEdBQUcsRUFDSCxVQUFVLEVBQ1YsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBRU4sTUFBTSw2QkFBNkIsQ0FBQztBQUdyQyx5QkFBeUI7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpELGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTlELGdCQUFnQjtBQUNoQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDN0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELGNB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "13.28.0",
4
+ "version": "13.30.0",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -11,33 +11,24 @@
11
11
  },
12
12
  "author": "Task Venture Capital GmbH",
13
13
  "license": "MIT",
14
- "scripts": {
15
- "test": "(tstest test/ --verbose --logfile --timeout 60)",
16
- "start": "(node ./cli.js)",
17
- "startTs": "(node cli.ts.js)",
18
- "build": "(tsbuild tsfolders --allowimplicitany && npm run bundle)",
19
- "build:docker": "tsdocker build --verbose",
20
- "release:docker": "tsdocker push --verbose",
21
- "bundle": "(tsbundle)",
22
- "watch": "tswatch"
23
- },
24
14
  "devDependencies": {
25
- "@git.zone/tsbuild": "^4.4.0",
26
- "@git.zone/tsbundle": "^2.10.1",
27
- "@git.zone/tsdocker": "^2.2.5",
28
- "@git.zone/tsrun": "^2.0.3",
29
- "@git.zone/tstest": "^3.6.3",
30
- "@git.zone/tswatch": "^3.3.3",
31
- "@types/node": "^25.6.1"
15
+ "@git.zone/tsbuild": "^4.4.1",
16
+ "@git.zone/tsbundle": "^2.10.4",
17
+ "@git.zone/tsdocker": "^2.3.0",
18
+ "@git.zone/tsrun": "^2.0.4",
19
+ "@git.zone/tstest": "^3.6.6",
20
+ "@git.zone/tswatch": "^3.3.5",
21
+ "@types/node": "^25.9.0"
32
22
  },
33
23
  "dependencies": {
34
- "@api.global/typedrequest": "^3.3.0",
24
+ "@api.global/typedrequest": "^3.3.1",
35
25
  "@api.global/typedrequest-interfaces": "^3.0.19",
36
26
  "@api.global/typedserver": "^8.4.6",
37
- "@api.global/typedsocket": "^4.1.2",
27
+ "@api.global/typedsocket": "^4.1.3",
38
28
  "@apiclient.xyz/cloudflare": "^7.1.0",
39
29
  "@design.estate/dees-catalog": "^3.81.0",
40
30
  "@design.estate/dees-element": "^2.2.4",
31
+ "@idp.global/sdk": "^1.3.0",
41
32
  "@push.rocks/lik": "^6.4.1",
42
33
  "@push.rocks/projectinfo": "^5.1.0",
43
34
  "@push.rocks/qenv": "^6.1.4",
@@ -55,20 +46,20 @@
55
46
  "@push.rocks/smartnetwork": "^4.7.1",
56
47
  "@push.rocks/smartpath": "^6.0.0",
57
48
  "@push.rocks/smartpromise": "^4.2.4",
58
- "@push.rocks/smartproxy": "^27.10.0",
49
+ "@push.rocks/smartproxy": "^27.10.2",
59
50
  "@push.rocks/smartradius": "^1.1.2",
60
51
  "@push.rocks/smartrequest": "^5.0.3",
61
52
  "@push.rocks/smartrx": "^3.0.10",
62
53
  "@push.rocks/smartstate": "^2.3.1",
63
54
  "@push.rocks/smartunique": "^3.0.9",
64
- "@push.rocks/smartvpn": "1.19.2",
55
+ "@push.rocks/smartvpn": "1.19.4",
65
56
  "@push.rocks/taskbuffer": "^8.0.2",
66
57
  "@serve.zone/catalog": "^2.12.4",
67
- "@serve.zone/interfaces": "^5.5.0",
58
+ "@serve.zone/interfaces": "^5.8.0",
68
59
  "@serve.zone/remoteingress": "^4.17.1",
69
60
  "@tsclass/tsclass": "^9.5.1",
70
61
  "@types/qrcode": "^1.5.6",
71
- "lru-cache": "^11.3.6",
62
+ "lru-cache": "^11.4.0",
72
63
  "qrcode": "^1.5.4",
73
64
  "uuid": "^14.0.0"
74
65
  },
@@ -98,14 +89,6 @@
98
89
  "VLAN assignment",
99
90
  "MAC authentication"
100
91
  ],
101
- "pnpm": {
102
- "onlyBuiltDependencies": [
103
- "esbuild",
104
- "mongodb-memory-server",
105
- "puppeteer"
106
- ]
107
- },
108
- "packageManager": "pnpm@10.11.0",
109
92
  "files": [
110
93
  "ts/**/*",
111
94
  "ts_web/**/*",
@@ -119,5 +102,15 @@
119
102
  "cli.js",
120
103
  ".smartconfig.json",
121
104
  "readme.md"
122
- ]
123
- }
105
+ ],
106
+ "scripts": {
107
+ "test": "(tstest test/ --verbose --logfile --timeout 60)",
108
+ "start": "(node ./cli.js)",
109
+ "startTs": "(node cli.ts.js)",
110
+ "build": "(tsbuild tsfolders --allowimplicitany && npm run bundle)",
111
+ "build:docker": "tsdocker build --verbose",
112
+ "release:docker": "tsdocker push --verbose",
113
+ "bundle": "(tsbundle)",
114
+ "watch": "tswatch"
115
+ }
116
+ }
package/readme.md CHANGED
@@ -73,10 +73,22 @@ await router.start();
73
73
  After startup:
74
74
 
75
75
  - open the dashboard at `http://localhost:3000`
76
- - log in with the current built-in development credentials `admin` / `admin`
76
+ - complete the first-admin bootstrap flow if no persisted admin account exists yet
77
77
  - send proxied traffic to `http://localhost:18080`
78
78
  - stop gracefully with `await router.stop()`
79
79
 
80
+ ## Initial Admin Bootstrap
81
+
82
+ When DB-backed persistence is enabled and no persisted admin exists, dcrouter does not auto-create an admin account. The Ops dashboard exposes a non-cancelable first-admin bootstrap flow that must be completed explicitly.
83
+
84
+ Bootstrap behavior:
85
+
86
+ - `getAdminBootstrapStatus` reports whether persistence is ready and whether a first admin is required.
87
+ - The temporary env/config admin identity is only used to authorize bootstrap access while no persisted admin exists.
88
+ - `createInitialAdminUser` creates the first persisted admin with normalized email and local password authentication.
89
+ - Optional `idp.global` authentication can be enabled for that local account; the local dcrouter role remains authoritative and the IdP email must match the local account email.
90
+ - After a persisted admin exists, temporary bootstrap admin login is rejected and normal persisted-account authentication is used.
91
+
80
92
  ## Configuration Model
81
93
 
82
94
  `DcRouter` is configured with `IDcRouterOptions` from `@serve.zone/dcrouter`.
@@ -199,7 +211,7 @@ const client = new DcRouterApiClient({
199
211
  baseUrl: 'https://dcrouter.example.com',
200
212
  });
201
213
 
202
- await client.login('admin', 'admin');
214
+ await client.login('admin@example.com', 'strong-password');
203
215
 
204
216
  const route = await client.routes.build()
205
217
  .setName('api-gateway')
@@ -279,7 +291,7 @@ Use of these trademarks must comply with Task Venture Capital GmbH's Trademark G
279
291
 
280
292
  ### Company Information
281
293
 
282
- Task Venture Capital GmbH
294
+ Task Venture Capital GmbH
283
295
  Registered at District Court Bremen HRB 35230 HB, Germany
284
296
 
285
297
  For any legal inquiries or further information, please contact us via email at hello@task.vc.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '13.28.0',
6
+ version: '13.30.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -167,6 +167,14 @@ export interface IDcRouterOptions {
167
167
  /** Port for the OpsServer web UI (default: 3000) */
168
168
  opsServerPort?: number;
169
169
 
170
+ /** Optional OpsServer account authentication settings. */
171
+ adminAuth?: {
172
+ /** Base URL for idp.global password authentication. Can also be set through DCROUTER_IDP_GLOBAL_URL. */
173
+ idpGlobalUrl?: string;
174
+ /** Test/integration hook for injecting an idp.global-compatible password client. */
175
+ idpClient?: Pick<plugins.idpSdkServer.IdpGlobalServerClient, 'loginWithEmailAndPassword' | 'stop'>;
176
+ };
177
+
170
178
  remoteIngressConfig?: {
171
179
  /** Enable remote ingress hub (default: false) */
172
180
  enabled?: boolean;
@@ -740,10 +748,14 @@ export class DcRouter {
740
748
 
741
749
  // VPN Server: optional, depends on SmartProxy
742
750
  if (this.options.vpnConfig?.enabled) {
751
+ const vpnServiceDeps = ['SmartProxy'];
752
+ if (this.options.dbConfig?.enabled !== false) {
753
+ vpnServiceDeps.push('ConfigManagers');
754
+ }
743
755
  this.serviceManager.addService(
744
756
  new plugins.taskbuffer.Service('VpnServer')
745
757
  .optional()
746
- .dependsOn('SmartProxy')
758
+ .dependsOn(...vpnServiceDeps)
747
759
  .withStart(async () => {
748
760
  await this.setupVpnServer();
749
761
  })
@@ -2418,6 +2430,13 @@ export class DcRouter {
2418
2430
  return;
2419
2431
  }
2420
2432
 
2433
+ if (this.options.dbConfig?.enabled === false) {
2434
+ throw new Error('VPN requires dbConfig.enabled because clients, keys, routes, and target profiles are persisted in DcRouterDb');
2435
+ }
2436
+ if (!this.routeConfigManager || !this.targetProfileManager) {
2437
+ throw new Error('VPN requires initialized route and target profile managers');
2438
+ }
2439
+
2421
2440
  logger.log('info', 'Setting up VPN server...');
2422
2441
 
2423
2442
  this.vpnManager = new VpnManager({
@@ -607,19 +607,21 @@ export class RouteConfigManager {
607
607
  route: plugins.smartproxy.IRouteConfig,
608
608
  routeId?: string,
609
609
  ): plugins.smartproxy.IRouteConfig {
610
- const vpnCallback = this.getVpnClientIpsForRoute;
611
- if (!vpnCallback) return route;
612
-
613
610
  const dcRoute = route as IDcRouterRouteConfig;
614
611
  if (!dcRoute.vpnOnly) return route;
615
612
 
616
- const vpnEntries = vpnCallback(dcRoute, routeId);
617
- const existingEntries = route.security?.ipAllowList || [];
613
+ const vpnEntries = this.getVpnClientIpsForRoute?.(dcRoute, routeId) || [];
614
+ const existingBlockList = route.security?.ipBlockList || [];
615
+ const ipBlockList = vpnEntries.length
616
+ ? existingBlockList
617
+ : [...new Set([...existingBlockList, '*'])];
618
+
618
619
  return {
619
620
  ...route,
620
621
  security: {
621
622
  ...route.security,
622
- ipAllowList: [...existingEntries, ...vpnEntries],
623
+ ipAllowList: vpnEntries,
624
+ ipBlockList,
623
625
  },
624
626
  };
625
627
  }
@@ -113,6 +113,9 @@ export class OpsServer {
113
113
  }
114
114
 
115
115
  public async stop() {
116
+ if (this.adminHandler) {
117
+ await this.adminHandler.stop();
118
+ }
116
119
  // Clean up log handler streams and push destination before stopping the server
117
120
  if (this.logsHandler) {
118
121
  this.logsHandler.cleanup();