@serve.zone/dcrouter 6.2.4 → 6.4.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 +559 -452
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +26 -0
- package/dist_ts/classes.dcrouter.js +49 -5
- package/dist_ts/index.d.ts +1 -0
- package/dist_ts/index.js +3 -1
- package/dist_ts/opsserver/classes.opsserver.d.ts +1 -0
- package/dist_ts/opsserver/classes.opsserver.js +3 -1
- package/dist_ts/opsserver/handlers/index.d.ts +1 -0
- package/dist_ts/opsserver/handlers/index.js +2 -1
- package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +8 -0
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +107 -0
- package/dist_ts/paths.d.ts +19 -9
- package/dist_ts/paths.js +30 -28
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +56 -0
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +133 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +45 -0
- package/dist_ts/remoteingress/classes.tunnel-manager.js +107 -0
- package/dist_ts/remoteingress/index.d.ts +2 -0
- package/dist_ts/remoteingress/index.js +3 -0
- package/dist_ts/security/classes.contentscanner.js +1 -2
- package/dist_ts_interfaces/data/index.d.ts +1 -0
- package/dist_ts_interfaces/data/index.js +2 -1
- package/dist_ts_interfaces/data/remoteingress.d.ts +24 -0
- package/dist_ts_interfaces/data/remoteingress.js +2 -0
- package/dist_ts_interfaces/requests/index.d.ts +1 -0
- package/dist_ts_interfaces/requests/index.js +2 -1
- package/dist_ts_interfaces/requests/remoteingress.d.ts +89 -0
- package/dist_ts_interfaces/requests/remoteingress.js +3 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +19 -0
- package/dist_ts_web/appstate.js +124 -2
- package/dist_ts_web/elements/index.d.ts +1 -0
- package/dist_ts_web/elements/index.js +2 -1
- package/dist_ts_web/elements/ops-dashboard.js +6 -1
- package/dist_ts_web/elements/ops-view-remoteingress.d.ts +20 -0
- package/dist_ts_web/elements/ops-view-remoteingress.js +317 -0
- package/dist_ts_web/router.d.ts +1 -1
- package/dist_ts_web/router.js +2 -2
- package/package.json +2 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +79 -6
- package/ts/index.ts +3 -0
- package/ts/opsserver/classes.opsserver.ts +2 -0
- package/ts/opsserver/handlers/index.ts +2 -1
- package/ts/opsserver/handlers/remoteingress.handler.ts +163 -0
- package/ts/paths.ts +32 -31
- package/ts/plugins.ts +3 -1
- package/ts/remoteingress/classes.remoteingress-manager.ts +160 -0
- package/ts/remoteingress/classes.tunnel-manager.ts +126 -0
- package/ts/remoteingress/index.ts +2 -0
- package/ts/security/classes.contentscanner.ts +0 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +180 -1
- package/ts_web/elements/index.ts +1 -0
- package/ts_web/elements/ops-dashboard.ts +5 -0
- package/ts_web/elements/ops-view-remoteingress.ts +290 -0
- package/ts_web/router.ts +1 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import * as interfaces from '../../../dist_ts_interfaces/index.js';
|
|
3
|
+
export class RemoteIngressHandler {
|
|
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
|
+
registerHandlers() {
|
|
12
|
+
// Get all remote ingress edges
|
|
13
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getRemoteIngresses', async (dataArg, toolsArg) => {
|
|
14
|
+
const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
|
|
15
|
+
if (!manager) {
|
|
16
|
+
return { edges: [] };
|
|
17
|
+
}
|
|
18
|
+
// Return edges without secrets
|
|
19
|
+
const edges = manager.getAllEdges().map((e) => ({
|
|
20
|
+
...e,
|
|
21
|
+
secret: '********', // Never expose secrets via API
|
|
22
|
+
}));
|
|
23
|
+
return { edges };
|
|
24
|
+
}));
|
|
25
|
+
// Create a new remote ingress edge
|
|
26
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createRemoteIngress', async (dataArg, toolsArg) => {
|
|
27
|
+
const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
|
|
28
|
+
const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
|
|
29
|
+
if (!manager) {
|
|
30
|
+
return {
|
|
31
|
+
success: false,
|
|
32
|
+
edge: null,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const edge = await manager.createEdge(dataArg.name, dataArg.listenPorts, dataArg.tags);
|
|
36
|
+
// Sync allowed edges with the hub
|
|
37
|
+
if (tunnelManager) {
|
|
38
|
+
await tunnelManager.syncAllowedEdges();
|
|
39
|
+
}
|
|
40
|
+
return { success: true, edge };
|
|
41
|
+
}));
|
|
42
|
+
// Delete a remote ingress edge
|
|
43
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteRemoteIngress', async (dataArg, toolsArg) => {
|
|
44
|
+
const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
|
|
45
|
+
const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
|
|
46
|
+
if (!manager) {
|
|
47
|
+
return { success: false, message: 'RemoteIngress not configured' };
|
|
48
|
+
}
|
|
49
|
+
const deleted = await manager.deleteEdge(dataArg.id);
|
|
50
|
+
if (deleted && tunnelManager) {
|
|
51
|
+
await tunnelManager.syncAllowedEdges();
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
success: deleted,
|
|
55
|
+
message: deleted ? undefined : 'Edge not found',
|
|
56
|
+
};
|
|
57
|
+
}));
|
|
58
|
+
// Update a remote ingress edge
|
|
59
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateRemoteIngress', async (dataArg, toolsArg) => {
|
|
60
|
+
const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
|
|
61
|
+
const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
|
|
62
|
+
if (!manager) {
|
|
63
|
+
return { success: false, edge: null };
|
|
64
|
+
}
|
|
65
|
+
const edge = await manager.updateEdge(dataArg.id, {
|
|
66
|
+
name: dataArg.name,
|
|
67
|
+
listenPorts: dataArg.listenPorts,
|
|
68
|
+
enabled: dataArg.enabled,
|
|
69
|
+
tags: dataArg.tags,
|
|
70
|
+
});
|
|
71
|
+
if (!edge) {
|
|
72
|
+
return { success: false, edge: null };
|
|
73
|
+
}
|
|
74
|
+
// Sync allowed edges if enabled status changed
|
|
75
|
+
if (tunnelManager && dataArg.enabled !== undefined) {
|
|
76
|
+
await tunnelManager.syncAllowedEdges();
|
|
77
|
+
}
|
|
78
|
+
return { success: true, edge: { ...edge, secret: '********' } };
|
|
79
|
+
}));
|
|
80
|
+
// Regenerate secret for an edge
|
|
81
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('regenerateRemoteIngressSecret', async (dataArg, toolsArg) => {
|
|
82
|
+
const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
|
|
83
|
+
const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
|
|
84
|
+
if (!manager) {
|
|
85
|
+
return { success: false, secret: '' };
|
|
86
|
+
}
|
|
87
|
+
const secret = await manager.regenerateSecret(dataArg.id);
|
|
88
|
+
if (!secret) {
|
|
89
|
+
return { success: false, secret: '' };
|
|
90
|
+
}
|
|
91
|
+
// Sync allowed edges since secret changed
|
|
92
|
+
if (tunnelManager) {
|
|
93
|
+
await tunnelManager.syncAllowedEdges();
|
|
94
|
+
}
|
|
95
|
+
return { success: true, secret };
|
|
96
|
+
}));
|
|
97
|
+
// Get runtime status of all edges
|
|
98
|
+
this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getRemoteIngressStatus', async (dataArg, toolsArg) => {
|
|
99
|
+
const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
|
|
100
|
+
if (!tunnelManager) {
|
|
101
|
+
return { statuses: [] };
|
|
102
|
+
}
|
|
103
|
+
return { statuses: tunnelManager.getEdgeStatuses() };
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlaW5ncmVzcy5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL3JlbW90ZWluZ3Jlc3MuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsTUFBTSxPQUFPLG9CQUFvQjtJQUdYO0lBRmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUM5QixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNuQyxvQkFBb0IsRUFDcEIsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztZQUNuRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQ0QsK0JBQStCO1lBQy9CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzlDLEdBQUcsQ0FBQztnQkFDSixNQUFNLEVBQUUs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
|
package/dist_ts/paths.d.ts
CHANGED
|
@@ -1,16 +1,26 @@
|
|
|
1
|
-
export declare const baseDir: string;
|
|
2
1
|
export declare const packageDir: string;
|
|
3
2
|
export declare const distServe: string;
|
|
4
3
|
export declare const dcrouterHomeDir: string;
|
|
5
4
|
export declare const dataDir: string;
|
|
6
5
|
export declare const defaultTsmDbPath: string;
|
|
7
|
-
export declare const keysDir: string;
|
|
8
6
|
export declare const dnsRecordsDir: string;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export declare
|
|
15
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Resolve all data paths from a given baseDir.
|
|
9
|
+
* When no baseDir is provided, falls back to ~/.serve.zone/dcrouter.
|
|
10
|
+
* Specific overrides (e.g. DATA_DIR env) take precedence.
|
|
11
|
+
*/
|
|
12
|
+
export declare function resolvePaths(baseDir?: string): {
|
|
13
|
+
dcrouterHomeDir: string;
|
|
14
|
+
dataDir: string;
|
|
15
|
+
defaultTsmDbPath: string;
|
|
16
|
+
defaultStoragePath: string;
|
|
17
|
+
dnsRecordsDir: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Ensure only the data directories that are actually used exist.
|
|
21
|
+
*/
|
|
22
|
+
export declare function ensureDataDirectories(resolvedPaths: ReturnType<typeof resolvePaths>): void;
|
|
23
|
+
/**
|
|
24
|
+
* Legacy wrapper — delegates to ensureDataDirectories with module-level defaults.
|
|
25
|
+
*/
|
|
16
26
|
export declare function ensureDirectories(): void;
|
package/dist_ts/paths.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
-
//
|
|
3
|
-
export const baseDir = process.cwd();
|
|
2
|
+
// Code/asset paths (not affected by baseDir)
|
|
4
3
|
export const packageDir = plugins.path.join(plugins.smartpath.get.dirnameFromImportMetaUrl(import.meta.url), '../');
|
|
5
4
|
export const distServe = plugins.path.join(packageDir, './dist_serve');
|
|
6
5
|
// Default base for all dcrouter data (always user-writable)
|
|
@@ -12,32 +11,35 @@ export const dataDir = process.env.DATA_DIR
|
|
|
12
11
|
: DEFAULT_DATA_PATH;
|
|
13
12
|
// Default TsmDB path for CacheDb
|
|
14
13
|
export const defaultTsmDbPath = plugins.path.join(dcrouterHomeDir, 'tsmdb');
|
|
15
|
-
// MTA
|
|
16
|
-
export const keysDir = plugins.path.join(dataDir, 'keys');
|
|
14
|
+
// DNS records directory (only surviving MTA directory reference)
|
|
17
15
|
export const dnsRecordsDir = plugins.path.join(dataDir, 'dns');
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Resolve all data paths from a given baseDir.
|
|
18
|
+
* When no baseDir is provided, falls back to ~/.serve.zone/dcrouter.
|
|
19
|
+
* Specific overrides (e.g. DATA_DIR env) take precedence.
|
|
20
|
+
*/
|
|
21
|
+
export function resolvePaths(baseDir) {
|
|
22
|
+
const root = baseDir ?? plugins.path.join(plugins.os.homedir(), '.serve.zone', 'dcrouter');
|
|
23
|
+
const resolvedDataDir = process.env.DATA_DIR ?? plugins.path.join(root, 'data');
|
|
24
|
+
return {
|
|
25
|
+
dcrouterHomeDir: root,
|
|
26
|
+
dataDir: resolvedDataDir,
|
|
27
|
+
defaultTsmDbPath: plugins.path.join(root, 'tsmdb'),
|
|
28
|
+
defaultStoragePath: plugins.path.join(root, 'storage'),
|
|
29
|
+
dnsRecordsDir: plugins.path.join(resolvedDataDir, 'dns'),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Ensure only the data directories that are actually used exist.
|
|
34
|
+
*/
|
|
35
|
+
export function ensureDataDirectories(resolvedPaths) {
|
|
36
|
+
plugins.fsUtils.ensureDirSync(resolvedPaths.dataDir);
|
|
37
|
+
plugins.fsUtils.ensureDirSync(resolvedPaths.dnsRecordsDir);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Legacy wrapper — delegates to ensureDataDirectories with module-level defaults.
|
|
41
|
+
*/
|
|
30
42
|
export function ensureDirectories() {
|
|
31
|
-
|
|
32
|
-
plugins.fsUtils.ensureDirSync(dataDir);
|
|
33
|
-
plugins.fsUtils.ensureDirSync(keysDir);
|
|
34
|
-
plugins.fsUtils.ensureDirSync(dnsRecordsDir);
|
|
35
|
-
plugins.fsUtils.ensureDirSync(sentEmailsDir);
|
|
36
|
-
plugins.fsUtils.ensureDirSync(receivedEmailsDir);
|
|
37
|
-
plugins.fsUtils.ensureDirSync(failedEmailsDir);
|
|
38
|
-
plugins.fsUtils.ensureDirSync(logsDir);
|
|
39
|
-
// Ensure email template directories
|
|
40
|
-
plugins.fsUtils.ensureDirSync(emailTemplatesDir);
|
|
41
|
-
plugins.fsUtils.ensureDirSync(MtaAttachmentsDir);
|
|
43
|
+
ensureDataDirectories(resolvePaths());
|
|
42
44
|
}
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0aHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9wYXRocy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4Qyw2Q0FBNkM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN6QyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUMvRCxLQUFLLENBQ04sQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFFdkUsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUVsRywrRkFBK0Y7QUFDL0YsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDckUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUTtJQUN6QyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRO0lBQ3RCLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUV0QixpQ0FBaUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTVFLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRS9EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE9BQWdCO0lBQzNDLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEYsT0FBTztRQUNMLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEQsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQztRQUN0RCxhQUFhLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQztLQUN6RCxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLGFBQThDO0lBQ2xGLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyRCxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBQ3hDLENBQUMifQ==
|
package/dist_ts/plugins.d.ts
CHANGED
|
@@ -9,7 +9,8 @@ import * as tls from 'tls';
|
|
|
9
9
|
import * as util from 'util';
|
|
10
10
|
export { dns, fs, crypto, http, net, os, path, tls, util, };
|
|
11
11
|
import * as servezoneInterfaces from '@serve.zone/interfaces';
|
|
12
|
-
|
|
12
|
+
import * as remoteingress from '@serve.zone/remoteingress';
|
|
13
|
+
export { servezoneInterfaces, remoteingress, };
|
|
13
14
|
import * as typedrequest from '@api.global/typedrequest';
|
|
14
15
|
import * as typedserver from '@api.global/typedserver';
|
|
15
16
|
import * as typedsocket from '@api.global/typedsocket';
|
package/dist_ts/plugins.js
CHANGED
|
@@ -11,7 +11,8 @@ import * as util from 'util';
|
|
|
11
11
|
export { dns, fs, crypto, http, net, os, path, tls, util, };
|
|
12
12
|
// @serve.zone scope
|
|
13
13
|
import * as servezoneInterfaces from '@serve.zone/interfaces';
|
|
14
|
-
|
|
14
|
+
import * as remoteingress from '@serve.zone/remoteingress';
|
|
15
|
+
export { servezoneInterfaces, remoteingress, };
|
|
15
16
|
// @api.global scope
|
|
16
17
|
import * as typedrequest from '@api.global/typedrequest';
|
|
17
18
|
import * as typedserver from '@api.global/typedserver';
|
|
@@ -109,4 +110,4 @@ export const fsUtils = {
|
|
|
109
110
|
return JSON.parse(content);
|
|
110
111
|
},
|
|
111
112
|
};
|
|
112
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3BsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYztBQUNkLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3pCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQzNCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsRUFBRSxFQUNGLE1BQU0sRUFDTixJQUFJLEVBQ0osR0FBRyxFQUNILEVBQUUsRUFDRixJQUFJLEVBQ0osR0FBRyxFQUNILElBQUksR0FDTCxDQUFBO0FBRUQsb0JBQW9CO0FBQ3BCLE9BQU8sS0FBSyxtQkFBbUIsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RCxPQUFPLEtBQUssYUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRTNELE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsYUFBYSxHQUNkLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFlBQVksTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEtBQUssV0FBVyxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZELE9BQU8sS0FBSyxXQUFXLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUNMLFlBQVksRUFDWixXQUFXLEVBQ1gsV0FBVyxHQUNaLENBQUE7QUFFRCxvQkFBb0I7QUFDcEIsT0FBTyxLQUFLLFdBQVcsTUFBTSx5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
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { StorageManager } from '../storage/classes.storagemanager.js';
|
|
2
|
+
import type { IRemoteIngress } from '../../dist_ts_interfaces/data/remoteingress.js';
|
|
3
|
+
/**
|
|
4
|
+
* Manages CRUD for remote ingress edge registrations.
|
|
5
|
+
* Persists edge configs via StorageManager and provides
|
|
6
|
+
* the allowed edges list for the Rust hub.
|
|
7
|
+
*/
|
|
8
|
+
export declare class RemoteIngressManager {
|
|
9
|
+
private storageManager;
|
|
10
|
+
private edges;
|
|
11
|
+
constructor(storageManager: StorageManager);
|
|
12
|
+
/**
|
|
13
|
+
* Load all edge registrations from storage into memory.
|
|
14
|
+
*/
|
|
15
|
+
initialize(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Create a new edge registration.
|
|
18
|
+
*/
|
|
19
|
+
createEdge(name: string, listenPorts: number[], tags?: string[]): Promise<IRemoteIngress>;
|
|
20
|
+
/**
|
|
21
|
+
* Get an edge by ID.
|
|
22
|
+
*/
|
|
23
|
+
getEdge(id: string): IRemoteIngress | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Get all edge registrations.
|
|
26
|
+
*/
|
|
27
|
+
getAllEdges(): IRemoteIngress[];
|
|
28
|
+
/**
|
|
29
|
+
* Update an edge registration.
|
|
30
|
+
*/
|
|
31
|
+
updateEdge(id: string, updates: {
|
|
32
|
+
name?: string;
|
|
33
|
+
listenPorts?: number[];
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
tags?: string[];
|
|
36
|
+
}): Promise<IRemoteIngress | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Delete an edge registration.
|
|
39
|
+
*/
|
|
40
|
+
deleteEdge(id: string): Promise<boolean>;
|
|
41
|
+
/**
|
|
42
|
+
* Regenerate the secret for an edge.
|
|
43
|
+
*/
|
|
44
|
+
regenerateSecret(id: string): Promise<string | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Verify an edge's secret using constant-time comparison.
|
|
47
|
+
*/
|
|
48
|
+
verifySecret(id: string, secret: string): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get the list of allowed edges (enabled only) for the Rust hub.
|
|
51
|
+
*/
|
|
52
|
+
getAllowedEdges(): Array<{
|
|
53
|
+
id: string;
|
|
54
|
+
secret: string;
|
|
55
|
+
}>;
|
|
56
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
const STORAGE_PREFIX = '/remote-ingress/';
|
|
3
|
+
/**
|
|
4
|
+
* Manages CRUD for remote ingress edge registrations.
|
|
5
|
+
* Persists edge configs via StorageManager and provides
|
|
6
|
+
* the allowed edges list for the Rust hub.
|
|
7
|
+
*/
|
|
8
|
+
export class RemoteIngressManager {
|
|
9
|
+
storageManager;
|
|
10
|
+
edges = new Map();
|
|
11
|
+
constructor(storageManager) {
|
|
12
|
+
this.storageManager = storageManager;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Load all edge registrations from storage into memory.
|
|
16
|
+
*/
|
|
17
|
+
async initialize() {
|
|
18
|
+
const keys = await this.storageManager.list(STORAGE_PREFIX);
|
|
19
|
+
for (const key of keys) {
|
|
20
|
+
const edge = await this.storageManager.getJSON(key);
|
|
21
|
+
if (edge) {
|
|
22
|
+
this.edges.set(edge.id, edge);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Create a new edge registration.
|
|
28
|
+
*/
|
|
29
|
+
async createEdge(name, listenPorts, tags) {
|
|
30
|
+
const id = plugins.uuid.v4();
|
|
31
|
+
const secret = plugins.crypto.randomBytes(32).toString('hex');
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const edge = {
|
|
34
|
+
id,
|
|
35
|
+
name,
|
|
36
|
+
secret,
|
|
37
|
+
listenPorts,
|
|
38
|
+
enabled: true,
|
|
39
|
+
tags: tags || [],
|
|
40
|
+
createdAt: now,
|
|
41
|
+
updatedAt: now,
|
|
42
|
+
};
|
|
43
|
+
await this.storageManager.setJSON(`${STORAGE_PREFIX}${id}`, edge);
|
|
44
|
+
this.edges.set(id, edge);
|
|
45
|
+
return edge;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get an edge by ID.
|
|
49
|
+
*/
|
|
50
|
+
getEdge(id) {
|
|
51
|
+
return this.edges.get(id);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get all edge registrations.
|
|
55
|
+
*/
|
|
56
|
+
getAllEdges() {
|
|
57
|
+
return Array.from(this.edges.values());
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Update an edge registration.
|
|
61
|
+
*/
|
|
62
|
+
async updateEdge(id, updates) {
|
|
63
|
+
const edge = this.edges.get(id);
|
|
64
|
+
if (!edge) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
if (updates.name !== undefined)
|
|
68
|
+
edge.name = updates.name;
|
|
69
|
+
if (updates.listenPorts !== undefined)
|
|
70
|
+
edge.listenPorts = updates.listenPorts;
|
|
71
|
+
if (updates.enabled !== undefined)
|
|
72
|
+
edge.enabled = updates.enabled;
|
|
73
|
+
if (updates.tags !== undefined)
|
|
74
|
+
edge.tags = updates.tags;
|
|
75
|
+
edge.updatedAt = Date.now();
|
|
76
|
+
await this.storageManager.setJSON(`${STORAGE_PREFIX}${id}`, edge);
|
|
77
|
+
this.edges.set(id, edge);
|
|
78
|
+
return edge;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Delete an edge registration.
|
|
82
|
+
*/
|
|
83
|
+
async deleteEdge(id) {
|
|
84
|
+
if (!this.edges.has(id)) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
await this.storageManager.delete(`${STORAGE_PREFIX}${id}`);
|
|
88
|
+
this.edges.delete(id);
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Regenerate the secret for an edge.
|
|
93
|
+
*/
|
|
94
|
+
async regenerateSecret(id) {
|
|
95
|
+
const edge = this.edges.get(id);
|
|
96
|
+
if (!edge) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
edge.secret = plugins.crypto.randomBytes(32).toString('hex');
|
|
100
|
+
edge.updatedAt = Date.now();
|
|
101
|
+
await this.storageManager.setJSON(`${STORAGE_PREFIX}${id}`, edge);
|
|
102
|
+
this.edges.set(id, edge);
|
|
103
|
+
return edge.secret;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Verify an edge's secret using constant-time comparison.
|
|
107
|
+
*/
|
|
108
|
+
verifySecret(id, secret) {
|
|
109
|
+
const edge = this.edges.get(id);
|
|
110
|
+
if (!edge) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
const expected = Buffer.from(edge.secret);
|
|
114
|
+
const provided = Buffer.from(secret);
|
|
115
|
+
if (expected.length !== provided.length) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
return plugins.crypto.timingSafeEqual(expected, provided);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Get the list of allowed edges (enabled only) for the Rust hub.
|
|
122
|
+
*/
|
|
123
|
+
getAllowedEdges() {
|
|
124
|
+
const result = [];
|
|
125
|
+
for (const edge of this.edges.values()) {
|
|
126
|
+
if (edge.enabled) {
|
|
127
|
+
result.push({ id: edge.id, secret: edge.secret });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZW1vdGVpbmdyZXNzLW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yZW1vdGVpbmdyZXNzL2NsYXNzZXMucmVtb3RlaW5ncmVzcy1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBSXpDLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBRTFDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3ZCLGNBQWMsQ0FBaUI7SUFDL0IsS0FBSyxHQUFnQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRXZELFlBQVksY0FBOEI7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQ3BFLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVLENBQ3JCLElBQVksRUFDWixXQUFxQixFQUNyQixJQUFlO1FBRWYsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FB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
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { IRemoteIngressStatus } from '../../dist_ts_interfaces/data/remoteingress.js';
|
|
2
|
+
import type { RemoteIngressManager } from './classes.remoteingress-manager.js';
|
|
3
|
+
export interface ITunnelManagerConfig {
|
|
4
|
+
tunnelPort?: number;
|
|
5
|
+
targetHost?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Manages the RemoteIngressHub instance and tracks connected edge statuses.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TunnelManager {
|
|
11
|
+
private hub;
|
|
12
|
+
private manager;
|
|
13
|
+
private config;
|
|
14
|
+
private edgeStatuses;
|
|
15
|
+
constructor(manager: RemoteIngressManager, config?: ITunnelManagerConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Start the tunnel hub and load allowed edges.
|
|
18
|
+
*/
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Stop the tunnel hub.
|
|
22
|
+
*/
|
|
23
|
+
stop(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Sync allowed edges from the manager to the hub.
|
|
26
|
+
* Call this after creating/deleting/updating edges.
|
|
27
|
+
*/
|
|
28
|
+
syncAllowedEdges(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Get runtime statuses for all known edges.
|
|
31
|
+
*/
|
|
32
|
+
getEdgeStatuses(): IRemoteIngressStatus[];
|
|
33
|
+
/**
|
|
34
|
+
* Get status for a specific edge.
|
|
35
|
+
*/
|
|
36
|
+
getEdgeStatus(edgeId: string): IRemoteIngressStatus | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get the count of connected edges.
|
|
39
|
+
*/
|
|
40
|
+
getConnectedCount(): number;
|
|
41
|
+
/**
|
|
42
|
+
* Get the total number of active tunnels across all edges.
|
|
43
|
+
*/
|
|
44
|
+
getTotalActiveTunnels(): number;
|
|
45
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
/**
|
|
3
|
+
* Manages the RemoteIngressHub instance and tracks connected edge statuses.
|
|
4
|
+
*/
|
|
5
|
+
export class TunnelManager {
|
|
6
|
+
hub;
|
|
7
|
+
manager;
|
|
8
|
+
config;
|
|
9
|
+
edgeStatuses = new Map();
|
|
10
|
+
constructor(manager, config = {}) {
|
|
11
|
+
this.manager = manager;
|
|
12
|
+
this.config = config;
|
|
13
|
+
this.hub = new plugins.remoteingress.RemoteIngressHub();
|
|
14
|
+
// Listen for edge connect/disconnect events
|
|
15
|
+
this.hub.on('edgeConnected', (data) => {
|
|
16
|
+
const existing = this.edgeStatuses.get(data.edgeId);
|
|
17
|
+
this.edgeStatuses.set(data.edgeId, {
|
|
18
|
+
edgeId: data.edgeId,
|
|
19
|
+
connected: true,
|
|
20
|
+
publicIp: existing?.publicIp ?? null,
|
|
21
|
+
activeTunnels: 0,
|
|
22
|
+
lastHeartbeat: Date.now(),
|
|
23
|
+
connectedAt: Date.now(),
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
this.hub.on('edgeDisconnected', (data) => {
|
|
27
|
+
const existing = this.edgeStatuses.get(data.edgeId);
|
|
28
|
+
if (existing) {
|
|
29
|
+
existing.connected = false;
|
|
30
|
+
existing.activeTunnels = 0;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
this.hub.on('streamOpened', (data) => {
|
|
34
|
+
const existing = this.edgeStatuses.get(data.edgeId);
|
|
35
|
+
if (existing) {
|
|
36
|
+
existing.activeTunnels++;
|
|
37
|
+
existing.lastHeartbeat = Date.now();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
this.hub.on('streamClosed', (data) => {
|
|
41
|
+
const existing = this.edgeStatuses.get(data.edgeId);
|
|
42
|
+
if (existing && existing.activeTunnels > 0) {
|
|
43
|
+
existing.activeTunnels--;
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Start the tunnel hub and load allowed edges.
|
|
49
|
+
*/
|
|
50
|
+
async start() {
|
|
51
|
+
await this.hub.start({
|
|
52
|
+
tunnelPort: this.config.tunnelPort ?? 8443,
|
|
53
|
+
targetHost: this.config.targetHost ?? '127.0.0.1',
|
|
54
|
+
});
|
|
55
|
+
// Send allowed edges to the hub
|
|
56
|
+
await this.syncAllowedEdges();
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Stop the tunnel hub.
|
|
60
|
+
*/
|
|
61
|
+
async stop() {
|
|
62
|
+
await this.hub.stop();
|
|
63
|
+
this.edgeStatuses.clear();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Sync allowed edges from the manager to the hub.
|
|
67
|
+
* Call this after creating/deleting/updating edges.
|
|
68
|
+
*/
|
|
69
|
+
async syncAllowedEdges() {
|
|
70
|
+
const edges = this.manager.getAllowedEdges();
|
|
71
|
+
await this.hub.updateAllowedEdges(edges);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get runtime statuses for all known edges.
|
|
75
|
+
*/
|
|
76
|
+
getEdgeStatuses() {
|
|
77
|
+
return Array.from(this.edgeStatuses.values());
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get status for a specific edge.
|
|
81
|
+
*/
|
|
82
|
+
getEdgeStatus(edgeId) {
|
|
83
|
+
return this.edgeStatuses.get(edgeId);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the count of connected edges.
|
|
87
|
+
*/
|
|
88
|
+
getConnectedCount() {
|
|
89
|
+
let count = 0;
|
|
90
|
+
for (const status of this.edgeStatuses.values()) {
|
|
91
|
+
if (status.connected)
|
|
92
|
+
count++;
|
|
93
|
+
}
|
|
94
|
+
return count;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get the total number of active tunnels across all edges.
|
|
98
|
+
*/
|
|
99
|
+
getTotalActiveTunnels() {
|
|
100
|
+
let total = 0;
|
|
101
|
+
for (const status of this.edgeStatuses.values()) {
|
|
102
|
+
total += status.activeTunnels;
|
|
103
|
+
}
|
|
104
|
+
return total;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50dW5uZWwtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3JlbW90ZWluZ3Jlc3MvY2xhc3Nlcy50dW5uZWwtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQVN6Qzs7R0FFRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBQ2hCLEdBQUcsQ0FBOEQ7SUFDakUsT0FBTyxDQUF1QjtJQUM5QixNQUFNLENBQXVCO0lBQzdCLFlBQVksR0FBc0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVwRSxZQUFZLE9BQTZCLEVBQUUsU0FBK0IsRUFBRTtRQUMxRSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRXhELDRDQUE0QztRQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUF3QixFQUFFLEVBQUU7WUFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLElBQUksSUFBSTtnQkFDcEMsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLGFBQWEsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QixDQUFDLENBQUM7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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './classes.remoteingress-manager.js';
|
|
2
|
+
export * from './classes.tunnel-manager.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9yZW1vdGVpbmdyZXNzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyw2QkFBNkIsQ0FBQyJ9
|