@serve.zone/dcrouter 12.1.0 → 12.2.1

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 (72) hide show
  1. package/dist_serve/bundle.js +752 -688
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/classes.dcrouter.d.ts +6 -1
  4. package/dist_ts/classes.dcrouter.js +11 -3
  5. package/dist_ts/config/classes.db-seeder.d.ts +25 -0
  6. package/dist_ts/config/classes.db-seeder.js +69 -0
  7. package/dist_ts/config/classes.reference-resolver.d.ts +80 -0
  8. package/dist_ts/config/classes.reference-resolver.js +482 -0
  9. package/dist_ts/config/classes.route-config-manager.d.ts +13 -3
  10. package/dist_ts/config/classes.route-config-manager.js +53 -3
  11. package/dist_ts/config/index.d.ts +2 -0
  12. package/dist_ts/config/index.js +3 -1
  13. package/dist_ts/db/documents/classes.network-target.doc.d.ts +15 -0
  14. package/dist_ts/db/documents/classes.network-target.doc.js +118 -0
  15. package/dist_ts/db/documents/classes.security-profile.doc.d.ts +16 -0
  16. package/dist_ts/db/documents/classes.security-profile.doc.js +118 -0
  17. package/dist_ts/db/documents/classes.stored-route.doc.d.ts +2 -0
  18. package/dist_ts/db/documents/classes.stored-route.doc.js +8 -2
  19. package/dist_ts/db/documents/index.d.ts +2 -0
  20. package/dist_ts/db/documents/index.js +3 -1
  21. package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
  22. package/dist_ts/opsserver/classes.opsserver.js +5 -1
  23. package/dist_ts/opsserver/handlers/index.d.ts +2 -0
  24. package/dist_ts/opsserver/handlers/index.js +3 -1
  25. package/dist_ts/opsserver/handlers/network-target.handler.d.ts +10 -0
  26. package/dist_ts/opsserver/handlers/network-target.handler.js +117 -0
  27. package/dist_ts/opsserver/handlers/route-management.handler.js +3 -2
  28. package/dist_ts/opsserver/handlers/security-profile.handler.d.ts +10 -0
  29. package/dist_ts/opsserver/handlers/security-profile.handler.js +119 -0
  30. package/dist_ts_interfaces/data/route-management.d.ts +48 -1
  31. package/dist_ts_interfaces/requests/index.d.ts +2 -0
  32. package/dist_ts_interfaces/requests/index.js +3 -1
  33. package/dist_ts_interfaces/requests/network-targets.d.ts +102 -0
  34. package/dist_ts_interfaces/requests/network-targets.js +2 -0
  35. package/dist_ts_interfaces/requests/route-management.d.ts +3 -1
  36. package/dist_ts_interfaces/requests/security-profiles.d.ts +102 -0
  37. package/dist_ts_interfaces/requests/security-profiles.js +2 -0
  38. package/dist_ts_web/00_commitinfo_data.js +1 -1
  39. package/dist_ts_web/appstate.d.ts +43 -0
  40. package/dist_ts_web/appstate.js +176 -2
  41. package/dist_ts_web/elements/index.d.ts +2 -0
  42. package/dist_ts_web/elements/index.js +3 -1
  43. package/dist_ts_web/elements/ops-dashboard.js +13 -1
  44. package/dist_ts_web/elements/ops-view-networktargets.d.ts +17 -0
  45. package/dist_ts_web/elements/ops-view-networktargets.js +247 -0
  46. package/dist_ts_web/elements/ops-view-securityprofiles.d.ts +17 -0
  47. package/dist_ts_web/elements/ops-view-securityprofiles.js +276 -0
  48. package/dist_ts_web/router.d.ts +1 -1
  49. package/dist_ts_web/router.js +2 -2
  50. package/package.json +1 -1
  51. package/ts/00_commitinfo_data.ts +1 -1
  52. package/ts/classes.dcrouter.ts +19 -1
  53. package/ts/config/classes.db-seeder.ts +95 -0
  54. package/ts/config/classes.reference-resolver.ts +576 -0
  55. package/ts/config/classes.route-config-manager.ts +64 -1
  56. package/ts/config/index.ts +3 -1
  57. package/ts/db/documents/classes.network-target.doc.ts +48 -0
  58. package/ts/db/documents/classes.security-profile.doc.ts +49 -0
  59. package/ts/db/documents/classes.stored-route.doc.ts +4 -0
  60. package/ts/db/documents/index.ts +2 -0
  61. package/ts/opsserver/classes.opsserver.ts +4 -0
  62. package/ts/opsserver/handlers/index.ts +3 -1
  63. package/ts/opsserver/handlers/network-target.handler.ts +167 -0
  64. package/ts/opsserver/handlers/route-management.handler.ts +2 -1
  65. package/ts/opsserver/handlers/security-profile.handler.ts +169 -0
  66. package/ts_web/00_commitinfo_data.ts +1 -1
  67. package/ts_web/appstate.ts +243 -1
  68. package/ts_web/elements/index.ts +2 -0
  69. package/ts_web/elements/ops-dashboard.ts +12 -0
  70. package/ts_web/elements/ops-view-networktargets.ts +215 -0
  71. package/ts_web/elements/ops-view-securityprofiles.ts +243 -0
  72. package/ts_web/router.ts +1 -1
