@serve.zone/dcrouter 11.0.50 → 11.2.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.
Files changed (48) hide show
  1. package/dist_serve/bundle.js +1 -1
  2. package/dist_serve/index.html +121 -0
  3. package/dist_ts/00_commitinfo_data.js +2 -2
  4. package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
  5. package/dist_ts_apiclient/classes.apitoken.js +115 -0
  6. package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
  7. package/dist_ts_apiclient/classes.certificate.js +69 -0
  8. package/dist_ts_apiclient/classes.config.d.ts +7 -0
  9. package/dist_ts_apiclient/classes.config.js +11 -0
  10. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
  11. package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
  12. package/dist_ts_apiclient/classes.email.d.ts +30 -0
  13. package/dist_ts_apiclient/classes.email.js +52 -0
  14. package/dist_ts_apiclient/classes.logs.d.ts +21 -0
  15. package/dist_ts_apiclient/classes.logs.js +14 -0
  16. package/dist_ts_apiclient/classes.radius.d.ts +59 -0
  17. package/dist_ts_apiclient/classes.radius.js +95 -0
  18. package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
  19. package/dist_ts_apiclient/classes.remoteingress.js +136 -0
  20. package/dist_ts_apiclient/classes.route.d.ts +42 -0
  21. package/dist_ts_apiclient/classes.route.js +154 -0
  22. package/dist_ts_apiclient/classes.stats.d.ts +47 -0
  23. package/dist_ts_apiclient/classes.stats.js +38 -0
  24. package/dist_ts_apiclient/index.d.ts +10 -0
  25. package/dist_ts_apiclient/index.js +14 -0
  26. package/dist_ts_apiclient/plugins.d.ts +3 -0
  27. package/dist_ts_apiclient/plugins.js +5 -0
  28. package/dist_ts_web/00_commitinfo_data.js +2 -2
  29. package/npmextra.json +2 -1
  30. package/package.json +8 -5
  31. package/readme.md +103 -7
  32. package/ts/00_commitinfo_data.ts +1 -1
  33. package/ts_apiclient/classes.apitoken.ts +157 -0
  34. package/ts_apiclient/classes.certificate.ts +123 -0
  35. package/ts_apiclient/classes.config.ts +17 -0
  36. package/ts_apiclient/classes.dcrouterapiclient.ts +112 -0
  37. package/ts_apiclient/classes.email.ts +77 -0
  38. package/ts_apiclient/classes.logs.ts +37 -0
  39. package/ts_apiclient/classes.radius.ts +180 -0
  40. package/ts_apiclient/classes.remoteingress.ts +185 -0
  41. package/ts_apiclient/classes.route.ts +203 -0
  42. package/ts_apiclient/classes.stats.ts +111 -0
  43. package/ts_apiclient/index.ts +15 -0
  44. package/ts_apiclient/plugins.ts +8 -0
  45. package/ts_apiclient/readme.md +279 -0
  46. package/ts_apiclient/tspublish.json +3 -0
  47. package/ts_web/00_commitinfo_data.ts +1 -1
  48. package/ts_web/readme.md +7 -0
