@serve.zone/dcrouter 6.3.0 → 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 +22 -0
- package/dist_ts/classes.dcrouter.js +42 -1
- 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/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_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 +66 -0
- 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/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_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
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
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './auth.js';
|
|
2
2
|
export * from './stats.js';
|
|
3
|
-
|
|
3
|
+
export * from './remoteingress.js';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQyJ9
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A stored remote ingress edge registration.
|
|
3
|
+
*/
|
|
4
|
+
export interface IRemoteIngress {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
secret: string;
|
|
8
|
+
listenPorts: number[];
|
|
9
|
+
enabled: boolean;
|
|
10
|
+
tags?: string[];
|
|
11
|
+
createdAt: number;
|
|
12
|
+
updatedAt: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Runtime status of a remote ingress edge.
|
|
16
|
+
*/
|
|
17
|
+
export interface IRemoteIngressStatus {
|
|
18
|
+
edgeId: string;
|
|
19
|
+
connected: boolean;
|
|
20
|
+
publicIp: string | null;
|
|
21
|
+
activeTunnels: number;
|
|
22
|
+
lastHeartbeat: number | null;
|
|
23
|
+
connectedAt: number | null;
|
|
24
|
+
}
|
|
@@ -6,4 +6,5 @@ export * from './combined.stats.js';
|
|
|
6
6
|
export * from './radius.js';
|
|
7
7
|
export * from './email-ops.js';
|
|
8
8
|
export * from './certificate.js';
|
|
9
|
-
|
|
9
|
+
export * from './remoteingress.js';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL3JlcXVlc3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUMifQ==
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as authInterfaces from '../data/auth.js';
|
|
3
|
+
import type { IRemoteIngress, IRemoteIngressStatus } from '../data/remoteingress.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create a new remote ingress edge registration.
|
|
6
|
+
*/
|
|
7
|
+
export interface IReq_CreateRemoteIngress extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CreateRemoteIngress> {
|
|
8
|
+
method: 'createRemoteIngress';
|
|
9
|
+
request: {
|
|
10
|
+
identity?: authInterfaces.IIdentity;
|
|
11
|
+
name: string;
|
|
12
|
+
listenPorts: number[];
|
|
13
|
+
tags?: string[];
|
|
14
|
+
};
|
|
15
|
+
response: {
|
|
16
|
+
success: boolean;
|
|
17
|
+
edge: IRemoteIngress;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Delete a remote ingress edge registration.
|
|
22
|
+
*/
|
|
23
|
+
export interface IReq_DeleteRemoteIngress extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_DeleteRemoteIngress> {
|
|
24
|
+
method: 'deleteRemoteIngress';
|
|
25
|
+
request: {
|
|
26
|
+
identity?: authInterfaces.IIdentity;
|
|
27
|
+
id: string;
|
|
28
|
+
};
|
|
29
|
+
response: {
|
|
30
|
+
success: boolean;
|
|
31
|
+
message?: string;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Update a remote ingress edge registration.
|
|
36
|
+
*/
|
|
37
|
+
export interface IReq_UpdateRemoteIngress extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_UpdateRemoteIngress> {
|
|
38
|
+
method: 'updateRemoteIngress';
|
|
39
|
+
request: {
|
|
40
|
+
identity?: authInterfaces.IIdentity;
|
|
41
|
+
id: string;
|
|
42
|
+
name?: string;
|
|
43
|
+
listenPorts?: number[];
|
|
44
|
+
enabled?: boolean;
|
|
45
|
+
tags?: string[];
|
|
46
|
+
};
|
|
47
|
+
response: {
|
|
48
|
+
success: boolean;
|
|
49
|
+
edge: IRemoteIngress;
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Regenerate the secret for a remote ingress edge.
|
|
54
|
+
*/
|
|
55
|
+
export interface IReq_RegenerateRemoteIngressSecret extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_RegenerateRemoteIngressSecret> {
|
|
56
|
+
method: 'regenerateRemoteIngressSecret';
|
|
57
|
+
request: {
|
|
58
|
+
identity?: authInterfaces.IIdentity;
|
|
59
|
+
id: string;
|
|
60
|
+
};
|
|
61
|
+
response: {
|
|
62
|
+
success: boolean;
|
|
63
|
+
secret: string;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get all remote ingress edge registrations.
|
|
68
|
+
*/
|
|
69
|
+
export interface IReq_GetRemoteIngresses extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetRemoteIngresses> {
|
|
70
|
+
method: 'getRemoteIngresses';
|
|
71
|
+
request: {
|
|
72
|
+
identity?: authInterfaces.IIdentity;
|
|
73
|
+
};
|
|
74
|
+
response: {
|
|
75
|
+
edges: IRemoteIngress[];
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get runtime status of all remote ingress edges.
|
|
80
|
+
*/
|
|
81
|
+
export interface IReq_GetRemoteIngressStatus extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetRemoteIngressStatus> {
|
|
82
|
+
method: 'getRemoteIngressStatus';
|
|
83
|
+
request: {
|
|
84
|
+
identity?: authInterfaces.IIdentity;
|
|
85
|
+
};
|
|
86
|
+
response: {
|
|
87
|
+
statuses: IRemoteIngressStatus[];
|
|
88
|
+
};
|
|
89
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as authInterfaces from '../data/auth.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlaW5ncmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvcmVxdWVzdHMvcmVtb3RlaW5ncmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssY0FBYyxNQUFNLGlCQUFpQixDQUFDIn0=
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/dcrouter',
|
|
6
|
-
version: '6.
|
|
6
|
+
version: '6.4.0',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSwwRUFBMEU7Q0FDeEYsQ0FBQSJ9
|
|
@@ -102,6 +102,16 @@ export declare const logStatePart: plugins.deesElement.domtools.plugins.smartsta
|
|
|
102
102
|
export declare const networkStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, INetworkState>;
|
|
103
103
|
export declare const emailOpsStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, IEmailOpsState>;
|
|
104
104
|
export declare const certificateStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, ICertificateState>;
|
|
105
|
+
export interface IRemoteIngressState {
|
|
106
|
+
edges: interfaces.data.IRemoteIngress[];
|
|
107
|
+
statuses: interfaces.data.IRemoteIngressStatus[];
|
|
108
|
+
selectedEdgeId: string | null;
|
|
109
|
+
newEdgeSecret: string | null;
|
|
110
|
+
isLoading: boolean;
|
|
111
|
+
error: string | null;
|
|
112
|
+
lastUpdated: number;
|
|
113
|
+
}
|
|
114
|
+
export declare const remoteIngressStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, IRemoteIngressState>;
|
|
105
115
|
export declare const loginAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ILoginState, {
|
|
106
116
|
username: string;
|
|
107
117
|
password: string;
|
|
@@ -127,3 +137,12 @@ export declare const resendEmailAction: plugins.deesElement.domtools.plugins.sma
|
|
|
127
137
|
export declare const removeFromSuppressionListAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IEmailOpsState, string>;
|
|
128
138
|
export declare const fetchCertificateOverviewAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ICertificateState, unknown>;
|
|
129
139
|
export declare const reprovisionCertificateAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ICertificateState, string>;
|
|
140
|
+
export declare const fetchRemoteIngressAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRemoteIngressState, unknown>;
|
|
141
|
+
export declare const createRemoteIngressAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRemoteIngressState, {
|
|
142
|
+
name: string;
|
|
143
|
+
listenPorts: number[];
|
|
144
|
+
tags?: string[];
|
|
145
|
+
}>;
|
|
146
|
+
export declare const deleteRemoteIngressAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRemoteIngressState, string>;
|
|
147
|
+
export declare const regenerateRemoteIngressSecretAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRemoteIngressState, string>;
|
|
148
|
+
export declare const clearNewEdgeSecretAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRemoteIngressState, unknown>;
|