@serve.zone/dcrouter 11.0.39 → 11.0.44

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.
@@ -39328,4 +39328,4 @@ ibantools/jsnext/ibantools.js:
39328
39328
  * @preferred
39329
39329
  *)
39330
39330
  */
39331
- //# sourceMappingURL=bundle-1772723745338.js.map
39331
+ //# sourceMappingURL=bundle-1772724591594.js.map
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '11.0.39',
6
+ version: '11.0.44',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFdBQVcsRUFBRSwwRUFBMEU7Q0FDeEYsQ0FBQSJ9
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "11.0.39",
4
+ "version": "11.0.44",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -19,7 +19,7 @@
19
19
  "watch": "tswatch"
20
20
  },
21
21
  "devDependencies": {
22
- "@git.zone/tsbuild": "^4.1.25",
22
+ "@git.zone/tsbuild": "^4.2.1",
23
23
  "@git.zone/tsbundle": "^2.9.0",
24
24
  "@git.zone/tsrun": "^2.0.1",
25
25
  "@git.zone/tstest": "^3.2.0",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '11.0.39',
6
+ version: '11.0.44',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '11.0.39',
6
+ version: '11.0.44',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -1,46 +0,0 @@
1
- import type { StorageManager } from '../storage/index.js';
2
- import type { IStoredApiToken, IApiTokenInfo, TApiTokenScope } from '../../dist_ts_interfaces/data/route-management.js';
3
- export declare class ApiTokenManager {
4
- private storageManager;
5
- private tokens;
6
- constructor(storageManager: StorageManager);
7
- initialize(): Promise<void>;
8
- /**
9
- * Create a new API token. Returns the raw token value (shown once).
10
- */
11
- createToken(name: string, scopes: TApiTokenScope[], expiresInDays: number | null, createdBy: string): Promise<{
12
- id: string;
13
- rawToken: string;
14
- }>;
15
- /**
16
- * Validate a raw token string. Returns the stored token if valid, null otherwise.
17
- * Also updates lastUsedAt.
18
- */
19
- validateToken(rawToken: string): Promise<IStoredApiToken | null>;
20
- /**
21
- * Check if a token has a specific scope.
22
- */
23
- hasScope(token: IStoredApiToken, scope: TApiTokenScope): boolean;
24
- /**
25
- * List all tokens (safe info only, no hashes).
26
- */
27
- listTokens(): IApiTokenInfo[];
28
- /**
29
- * Revoke (delete) a token.
30
- */
31
- revokeToken(id: string): Promise<boolean>;
32
- /**
33
- * Roll (regenerate) a token's secret while keeping its identity.
34
- * Returns the new raw token value (shown once).
35
- */
36
- rollToken(id: string): Promise<{
37
- id: string;
38
- rawToken: string;
39
- } | null>;
40
- /**
41
- * Enable or disable a token.
42
- */
43
- toggleToken(id: string, enabled: boolean): Promise<boolean>;
44
- private loadTokens;
45
- private persistToken;
46
- }
@@ -1,150 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { logger } from '../logger.js';
3
- const TOKENS_PREFIX = '/config-api/tokens/';
4
- const TOKEN_PREFIX_STR = 'dcr_';
5
- export class ApiTokenManager {
6
- storageManager;
7
- tokens = new Map();
8
- constructor(storageManager) {
9
- this.storageManager = storageManager;
10
- }
11
- async initialize() {
12
- await this.loadTokens();
13
- if (this.tokens.size > 0) {
14
- logger.log('info', `Loaded ${this.tokens.size} API token(s) from storage`);
15
- }
16
- }
17
- // =========================================================================
18
- // Token lifecycle
19
- // =========================================================================
20
- /**
21
- * Create a new API token. Returns the raw token value (shown once).
22
- */
23
- async createToken(name, scopes, expiresInDays, createdBy) {
24
- const id = plugins.uuid.v4();
25
- const randomBytes = plugins.crypto.randomBytes(32);
26
- const rawPayload = `${id}:${randomBytes.toString('base64url')}`;
27
- const rawToken = `${TOKEN_PREFIX_STR}${rawPayload}`;
28
- const tokenHash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
29
- const now = Date.now();
30
- const stored = {
31
- id,
32
- name,
33
- tokenHash,
34
- scopes,
35
- createdAt: now,
36
- expiresAt: expiresInDays != null ? now + expiresInDays * 86400000 : null,
37
- lastUsedAt: null,
38
- createdBy,
39
- enabled: true,
40
- };
41
- this.tokens.set(id, stored);
42
- await this.persistToken(stored);
43
- logger.log('info', `API token '${name}' created (id: ${id})`);
44
- return { id, rawToken };
45
- }
46
- /**
47
- * Validate a raw token string. Returns the stored token if valid, null otherwise.
48
- * Also updates lastUsedAt.
49
- */
50
- async validateToken(rawToken) {
51
- if (!rawToken.startsWith(TOKEN_PREFIX_STR))
52
- return null;
53
- const hash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
54
- for (const stored of this.tokens.values()) {
55
- if (stored.tokenHash === hash) {
56
- if (!stored.enabled)
57
- return null;
58
- if (stored.expiresAt !== null && stored.expiresAt < Date.now())
59
- return null;
60
- // Update lastUsedAt (fire and forget)
61
- stored.lastUsedAt = Date.now();
62
- this.persistToken(stored).catch(() => { });
63
- return stored;
64
- }
65
- }
66
- return null;
67
- }
68
- /**
69
- * Check if a token has a specific scope.
70
- */
71
- hasScope(token, scope) {
72
- return token.scopes.includes(scope);
73
- }
74
- /**
75
- * List all tokens (safe info only, no hashes).
76
- */
77
- listTokens() {
78
- const result = [];
79
- for (const stored of this.tokens.values()) {
80
- result.push({
81
- id: stored.id,
82
- name: stored.name,
83
- scopes: stored.scopes,
84
- createdAt: stored.createdAt,
85
- expiresAt: stored.expiresAt,
86
- lastUsedAt: stored.lastUsedAt,
87
- enabled: stored.enabled,
88
- });
89
- }
90
- return result;
91
- }
92
- /**
93
- * Revoke (delete) a token.
94
- */
95
- async revokeToken(id) {
96
- if (!this.tokens.has(id))
97
- return false;
98
- const token = this.tokens.get(id);
99
- this.tokens.delete(id);
100
- await this.storageManager.delete(`${TOKENS_PREFIX}${id}.json`);
101
- logger.log('info', `API token '${token.name}' revoked (id: ${id})`);
102
- return true;
103
- }
104
- /**
105
- * Roll (regenerate) a token's secret while keeping its identity.
106
- * Returns the new raw token value (shown once).
107
- */
108
- async rollToken(id) {
109
- const stored = this.tokens.get(id);
110
- if (!stored)
111
- return null;
112
- const randomBytes = plugins.crypto.randomBytes(32);
113
- const rawPayload = `${id}:${randomBytes.toString('base64url')}`;
114
- const rawToken = `${TOKEN_PREFIX_STR}${rawPayload}`;
115
- stored.tokenHash = plugins.crypto.createHash('sha256').update(rawToken).digest('hex');
116
- await this.persistToken(stored);
117
- logger.log('info', `API token '${stored.name}' rolled (id: ${id})`);
118
- return { id, rawToken };
119
- }
120
- /**
121
- * Enable or disable a token.
122
- */
123
- async toggleToken(id, enabled) {
124
- const stored = this.tokens.get(id);
125
- if (!stored)
126
- return false;
127
- stored.enabled = enabled;
128
- await this.persistToken(stored);
129
- logger.log('info', `API token '${stored.name}' ${enabled ? 'enabled' : 'disabled'} (id: ${id})`);
130
- return true;
131
- }
132
- // =========================================================================
133
- // Private
134
- // =========================================================================
135
- async loadTokens() {
136
- const keys = await this.storageManager.list(TOKENS_PREFIX);
137
- for (const key of keys) {
138
- if (!key.endsWith('.json'))
139
- continue;
140
- const stored = await this.storageManager.getJSON(key);
141
- if (stored?.id) {
142
- this.tokens.set(stored.id, stored);
143
- }
144
- }
145
- }
146
- async persistToken(stored) {
147
- await this.storageManager.setJSON(`${TOKENS_PREFIX}${stored.id}.json`, stored);
148
- }
149
- }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hcGktdG9rZW4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLmFwaS10b2tlbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFRdEMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFaEMsTUFBTSxPQUFPLGVBQWU7SUFHTjtJQUZaLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUVwRCxZQUFvQixjQUE4QjtRQUE5QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFBRyxDQUFDO0lBRS9DLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksNEJBQTRCLENBQUMsQ0FBQztRQUM3RSxDQUFDO0lBQ0gsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSxrQkFBa0I7SUFDbEIsNEVBQTRFO0lBRTVFOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFdBQVcsQ0FDdEIsSUFBWSxFQUNaLE1BQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLFNBQWlCO1FBRWpCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbkQsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLElB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
@@ -1,35 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import type { StorageManager } from '../storage/index.js';
3
- import type { IMergedRoute, IRouteWarning } from '../../dist_ts_interfaces/data/route-management.js';
4
- export declare class RouteConfigManager {
5
- private storageManager;
6
- private getHardcodedRoutes;
7
- private getSmartProxy;
8
- private storedRoutes;
9
- private overrides;
10
- private warnings;
11
- constructor(storageManager: StorageManager, getHardcodedRoutes: () => plugins.smartproxy.IRouteConfig[], getSmartProxy: () => plugins.smartproxy.SmartProxy | undefined);
12
- /**
13
- * Load persisted routes and overrides, compute warnings, apply to SmartProxy.
14
- */
15
- initialize(): Promise<void>;
16
- getMergedRoutes(): {
17
- routes: IMergedRoute[];
18
- warnings: IRouteWarning[];
19
- };
20
- createRoute(route: plugins.smartproxy.IRouteConfig, createdBy: string, enabled?: boolean): Promise<string>;
21
- updateRoute(id: string, patch: {
22
- route?: Partial<plugins.smartproxy.IRouteConfig>;
23
- enabled?: boolean;
24
- }): Promise<boolean>;
25
- deleteRoute(id: string): Promise<boolean>;
26
- toggleRoute(id: string, enabled: boolean): Promise<boolean>;
27
- setOverride(routeName: string, enabled: boolean, updatedBy: string): Promise<void>;
28
- removeOverride(routeName: string): Promise<boolean>;
29
- private loadStoredRoutes;
30
- private loadOverrides;
31
- private persistRoute;
32
- private computeWarnings;
33
- private logWarnings;
34
- private applyRoutes;
35
- }
@@ -1,231 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { logger } from '../logger.js';
3
- const ROUTES_PREFIX = '/config-api/routes/';
4
- const OVERRIDES_PREFIX = '/config-api/overrides/';
5
- export class RouteConfigManager {
6
- storageManager;
7
- getHardcodedRoutes;
8
- getSmartProxy;
9
- storedRoutes = new Map();
10
- overrides = new Map();
11
- warnings = [];
12
- constructor(storageManager, getHardcodedRoutes, getSmartProxy) {
13
- this.storageManager = storageManager;
14
- this.getHardcodedRoutes = getHardcodedRoutes;
15
- this.getSmartProxy = getSmartProxy;
16
- }
17
- /**
18
- * Load persisted routes and overrides, compute warnings, apply to SmartProxy.
19
- */
20
- async initialize() {
21
- await this.loadStoredRoutes();
22
- await this.loadOverrides();
23
- this.computeWarnings();
24
- this.logWarnings();
25
- await this.applyRoutes();
26
- }
27
- // =========================================================================
28
- // Merged view
29
- // =========================================================================
30
- getMergedRoutes() {
31
- const merged = [];
32
- // Hardcoded routes
33
- for (const route of this.getHardcodedRoutes()) {
34
- const name = route.name || '';
35
- const override = this.overrides.get(name);
36
- merged.push({
37
- route,
38
- source: 'hardcoded',
39
- enabled: override ? override.enabled : true,
40
- overridden: !!override,
41
- });
42
- }
43
- // Programmatic routes
44
- for (const stored of this.storedRoutes.values()) {
45
- merged.push({
46
- route: stored.route,
47
- source: 'programmatic',
48
- enabled: stored.enabled,
49
- overridden: false,
50
- storedRouteId: stored.id,
51
- createdAt: stored.createdAt,
52
- updatedAt: stored.updatedAt,
53
- });
54
- }
55
- return { routes: merged, warnings: [...this.warnings] };
56
- }
57
- // =========================================================================
58
- // Programmatic route CRUD
59
- // =========================================================================
60
- async createRoute(route, createdBy, enabled = true) {
61
- const id = plugins.uuid.v4();
62
- const now = Date.now();
63
- // Ensure route has a name
64
- if (!route.name) {
65
- route.name = `programmatic-${id.slice(0, 8)}`;
66
- }
67
- const stored = {
68
- id,
69
- route,
70
- enabled,
71
- createdAt: now,
72
- updatedAt: now,
73
- createdBy,
74
- };
75
- this.storedRoutes.set(id, stored);
76
- await this.persistRoute(stored);
77
- await this.applyRoutes();
78
- return id;
79
- }
80
- async updateRoute(id, patch) {
81
- const stored = this.storedRoutes.get(id);
82
- if (!stored)
83
- return false;
84
- if (patch.route) {
85
- stored.route = { ...stored.route, ...patch.route };
86
- }
87
- if (patch.enabled !== undefined) {
88
- stored.enabled = patch.enabled;
89
- }
90
- stored.updatedAt = Date.now();
91
- await this.persistRoute(stored);
92
- await this.applyRoutes();
93
- return true;
94
- }
95
- async deleteRoute(id) {
96
- if (!this.storedRoutes.has(id))
97
- return false;
98
- this.storedRoutes.delete(id);
99
- await this.storageManager.delete(`${ROUTES_PREFIX}${id}.json`);
100
- await this.applyRoutes();
101
- return true;
102
- }
103
- async toggleRoute(id, enabled) {
104
- return this.updateRoute(id, { enabled });
105
- }
106
- // =========================================================================
107
- // Hardcoded route overrides
108
- // =========================================================================
109
- async setOverride(routeName, enabled, updatedBy) {
110
- const override = {
111
- routeName,
112
- enabled,
113
- updatedAt: Date.now(),
114
- updatedBy,
115
- };
116
- this.overrides.set(routeName, override);
117
- await this.storageManager.setJSON(`${OVERRIDES_PREFIX}${routeName}.json`, override);
118
- this.computeWarnings();
119
- await this.applyRoutes();
120
- }
121
- async removeOverride(routeName) {
122
- if (!this.overrides.has(routeName))
123
- return false;
124
- this.overrides.delete(routeName);
125
- await this.storageManager.delete(`${OVERRIDES_PREFIX}${routeName}.json`);
126
- this.computeWarnings();
127
- await this.applyRoutes();
128
- return true;
129
- }
130
- // =========================================================================
131
- // Private: persistence
132
- // =========================================================================
133
- async loadStoredRoutes() {
134
- const keys = await this.storageManager.list(ROUTES_PREFIX);
135
- for (const key of keys) {
136
- if (!key.endsWith('.json'))
137
- continue;
138
- const stored = await this.storageManager.getJSON(key);
139
- if (stored?.id) {
140
- this.storedRoutes.set(stored.id, stored);
141
- }
142
- }
143
- if (this.storedRoutes.size > 0) {
144
- logger.log('info', `Loaded ${this.storedRoutes.size} programmatic route(s) from storage`);
145
- }
146
- }
147
- async loadOverrides() {
148
- const keys = await this.storageManager.list(OVERRIDES_PREFIX);
149
- for (const key of keys) {
150
- if (!key.endsWith('.json'))
151
- continue;
152
- const override = await this.storageManager.getJSON(key);
153
- if (override?.routeName) {
154
- this.overrides.set(override.routeName, override);
155
- }
156
- }
157
- if (this.overrides.size > 0) {
158
- logger.log('info', `Loaded ${this.overrides.size} route override(s) from storage`);
159
- }
160
- }
161
- async persistRoute(stored) {
162
- await this.storageManager.setJSON(`${ROUTES_PREFIX}${stored.id}.json`, stored);
163
- }
164
- // =========================================================================
165
- // Private: warnings
166
- // =========================================================================
167
- computeWarnings() {
168
- this.warnings = [];
169
- const hardcodedNames = new Set(this.getHardcodedRoutes().map((r) => r.name || ''));
170
- // Check overrides
171
- for (const [routeName, override] of this.overrides) {
172
- if (!hardcodedNames.has(routeName)) {
173
- this.warnings.push({
174
- type: 'orphaned-override',
175
- routeName,
176
- message: `Orphaned override for route '${routeName}' — hardcoded route no longer exists`,
177
- });
178
- }
179
- else if (!override.enabled) {
180
- this.warnings.push({
181
- type: 'disabled-hardcoded',
182
- routeName,
183
- message: `Route '${routeName}' is disabled via API override`,
184
- });
185
- }
186
- }
187
- // Check disabled programmatic routes
188
- for (const stored of this.storedRoutes.values()) {
189
- if (!stored.enabled) {
190
- const name = stored.route.name || stored.id;
191
- this.warnings.push({
192
- type: 'disabled-programmatic',
193
- routeName: name,
194
- message: `Programmatic route '${name}' (id: ${stored.id}) is disabled`,
195
- });
196
- }
197
- }
198
- }
199
- logWarnings() {
200
- for (const w of this.warnings) {
201
- logger.log('warn', w.message);
202
- }
203
- }
204
- // =========================================================================
205
- // Private: apply merged routes to SmartProxy
206
- // =========================================================================
207
- async applyRoutes() {
208
- const smartProxy = this.getSmartProxy();
209
- if (!smartProxy)
210
- return;
211
- const enabledRoutes = [];
212
- // Add enabled hardcoded routes (respecting overrides)
213
- for (const route of this.getHardcodedRoutes()) {
214
- const name = route.name || '';
215
- const override = this.overrides.get(name);
216
- if (override && !override.enabled) {
217
- continue; // Skip disabled hardcoded route
218
- }
219
- enabledRoutes.push(route);
220
- }
221
- // Add enabled programmatic routes
222
- for (const stored of this.storedRoutes.values()) {
223
- if (stored.enabled) {
224
- enabledRoutes.push(stored.route);
225
- }
226
- }
227
- await smartProxy.updateRoutes(enabledRoutes);
228
- logger.log('info', `Applied ${enabledRoutes.length} routes to SmartProxy (${this.storedRoutes.size} programmatic, ${this.overrides.size} overrides)`);
229
- }
230
- }
231
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS1jb25maWctbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvbmZpZy9jbGFzc2VzLnJvdXRlLWNvbmZpZy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFTdEMsTUFBTSxhQUFhLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQztBQUVsRCxNQUFNLE9BQU8sa0JBQWtCO0lBTW5CO0lBQ0E7SUFDQTtJQVBGLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUMvQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQTBCLENBQUM7SUFDOUMsUUFBUSxHQUFvQixFQUFFLENBQUM7SUFFdkMsWUFDVSxjQUE4QixFQUM5QixrQkFBMkQsRUFDM0QsYUFBOEQ7UUFGOUQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBeUM7UUFDM0Qsa0JBQWEsR0FBYixhQUFhLENBQWlEO0lBQ3JFLENBQUM7SUFFSjs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsNEVBQTRFO0lBQzVFLGNBQWM7SUFDZCw0RUFBNEU7SUFFckUsZUFBZTtRQUNwQixNQUFNLE1BQU0sR0FBbUIsRUFBRSxDQUFDO1FBRWxDLG1CQUFtQjtRQUNuQixLQUFLLE1B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
@@ -1,3 +0,0 @@
1
- export * from './validator.js';
2
- export { RouteConfigManager } from './classes.route-config-manager.js';
3
- export { ApiTokenManager } from './classes.api-token-manager.js';
@@ -1,5 +0,0 @@
1
- // Export validation tools only
2
- export * from './validator.js';
3
- export { RouteConfigManager } from './classes.route-config-manager.js';
4
- export { ApiTokenManager } from './classes.api-token-manager.js';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb25maWcvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDIn0=
@@ -1,104 +0,0 @@
1
- /**
2
- * Validation result
3
- */
4
- export interface IValidationResult {
5
- /**
6
- * Whether the validation passed
7
- */
8
- valid: boolean;
9
- /**
10
- * Validation errors if any
11
- */
12
- errors?: string[];
13
- /**
14
- * Validated configuration (may include defaults)
15
- */
16
- config?: any;
17
- }
18
- /**
19
- * Validation schema types
20
- */
21
- export type ValidationSchema = Record<string, {
22
- /**
23
- * Type of the value
24
- */
25
- type: 'string' | 'number' | 'boolean' | 'object' | 'array';
26
- /**
27
- * Whether the field is required
28
- */
29
- required?: boolean;
30
- /**
31
- * Default value if not specified
32
- */
33
- default?: any;
34
- /**
35
- * Minimum value (for numbers)
36
- */
37
- min?: number;
38
- /**
39
- * Maximum value (for numbers)
40
- */
41
- max?: number;
42
- /**
43
- * Minimum length (for strings or arrays)
44
- */
45
- minLength?: number;
46
- /**
47
- * Maximum length (for strings or arrays)
48
- */
49
- maxLength?: number;
50
- /**
51
- * Pattern to match (for strings)
52
- */
53
- pattern?: RegExp;
54
- /**
55
- * Allowed values (for strings, numbers)
56
- */
57
- enum?: any[];
58
- /**
59
- * Nested schema (for objects)
60
- */
61
- schema?: ValidationSchema;
62
- /**
63
- * Item schema (for arrays)
64
- */
65
- items?: {
66
- type: 'string' | 'number' | 'boolean' | 'object';
67
- schema?: ValidationSchema;
68
- };
69
- /**
70
- * Custom validation function
71
- */
72
- validate?: (value: any) => boolean | string;
73
- }>;
74
- /**
75
- * Configuration validator
76
- * Validates configuration objects against schemas and provides default values
77
- */
78
- export declare class ConfigValidator {
79
- /**
80
- * Validate a configuration object against a schema
81
- *
82
- * @param config Configuration object to validate
83
- * @param schema Validation schema
84
- * @returns Validation result
85
- */
86
- static validate<T>(config: T, schema: ValidationSchema): IValidationResult;
87
- /**
88
- * Apply defaults to a configuration object based on a schema
89
- *
90
- * @param config Configuration object to apply defaults to
91
- * @param schema Validation schema with defaults
92
- * @returns Configuration with defaults applied
93
- */
94
- static applyDefaults<T>(config: T, schema: ValidationSchema): T;
95
- /**
96
- * Throw a validation error if the configuration is invalid
97
- *
98
- * @param config Configuration to validate
99
- * @param schema Validation schema
100
- * @returns Validated configuration with defaults
101
- * @throws ValidationError if validation fails
102
- */
103
- static validateOrThrow<T>(config: T, schema: ValidationSchema): T;
104
- }
@@ -1,152 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { ValidationError } from '../errors/base.errors.js';
3
- /**
4
- * Configuration validator
5
- * Validates configuration objects against schemas and provides default values
6
- */
7
- export class ConfigValidator {
8
- /**
9
- * Validate a configuration object against a schema
10
- *
11
- * @param config Configuration object to validate
12
- * @param schema Validation schema
13
- * @returns Validation result
14
- */
15
- static validate(config, schema) {
16
- const errors = [];
17
- const validatedConfig = { ...config };
18
- // Validate each field against the schema
19
- for (const [key, rules] of Object.entries(schema)) {
20
- const value = config[key];
21
- // Check if required
22
- if (rules.required && (value === undefined || value === null)) {
23
- errors.push(`${key} is required`);
24
- continue;
25
- }
26
- // If not present and not required, apply default if available
27
- if ((value === undefined || value === null)) {
28
- if (rules.default !== undefined) {
29
- validatedConfig[key] = rules.default;
30
- }
31
- continue;
32
- }
33
- // Type validation
34
- if (value !== undefined && value !== null) {
35
- const valueType = Array.isArray(value) ? 'array' : typeof value;
36
- if (valueType !== rules.type) {
37
- errors.push(`${key} must be of type ${rules.type}, got ${valueType}`);
38
- continue;
39
- }
40
- // Type-specific validations
41
- switch (rules.type) {
42
- case 'number':
43
- if (rules.min !== undefined && value < rules.min) {
44
- errors.push(`${key} must be at least ${rules.min}`);
45
- }
46
- if (rules.max !== undefined && value > rules.max) {
47
- errors.push(`${key} must be at most ${rules.max}`);
48
- }
49
- break;
50
- case 'string':
51
- if (rules.minLength !== undefined && value.length < rules.minLength) {
52
- errors.push(`${key} must be at least ${rules.minLength} characters`);
53
- }
54
- if (rules.maxLength !== undefined && value.length > rules.maxLength) {
55
- errors.push(`${key} must be at most ${rules.maxLength} characters`);
56
- }
57
- if (rules.pattern && !rules.pattern.test(value)) {
58
- errors.push(`${key} must match pattern ${rules.pattern}`);
59
- }
60
- break;
61
- case 'array':
62
- if (rules.minLength !== undefined && value.length < rules.minLength) {
63
- errors.push(`${key} must have at least ${rules.minLength} items`);
64
- }
65
- if (rules.maxLength !== undefined && value.length > rules.maxLength) {
66
- errors.push(`${key} must have at most ${rules.maxLength} items`);
67
- }
68
- if (rules.items && value.length > 0) {
69
- for (let i = 0; i < value.length; i++) {
70
- const itemType = Array.isArray(value[i]) ? 'array' : typeof value[i];
71
- if (itemType !== rules.items.type) {
72
- errors.push(`${key}[${i}] must be of type ${rules.items.type}, got ${itemType}`);
73
- }
74
- else if (rules.items.schema && itemType === 'object') {
75
- const itemResult = this.validate(value[i], rules.items.schema);
76
- if (!itemResult.valid) {
77
- errors.push(...itemResult.errors.map(err => `${key}[${i}].${err}`));
78
- }
79
- }
80
- }
81
- }
82
- break;
83
- case 'object':
84
- if (rules.schema) {
85
- const nestedResult = this.validate(value, rules.schema);
86
- if (!nestedResult.valid) {
87
- errors.push(...nestedResult.errors.map(err => `${key}.${err}`));
88
- }
89
- validatedConfig[key] = nestedResult.config;
90
- }
91
- break;
92
- }
93
- // Enum validation
94
- if (rules.enum && !rules.enum.includes(value)) {
95
- errors.push(`${key} must be one of [${rules.enum.join(', ')}]`);
96
- }
97
- // Custom validation
98
- if (rules.validate) {
99
- const result = rules.validate(value);
100
- if (result !== true) {
101
- errors.push(typeof result === 'string' ? result : `${key} failed custom validation`);
102
- }
103
- }
104
- }
105
- }
106
- return {
107
- valid: errors.length === 0,
108
- errors: errors.length > 0 ? errors : undefined,
109
- config: validatedConfig
110
- };
111
- }
112
- /**
113
- * Apply defaults to a configuration object based on a schema
114
- *
115
- * @param config Configuration object to apply defaults to
116
- * @param schema Validation schema with defaults
117
- * @returns Configuration with defaults applied
118
- */
119
- static applyDefaults(config, schema) {
120
- const result = { ...config };
121
- for (const [key, rules] of Object.entries(schema)) {
122
- if (result[key] === undefined && rules.default !== undefined) {
123
- result[key] = rules.default;
124
- }
125
- // Apply defaults to nested objects
126
- if (result[key] && rules.type === 'object' && rules.schema) {
127
- result[key] = this.applyDefaults(result[key], rules.schema);
128
- }
129
- // Apply defaults to array items
130
- if (result[key] && rules.type === 'array' && rules.items && rules.items.schema) {
131
- result[key] = result[key].map(item => typeof item === 'object' ? this.applyDefaults(item, rules.items.schema) : item);
132
- }
133
- }
134
- return result;
135
- }
136
- /**
137
- * Throw a validation error if the configuration is invalid
138
- *
139
- * @param config Configuration to validate
140
- * @param schema Validation schema
141
- * @returns Validated configuration with defaults
142
- * @throws ValidationError if validation fails
143
- */
144
- static validateOrThrow(config, schema) {
145
- const result = this.validate(config, schema);
146
- if (!result.valid) {
147
- throw new ValidationError(`Configuration validation failed: ${result.errors.join(', ')}`, 'CONFIG_VALIDATION_ERROR', { data: { errors: result.errors } });
148
- }
149
- return result.config;
150
- }
151
- }
152
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY29uZmlnL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUEwRjNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBRTFCOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUksTUFBUyxFQUFFLE1BQXdCO1FBQzNELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixNQUFNLGVBQWUsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFFdEMseUNBQXlDO1FBQ3pDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRTFCLG9CQUFvQjtZQUNwQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxjQUFjLENBQUMsQ0FBQztnQkFDbEMsU0FBUztZQUNYLENBQUM7WUFFRCw4REFBOEQ7WUFDOUQsSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzVDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDaEMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsU0FBUztZQUNYLENBQUM7WUFFRCxr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
@@ -1,224 +0,0 @@
1
- import { ErrorSeverity, ErrorCategory, ErrorRecoverability } from './error.codes.js';
2
- /**
3
- * Context information added to structured errors
4
- */
5
- export interface IErrorContext {
6
- /** Component or service where the error occurred */
7
- component?: string;
8
- /** Operation that was being performed */
9
- operation?: string;
10
- /** Unique request ID if available */
11
- requestId?: string;
12
- /** Error occurred at timestamp */
13
- timestamp?: number;
14
- /** User-visible message (safe to display to end-users) */
15
- userMessage?: string;
16
- /** Additional structured data for debugging */
17
- data?: Record<string, any>;
18
- /** Related entity IDs if applicable */
19
- entity?: {
20
- type: string;
21
- id: string | number;
22
- };
23
- /** Stack trace (if enabled in configuration) */
24
- stack?: string;
25
- /** Retry information if applicable */
26
- retry?: {
27
- /** Maximum number of retries allowed */
28
- maxRetries?: number;
29
- /** Current retry count */
30
- currentRetry?: number;
31
- /** Next retry timestamp */
32
- nextRetryAt?: number;
33
- /** Delay between retries (in ms) */
34
- retryDelay?: number;
35
- };
36
- }
37
- /**
38
- * Base class for all errors in the Platform Service
39
- * Adds structured error information, logging, and error tracking
40
- */
41
- export declare class PlatformError extends Error {
42
- /** Error code identifying the specific error type */
43
- readonly code: string;
44
- /** Error severity level */
45
- readonly severity: ErrorSeverity;
46
- /** Error category for grouping related errors */
47
- readonly category: ErrorCategory;
48
- /** Whether the error can be recovered from automatically */
49
- readonly recoverability: ErrorRecoverability;
50
- /** Additional context information */
51
- readonly context: IErrorContext;
52
- /**
53
- * Creates a new PlatformError
54
- *
55
- * @param message Error message
56
- * @param code Error code from error.codes.ts
57
- * @param severity Error severity level
58
- * @param category Error category
59
- * @param recoverability Error recoverability indication
60
- * @param context Additional context information
61
- */
62
- constructor(message: string, code: string, severity?: ErrorSeverity, category?: ErrorCategory, recoverability?: ErrorRecoverability, context?: IErrorContext);
63
- /**
64
- * Logs the error using the platform logger
65
- */
66
- private logError;
67
- /**
68
- * Maps severity levels to log levels
69
- */
70
- private getLogLevelFromSeverity;
71
- /**
72
- * Returns a JSON representation of the error
73
- */
74
- toJSON(): Record<string, any>;
75
- /**
76
- * Creates an instance with retry information
77
- *
78
- * @param maxRetries Maximum number of retries
79
- * @param currentRetry Current retry count
80
- * @param retryDelay Delay between retries in ms
81
- */
82
- withRetry(maxRetries: number, currentRetry?: number, retryDelay?: number): PlatformError;
83
- /**
84
- * Protected method to create a new instance with updated context
85
- * Subclasses can override this to handle their own constructor signatures
86
- */
87
- protected createWithContext(context: IErrorContext): PlatformError;
88
- /**
89
- * Checks if the error should be retried based on retry information
90
- */
91
- shouldRetry(): boolean;
92
- /**
93
- * Returns a user-friendly message that is safe to display to end users
94
- */
95
- getUserMessage(): string;
96
- }
97
- /**
98
- * Error class for validation errors
99
- */
100
- export declare class ValidationError extends PlatformError {
101
- /**
102
- * Creates a new validation error
103
- *
104
- * @param message Error message
105
- * @param code Error code
106
- * @param context Additional context
107
- */
108
- constructor(message: string, code: string, context?: IErrorContext);
109
- /**
110
- * Creates a new instance with updated context
111
- * Overrides the base implementation to handle ValidationError's constructor signature
112
- */
113
- protected createWithContext(context: IErrorContext): PlatformError;
114
- }
115
- /**
116
- * Error class for configuration errors
117
- */
118
- export declare class ConfigurationError extends PlatformError {
119
- /**
120
- * Creates a new configuration error
121
- *
122
- * @param message Error message
123
- * @param code Error code
124
- * @param context Additional context
125
- */
126
- constructor(message: string, code: string, context?: IErrorContext);
127
- /**
128
- * Creates a new instance with updated context
129
- * Overrides the base implementation to handle ConfigurationError's constructor signature
130
- */
131
- protected createWithContext(context: IErrorContext): PlatformError;
132
- }
133
- /**
134
- * Error class for network-related errors
135
- */
136
- export declare class NetworkError extends PlatformError {
137
- /**
138
- * Creates a new network error
139
- *
140
- * @param message Error message
141
- * @param code Error code
142
- * @param context Additional context
143
- */
144
- constructor(message: string, code: string, context?: IErrorContext);
145
- /**
146
- * Creates a new instance with updated context
147
- * Overrides the base implementation to handle NetworkError's constructor signature
148
- */
149
- protected createWithContext(context: IErrorContext): PlatformError;
150
- }
151
- /**
152
- * Error class for resource availability errors (rate limits, quotas)
153
- */
154
- export declare class ResourceError extends PlatformError {
155
- /**
156
- * Creates a new resource error
157
- *
158
- * @param message Error message
159
- * @param code Error code
160
- * @param context Additional context
161
- */
162
- constructor(message: string, code: string, context?: IErrorContext);
163
- /**
164
- * Creates a new instance with updated context
165
- * Overrides the base implementation to handle ResourceError's constructor signature
166
- */
167
- protected createWithContext(context: IErrorContext): PlatformError;
168
- }
169
- /**
170
- * Error class for authentication/authorization errors
171
- */
172
- export declare class AuthenticationError extends PlatformError {
173
- /**
174
- * Creates a new authentication error
175
- *
176
- * @param message Error message
177
- * @param code Error code
178
- * @param context Additional context
179
- */
180
- constructor(message: string, code: string, context?: IErrorContext);
181
- /**
182
- * Creates a new instance with updated context
183
- * Overrides the base implementation to handle AuthenticationError's constructor signature
184
- */
185
- protected createWithContext(context: IErrorContext): PlatformError;
186
- }
187
- /**
188
- * Error class for operation errors (API calls, processing)
189
- */
190
- export declare class OperationError extends PlatformError {
191
- /**
192
- * Creates a new operation error
193
- *
194
- * @param message Error message
195
- * @param code Error code
196
- * @param context Additional context
197
- */
198
- constructor(message: string, code: string, context?: IErrorContext);
199
- /**
200
- * Creates a new instance with updated context
201
- * Overrides the base implementation to handle OperationError's constructor signature
202
- */
203
- protected createWithContext(context: IErrorContext): PlatformError;
204
- }
205
- /**
206
- * Error class for critical system errors
207
- */
208
- export declare class SystemError extends PlatformError {
209
- /**
210
- * Creates a new system error
211
- *
212
- * @param message Error message
213
- * @param code Error code
214
- * @param context Additional context
215
- */
216
- constructor(message: string, code: string, context?: IErrorContext);
217
- }
218
- /**
219
- * Helper to get the appropriate error class based on error category
220
- *
221
- * @param category Error category
222
- * @returns The appropriate error class
223
- */
224
- export declare function getErrorClassForCategory(category: ErrorCategory): any;