@@ -0,0 +1,52 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ export class Email {
3
+ clientRef;
4
+ // Data from IEmail
5
+ id;
6
+ direction;
7
+ status;
8
+ from;
9
+ to;
10
+ subject;
11
+ timestamp;
12
+ messageId;
13
+ size;
14
+ constructor(clientRef, data) {
15
+ this.clientRef = clientRef;
16
+ this.id = data.id;
17
+ this.direction = data.direction;
18
+ this.status = data.status;
19
+ this.from = data.from;
20
+ this.to = data.to;
21
+ this.subject = data.subject;
22
+ this.timestamp = data.timestamp;
23
+ this.messageId = data.messageId;
24
+ this.size = data.size;
25
+ }
26
+ async getDetail() {
27
+ const response = await this.clientRef.request('getEmailDetail', this.clientRef.buildRequestPayload({ emailId: this.id }));
28
+ return response.email;
29
+ }
30
+ async resend() {
31
+ const response = await this.clientRef.request('resendEmail', this.clientRef.buildRequestPayload({ emailId: this.id }));
32
+ return response;
33
+ }
34
+ }
35
+ export class EmailManager {
36
+ clientRef;
37
+ constructor(clientRef) {
38
+ this.clientRef = clientRef;
39
+ }
40
+ async list() {
41
+ const response = await this.clientRef.request('getAllEmails', this.clientRef.buildRequestPayload());
42
+ return response.emails.map((e) => new Email(this.clientRef, e));
43
+ }
44
+ async getDetail(emailId) {
45
+ const response = await this.clientRef.request('getEmailDetail', this.clientRef.buildRequestPayload({ emailId }));
46
+ return response.email;
47
+ }
48
+ async resend(emailId) {
49
+ return this.clientRef.request('resendEmail', this.clientRef.buildRequestPayload({ emailId }));
50
+ }
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5lbWFpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2FwaWNsaWVudC9jbGFzc2VzLmVtYWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFHeEQsTUFBTSxPQUFPLEtBQUs7SUFDUixTQUFTLENBQW9CO0lBRXJDLG1CQUFtQjtJQUNaLEVBQUUsQ0FBUztJQUNYLFNBQVMsQ0FBc0M7SUFDL0MsTUFBTSxDQUFtQztJQUN6QyxJQUFJLENBQVM7SUFDYixFQUFFLENBQVM7SUFDWCxPQUFPLENBQVM7SUFDaEIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixJQUFJLENBQVM7SUFFcEIsWUFBWSxTQUE0QixFQUFFLElBQWdDO1FBQ3hFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQVEsQ0FDaEUsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU07UUFDakIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsYUFBYSxFQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFRLENBQ2hFLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sWUFBWTtJQUNmLFNBQVMsQ0FBb0I7SUFFckMsWUFBWSxTQUE0QjtRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFDZixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxjQUFjLEVBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBUyxDQUM1QyxDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQWU7UUFDcEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsZ0JBQWdCLEVBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBUSxDQUN2RCxDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQWU7UUFDakMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0IsYUFBYSxFQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBUSxDQUN2RCxDQUFDO0lBQ0osQ0FBQztDQUNGIn0=
@@ -0,0 +1,21 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ import type { DcRouterApiClient } from './classes.dcrouterapiclient.js';
3
+ export declare class LogManager {
4
+ private clientRef;
5
+ constructor(clientRef: DcRouterApiClient);
6
+ getRecent(options?: {
7
+ level?: 'debug' | 'info' | 'warn' | 'error';
8
+ category?: 'smtp' | 'dns' | 'security' | 'system' | 'email';
9
+ limit?: number;
10
+ offset?: number;
11
+ search?: string;
12
+ timeRange?: string;
13
+ }): Promise<interfaces.requests.IReq_GetRecentLogs['response']>;
14
+ getStream(options?: {
15
+ follow?: boolean;
16
+ filters?: {
17
+ level?: string[];
18
+ category?: string[];
19
+ };
20
+ }): Promise<interfaces.requests.IReq_GetLogStream['response']>;
21
+ }
@@ -0,0 +1,14 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ export class LogManager {
3
+ clientRef;
4
+ constructor(clientRef) {
5
+ this.clientRef = clientRef;
6
+ }
7
+ async getRecent(options) {
8
+ return this.clientRef.request('getRecentLogs', this.clientRef.buildRequestPayload(options || {}));
9
+ }
10
+ async getStream(options) {
11
+ return this.clientRef.request('getLogStream', this.clientRef.buildRequestPayload(options || {}));
12
+ }
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5sb2dzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfYXBpY2xpZW50L2NsYXNzZXMubG9ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBR3hELE1BQU0sT0FBTyxVQUFVO0lBQ2IsU0FBUyxDQUFvQjtJQUVyQyxZQUFZLFNBQTRCO1FBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLE9BT3RCO1FBQ0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0IsZUFBZSxFQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBUSxDQUN6RCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FNdEI7UUFDQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQixjQUFjLEVBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFRLENBQ3pELENBQUM7SUFDSixDQUFDO0NBQ0YifQ==
@@ -0,0 +1,59 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ import type { DcRouterApiClient } from './classes.dcrouterapiclient.js';
3
+ export declare class RadiusClientManager {
4
+ private clientRef;
5
+ constructor(clientRef: DcRouterApiClient);
6
+ list(): Promise<Array<{
7
+ name: string;
8
+ ipRange: string;
9
+ description?: string;
10
+ enabled: boolean;
11
+ }>>;
12
+ set(client: {
13
+ name: string;
14
+ ipRange: string;
15
+ secret: string;
16
+ description?: string;
17
+ enabled: boolean;
18
+ }): Promise<void>;
19
+ remove(name: string): Promise<void>;
20
+ }
21
+ export declare class RadiusVlanManager {
22
+ private clientRef;
23
+ constructor(clientRef: DcRouterApiClient);
24
+ list(): Promise<interfaces.requests.IReq_GetVlanMappings['response']>;
25
+ set(mapping: {
26
+ mac: string;
27
+ vlan: number;
28
+ description?: string;
29
+ enabled: boolean;
30
+ }): Promise<void>;
31
+ remove(mac: string): Promise<void>;
32
+ updateConfig(options: {
33
+ defaultVlan?: number;
34
+ allowUnknownMacs?: boolean;
35
+ }): Promise<{
36
+ defaultVlan: number;
37
+ allowUnknownMacs: boolean;
38
+ }>;
39
+ testAssignment(mac: string): Promise<interfaces.requests.IReq_TestVlanAssignment['response']>;
40
+ }
41
+ export declare class RadiusSessionManager {
42
+ private clientRef;
43
+ constructor(clientRef: DcRouterApiClient);
44
+ list(filter?: {
45
+ username?: string;
46
+ nasIpAddress?: string;
47
+ vlanId?: number;
48
+ }): Promise<interfaces.requests.IReq_GetRadiusSessions['response']>;
49
+ disconnect(sessionId: string, reason?: string): Promise<void>;
50
+ }
51
+ export declare class RadiusManager {
52
+ private clientRef;
53
+ clients: RadiusClientManager;
54
+ vlans: RadiusVlanManager;
55
+ sessions: RadiusSessionManager;
56
+ constructor(clientRef: DcRouterApiClient);
57
+ getAccountingSummary(startTime: number, endTime: number): Promise<interfaces.requests.IReq_GetRadiusAccountingSummary['response']['summary']>;
58
+ getStatistics(): Promise<interfaces.requests.IReq_GetRadiusStatistics['response']>;
59
+ }
@@ -0,0 +1,95 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ // =====================
3
+ // Sub-managers
4
+ // =====================
5
+ export class RadiusClientManager {
6
+ clientRef;
7
+ constructor(clientRef) {
8
+ this.clientRef = clientRef;
9
+ }
10
+ async list() {
11
+ const response = await this.clientRef.request('getRadiusClients', this.clientRef.buildRequestPayload());
12
+ return response.clients;
13
+ }
14
+ async set(client) {
15
+ const response = await this.clientRef.request('setRadiusClient', this.clientRef.buildRequestPayload({ client }));
16
+ if (!response.success) {
17
+ throw new Error(response.message || 'Failed to set RADIUS client');
18
+ }
19
+ }
20
+ async remove(name) {
21
+ const response = await this.clientRef.request('removeRadiusClient', this.clientRef.buildRequestPayload({ name }));
22
+ if (!response.success) {
23
+ throw new Error(response.message || 'Failed to remove RADIUS client');
24
+ }
25
+ }
26
+ }
27
+ export class RadiusVlanManager {
28
+ clientRef;
29
+ constructor(clientRef) {
30
+ this.clientRef = clientRef;
31
+ }
32
+ async list() {
33
+ return this.clientRef.request('getVlanMappings', this.clientRef.buildRequestPayload());
34
+ }
35
+ async set(mapping) {
36
+ const response = await this.clientRef.request('setVlanMapping', this.clientRef.buildRequestPayload({ mapping }));
37
+ if (!response.success) {
38
+ throw new Error(response.message || 'Failed to set VLAN mapping');
39
+ }
40
+ }
41
+ async remove(mac) {
42
+ const response = await this.clientRef.request('removeVlanMapping', this.clientRef.buildRequestPayload({ mac }));
43
+ if (!response.success) {
44
+ throw new Error(response.message || 'Failed to remove VLAN mapping');
45
+ }
46
+ }
47
+ async updateConfig(options) {
48
+ const response = await this.clientRef.request('updateVlanConfig', this.clientRef.buildRequestPayload(options));
49
+ if (!response.success) {
50
+ throw new Error('Failed to update VLAN config');
51
+ }
52
+ return response.config;
53
+ }
54
+ async testAssignment(mac) {
55
+ return this.clientRef.request('testVlanAssignment', this.clientRef.buildRequestPayload({ mac }));
56
+ }
57
+ }
58
+ export class RadiusSessionManager {
59
+ clientRef;
60
+ constructor(clientRef) {
61
+ this.clientRef = clientRef;
62
+ }
63
+ async list(filter) {
64
+ return this.clientRef.request('getRadiusSessions', this.clientRef.buildRequestPayload({ filter }));
65
+ }
66
+ async disconnect(sessionId, reason) {
67
+ const response = await this.clientRef.request('disconnectRadiusSession', this.clientRef.buildRequestPayload({ sessionId, reason }));
68
+ if (!response.success) {
69
+ throw new Error(response.message || 'Failed to disconnect session');
70
+ }
71
+ }
72
+ }
73
+ // =====================
74
+ // Main RADIUS Manager
75
+ // =====================
76
+ export class RadiusManager {
77
+ clientRef;
78
+ clients;
79
+ vlans;
80
+ sessions;
81
+ constructor(clientRef) {
82
+ this.clientRef = clientRef;
83
+ this.clients = new RadiusClientManager(clientRef);
84
+ this.vlans = new RadiusVlanManager(clientRef);
85
+ this.sessions = new RadiusSessionManager(clientRef);
86
+ }
87
+ async getAccountingSummary(startTime, endTime) {
88
+ const response = await this.clientRef.request('getRadiusAccountingSummary', this.clientRef.buildRequestPayload({ startTime, endTime }));
89
+ return response.summary;
90
+ }
91
+ async getStatistics() {
92
+ return this.clientRef.request('getRadiusStatistics', this.clientRef.buildRequestPayload());
93
+ }
94
+ }
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yYWRpdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19hcGljbGllbnQvY2xhc3Nlcy5yYWRpdXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUd4RCx3QkFBd0I7QUFDeEIsZUFBZTtBQUNmLHdCQUF3QjtBQUV4QixNQUFNLE9BQU8sbUJBQW1CO0lBQ3RCLFNBQVMsQ0FBb0I7SUFFckMsWUFBWSxTQUE0QjtRQUN0QyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUk7UUFNZixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxrQkFBa0IsRUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBUyxDQUM1QyxDQUFDO1FBQ0YsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFTSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BTWhCO1FBQ0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDM0MsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBUSxDQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLElBQUksNkJBQTZCLENBQUMsQ0FBQztRQUNyRSxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBWTtRQUM5QixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxvQkFBb0IsRUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxF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
@@ -0,0 +1,54 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ import type { DcRouterApiClient } from './classes.dcrouterapiclient.js';
3
+ export declare class RemoteIngress {
4
+ private clientRef;
5
+ id: string;
6
+ name: string;
7
+ secret: string;
8
+ listenPorts: number[];
9
+ enabled: boolean;
10
+ autoDerivePorts: boolean;
11
+ tags?: string[];
12
+ createdAt: number;
13
+ updatedAt: number;
14
+ effectiveListenPorts?: number[];
15
+ manualPorts?: number[];
16
+ derivedPorts?: number[];
17
+ constructor(clientRef: DcRouterApiClient, data: interfaces.data.IRemoteIngress);
18
+ update(changes: {
19
+ name?: string;
20
+ listenPorts?: number[];
21
+ autoDerivePorts?: boolean;
22
+ enabled?: boolean;
23
+ tags?: string[];
24
+ }): Promise<void>;
25
+ delete(): Promise<void>;
26
+ regenerateSecret(): Promise<string>;
27
+ getConnectionToken(hubHost?: string): Promise<string | undefined>;
28
+ }
29
+ export declare class RemoteIngressBuilder {
30
+ private clientRef;
31
+ private edgeName;
32
+ private edgeListenPorts?;
33
+ private edgeAutoDerivePorts?;
34
+ private edgeTags?;
35
+ constructor(clientRef: DcRouterApiClient);
36
+ setName(name: string): this;
37
+ setListenPorts(ports: number[]): this;
38
+ setAutoDerivePorts(auto: boolean): this;
39
+ setTags(tags: string[]): this;
40
+ save(): Promise<RemoteIngress>;
41
+ }
42
+ export declare class RemoteIngressManager {
43
+ private clientRef;
44
+ constructor(clientRef: DcRouterApiClient);
45
+ list(): Promise<RemoteIngress[]>;
46
+ getStatuses(): Promise<interfaces.data.IRemoteIngressStatus[]>;
47
+ create(options: {
48
+ name: string;
49
+ listenPorts?: number[];
50
+ autoDerivePorts?: boolean;
51
+ tags?: string[];
52
+ }): Promise<RemoteIngress>;
53
+ build(): RemoteIngressBuilder;
54
+ }
@@ -0,0 +1,136 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ export class RemoteIngress {
3
+ clientRef;
4
+ // Data from IRemoteIngress
5
+ id;
6
+ name;
7
+ secret;
8
+ listenPorts;
9
+ enabled;
10
+ autoDerivePorts;
11
+ tags;
12
+ createdAt;
13
+ updatedAt;
14
+ effectiveListenPorts;
15
+ manualPorts;
16
+ derivedPorts;
17
+ constructor(clientRef, data) {
18
+ this.clientRef = clientRef;
19
+ this.id = data.id;
20
+ this.name = data.name;
21
+ this.secret = data.secret;
22
+ this.listenPorts = data.listenPorts;
23
+ this.enabled = data.enabled;
24
+ this.autoDerivePorts = data.autoDerivePorts;
25
+ this.tags = data.tags;
26
+ this.createdAt = data.createdAt;
27
+ this.updatedAt = data.updatedAt;
28
+ this.effectiveListenPorts = data.effectiveListenPorts;
29
+ this.manualPorts = data.manualPorts;
30
+ this.derivedPorts = data.derivedPorts;
31
+ }
32
+ async update(changes) {
33
+ const response = await this.clientRef.request('updateRemoteIngress', this.clientRef.buildRequestPayload({ id: this.id, ...changes }));
34
+ if (!response.success) {
35
+ throw new Error('Failed to update remote ingress');
36
+ }
37
+ // Update local state from response
38
+ const edge = response.edge;
39
+ this.name = edge.name;
40
+ this.listenPorts = edge.listenPorts;
41
+ this.enabled = edge.enabled;
42
+ this.autoDerivePorts = edge.autoDerivePorts;
43
+ this.tags = edge.tags;
44
+ this.updatedAt = edge.updatedAt;
45
+ this.effectiveListenPorts = edge.effectiveListenPorts;
46
+ this.manualPorts = edge.manualPorts;
47
+ this.derivedPorts = edge.derivedPorts;
48
+ }
49
+ async delete() {
50
+ const response = await this.clientRef.request('deleteRemoteIngress', this.clientRef.buildRequestPayload({ id: this.id }));
51
+ if (!response.success) {
52
+ throw new Error(response.message || 'Failed to delete remote ingress');
53
+ }
54
+ }
55
+ async regenerateSecret() {
56
+ const response = await this.clientRef.request('regenerateRemoteIngressSecret', this.clientRef.buildRequestPayload({ id: this.id }));
57
+ if (!response.success) {
58
+ throw new Error('Failed to regenerate secret');
59
+ }
60
+ this.secret = response.secret;
61
+ return response.secret;
62
+ }
63
+ async getConnectionToken(hubHost) {
64
+ const response = await this.clientRef.request('getRemoteIngressConnectionToken', this.clientRef.buildRequestPayload({ edgeId: this.id, hubHost }));
65
+ if (!response.success) {
66
+ throw new Error(response.message || 'Failed to get connection token');
67
+ }
68
+ return response.token;
69
+ }
70
+ }
71
+ export class RemoteIngressBuilder {
72
+ clientRef;
73
+ edgeName = '';
74
+ edgeListenPorts;
75
+ edgeAutoDerivePorts;
76
+ edgeTags;
77
+ constructor(clientRef) {
78
+ this.clientRef = clientRef;
79
+ }
80
+ setName(name) {
81
+ this.edgeName = name;
82
+ return this;
83
+ }
84
+ setListenPorts(ports) {
85
+ this.edgeListenPorts = ports;
86
+ return this;
87
+ }
88
+ setAutoDerivePorts(auto) {
89
+ this.edgeAutoDerivePorts = auto;
90
+ return this;
91
+ }
92
+ setTags(tags) {
93
+ this.edgeTags = tags;
94
+ return this;
95
+ }
96
+ async save() {
97
+ const response = await this.clientRef.request('createRemoteIngress', this.clientRef.buildRequestPayload({
98
+ name: this.edgeName,
99
+ listenPorts: this.edgeListenPorts,
100
+ autoDerivePorts: this.edgeAutoDerivePorts,
101
+ tags: this.edgeTags,
102
+ }));
103
+ if (!response.success) {
104
+ throw new Error('Failed to create remote ingress');
105
+ }
106
+ return new RemoteIngress(this.clientRef, response.edge);
107
+ }
108
+ }
109
+ export class RemoteIngressManager {
110
+ clientRef;
111
+ constructor(clientRef) {
112
+ this.clientRef = clientRef;
113
+ }
114
+ async list() {
115
+ const response = await this.clientRef.request('getRemoteIngresses', this.clientRef.buildRequestPayload());
116
+ return response.edges.map((e) => new RemoteIngress(this.clientRef, e));
117
+ }
118
+ async getStatuses() {
119
+ const response = await this.clientRef.request('getRemoteIngressStatus', this.clientRef.buildRequestPayload());
120
+ return response.statuses;
121
+ }
122
+ async create(options) {
123
+ const builder = this.build().setName(options.name);
124
+ if (options.listenPorts)
125
+ builder.setListenPorts(options.listenPorts);
126
+ if (options.autoDerivePorts !== undefined)
127
+ builder.setAutoDerivePorts(options.autoDerivePorts);
128
+ if (options.tags)
129
+ builder.setTags(options.tags);
130
+ return builder.save();
131
+ }
132
+ build() {
133
+ return new RemoteIngressBuilder(this.clientRef);
134
+ }
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yZW1vdGVpbmdyZXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfYXBpY2xpZW50L2NsYXNzZXMucmVtb3RlaW5ncmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssVUFBVSxNQUFNLDJCQUEyQixDQUFDO0FBR3hELE1BQU0sT0FBTyxhQUFhO0lBQ2hCLFNBQVMsQ0FBb0I7SUFFckMsMkJBQTJCO0lBQ3BCLEVBQUUsQ0FBUztJQUNYLElBQUksQ0FBUztJQUNiLE1BQU0sQ0FBUztJQUNmLFdBQVcsQ0FBVztJQUN0QixPQUFPLENBQVU7SUFDakIsZUFBZSxDQUFVO0lBQ3pCLElBQUksQ0FBWTtJQUNoQixTQUFTLENBQVM7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLG9CQUFvQixDQUFZO0lBQ2hDLFdBQVcsQ0FBWTtJQUN2QixZQUFZLENBQVk7SUFFL0IsWUFBWSxTQUE0QixFQUFFLElBQW9DO1FBQzVFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFD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
@@ -0,0 +1,42 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ import type { IRouteConfig } from '@push.rocks/smartproxy';
3
+ import type { DcRouterApiClient } from './classes.dcrouterapiclient.js';
4
+ export declare class Route {
5
+ private clientRef;
6
+ routeConfig: IRouteConfig;
7
+ source: 'hardcoded' | 'programmatic';
8
+ enabled: boolean;
9
+ overridden: boolean;
10
+ storedRouteId?: string;
11
+ createdAt?: number;
12
+ updatedAt?: number;
13
+ get name(): string;
14
+ constructor(clientRef: DcRouterApiClient, data: interfaces.data.IMergedRoute);
15
+ update(changes: Partial<IRouteConfig>): Promise<void>;
16
+ delete(): Promise<void>;
17
+ toggle(enabled: boolean): Promise<void>;
18
+ setOverride(enabled: boolean): Promise<void>;
19
+ removeOverride(): Promise<void>;
20
+ }
21
+ export declare class RouteBuilder {
22
+ private clientRef;
23
+ private routeConfig;
24
+ private isEnabled;
25
+ constructor(clientRef: DcRouterApiClient);
26
+ setName(name: string): this;
27
+ setMatch(match: IRouteConfig['match']): this;
28
+ setAction(action: IRouteConfig['action']): this;
29
+ setTls(tls: IRouteConfig['action']['tls']): this;
30
+ setEnabled(enabled: boolean): this;
31
+ save(): Promise<Route>;
32
+ }
33
+ export declare class RouteManager {
34
+ private clientRef;
35
+ constructor(clientRef: DcRouterApiClient);
36
+ list(): Promise<{
37
+ routes: Route[];
38
+ warnings: interfaces.data.IRouteWarning[];
39
+ }>;
40
+ create(routeConfig: IRouteConfig, enabled?: boolean): Promise<Route>;
41
+ build(): RouteBuilder;
42
+ }
@@ -0,0 +1,154 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ export class Route {
3
+ clientRef;
4
+ // Data from IMergedRoute
5
+ routeConfig;
6
+ source;
7
+ enabled;
8
+ overridden;
9
+ storedRouteId;
10
+ createdAt;
11
+ updatedAt;
12
+ // Convenience accessors
13
+ get name() {
14
+ return this.routeConfig.name || '';
15
+ }
16
+ constructor(clientRef, data) {
17
+ this.clientRef = clientRef;
18
+ this.routeConfig = data.route;
19
+ this.source = data.source;
20
+ this.enabled = data.enabled;
21
+ this.overridden = data.overridden;
22
+ this.storedRouteId = data.storedRouteId;
23
+ this.createdAt = data.createdAt;
24
+ this.updatedAt = data.updatedAt;
25
+ }
26
+ async update(changes) {
27
+ if (!this.storedRouteId) {
28
+ throw new Error('Cannot update a hardcoded route. Use setOverride() instead.');
29
+ }
30
+ const response = await this.clientRef.request('updateRoute', this.clientRef.buildRequestPayload({ id: this.storedRouteId, route: changes }));
31
+ if (!response.success) {
32
+ throw new Error(response.message || 'Failed to update route');
33
+ }
34
+ }
35
+ async delete() {
36
+ if (!this.storedRouteId) {
37
+ throw new Error('Cannot delete a hardcoded route. Use setOverride() instead.');
38
+ }
39
+ const response = await this.clientRef.request('deleteRoute', this.clientRef.buildRequestPayload({ id: this.storedRouteId }));
40
+ if (!response.success) {
41
+ throw new Error(response.message || 'Failed to delete route');
42
+ }
43
+ }
44
+ async toggle(enabled) {
45
+ if (!this.storedRouteId) {
46
+ throw new Error('Cannot toggle a hardcoded route. Use setOverride() instead.');
47
+ }
48
+ const response = await this.clientRef.request('toggleRoute', this.clientRef.buildRequestPayload({ id: this.storedRouteId, enabled }));
49
+ if (!response.success) {
50
+ throw new Error(response.message || 'Failed to toggle route');
51
+ }
52
+ this.enabled = enabled;
53
+ }
54
+ async setOverride(enabled) {
55
+ const response = await this.clientRef.request('setRouteOverride', this.clientRef.buildRequestPayload({ routeName: this.name, enabled }));
56
+ if (!response.success) {
57
+ throw new Error(response.message || 'Failed to set route override');
58
+ }
59
+ this.overridden = true;
60
+ this.enabled = enabled;
61
+ }
62
+ async removeOverride() {
63
+ const response = await this.clientRef.request('removeRouteOverride', this.clientRef.buildRequestPayload({ routeName: this.name }));
64
+ if (!response.success) {
65
+ throw new Error(response.message || 'Failed to remove route override');
66
+ }
67
+ this.overridden = false;
68
+ }
69
+ }
70
+ export class RouteBuilder {
71
+ clientRef;
72
+ routeConfig = {};
73
+ isEnabled = true;
74
+ constructor(clientRef) {
75
+ this.clientRef = clientRef;
76
+ }
77
+ setName(name) {
78
+ this.routeConfig.name = name;
79
+ return this;
80
+ }
81
+ setMatch(match) {
82
+ this.routeConfig.match = match;
83
+ return this;
84
+ }
85
+ setAction(action) {
86
+ this.routeConfig.action = action;
87
+ return this;
88
+ }
89
+ setTls(tls) {
90
+ if (!this.routeConfig.action) {
91
+ this.routeConfig.action = { type: 'forward' };
92
+ }
93
+ this.routeConfig.action.tls = tls;
94
+ return this;
95
+ }
96
+ setEnabled(enabled) {
97
+ this.isEnabled = enabled;
98
+ return this;
99
+ }
100
+ async save() {
101
+ const response = await this.clientRef.request('createRoute', this.clientRef.buildRequestPayload({
102
+ route: this.routeConfig,
103
+ enabled: this.isEnabled,
104
+ }));
105
+ if (!response.success) {
106
+ throw new Error(response.message || 'Failed to create route');
107
+ }
108
+ // Return a Route instance by re-fetching the list
109
+ // The created route is programmatic, so we find it by storedRouteId
110
+ const { routes } = await new RouteManager(this.clientRef).list();
111
+ const created = routes.find((r) => r.storedRouteId === response.storedRouteId);
112
+ if (created) {
113
+ return created;
114
+ }
115
+ // Fallback: construct from known data
116
+ return new Route(this.clientRef, {
117
+ route: this.routeConfig,
118
+ source: 'programmatic',
119
+ enabled: this.isEnabled,
120
+ overridden: false,
121
+ storedRouteId: response.storedRouteId,
122
+ });
123
+ }
124
+ }
125
+ export class RouteManager {
126
+ clientRef;
127
+ constructor(clientRef) {
128
+ this.clientRef = clientRef;
129
+ }
130
+ async list() {
131
+ const response = await this.clientRef.request('getMergedRoutes', this.clientRef.buildRequestPayload());
132
+ return {
133
+ routes: response.routes.map((r) => new Route(this.clientRef, r)),
134
+ warnings: response.warnings,
135
+ };
136
+ }
137
+ async create(routeConfig, enabled) {
138
+ const response = await this.clientRef.request('createRoute', this.clientRef.buildRequestPayload({ route: routeConfig, enabled: enabled ?? true }));
139
+ if (!response.success) {
140
+ throw new Error(response.message || 'Failed to create route');
141
+ }
142
+ return new Route(this.clientRef, {
143
+ route: routeConfig,
144
+ source: 'programmatic',
145
+ enabled: enabled ?? true,
146
+ overridden: false,
147
+ storedRouteId: response.storedRouteId,
148
+ });
149
+ }
150
+ build() {
151
+ return new RouteBuilder(this.clientRef);
152
+ }
153
+ }
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5yb3V0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2FwaWNsaWVudC9jbGFzc2VzLnJvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFJeEQsTUFBTSxPQUFPLEtBQUs7SUFDUixTQUFTLENBQW9CO0lBRXJDLHlCQUF5QjtJQUNsQixXQUFXLENBQWU7SUFDMUIsTUFBTSxDQUErQjtJQUNyQyxPQUFPLENBQVU7SUFDakIsVUFBVSxDQUFVO0lBQ3BCLGFBQWEsQ0FBVTtJQUN2QixTQUFTLENBQVU7SUFDbkIsU0FBUyxDQUFVO0lBRTFCLHdCQUF3QjtJQUN4QixJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsWUFBWSxTQUE0QixFQUFFLElBQWtDO1FBQzFFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUE4QjtRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFB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