@@ -0,0 +1,276 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { DeesElement, html, customElement, css, state, cssManager, } from '@design.estate/dees-element';
36
+ import * as appstate from '../appstate.js';
37
+ import * as interfaces from '../../dist_ts_interfaces/index.js';
38
+ import { viewHostCss } from './shared/css.js';
39
+ import {} from '@design.estate/dees-catalog';
40
+ let OpsViewSecurityProfiles = (() => {
41
+ let _classDecorators = [customElement('ops-view-securityprofiles')];
42
+ let _classDescriptor;
43
+ let _classExtraInitializers = [];
44
+ let _classThis;
45
+ let _classSuper = DeesElement;
46
+ let _profilesState_decorators;
47
+ let _profilesState_initializers = [];
48
+ let _profilesState_extraInitializers = [];
49
+ var OpsViewSecurityProfiles = class extends _classSuper {
50
+ static { _classThis = this; }
51
+ static {
52
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
53
+ _profilesState_decorators = [state()];
54
+ __esDecorate(this, null, _profilesState_decorators, { kind: "accessor", name: "profilesState", static: false, private: false, access: { has: obj => "profilesState" in obj, get: obj => obj.profilesState, set: (obj, value) => { obj.profilesState = value; } }, metadata: _metadata }, _profilesState_initializers, _profilesState_extraInitializers);
55
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
56
+ OpsViewSecurityProfiles = _classThis = _classDescriptor.value;
57
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
58
+ }
59
+ #profilesState_accessor_storage = __runInitializers(this, _profilesState_initializers, appstate.profilesTargetsStatePart.getState());
60
+ get profilesState() { return this.#profilesState_accessor_storage; }
61
+ set profilesState(value) { this.#profilesState_accessor_storage = value; }
62
+ constructor() {
63
+ super();
64
+ __runInitializers(this, _profilesState_extraInitializers);
65
+ const sub = appstate.profilesTargetsStatePart.select().subscribe((newState) => {
66
+ this.profilesState = newState;
67
+ });
68
+ this.rxSubscriptions.push(sub);
69
+ }
70
+ async connectedCallback() {
71
+ await super.connectedCallback();
72
+ await appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null);
73
+ }
74
+ static styles = [
75
+ cssManager.defaultStyles,
76
+ viewHostCss,
77
+ css `
78
+ .profilesContainer {
79
+ display: flex;
80
+ flex-direction: column;
81
+ gap: 24px;
82
+ }
83
+ `,
84
+ ];
85
+ render() {
86
+ const profiles = this.profilesState.profiles;
87
+ const statsTiles = [
88
+ {
89
+ id: 'totalProfiles',
90
+ title: 'Total Profiles',
91
+ type: 'number',
92
+ value: profiles.length,
93
+ icon: 'lucide:shieldCheck',
94
+ description: 'Reusable security profiles',
95
+ color: '#3b82f6',
96
+ },
97
+ ];
98
+ return html `
99
+ <div class="profilesContainer">
100
+ <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
101
+ <dees-table
102
+ .heading1=${'Security Profiles'}
103
+ .heading2=${'Reusable security configurations for routes'}
104
+ .data=${profiles}
105
+ .displayFunction=${(profile) => ({
106
+ Name: profile.name,
107
+ Description: profile.description || '-',
108
+ 'IP Allow List': (profile.security?.ipAllowList || []).join(', ') || '-',
109
+ 'IP Block List': (profile.security?.ipBlockList || []).join(', ') || '-',
110
+ 'Max Connections': profile.security?.maxConnections ?? '-',
111
+ 'Rate Limit': profile.security?.rateLimit?.enabled ? `${profile.security.rateLimit.maxRequests}/${profile.security.rateLimit.window}s` : '-',
112
+ Extends: (profile.extendsProfiles || []).length > 0
113
+ ? profile.extendsProfiles.map(id => {
114
+ const p = profiles.find(pp => pp.id === id);
115
+ return p ? p.name : id.slice(0, 8);
116
+ }).join(', ')
117
+ : '-',
118
+ })}
119
+ .dataActions=${[
120
+ {
121
+ name: 'Create Profile',
122
+ iconName: 'lucide:plus',
123
+ type: ['header'],
124
+ actionFunc: async (_, table) => {
125
+ await this.showCreateProfileDialog(table);
126
+ },
127
+ },
128
+ {
129
+ name: 'Refresh',
130
+ iconName: 'lucide:rotateCw',
131
+ type: ['header'],
132
+ actionFunc: async () => {
133
+ await appstate.profilesTargetsStatePart.dispatchAction(appstate.fetchProfilesAndTargetsAction, null);
134
+ },
135
+ },
136
+ {
137
+ name: 'Edit',
138
+ iconName: 'lucide:pencil',
139
+ type: ['contextmenu'],
140
+ actionFunc: async (profile, table) => {
141
+ await this.showEditProfileDialog(profile, table);
142
+ },
143
+ },
144
+ {
145
+ name: 'Delete',
146
+ iconName: 'lucide:trash2',
147
+ type: ['contextmenu'],
148
+ actionFunc: async (profile) => {
149
+ await this.deleteProfile(profile);
150
+ },
151
+ },
152
+ ]}
153
+ ></dees-table>
154
+ </div>
155
+ `;
156
+ }
157
+ async showCreateProfileDialog(table) {
158
+ const { DeesModal } = await import('@design.estate/dees-catalog');
159
+ DeesModal.createAndShow({
160
+ heading: 'Create Security Profile',
161
+ content: html `
162
+ <dees-form>
163
+ <dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
164
+ <dees-input-text .key=${'description'} .label=${'Description'}></dees-input-text>
165
+ <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'}></dees-input-text>
166
+ <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'}></dees-input-text>
167
+ <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'}></dees-input-text>
168
+ </dees-form>
169
+ `,
170
+ menuOptions: [
171
+ {
172
+ name: 'Create',
173
+ action: async (modalArg) => {
174
+ const form = modalArg.shadowRoot.querySelector('dees-form');
175
+ const data = await form.collectFormData();
176
+ const ipAllowList = data.ipAllowList
177
+ ? String(data.ipAllowList).split(',').map((s) => s.trim()).filter(Boolean)
178
+ : undefined;
179
+ const ipBlockList = data.ipBlockList
180
+ ? String(data.ipBlockList).split(',').map((s) => s.trim()).filter(Boolean)
181
+ : undefined;
182
+ const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
183
+ await appstate.profilesTargetsStatePart.dispatchAction(appstate.createProfileAction, {
184
+ name: String(data.name),
185
+ description: data.description ? String(data.description) : undefined,
186
+ security: {
187
+ ...(ipAllowList ? { ipAllowList } : {}),
188
+ ...(ipBlockList ? { ipBlockList } : {}),
189
+ ...(maxConnections ? { maxConnections } : {}),
190
+ },
191
+ });
192
+ modalArg.destroy();
193
+ },
194
+ },
195
+ { name: 'Cancel', action: async (modalArg) => modalArg.destroy() },
196
+ ],
197
+ });
198
+ }
199
+ async showEditProfileDialog(profile, table) {
200
+ const { DeesModal } = await import('@design.estate/dees-catalog');
201
+ DeesModal.createAndShow({
202
+ heading: `Edit Profile: ${profile.name}`,
203
+ content: html `
204
+ <dees-form>
205
+ <dees-input-text .key=${'name'} .label=${'Name'} .value=${profile.name}></dees-input-text>
206
+ <dees-input-text .key=${'description'} .label=${'Description'} .value=${profile.description || ''}></dees-input-text>
207
+ <dees-input-text .key=${'ipAllowList'} .label=${'IP Allow List (comma-separated)'} .value=${(profile.security?.ipAllowList || []).join(', ')}></dees-input-text>
208
+ <dees-input-text .key=${'ipBlockList'} .label=${'IP Block List (comma-separated)'} .value=${(profile.security?.ipBlockList || []).join(', ')}></dees-input-text>
209
+ <dees-input-text .key=${'maxConnections'} .label=${'Max Connections'} .value=${String(profile.security?.maxConnections || '')}></dees-input-text>
210
+ </dees-form>
211
+ `,
212
+ menuOptions: [
213
+ {
214
+ name: 'Save',
215
+ action: async (modalArg) => {
216
+ const form = modalArg.shadowRoot.querySelector('dees-form');
217
+ const data = await form.collectFormData();
218
+ const ipAllowList = data.ipAllowList
219
+ ? String(data.ipAllowList).split(',').map((s) => s.trim()).filter(Boolean)
220
+ : [];
221
+ const ipBlockList = data.ipBlockList
222
+ ? String(data.ipBlockList).split(',').map((s) => s.trim()).filter(Boolean)
223
+ : [];
224
+ const maxConnections = data.maxConnections ? parseInt(String(data.maxConnections)) : undefined;
225
+ await appstate.profilesTargetsStatePart.dispatchAction(appstate.updateProfileAction, {
226
+ id: profile.id,
227
+ name: String(data.name),
228
+ description: data.description ? String(data.description) : undefined,
229
+ security: {
230
+ ipAllowList,
231
+ ipBlockList,
232
+ ...(maxConnections ? { maxConnections } : {}),
233
+ },
234
+ });
235
+ modalArg.destroy();
236
+ },
237
+ },
238
+ { name: 'Cancel', action: async (modalArg) => modalArg.destroy() },
239
+ ],
240
+ });
241
+ }
242
+ async deleteProfile(profile) {
243
+ await appstate.profilesTargetsStatePart.dispatchAction(appstate.deleteProfileAction, {
244
+ id: profile.id,
245
+ force: false,
246
+ });
247
+ const currentState = appstate.profilesTargetsStatePart.getState();
248
+ if (currentState.error?.includes('in use')) {
249
+ const { DeesModal } = await import('@design.estate/dees-catalog');
250
+ DeesModal.createAndShow({
251
+ heading: 'Profile In Use',
252
+ content: html `<p>${currentState.error} Force delete?</p>`,
253
+ menuOptions: [
254
+ {
255
+ name: 'Force Delete',
256
+ action: async (modalArg) => {
257
+ await appstate.profilesTargetsStatePart.dispatchAction(appstate.deleteProfileAction, {
258
+ id: profile.id,
259
+ force: true,
260
+ });
261
+ modalArg.destroy();
262
+ },
263
+ },
264
+ { name: 'Cancel', action: async (modalArg) => modalArg.destroy() },
265
+ ],
266
+ });
267
+ }
268
+ }
269
+ static {
270
+ __runInitializers(_classThis, _classExtraInitializers);
271
+ }
272
+ };
273
+ return OpsViewSecurityProfiles = _classThis;
274
+ })();
275
+ export { OpsViewSecurityProfiles };
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHlwcm9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9vcHMtdmlldy1zZWN1cml0eXByb2ZpbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLElBQUksRUFDSixhQUFhLEVBRWIsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxVQUFVLE1BQU0sbUNBQW1DLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCx1QkFBdUI7NEJBRG5DLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7O3VDQUFuQixTQUFRLFdBQVc7Ozs7eUNBQ3JELEtBQUssRUFBRTtZQUNSLDRMQUFTLGFBQWEsNkJBQWIsYUFBYSxxR0FBaUY7WUFGekcsNktBNk5DOzs7O1FBM05DLHVGQUF5RCxRQUFRLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBdkcsSUFBUyxhQUFhLG1EQUFpRjtRQUF2RyxJQUFTLGFBQWEseURBQWlGO1FBRXZHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUM1RSxJQUFJLENBQUMsYUFBYSxHQUFHLFFBQVEsQ0FBQztZQUNoQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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
@@ -1,4 +1,4 @@
1
- export declare const validViews: readonly ["overview", "network", "emails", "logs", "routes", "apitokens", "configuration", "security", "certificates", "remoteingress", "vpn"];
1
+ export declare const validViews: readonly ["overview", "network", "emails", "logs", "routes", "apitokens", "configuration", "security", "certificates", "remoteingress", "vpn", "securityprofiles", "networktargets"];
2
2
  export type TValidView = typeof validViews[number];
3
3
  declare class AppRouter {
4
4
  private router;
@@ -1,7 +1,7 @@
1
1
  import * as plugins from './plugins.js';
2
2
  import * as appstate from './appstate.js';
3
3
  const SmartRouter = plugins.domtools.plugins.smartrouter.SmartRouter;
4
- export const validViews = ['overview', 'network', 'emails', 'logs', 'routes', 'apitokens', 'configuration', 'security', 'certificates', 'remoteingress', 'vpn'];
4
+ export const validViews = ['overview', 'network', 'emails', 'logs', 'routes', 'apitokens', 'configuration', 'security', 'certificates', 'remoteingress', 'vpn', 'securityprofiles', 'networktargets'];
5
5
  class AppRouter {
6
6
  router;
7
7
  initialized = false;
@@ -88,4 +88,4 @@ class AppRouter {
88
88
  }
89
89
  }
90
90
  export const appRouter = new AppRouter();
91
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQVUsQ0FBQztBQUl6SyxNQUFNLFNBQVM7SUFDTCxNQUFNLENBQW1DO0lBQ3pDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXBDO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU8sV0FBVztRQUNqQixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsS0FBSyxJQUFJLEVBQUU7Z0JBQ3BDLElBQUks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
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL3JvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEtBQUssUUFBUSxNQUFNLGVBQWUsQ0FBQztBQUUxQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQVUsQ0FBQztBQUkvTSxNQUFNLFNBQVM7SUFDTCxNQUFNLENBQW1DO0lBQ3pDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXBDO1FBQ0UsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVztZQUFFLE9BQU87UUFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU8sV0FBVztRQUNqQixLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsS0FB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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": "12.1.0",
4
+ "version": "12.2.1",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '12.1.0',
6
+ version: '12.2.1',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -21,7 +21,7 @@ import { MetricsManager } from './monitoring/index.js';
21
21
  import { RadiusServer, type IRadiusServerConfig } from './radius/index.js';
22
22
  import { RemoteIngressManager, TunnelManager } from './remoteingress/index.js';
23
23
  import { VpnManager, type IVpnManagerConfig } from './vpn/index.js';
24
- import { RouteConfigManager, ApiTokenManager } from './config/index.js';
24
+ import { RouteConfigManager, ApiTokenManager, ReferenceResolver, DbSeeder } from './config/index.js';
25
25
  import { SecurityLogger, ContentScanner, IPReputationChecker } from './security/index.js';
26
26
  import { type IHttp3Config, augmentRoutesWithHttp3 } from './http3/index.js';
27
27
 
@@ -137,6 +137,10 @@ export interface IDcRouterOptions {
137
137
  dbName?: string;
138
138
  /** Cache cleanup interval in hours (default: 1) */
139
139
  cleanupIntervalHours?: number;
140
+ /** Seed default security profiles and network targets when DB is empty on first startup. */
141
+ seedOnEmpty?: boolean;
142
+ /** Custom seed data for profiles and targets (overrides built-in defaults). */
143
+ seedData?: import('./config/classes.db-seeder.js').ISeedData;
140
144
  };
141
145
 
142
146
  /**
@@ -269,6 +273,7 @@ export class DcRouter {
269
273
  // Programmatic config API
270
274
  public routeConfigManager?: RouteConfigManager;
271
275
  public apiTokenManager?: ApiTokenManager;
276
+ public referenceResolver?: ReferenceResolver;
272
277
 
273
278
  // Auto-discovered public IP (populated by generateAuthoritativeRecords)
274
279
  public detectedPublicIp: string | null = null;
@@ -456,6 +461,10 @@ export class DcRouter {
456
461
  .optional()
457
462
  .dependsOn('SmartProxy', 'DcRouterDb')
458
463
  .withStart(async () => {
464
+ // Initialize reference resolver first (profiles + targets)
465
+ this.referenceResolver = new ReferenceResolver();
466
+ await this.referenceResolver.initialize();
467
+
459
468
  this.routeConfigManager = new RouteConfigManager(
460
469
  () => this.getConstructorRoutes(),
461
470
  () => this.smartProxy,
@@ -468,14 +477,23 @@ export class DcRouter {
468
477
  return [this.options.vpnConfig?.subnet || '10.8.0.0/24'];
469
478
  }
470
479
  : undefined,
480
+ this.referenceResolver,
471
481
  );
472
482
  this.apiTokenManager = new ApiTokenManager();
473
483
  await this.apiTokenManager.initialize();
474
484
  await this.routeConfigManager.initialize();
485
+
486
+ // Seed default profiles/targets if DB is empty and seeding is enabled
487
+ const seeder = new DbSeeder(this.referenceResolver);
488
+ await seeder.seedIfEmpty(
489
+ this.options.dbConfig?.seedOnEmpty,
490
+ this.options.dbConfig?.seedData,
491
+ );
475
492
  })
476
493
  .withStop(async () => {
477
494
  this.routeConfigManager = undefined;
478
495
  this.apiTokenManager = undefined;
496
+ this.referenceResolver = undefined;
479
497
  })
480
498
  .withRetry({ maxRetries: 2, baseDelayMs: 1000 }),
481
499
  );
@@ -0,0 +1,95 @@
1
+ import { logger } from '../logger.js';
2
+ import type { ReferenceResolver } from './classes.reference-resolver.js';
3
+ import type { IRouteSecurity } from '../../ts_interfaces/data/route-management.js';
4
+
5
+ export interface ISeedData {
6
+ profiles?: Array<{
7
+ name: string;
8
+ description?: string;
9
+ security: IRouteSecurity;
10
+ extendsProfiles?: string[];
11
+ }>;
12
+ targets?: Array<{
13
+ name: string;
14
+ description?: string;
15
+ host: string | string[];
16
+ port: number;
17
+ }>;
18
+ }
19
+
20
+ export class DbSeeder {
21
+ constructor(private referenceResolver: ReferenceResolver) {}
22
+
23
+ /**
24
+ * Check if DB is empty and seed if configured.
25
+ * Called once during ConfigManagers service startup, after initialize().
26
+ */
27
+ public async seedIfEmpty(
28
+ seedOnEmpty?: boolean,
29
+ seedData?: ISeedData,
30
+ ): Promise<void> {
31
+ if (!seedOnEmpty) return;
32
+
33
+ const existingProfiles = this.referenceResolver.listProfiles();
34
+ const existingTargets = this.referenceResolver.listTargets();
35
+
36
+ if (existingProfiles.length > 0 || existingTargets.length > 0) {
37
+ logger.log('info', 'DB already contains profiles/targets, skipping seed');
38
+ return;
39
+ }
40
+
41
+ logger.log('info', 'Seeding database with initial profiles and targets...');
42
+
43
+ const profilesToSeed: NonNullable<ISeedData['profiles']> = seedData?.profiles ?? DEFAULT_PROFILES;
44
+ const targetsToSeed: NonNullable<ISeedData['targets']> = seedData?.targets ?? DEFAULT_TARGETS;
45
+
46
+ for (const p of profilesToSeed) {
47
+ await this.referenceResolver.createProfile({
48
+ name: p.name,
49
+ description: p.description,
50
+ security: p.security,
51
+ extendsProfiles: p.extendsProfiles,
52
+ createdBy: 'system-seed',
53
+ });
54
+ }
55
+
56
+ for (const t of targetsToSeed) {
57
+ await this.referenceResolver.createTarget({
58
+ name: t.name,
59
+ description: t.description,
60
+ host: t.host,
61
+ port: t.port,
62
+ createdBy: 'system-seed',
63
+ });
64
+ }
65
+
66
+ logger.log('info', `Seeded ${profilesToSeed.length} profile(s) and ${targetsToSeed.length} target(s)`);
67
+ }
68
+ }
69
+
70
+ const DEFAULT_PROFILES: Array<NonNullable<ISeedData['profiles']>[number]> = [
71
+ {
72
+ name: 'PUBLIC',
73
+ description: 'Allow all traffic — no IP restrictions',
74
+ security: {
75
+ ipAllowList: ['*'],
76
+ },
77
+ },
78
+ {
79
+ name: 'STANDARD',
80
+ description: 'Standard internal access with common private subnets',
81
+ security: {
82
+ ipAllowList: ['192.168.0.0/16', '10.0.0.0/8', '127.0.0.1', '::1'],
83
+ maxConnections: 1000,
84
+ },
85
+ },
86
+ ];
87
+
88
+ const DEFAULT_TARGETS: Array<NonNullable<ISeedData['targets']>[number]> = [
89
+ {
90
+ name: 'LOCALHOST',
91
+ description: 'Local machine on port 443',
92
+ host: '127.0.0.1',
93
+ port: 443,
94
+ },
95
+ ];