@serve.zone/dcrouter 15.0.2 → 15.0.4
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/deno.json +1 -1
- package/dist_serve/bundle.js +768 -768
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.js +9 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate/acme.d.ts +17 -0
- package/dist_ts_web/appstate/acme.js +64 -0
- package/dist_ts_web/appstate/certificates.d.ts +37 -0
- package/dist_ts_web/appstate/certificates.js +107 -0
- package/dist_ts_web/appstate/config.d.ts +9 -0
- package/dist_ts_web/appstate/config.js +35 -0
- package/dist_ts_web/appstate/domains.d.ts +80 -0
- package/dist_ts_web/appstate/domains.js +324 -0
- package/dist_ts_web/appstate/email-domains.d.ts +25 -0
- package/dist_ts_web/appstate/email-domains.js +104 -0
- package/dist_ts_web/appstate/email-ops.d.ts +10 -0
- package/dist_ts_web/appstate/email-ops.js +40 -0
- package/dist_ts_web/appstate/login.d.ts +30 -0
- package/dist_ts_web/appstate/login.js +83 -0
- package/dist_ts_web/appstate/logs.d.ts +16 -0
- package/dist_ts_web/appstate/logs.js +27 -0
- package/dist_ts_web/appstate/network.d.ts +50 -0
- package/dist_ts_web/appstate/network.js +122 -0
- package/dist_ts_web/appstate/profiles-targets.d.ts +45 -0
- package/dist_ts_web/appstate/profiles-targets.js +173 -0
- package/dist_ts_web/appstate/remoteingress.d.ts +47 -0
- package/dist_ts_web/appstate/remoteingress.js +204 -0
- package/dist_ts_web/appstate/routes.d.ts +76 -0
- package/dist_ts_web/appstate/routes.js +316 -0
- package/dist_ts_web/appstate/runtime.d.ts +1 -0
- package/dist_ts_web/appstate/runtime.js +276 -0
- package/dist_ts_web/appstate/security.d.ts +29 -0
- package/dist_ts_web/appstate/security.js +167 -0
- package/dist_ts_web/appstate/shared.d.ts +3 -0
- package/dist_ts_web/appstate/shared.js +13 -0
- package/dist_ts_web/appstate/stats.d.ts +15 -0
- package/dist_ts_web/appstate/stats.js +59 -0
- package/dist_ts_web/appstate/target-profiles.d.ts +37 -0
- package/dist_ts_web/appstate/target-profiles.js +118 -0
- package/dist_ts_web/appstate/ui.d.ts +11 -0
- package/dist_ts_web/appstate/ui.js +55 -0
- package/dist_ts_web/appstate/users.d.ts +27 -0
- package/dist_ts_web/appstate/users.js +85 -0
- package/dist_ts_web/appstate/vpn.d.ts +44 -0
- package/dist_ts_web/appstate/vpn.js +148 -0
- package/dist_ts_web/appstate.d.ts +20 -568
- package/dist_ts_web/appstate.js +24 -2418
- package/package.json +3 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +10 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate/acme.ts +93 -0
- package/ts_web/appstate/certificates.ts +159 -0
- package/ts_web/appstate/config.ts +49 -0
- package/ts_web/appstate/domains.ts +429 -0
- package/ts_web/appstate/email-domains.ts +155 -0
- package/ts_web/appstate/email-ops.ts +57 -0
- package/ts_web/appstate/login.ts +128 -0
- package/ts_web/appstate/logs.ts +50 -0
- package/ts_web/appstate/network.ts +161 -0
- package/ts_web/appstate/profiles-targets.ts +240 -0
- package/ts_web/appstate/remoteingress.ts +300 -0
- package/ts_web/appstate/routes.ts +447 -0
- package/ts_web/appstate/runtime.ts +308 -0
- package/ts_web/appstate/security.ts +229 -0
- package/ts_web/appstate/shared.ts +15 -0
- package/ts_web/appstate/stats.ts +79 -0
- package/ts_web/appstate/target-profiles.ts +164 -0
- package/ts_web/appstate/ui.ts +75 -0
- package/ts_web/appstate/users.ts +133 -0
- package/ts_web/appstate/vpn.ts +234 -0
- package/ts_web/appstate.ts +24 -3403
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
export interface ISecurityPolicyState {
|
|
4
|
+
rules: interfaces.data.ISecurityBlockRule[];
|
|
5
|
+
ipIntelligence: interfaces.data.IIpIntelligenceRecord[];
|
|
6
|
+
compiledPolicy: interfaces.data.ISecurityCompiledPolicy | null;
|
|
7
|
+
auditEvents: interfaces.data.ISecurityPolicyAuditEvent[];
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
error: string | null;
|
|
10
|
+
lastUpdated: number;
|
|
11
|
+
}
|
|
12
|
+
export declare const securityPolicyStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, ISecurityPolicyState>;
|
|
13
|
+
export declare const fetchSecurityPolicyAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ISecurityPolicyState, unknown>;
|
|
14
|
+
export declare const createSecurityBlockRuleAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ISecurityPolicyState, {
|
|
15
|
+
type: interfaces.data.TSecurityBlockRuleType;
|
|
16
|
+
value: string;
|
|
17
|
+
matchMode?: interfaces.data.TSecurityBlockRuleMatchMode;
|
|
18
|
+
reason?: string;
|
|
19
|
+
enabled?: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
export declare const updateSecurityBlockRuleAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ISecurityPolicyState, {
|
|
22
|
+
id: string;
|
|
23
|
+
value?: string;
|
|
24
|
+
matchMode?: interfaces.data.TSecurityBlockRuleMatchMode;
|
|
25
|
+
reason?: string;
|
|
26
|
+
enabled?: boolean;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const deleteSecurityBlockRuleAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ISecurityPolicyState, string>;
|
|
29
|
+
export declare const refreshIpIntelligenceAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ISecurityPolicyState, string>;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
import { appState } from './shared.js';
|
|
4
|
+
import { getActionContext } from './login.js';
|
|
5
|
+
import { runBackgroundRefresh } from './shared.js';
|
|
6
|
+
export const securityPolicyStatePart = await appState.getStatePart('securityPolicy', {
|
|
7
|
+
rules: [],
|
|
8
|
+
ipIntelligence: [],
|
|
9
|
+
compiledPolicy: null,
|
|
10
|
+
auditEvents: [],
|
|
11
|
+
isLoading: false,
|
|
12
|
+
error: null,
|
|
13
|
+
lastUpdated: 0,
|
|
14
|
+
}, 'soft');
|
|
15
|
+
function refreshSecurityIpIntelligence(identity) {
|
|
16
|
+
runBackgroundRefresh('securityIpIntelligence', 'Security IP intelligence refresh failed:', async () => {
|
|
17
|
+
const intelligenceRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listIpIntelligence');
|
|
18
|
+
const intelligenceResponse = await intelligenceRequest.fire({
|
|
19
|
+
identity,
|
|
20
|
+
limit: 500,
|
|
21
|
+
});
|
|
22
|
+
securityPolicyStatePart.setState({
|
|
23
|
+
...securityPolicyStatePart.getState(),
|
|
24
|
+
ipIntelligence: intelligenceResponse.records || [],
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
// Security Policy Actions
|
|
29
|
+
// ============================================================================
|
|
30
|
+
export const fetchSecurityPolicyAction = securityPolicyStatePart.createAction(async (statePartArg) => {
|
|
31
|
+
const context = getActionContext();
|
|
32
|
+
const currentState = statePartArg.getState();
|
|
33
|
+
if (!context.identity)
|
|
34
|
+
return currentState;
|
|
35
|
+
try {
|
|
36
|
+
const rulesRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listSecurityBlockRules');
|
|
37
|
+
const compiledPolicyRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCompiledSecurityPolicy');
|
|
38
|
+
const auditRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listSecurityPolicyAudit');
|
|
39
|
+
const [rulesResponse, compiledPolicyResponse, auditResponse] = await Promise.all([
|
|
40
|
+
rulesRequest.fire({ identity: context.identity }),
|
|
41
|
+
compiledPolicyRequest.fire({ identity: context.identity }),
|
|
42
|
+
auditRequest.fire({ identity: context.identity, limit: 100 }),
|
|
43
|
+
]);
|
|
44
|
+
refreshSecurityIpIntelligence(context.identity);
|
|
45
|
+
return {
|
|
46
|
+
rules: rulesResponse.rules || [],
|
|
47
|
+
ipIntelligence: currentState.ipIntelligence,
|
|
48
|
+
compiledPolicy: compiledPolicyResponse.policy,
|
|
49
|
+
auditEvents: auditResponse.events || [],
|
|
50
|
+
isLoading: false,
|
|
51
|
+
error: null,
|
|
52
|
+
lastUpdated: Date.now(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
...currentState,
|
|
58
|
+
isLoading: false,
|
|
59
|
+
error: error instanceof Error ? error.message : 'Failed to fetch security policy',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
export const createSecurityBlockRuleAction = securityPolicyStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
|
|
64
|
+
const context = getActionContext();
|
|
65
|
+
const currentState = statePartArg.getState();
|
|
66
|
+
if (!context.identity)
|
|
67
|
+
return currentState;
|
|
68
|
+
try {
|
|
69
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createSecurityBlockRule');
|
|
70
|
+
const response = await request.fire({
|
|
71
|
+
identity: context.identity,
|
|
72
|
+
type: dataArg.type,
|
|
73
|
+
value: dataArg.value,
|
|
74
|
+
matchMode: dataArg.matchMode,
|
|
75
|
+
reason: dataArg.reason,
|
|
76
|
+
enabled: dataArg.enabled,
|
|
77
|
+
});
|
|
78
|
+
if (!response.success) {
|
|
79
|
+
return { ...currentState, error: response.message || 'Failed to create security block rule' };
|
|
80
|
+
}
|
|
81
|
+
return await actionContext.dispatch(fetchSecurityPolicyAction, null);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
return {
|
|
85
|
+
...currentState,
|
|
86
|
+
error: error instanceof Error ? error.message : 'Failed to create security block rule',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
export const updateSecurityBlockRuleAction = securityPolicyStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
|
|
91
|
+
const context = getActionContext();
|
|
92
|
+
const currentState = statePartArg.getState();
|
|
93
|
+
if (!context.identity)
|
|
94
|
+
return currentState;
|
|
95
|
+
try {
|
|
96
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateSecurityBlockRule');
|
|
97
|
+
const response = await request.fire({
|
|
98
|
+
identity: context.identity,
|
|
99
|
+
id: dataArg.id,
|
|
100
|
+
value: dataArg.value,
|
|
101
|
+
matchMode: dataArg.matchMode,
|
|
102
|
+
reason: dataArg.reason,
|
|
103
|
+
enabled: dataArg.enabled,
|
|
104
|
+
});
|
|
105
|
+
if (!response.success) {
|
|
106
|
+
return { ...currentState, error: response.message || 'Failed to update security block rule' };
|
|
107
|
+
}
|
|
108
|
+
return await actionContext.dispatch(fetchSecurityPolicyAction, null);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
return {
|
|
112
|
+
...currentState,
|
|
113
|
+
error: error instanceof Error ? error.message : 'Failed to update security block rule',
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
export const deleteSecurityBlockRuleAction = securityPolicyStatePart.createAction(async (statePartArg, ruleId, actionContext) => {
|
|
118
|
+
const context = getActionContext();
|
|
119
|
+
const currentState = statePartArg.getState();
|
|
120
|
+
if (!context.identity)
|
|
121
|
+
return currentState;
|
|
122
|
+
try {
|
|
123
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteSecurityBlockRule');
|
|
124
|
+
const response = await request.fire({ identity: context.identity, id: ruleId });
|
|
125
|
+
if (!response.success) {
|
|
126
|
+
return { ...currentState, error: response.message || 'Failed to delete security block rule' };
|
|
127
|
+
}
|
|
128
|
+
return await actionContext.dispatch(fetchSecurityPolicyAction, null);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return {
|
|
132
|
+
...currentState,
|
|
133
|
+
error: error instanceof Error ? error.message : 'Failed to delete security block rule',
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
export const refreshIpIntelligenceAction = securityPolicyStatePart.createAction(async (statePartArg, ipAddress, actionContext) => {
|
|
138
|
+
const context = getActionContext();
|
|
139
|
+
const currentState = statePartArg.getState();
|
|
140
|
+
if (!context.identity)
|
|
141
|
+
return currentState;
|
|
142
|
+
try {
|
|
143
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'refreshIpIntelligence');
|
|
144
|
+
const response = await request.fire({ identity: context.identity, ipAddress });
|
|
145
|
+
if (!response.success) {
|
|
146
|
+
return { ...currentState, error: response.message || 'Failed to refresh IP intelligence' };
|
|
147
|
+
}
|
|
148
|
+
const refreshedState = await actionContext.dispatch(fetchSecurityPolicyAction, null);
|
|
149
|
+
if (!response.record)
|
|
150
|
+
return refreshedState;
|
|
151
|
+
return {
|
|
152
|
+
...refreshedState,
|
|
153
|
+
ipIntelligence: [
|
|
154
|
+
response.record,
|
|
155
|
+
...refreshedState.ipIntelligence.filter((record) => record.ipAddress !== response.record.ipAddress),
|
|
156
|
+
],
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return {
|
|
161
|
+
...currentState,
|
|
162
|
+
error: error instanceof Error ? error.message : 'Failed to refresh IP intelligence',
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// ============================================================================
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90c193ZWIvYXBwc3RhdGUvc2VjdXJpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLFVBQVUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFZbkQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUNoRSxnQkFBZ0IsRUFDaEI7SUFDRSxLQUFLLEVBQUUsRUFBRTtJQUNULGNBQWMsRUFBRSxFQUFFO0lBQ2xCLGNBQWMsRUFBRSxJQUFJO0lBQ3BCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsU0FBUyxFQUFFLEtBQUs7SUFDaEIsS0FBSyxFQUFFLElBQUk7SUFDWCxXQUFXLEVBQUUsQ0FBQztDQUNmLEVBQ0QsTUFBTSxDQUNQLENBQUM7QUFFRixTQUFTLDZCQUE2QixDQUFDLFFBQW1DO0lBQ3hFLG9CQUFvQixDQUFDLHdCQUF3QixFQUFFLDBDQUEwQyxFQUFFLEtBQUssSUFBSSxFQUFFO1FBQ3BHLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUVoRixlQUFlLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUN6QyxNQUFNLG9CQUFvQixHQUFHLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzFELFFBQVE7WUFDUixLQUFLLEVBQUUsR0FBRztTQUNYLENBQUMsQ0FBQztRQUNILHVCQUF1QixDQUFDLFFBQVEsQ0FBQztZQUMvQixHQUFHLHVCQUF1QixDQUFD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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
// Create main app state instance
|
|
3
|
+
export const appState = new plugins.domtools.plugins.smartstate.Smartstate();
|
|
4
|
+
const backgroundRefreshesInFlight = new Set();
|
|
5
|
+
export function runBackgroundRefresh(key, errorMessage, task) {
|
|
6
|
+
if (backgroundRefreshesInFlight.has(key))
|
|
7
|
+
return;
|
|
8
|
+
backgroundRefreshesInFlight.add(key);
|
|
9
|
+
void task()
|
|
10
|
+
.catch((error) => console.error(errorMessage, error))
|
|
11
|
+
.finally(() => backgroundRefreshesInFlight.delete(key));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHNfd2ViL2FwcHN0YXRlL3NoYXJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxpQ0FBaUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBRTdFLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUV0RCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBVyxFQUFFLFlBQW9CLEVBQUUsSUFBeUI7SUFDL0YsSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTztJQUNqRCwyQkFBMkIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsS0FBSyxJQUFJLEVBQUU7U0FDUixLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3BELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM1RCxDQUFDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
export interface IStatsState {
|
|
4
|
+
serverStats: interfaces.data.IServerStats | null;
|
|
5
|
+
emailStats: interfaces.data.IEmailStats | null;
|
|
6
|
+
dnsStats: interfaces.data.IDnsStats | null;
|
|
7
|
+
securityMetrics: interfaces.data.ISecurityMetrics | null;
|
|
8
|
+
radiusStats: interfaces.data.IRadiusStats | null;
|
|
9
|
+
vpnStats: interfaces.data.IVpnStats | null;
|
|
10
|
+
lastUpdated: number;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
error: string | null;
|
|
13
|
+
}
|
|
14
|
+
export declare const statsStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, IStatsState>;
|
|
15
|
+
export declare const fetchAllStatsAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IStatsState, unknown>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
import { appState } from './shared.js';
|
|
4
|
+
import { getActionContext } from './login.js';
|
|
5
|
+
export const statsStatePart = await appState.getStatePart('stats', {
|
|
6
|
+
serverStats: null,
|
|
7
|
+
emailStats: null,
|
|
8
|
+
dnsStats: null,
|
|
9
|
+
securityMetrics: null,
|
|
10
|
+
radiusStats: null,
|
|
11
|
+
vpnStats: null,
|
|
12
|
+
lastUpdated: 0,
|
|
13
|
+
isLoading: false,
|
|
14
|
+
error: null,
|
|
15
|
+
}, 'soft' // Stats are cached but not persisted
|
|
16
|
+
);
|
|
17
|
+
// Fetch All Stats Action - Using combined endpoint for efficiency
|
|
18
|
+
export const fetchAllStatsAction = statsStatePart.createAction(async (statePartArg) => {
|
|
19
|
+
const context = getActionContext();
|
|
20
|
+
const currentState = statePartArg.getState();
|
|
21
|
+
if (!context.identity)
|
|
22
|
+
return currentState;
|
|
23
|
+
try {
|
|
24
|
+
// Use combined metrics endpoint - single request instead of 4
|
|
25
|
+
const combinedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCombinedMetrics');
|
|
26
|
+
const combinedResponse = await combinedRequest.fire({
|
|
27
|
+
identity: context.identity,
|
|
28
|
+
sections: {
|
|
29
|
+
server: true,
|
|
30
|
+
email: true,
|
|
31
|
+
dns: true,
|
|
32
|
+
security: true,
|
|
33
|
+
network: false, // Network is fetched separately for the network view
|
|
34
|
+
radius: true,
|
|
35
|
+
vpn: true,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
// Update state with all stats from combined response
|
|
39
|
+
return {
|
|
40
|
+
serverStats: combinedResponse.metrics.server || currentState.serverStats,
|
|
41
|
+
emailStats: combinedResponse.metrics.email || currentState.emailStats,
|
|
42
|
+
dnsStats: combinedResponse.metrics.dns || currentState.dnsStats,
|
|
43
|
+
securityMetrics: combinedResponse.metrics.security || currentState.securityMetrics,
|
|
44
|
+
radiusStats: combinedResponse.metrics.radius || currentState.radiusStats,
|
|
45
|
+
vpnStats: combinedResponse.metrics.vpn || currentState.vpnStats,
|
|
46
|
+
lastUpdated: Date.now(),
|
|
47
|
+
isLoading: false,
|
|
48
|
+
error: null,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return {
|
|
53
|
+
...currentState,
|
|
54
|
+
isLoading: false,
|
|
55
|
+
error: error.message || 'Failed to fetch statistics',
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90c193ZWIvYXBwc3RhdGUvc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLFVBQVUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQWM5QyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUN2RCxPQUFPLEVBQ1A7SUFDRSxXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsSUFBSTtJQUNoQixRQUFRLEVBQUUsSUFBSTtJQUNkLGVBQWUsRUFBRSxJQUFJO0lBQ3JCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsV0FBVyxFQUFFLENBQUM7SUFDZCxTQUFTLEVBQUUsS0FBSztJQUNoQixLQUFLLEVBQUUsSUFBSTtDQUNaLEVBQ0QsTUFBTSxDQUFDLHFDQUFxQztDQUM3QyxDQUFDO0FBRUYsa0VBQWtFO0FBQ2xFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBd0IsRUFBRTtJQUMxRyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUcsQ0FBQztJQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7UUFBRSxPQUFPLFlBQVksQ0FBQztJQUUzQyxJQUFJLENBQUM7UUFDSCw4REFBOEQ7UUFDOUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUU1RSxlQUFlLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQUV6QyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sZUFBZSxDQUFDLElBQUksQ0FBQztZQUNsRCxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsUUFBUSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEtBQUssRUFBRSxJQUFJO2dCQUNYLEdBQUcsRUFBRSxJQUFJO2dCQUNULFFBQVEsRUFBRSxJQUFJO2dCQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUscURBQXFEO2dCQUNyRSxNQUFNLEVBQUUsSUFBSTtnQkFDWixHQUFHLEVBQUUsSUFBSTthQUNWO1NBQ0YsQ0FBQyxDQUFDO1FBRUgscURBQXFEO1FBQ3JELE9BQU87WUFDTCxXQUFXLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsV0FBVztZQUN4RSxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUMsVUFBVTtZQUNyRSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUTtZQUMvRCxlQUFlLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsZUFBZTtZQUNsRixXQUFXLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsV0FBVztZQUN4RSxRQUFRLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUTtZQUMvRCxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsSUFBSTtTQUNaLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixPQUFPO1lBQ0wsR0FBRyxZQUFZO1lBQ2YsU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFHLEtBQWUsQ0FBQyxPQUFPLElBQUksNEJBQTRCO1NBQ2hFLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
export interface ITargetProfilesState {
|
|
4
|
+
profiles: interfaces.data.ITargetProfile[];
|
|
5
|
+
isLoading: boolean;
|
|
6
|
+
error: string | null;
|
|
7
|
+
lastUpdated: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const targetProfilesStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, ITargetProfilesState>;
|
|
10
|
+
export declare const fetchTargetProfilesAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ITargetProfilesState, unknown>;
|
|
11
|
+
export declare const createTargetProfileAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ITargetProfilesState, {
|
|
12
|
+
name: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
domains?: string[];
|
|
15
|
+
targets?: Array<{
|
|
16
|
+
ip: string;
|
|
17
|
+
port: number;
|
|
18
|
+
}>;
|
|
19
|
+
routeRefs?: string[];
|
|
20
|
+
allowRoutesByClientSourceIp?: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
export declare const updateTargetProfileAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ITargetProfilesState, {
|
|
23
|
+
id: string;
|
|
24
|
+
name?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
domains?: string[];
|
|
27
|
+
targets?: Array<{
|
|
28
|
+
ip: string;
|
|
29
|
+
port: number;
|
|
30
|
+
}>;
|
|
31
|
+
routeRefs?: string[];
|
|
32
|
+
allowRoutesByClientSourceIp?: boolean;
|
|
33
|
+
}>;
|
|
34
|
+
export declare const deleteTargetProfileAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<ITargetProfilesState, {
|
|
35
|
+
id: string;
|
|
36
|
+
force?: boolean;
|
|
37
|
+
}>;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
import { appState } from './shared.js';
|
|
4
|
+
import { getActionContext } from './login.js';
|
|
5
|
+
export const targetProfilesStatePart = await appState.getStatePart('targetProfiles', {
|
|
6
|
+
profiles: [],
|
|
7
|
+
isLoading: false,
|
|
8
|
+
error: null,
|
|
9
|
+
lastUpdated: 0,
|
|
10
|
+
}, 'soft');
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Target Profiles Actions
|
|
13
|
+
// ============================================================================
|
|
14
|
+
export const fetchTargetProfilesAction = targetProfilesStatePart.createAction(async (statePartArg) => {
|
|
15
|
+
const context = getActionContext();
|
|
16
|
+
const currentState = statePartArg.getState();
|
|
17
|
+
if (!context.identity)
|
|
18
|
+
return currentState;
|
|
19
|
+
try {
|
|
20
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getTargetProfiles');
|
|
21
|
+
const response = await request.fire({ identity: context.identity });
|
|
22
|
+
return {
|
|
23
|
+
profiles: response.profiles,
|
|
24
|
+
isLoading: false,
|
|
25
|
+
error: null,
|
|
26
|
+
lastUpdated: Date.now(),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return {
|
|
31
|
+
...currentState,
|
|
32
|
+
isLoading: false,
|
|
33
|
+
error: error instanceof Error ? error.message : 'Failed to fetch target profiles',
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
export const createTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
|
|
38
|
+
const context = getActionContext();
|
|
39
|
+
try {
|
|
40
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createTargetProfile');
|
|
41
|
+
const response = await request.fire({
|
|
42
|
+
identity: context.identity,
|
|
43
|
+
name: dataArg.name,
|
|
44
|
+
description: dataArg.description,
|
|
45
|
+
domains: dataArg.domains,
|
|
46
|
+
targets: dataArg.targets,
|
|
47
|
+
routeRefs: dataArg.routeRefs,
|
|
48
|
+
allowRoutesByClientSourceIp: dataArg.allowRoutesByClientSourceIp,
|
|
49
|
+
});
|
|
50
|
+
if (!response.success) {
|
|
51
|
+
return {
|
|
52
|
+
...statePartArg.getState(),
|
|
53
|
+
error: response.message || 'Failed to create target profile',
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return await actionContext.dispatch(fetchTargetProfilesAction, null);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
return {
|
|
60
|
+
...statePartArg.getState(),
|
|
61
|
+
error: error instanceof Error ? error.message : 'Failed to create target profile',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
export const updateTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
|
|
66
|
+
const context = getActionContext();
|
|
67
|
+
try {
|
|
68
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateTargetProfile');
|
|
69
|
+
const response = await request.fire({
|
|
70
|
+
identity: context.identity,
|
|
71
|
+
id: dataArg.id,
|
|
72
|
+
name: dataArg.name,
|
|
73
|
+
description: dataArg.description,
|
|
74
|
+
domains: dataArg.domains,
|
|
75
|
+
targets: dataArg.targets,
|
|
76
|
+
routeRefs: dataArg.routeRefs,
|
|
77
|
+
allowRoutesByClientSourceIp: dataArg.allowRoutesByClientSourceIp,
|
|
78
|
+
});
|
|
79
|
+
if (!response.success) {
|
|
80
|
+
return {
|
|
81
|
+
...statePartArg.getState(),
|
|
82
|
+
error: response.message || 'Failed to update target profile',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return await actionContext.dispatch(fetchTargetProfilesAction, null);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
...statePartArg.getState(),
|
|
90
|
+
error: error instanceof Error ? error.message : 'Failed to update target profile',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
export const deleteTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
|
|
95
|
+
const context = getActionContext();
|
|
96
|
+
try {
|
|
97
|
+
const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteTargetProfile');
|
|
98
|
+
const response = await request.fire({
|
|
99
|
+
identity: context.identity,
|
|
100
|
+
id: dataArg.id,
|
|
101
|
+
force: dataArg.force,
|
|
102
|
+
});
|
|
103
|
+
if (!response.success) {
|
|
104
|
+
return {
|
|
105
|
+
...statePartArg.getState(),
|
|
106
|
+
error: response.message || 'Failed to delete target profile',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
return await actionContext.dispatch(fetchTargetProfilesAction, null);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return {
|
|
113
|
+
...statePartArg.getState(),
|
|
114
|
+
error: error instanceof Error ? error.message : 'Failed to delete target profile',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LXByb2ZpbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHNfd2ViL2FwcHN0YXRlL3RhcmdldC1wcm9maWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEtBQUssVUFBVSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBWTlDLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FDaEUsZ0JBQWdCLEVBQ2hCO0lBQ0UsUUFBUSxFQUFFLEVBQUU7SUFDWixTQUFTLEVBQUUsS0FBSztJQUNoQixLQUFLLEVBQUUsSUFBSTtJQUNYLFdBQVcsRUFBRSxDQUFDO0NBQ2YsRUFDRCxNQUFNLENBQ1AsQ0FBQztBQUVGLCtFQUErRTtBQUMvRSwwQkFBMEI7QUFDMUIsK0VBQStFO0FBRS9FLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHVCQUF1QixDQUFDLFlBQVksQ0FDM0UsS0FBSyxFQUFFLFlBQVksRUFBaUMsRUFBRTtJQUNwRCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBQ25DLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUcsQ0FBQztJQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7UUFBRSxPQUFPLFlBQVksQ0FBQztJQUUzQyxJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBRXBFLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRXhDLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUVwRSxPQUFPO1lBQ0wsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1lBQzNCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsV0FBVyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7U0FDeEIsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTztZQUNMLEdBQUcsWUFBWTtZQUNmLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7U0FDbEYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHVCQUF1QixDQUFDLFlBQVksQ0FPMUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFpQyxFQUFFO0lBQy9FLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUVwRSxlQUFlLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFTO1lBQzNCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsMkJBQTJCLEVBQUUsT0FBTyxDQUFDLDJCQUEyQjtTQUNqRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0wsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFHO2dCQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxpQ0FBaUM7YUFDN0QsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sYUFBYyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixPQUFPO1lBQ0wsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFHO1lBQzNCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7U0FDbEYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHVCQUF1QixDQUFDLFlBQVksQ0FRMUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFpQyxFQUFFO0lBQy9FLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUVwRSxlQUFlLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFTO1lBQzNCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNkLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDaEMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsMkJBQTJCLEVBQUUsT0FBTyxDQUFDLDJCQUEyQjtTQUNqRSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0wsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFHO2dCQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxpQ0FBaUM7YUFDN0QsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sYUFBYyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixPQUFPO1lBQ0wsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFHO1lBQzNCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7U0FDbEYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHVCQUF1QixDQUFDLFlBQVksQ0FHMUUsS0FBSyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFpQyxFQUFFO0lBQy9FLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUVwRSxlQUFlLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFTO1lBQzNCLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtZQUNkLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RCLE9BQU87Z0JBQ0wsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFHO2dCQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sSUFBSSxpQ0FBaUM7YUFDN0QsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sYUFBYyxDQUFDLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixPQUFPO1lBQ0wsR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFHO1lBQzNCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7U0FDbEYsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface IUiState {
|
|
2
|
+
activeView: string;
|
|
3
|
+
activeSubview: string | null;
|
|
4
|
+
sidebarCollapsed: boolean;
|
|
5
|
+
autoRefresh: boolean;
|
|
6
|
+
refreshInterval: number;
|
|
7
|
+
theme: 'light' | 'dark';
|
|
8
|
+
}
|
|
9
|
+
export declare const uiStatePart: import("@push.rocks/smartstate").StatePart<string, IUiState>;
|
|
10
|
+
export declare const toggleAutoRefreshAction: import("@push.rocks/smartstate").StateAction<IUiState, unknown>;
|
|
11
|
+
export declare const setActiveViewAction: import("@push.rocks/smartstate").StateAction<IUiState, string>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { appState } from './shared.js';
|
|
2
|
+
import { networkStatePart, fetchNetworkStatsAction } from './network.js';
|
|
3
|
+
import { certificateStatePart, fetchCertificateOverviewAction } from './certificates.js';
|
|
4
|
+
// Determine initial view from URL path
|
|
5
|
+
const getInitialView = () => {
|
|
6
|
+
const path = typeof window !== 'undefined' ? window.location.pathname : '/';
|
|
7
|
+
const validViews = ['overview', 'network', 'email', 'logs', 'access', 'security', 'domains'];
|
|
8
|
+
const segments = path.split('/').filter(Boolean);
|
|
9
|
+
const view = segments[0];
|
|
10
|
+
return validViews.includes(view) ? view : 'overview';
|
|
11
|
+
};
|
|
12
|
+
// Determine initial subview (second URL segment) from the path
|
|
13
|
+
const getInitialSubview = () => {
|
|
14
|
+
const path = typeof window !== 'undefined' ? window.location.pathname : '/';
|
|
15
|
+
const segments = path.split('/').filter(Boolean);
|
|
16
|
+
return segments[1] ?? null;
|
|
17
|
+
};
|
|
18
|
+
export const uiStatePart = await appState.getStatePart('ui', {
|
|
19
|
+
activeView: getInitialView(),
|
|
20
|
+
activeSubview: getInitialSubview(),
|
|
21
|
+
sidebarCollapsed: false,
|
|
22
|
+
autoRefresh: true,
|
|
23
|
+
refreshInterval: 1000, // 1 second
|
|
24
|
+
theme: 'light',
|
|
25
|
+
});
|
|
26
|
+
// Toggle Auto Refresh Action
|
|
27
|
+
export const toggleAutoRefreshAction = uiStatePart.createAction(async (statePartArg) => {
|
|
28
|
+
const currentState = statePartArg.getState();
|
|
29
|
+
return {
|
|
30
|
+
...currentState,
|
|
31
|
+
autoRefresh: !currentState.autoRefresh,
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
// Set Active View Action
|
|
35
|
+
export const setActiveViewAction = uiStatePart.createAction(async (statePartArg, viewName) => {
|
|
36
|
+
const currentState = statePartArg.getState();
|
|
37
|
+
// If switching to network view, ensure we fetch network data
|
|
38
|
+
if (viewName === 'network' && currentState.activeView !== 'network') {
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
networkStatePart.dispatchAction(fetchNetworkStatsAction, null);
|
|
41
|
+
}, 100);
|
|
42
|
+
}
|
|
43
|
+
// If switching to the Domains group, ensure we fetch certificate data
|
|
44
|
+
// (Certificates is a subview of Domains).
|
|
45
|
+
if (viewName === 'domains' && currentState.activeView !== 'domains') {
|
|
46
|
+
setTimeout(() => {
|
|
47
|
+
certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
|
|
48
|
+
}, 100);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
...currentState,
|
|
52
|
+
activeView: viewName,
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90c193ZWIvYXBwc3RhdGUvdWkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLDhCQUE4QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFXekYsdUNBQXVDO0FBQ3ZDLE1BQU0sY0FBYyxHQUFHLEdBQVcsRUFBRTtJQUNsQyxNQUFNLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDNUUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztBQUN2RCxDQUFDLENBQUM7QUFFRiwrREFBK0Q7QUFDL0QsTUFBTSxpQkFBaUIsR0FBRyxHQUFrQixFQUFFO0lBQzVDLE1BQU0sSUFBSSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUM1RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDN0IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FDcEQsSUFBSSxFQUNKO0lBQ0UsVUFBVSxFQUFFLGNBQWMsRUFBRTtJQUM1QixhQUFhLEVBQUUsaUJBQWlCLEVBQUU7SUFDbEMsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixXQUFXLEVBQUUsSUFBSTtJQUNqQixlQUFlLEVBQUUsSUFBSSxFQUFFLFdBQVc7SUFDbEMsS0FBSyxFQUFFLE9BQU87Q0FDZixDQUNGLENBQUM7QUFFRiw2QkFBNkI7QUFDN0IsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFxQixFQUFFO0lBQ3hHLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUcsQ0FBQztJQUM5QyxPQUFPO1FBQ0wsR0FBRyxZQUFZO1FBQ2YsV0FBVyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVc7S0FDdkMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQVMsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQXFCLEVBQUU7SUFDdEgsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsRUFBRyxDQUFDO0lBRTlDLDZEQUE2RDtJQUM3RCxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksWUFBWSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsMENBQTBDO0lBQzFDLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxZQUFZLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3BFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsOEJBQThCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELE9BQU87UUFDTCxHQUFHLFlBQVk7UUFDZixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as interfaces from '../../dist_ts_interfaces/index.js';
|
|
3
|
+
export interface IUser {
|
|
4
|
+
id: string;
|
|
5
|
+
username: string;
|
|
6
|
+
email?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
role: string;
|
|
9
|
+
status?: 'active' | 'disabled';
|
|
10
|
+
authSources?: Array<'local' | 'idp.global'>;
|
|
11
|
+
}
|
|
12
|
+
export interface IUsersState {
|
|
13
|
+
users: IUser[];
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
error: string | null;
|
|
16
|
+
lastUpdated: number;
|
|
17
|
+
}
|
|
18
|
+
export declare const usersStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, IUsersState>;
|
|
19
|
+
export declare const fetchUsersAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IUsersState, unknown>;
|
|
20
|
+
export declare const createUserAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IUsersState, {
|
|
21
|
+
email: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
role: interfaces.requests.TUserManagementRole;
|
|
24
|
+
password: string;
|
|
25
|
+
enableIdpGlobalAuth?: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
export declare const deleteUserAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IUsersState, string>;
|