@serve.zone/dcrouter 8.0.0 → 9.1.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.
- package/dist_serve/bundle.js +2420 -1227
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +9 -0
- package/dist_ts/classes.dcrouter.js +27 -1
- package/dist_ts/config/classes.api-token-manager.d.ts +38 -0
- package/dist_ts/config/classes.api-token-manager.js +134 -0
- package/dist_ts/config/classes.route-config-manager.d.ts +35 -0
- package/dist_ts/config/classes.route-config-manager.js +231 -0
- package/dist_ts/config/index.d.ts +2 -0
- package/dist_ts/config/index.js +3 -1
- package/dist_ts/opsserver/classes.opsserver.d.ts +2 -0
- package/dist_ts/opsserver/classes.opsserver.js +5 -1
- package/dist_ts/opsserver/handlers/{config.handler.d.ts → api-token.handler.d.ts} +5 -2
- package/dist_ts/opsserver/handlers/api-token.handler.js +66 -0
- package/dist_ts/opsserver/handlers/index.d.ts +2 -0
- package/dist_ts/opsserver/handlers/index.js +3 -1
- package/dist_ts/opsserver/handlers/route-management.handler.d.ts +13 -0
- package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
- package/dist_ts_interfaces/data/index.d.ts +1 -0
- package/dist_ts_interfaces/data/index.js +2 -1
- package/dist_ts_interfaces/data/route-management.d.ts +68 -0
- package/dist_ts_interfaces/data/route-management.js +2 -0
- package/dist_ts_interfaces/requests/api-tokens.d.ts +63 -0
- package/dist_ts_interfaces/requests/api-tokens.js +2 -0
- package/dist_ts_interfaces/requests/config.d.ts +77 -1
- package/dist_ts_interfaces/requests/index.d.ts +2 -0
- package/dist_ts_interfaces/requests/index.js +3 -1
- package/dist_ts_interfaces/requests/route-management.d.ts +114 -0
- package/dist_ts_interfaces/requests/route-management.js +2 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +37 -1
- package/dist_ts_web/appstate.js +220 -2
- package/dist_ts_web/elements/index.d.ts +2 -0
- package/dist_ts_web/elements/index.js +3 -1
- package/dist_ts_web/elements/ops-dashboard.js +23 -3
- package/dist_ts_web/elements/ops-view-apitokens.d.ts +12 -0
- package/dist_ts_web/elements/ops-view-apitokens.js +310 -0
- package/dist_ts_web/elements/ops-view-config.d.ts +10 -8
- package/dist_ts_web/elements/ops-view-config.js +215 -297
- package/dist_ts_web/elements/ops-view-routes.d.ts +12 -0
- package/dist_ts_web/elements/ops-view-routes.js +404 -0
- package/dist_ts_web/router.d.ts +1 -1
- package/dist_ts_web/router.js +2 -2
- package/package.json +2 -2
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +37 -1
- package/ts/config/classes.api-token-manager.ts +155 -0
- package/ts/config/classes.route-config-manager.ts +271 -0
- package/ts/config/index.ts +3 -1
- package/ts/opsserver/classes.opsserver.ts +4 -0
- package/ts/opsserver/handlers/api-token.handler.ts +96 -0
- package/ts/opsserver/handlers/config.handler.ts +154 -72
- package/ts/opsserver/handlers/index.ts +3 -1
- package/ts/opsserver/handlers/route-management.handler.ts +163 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +309 -2
- package/ts_web/elements/index.ts +2 -0
- package/ts_web/elements/ops-dashboard.ts +22 -2
- package/ts_web/elements/ops-view-apitokens.ts +285 -0
- package/ts_web/elements/ops-view-config.ts +237 -299
- package/ts_web/elements/ops-view-routes.ts +389 -0
- package/ts_web/router.ts +1 -1
- package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
- package/dist_ts/cache/classes.cache.cleaner.js +0 -130
- package/dist_ts/cache/classes.cached.document.d.ts +0 -76
- package/dist_ts/cache/classes.cached.document.js +0 -100
- package/dist_ts/cache/classes.cachedb.d.ts +0 -60
- package/dist_ts/cache/classes.cachedb.js +0 -126
- package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
- package/dist_ts/cache/documents/classes.cached.email.js +0 -337
- package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
- package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
- package/dist_ts/cache/documents/index.d.ts +0 -2
- package/dist_ts/cache/documents/index.js +0 -3
- package/dist_ts/cache/index.d.ts +0 -4
- package/dist_ts/cache/index.js +0 -7
- package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
- package/dist_ts/monitoring/classes.metricscache.js +0 -63
- package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
- package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
- package/dist_ts/opsserver/handlers/config.handler.js +0 -67
- package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -17
- package/dist_ts/opsserver/handlers/logs.handler.js +0 -215
- package/dist_ts/security/classes.securitylogger.js +0 -235
- package/dist_ts/storage/classes.storagemanager.d.ts +0 -82
- package/dist_ts/storage/classes.storagemanager.js +0 -344
- package/dist_ts/storage/index.d.ts +0 -1
- package/dist_ts/storage/index.js +0 -3
|
@@ -0,0 +1,231 @@
|
|
|
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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
|
package/dist_ts/config/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
// Export validation tools only
|
|
2
2
|
export * from './validator.js';
|
|
3
|
-
|
|
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=
|
|
@@ -14,6 +14,8 @@ export declare class OpsServer {
|
|
|
14
14
|
private emailOpsHandler;
|
|
15
15
|
private certificateHandler;
|
|
16
16
|
private remoteIngressHandler;
|
|
17
|
+
private routeManagementHandler;
|
|
18
|
+
private apiTokenHandler;
|
|
17
19
|
constructor(dcRouterRefArg: DcRouter);
|
|
18
20
|
start(): Promise<void>;
|
|
19
21
|
/**
|
|
@@ -16,6 +16,8 @@ export class OpsServer {
|
|
|
16
16
|
emailOpsHandler;
|
|
17
17
|
certificateHandler;
|
|
18
18
|
remoteIngressHandler;
|
|
19
|
+
routeManagementHandler;
|
|
20
|
+
apiTokenHandler;
|
|
19
21
|
constructor(dcRouterRefArg) {
|
|
20
22
|
this.dcRouterRef = dcRouterRefArg;
|
|
21
23
|
// Add our typedrouter to the dcRouter's main typedrouter
|
|
@@ -49,6 +51,8 @@ export class OpsServer {
|
|
|
49
51
|
this.emailOpsHandler = new handlers.EmailOpsHandler(this);
|
|
50
52
|
this.certificateHandler = new handlers.CertificateHandler(this);
|
|
51
53
|
this.remoteIngressHandler = new handlers.RemoteIngressHandler(this);
|
|
54
|
+
this.routeManagementHandler = new handlers.RouteManagementHandler(this);
|
|
55
|
+
this.apiTokenHandler = new handlers.ApiTokenHandler(this);
|
|
52
56
|
console.log('✅ OpsServer TypedRequest handlers initialized');
|
|
53
57
|
}
|
|
54
58
|
async stop() {
|
|
@@ -57,4 +61,4 @@ export class OpsServer {
|
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
63
|
}
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5vcHNzZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9vcHNzZXJ2ZXIvY2xhc3Nlcy5vcHNzZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDckMsT0FBTyxLQUFLLFFBQVEsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxNQUFNLE9BQU8sU0FBUztJQUNiLFdBQVcsQ0FBVztJQUN0QixNQUFNLENBQTBEO0lBRXZFLDhDQUE4QztJQUN2QyxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTVELG9CQUFvQjtJQUNiLFlBQVksQ0FBd0I7SUFDbkMsYUFBYSxDQUF5QjtJQUN0QyxXQUFXLENBQXVCO0lBQ2xDLGVBQWUsQ0FBMkI7SUFDMUMsWUFBWSxDQUF3QjtJQUNwQyxhQUFhLENBQXlCO0lBQ3RDLGVBQWUsQ0FBMkI7SUFDMUMsa0JBQWtCLENBQThCO0lBQ2hELG9CQUFvQixDQUFnQztJQUNwRCxzQkFBc0IsQ0FBa0M7SUFDeEQsZUFBZSxDQUEyQjtJQUVsRCxZQUFZLGNBQXdCO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO1FBRWxDLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSztRQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUM7WUFDeEUsTUFBTSxFQUFFLFdBQVc7WUFDbkIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTO1NBQzFCLENBQUMsQ0FBQztRQUVILHlEQUF5RDtRQUN6RCxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFckUsa0JBQWtCO1FBQ2xCLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTNCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLGFBQWE7UUFDekIscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztRQUV2RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksUUFBUSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxRCxPQUFPLENBQUMsR0FBRyxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
2
|
import type { OpsServer } from '../classes.opsserver.js';
|
|
3
|
-
export declare class
|
|
3
|
+
export declare class ApiTokenHandler {
|
|
4
4
|
private opsServerRef;
|
|
5
5
|
typedrouter: plugins.typedrequest.TypedRouter;
|
|
6
6
|
constructor(opsServerRef: OpsServer);
|
|
7
|
+
/**
|
|
8
|
+
* Token management requires admin JWT only (tokens cannot manage tokens).
|
|
9
|
+
*/
|
|
10
|
+
private requireAdmin;
|
|
7
11
|
private registerHandlers;
|
|
8
|
-
private getConfiguration;
|
|
9
12
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
3
|
+
export class ApiTokenHandler {
|
|
4
|
+
opsServerRef;
|
|
5
|
+
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
6
|
+
constructor(opsServerRef) {
|
|
7
|
+
this.opsServerRef = opsServerRef;
|
|
8
|
+
this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
|
|
9
|
+
this.registerHandlers();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Token management requires admin JWT only (tokens cannot manage tokens).
|
|
13
|
+
*/
|
|
14
|
+
async requireAdmin(identity) {
|
|
15
|
+
if (!identity?.jwt) {
|
|
16
|
+
throw new plugins.typedrequest.TypedResponseError('unauthorized');
|
|
17
|
+
}
|
|
18
|
+
const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({ identity });
|
|
19
|
+
if (!isAdmin) {
|
|
20
|
+
throw new plugins.typedrequest.TypedResponseError('admin access required');
|
|
21
|
+
}
|
|
22
|
+
return identity.userId;
|
|
23
|
+
}
|
|
24
|
+
registerHandlers() {
|
|
25
|
+
// Create API token
|
|
26
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createApiToken', async (dataArg) => {
|
|
27
|
+
const userId = await this.requireAdmin(dataArg.identity);
|
|
28
|
+
const manager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
29
|
+
if (!manager) {
|
|
30
|
+
return { success: false, message: 'Token management not initialized' };
|
|
31
|
+
}
|
|
32
|
+
const result = await manager.createToken(dataArg.name, dataArg.scopes, dataArg.expiresInDays ?? null, userId);
|
|
33
|
+
return { success: true, tokenId: result.id, tokenValue: result.rawToken };
|
|
34
|
+
}));
|
|
35
|
+
// List API tokens
|
|
36
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('listApiTokens', async (dataArg) => {
|
|
37
|
+
await this.requireAdmin(dataArg.identity);
|
|
38
|
+
const manager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
39
|
+
if (!manager) {
|
|
40
|
+
return { tokens: [] };
|
|
41
|
+
}
|
|
42
|
+
return { tokens: manager.listTokens() };
|
|
43
|
+
}));
|
|
44
|
+
// Revoke API token
|
|
45
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('revokeApiToken', async (dataArg) => {
|
|
46
|
+
await this.requireAdmin(dataArg.identity);
|
|
47
|
+
const manager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
48
|
+
if (!manager) {
|
|
49
|
+
return { success: false, message: 'Token management not initialized' };
|
|
50
|
+
}
|
|
51
|
+
const ok = await manager.revokeToken(dataArg.id);
|
|
52
|
+
return { success: ok, message: ok ? undefined : 'Token not found' };
|
|
53
|
+
}));
|
|
54
|
+
// Toggle API token
|
|
55
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('toggleApiToken', async (dataArg) => {
|
|
56
|
+
await this.requireAdmin(dataArg.identity);
|
|
57
|
+
const manager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
58
|
+
if (!manager) {
|
|
59
|
+
return { success: false, message: 'Token management not initialized' };
|
|
60
|
+
}
|
|
61
|
+
const ok = await manager.toggleToken(dataArg.id, dataArg.enabled);
|
|
62
|
+
return { success: ok, message: ok ? undefined : 'Token not found' };
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXRva2VuLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvYXBpLXRva2VuLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUU1QyxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBRTlELE1BQU0sT0FBTyxlQUFlO0lBR047SUFGYixXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTVELFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFvQztRQUM3RCxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3RSxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsbUJBQW1CO1FB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
|
|
@@ -7,4 +7,6 @@ export * from './radius.handler.js';
|
|
|
7
7
|
export * from './email-ops.handler.js';
|
|
8
8
|
export * from './certificate.handler.js';
|
|
9
9
|
export * from './remoteingress.handler.js';
|
|
10
|
-
|
|
10
|
+
export * from './route-management.handler.js';
|
|
11
|
+
export * from './api-token.handler.js';
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaGFuZGxlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHdCQUF3QixDQUFDIn0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import type { OpsServer } from '../classes.opsserver.js';
|
|
3
|
+
export declare class RouteManagementHandler {
|
|
4
|
+
private opsServerRef;
|
|
5
|
+
typedrouter: plugins.typedrequest.TypedRouter;
|
|
6
|
+
constructor(opsServerRef: OpsServer);
|
|
7
|
+
/**
|
|
8
|
+
* Validate auth: JWT identity OR API token with required scope.
|
|
9
|
+
* Returns a userId string on success, throws on failure.
|
|
10
|
+
*/
|
|
11
|
+
private requireAuth;
|
|
12
|
+
private registerHandlers;
|
|
13
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
3
|
+
export class RouteManagementHandler {
|
|
4
|
+
opsServerRef;
|
|
5
|
+
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
6
|
+
constructor(opsServerRef) {
|
|
7
|
+
this.opsServerRef = opsServerRef;
|
|
8
|
+
this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
|
|
9
|
+
this.registerHandlers();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate auth: JWT identity OR API token with required scope.
|
|
13
|
+
* Returns a userId string on success, throws on failure.
|
|
14
|
+
*/
|
|
15
|
+
async requireAuth(request, requiredScope) {
|
|
16
|
+
// Try JWT identity first
|
|
17
|
+
if (request.identity?.jwt) {
|
|
18
|
+
try {
|
|
19
|
+
const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({
|
|
20
|
+
identity: request.identity,
|
|
21
|
+
});
|
|
22
|
+
if (isAdmin)
|
|
23
|
+
return request.identity.userId;
|
|
24
|
+
}
|
|
25
|
+
catch { /* fall through */ }
|
|
26
|
+
}
|
|
27
|
+
// Try API token
|
|
28
|
+
if (request.apiToken) {
|
|
29
|
+
const tokenManager = this.opsServerRef.dcRouterRef.apiTokenManager;
|
|
30
|
+
if (tokenManager) {
|
|
31
|
+
const token = await tokenManager.validateToken(request.apiToken);
|
|
32
|
+
if (token) {
|
|
33
|
+
if (!requiredScope || tokenManager.hasScope(token, requiredScope)) {
|
|
34
|
+
return token.createdBy;
|
|
35
|
+
}
|
|
36
|
+
throw new plugins.typedrequest.TypedResponseError('insufficient scope');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
throw new plugins.typedrequest.TypedResponseError('unauthorized');
|
|
41
|
+
}
|
|
42
|
+
registerHandlers() {
|
|
43
|
+
// Get merged routes
|
|
44
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getMergedRoutes', async (dataArg) => {
|
|
45
|
+
await this.requireAuth(dataArg, 'routes:read');
|
|
46
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
47
|
+
if (!manager) {
|
|
48
|
+
return { routes: [], warnings: [] };
|
|
49
|
+
}
|
|
50
|
+
return manager.getMergedRoutes();
|
|
51
|
+
}));
|
|
52
|
+
// Create route
|
|
53
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createRoute', async (dataArg) => {
|
|
54
|
+
const userId = await this.requireAuth(dataArg, 'routes:write');
|
|
55
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
56
|
+
if (!manager) {
|
|
57
|
+
return { success: false, message: 'Route management not initialized' };
|
|
58
|
+
}
|
|
59
|
+
const id = await manager.createRoute(dataArg.route, userId, dataArg.enabled ?? true);
|
|
60
|
+
return { success: true, storedRouteId: id };
|
|
61
|
+
}));
|
|
62
|
+
// Update route
|
|
63
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateRoute', async (dataArg) => {
|
|
64
|
+
await this.requireAuth(dataArg, 'routes:write');
|
|
65
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
66
|
+
if (!manager) {
|
|
67
|
+
return { success: false, message: 'Route management not initialized' };
|
|
68
|
+
}
|
|
69
|
+
const ok = await manager.updateRoute(dataArg.id, {
|
|
70
|
+
route: dataArg.route,
|
|
71
|
+
enabled: dataArg.enabled,
|
|
72
|
+
});
|
|
73
|
+
return { success: ok, message: ok ? undefined : 'Route not found' };
|
|
74
|
+
}));
|
|
75
|
+
// Delete route
|
|
76
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteRoute', async (dataArg) => {
|
|
77
|
+
await this.requireAuth(dataArg, 'routes:write');
|
|
78
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
79
|
+
if (!manager) {
|
|
80
|
+
return { success: false, message: 'Route management not initialized' };
|
|
81
|
+
}
|
|
82
|
+
const ok = await manager.deleteRoute(dataArg.id);
|
|
83
|
+
return { success: ok, message: ok ? undefined : 'Route not found' };
|
|
84
|
+
}));
|
|
85
|
+
// Set override on a hardcoded route
|
|
86
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('setRouteOverride', async (dataArg) => {
|
|
87
|
+
const userId = await this.requireAuth(dataArg, 'routes:write');
|
|
88
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
89
|
+
if (!manager) {
|
|
90
|
+
return { success: false, message: 'Route management not initialized' };
|
|
91
|
+
}
|
|
92
|
+
await manager.setOverride(dataArg.routeName, dataArg.enabled, userId);
|
|
93
|
+
return { success: true };
|
|
94
|
+
}));
|
|
95
|
+
// Remove override from a hardcoded route
|
|
96
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('removeRouteOverride', async (dataArg) => {
|
|
97
|
+
await this.requireAuth(dataArg, 'routes:write');
|
|
98
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
99
|
+
if (!manager) {
|
|
100
|
+
return { success: false, message: 'Route management not initialized' };
|
|
101
|
+
}
|
|
102
|
+
const ok = await manager.removeOverride(dataArg.routeName);
|
|
103
|
+
return { success: ok, message: ok ? undefined : 'Override not found' };
|
|
104
|
+
}));
|
|
105
|
+
// Toggle programmatic route
|
|
106
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('toggleRoute', async (dataArg) => {
|
|
107
|
+
await this.requireAuth(dataArg, 'routes:write');
|
|
108
|
+
const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
|
|
109
|
+
if (!manager) {
|
|
110
|
+
return { success: false, message: 'Route management not initialized' };
|
|
111
|
+
}
|
|
112
|
+
const ok = await manager.toggleRoute(dataArg.id, dataArg.enabled);
|
|
113
|
+
return { success: ok, message: ok ? undefined : 'Route not found' };
|
|
114
|
+
}));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL3JvdXRlLW1hbmFnZW1lbnQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsTUFBTSxPQUFPLHNCQUFzQjtJQUdiO0lBRmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixPQUFvRSxFQUNwRSxhQUE4QztRQUU5Qyx5QkFBeUI7UUFDekIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDM0UsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2lCQUMzQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxPQUFPO29CQUFFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDOUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUs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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './auth.js';
|
|
2
2
|
export * from './stats.js';
|
|
3
3
|
export * from './remoteingress.js';
|
|
4
|
-
|
|
4
|
+
export * from './route-management.js';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDIn0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { IRouteConfig } from '@push.rocks/smartproxy';
|
|
2
|
+
export type TApiTokenScope = 'routes:read' | 'routes:write' | 'config:read' | 'tokens:read' | 'tokens:manage';
|
|
3
|
+
/**
|
|
4
|
+
* A merged route combining hardcoded and programmatic sources.
|
|
5
|
+
*/
|
|
6
|
+
export interface IMergedRoute {
|
|
7
|
+
route: IRouteConfig;
|
|
8
|
+
source: 'hardcoded' | 'programmatic';
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
overridden: boolean;
|
|
11
|
+
storedRouteId?: string;
|
|
12
|
+
createdAt?: number;
|
|
13
|
+
updatedAt?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A warning generated during route merge/startup.
|
|
17
|
+
*/
|
|
18
|
+
export interface IRouteWarning {
|
|
19
|
+
type: 'disabled-hardcoded' | 'disabled-programmatic' | 'orphaned-override';
|
|
20
|
+
routeName: string;
|
|
21
|
+
message: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Public info about an API token (never includes the hash).
|
|
25
|
+
*/
|
|
26
|
+
export interface IApiTokenInfo {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
scopes: TApiTokenScope[];
|
|
30
|
+
createdAt: number;
|
|
31
|
+
expiresAt: number | null;
|
|
32
|
+
lastUsedAt: number | null;
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A programmatic route stored in /config-api/routes/{id}.json
|
|
37
|
+
*/
|
|
38
|
+
export interface IStoredRoute {
|
|
39
|
+
id: string;
|
|
40
|
+
route: IRouteConfig;
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
createdAt: number;
|
|
43
|
+
updatedAt: number;
|
|
44
|
+
createdBy: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* An override for a hardcoded route, stored in /config-api/overrides/{routeName}.json
|
|
48
|
+
*/
|
|
49
|
+
export interface IRouteOverride {
|
|
50
|
+
routeName: string;
|
|
51
|
+
enabled: boolean;
|
|
52
|
+
updatedAt: number;
|
|
53
|
+
updatedBy: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A stored API token, stored in /config-api/tokens/{id}.json
|
|
57
|
+
*/
|
|
58
|
+
export interface IStoredApiToken {
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
tokenHash: string;
|
|
62
|
+
scopes: TApiTokenScope[];
|
|
63
|
+
createdAt: number;
|
|
64
|
+
expiresAt: number | null;
|
|
65
|
+
lastUsedAt: number | null;
|
|
66
|
+
createdBy: string;
|
|
67
|
+
enabled: boolean;
|
|
68
|
+
}
|