@serve.zone/dcrouter 15.0.2 → 15.0.3

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 (70) hide show
  1. package/deno.json +1 -1
  2. package/dist_serve/bundle.js +768 -768
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/00_commitinfo_data.js +1 -1
  5. package/dist_ts_web/appstate/acme.d.ts +17 -0
  6. package/dist_ts_web/appstate/acme.js +64 -0
  7. package/dist_ts_web/appstate/certificates.d.ts +37 -0
  8. package/dist_ts_web/appstate/certificates.js +107 -0
  9. package/dist_ts_web/appstate/config.d.ts +9 -0
  10. package/dist_ts_web/appstate/config.js +35 -0
  11. package/dist_ts_web/appstate/domains.d.ts +80 -0
  12. package/dist_ts_web/appstate/domains.js +324 -0
  13. package/dist_ts_web/appstate/email-domains.d.ts +25 -0
  14. package/dist_ts_web/appstate/email-domains.js +104 -0
  15. package/dist_ts_web/appstate/email-ops.d.ts +10 -0
  16. package/dist_ts_web/appstate/email-ops.js +40 -0
  17. package/dist_ts_web/appstate/login.d.ts +30 -0
  18. package/dist_ts_web/appstate/login.js +83 -0
  19. package/dist_ts_web/appstate/logs.d.ts +16 -0
  20. package/dist_ts_web/appstate/logs.js +27 -0
  21. package/dist_ts_web/appstate/network.d.ts +50 -0
  22. package/dist_ts_web/appstate/network.js +122 -0
  23. package/dist_ts_web/appstate/profiles-targets.d.ts +45 -0
  24. package/dist_ts_web/appstate/profiles-targets.js +173 -0
  25. package/dist_ts_web/appstate/remoteingress.d.ts +47 -0
  26. package/dist_ts_web/appstate/remoteingress.js +204 -0
  27. package/dist_ts_web/appstate/routes.d.ts +76 -0
  28. package/dist_ts_web/appstate/routes.js +316 -0
  29. package/dist_ts_web/appstate/runtime.d.ts +1 -0
  30. package/dist_ts_web/appstate/runtime.js +276 -0
  31. package/dist_ts_web/appstate/security.d.ts +29 -0
  32. package/dist_ts_web/appstate/security.js +167 -0
  33. package/dist_ts_web/appstate/shared.d.ts +3 -0
  34. package/dist_ts_web/appstate/shared.js +13 -0
  35. package/dist_ts_web/appstate/stats.d.ts +15 -0
  36. package/dist_ts_web/appstate/stats.js +59 -0
  37. package/dist_ts_web/appstate/target-profiles.d.ts +37 -0
  38. package/dist_ts_web/appstate/target-profiles.js +118 -0
  39. package/dist_ts_web/appstate/ui.d.ts +11 -0
  40. package/dist_ts_web/appstate/ui.js +55 -0
  41. package/dist_ts_web/appstate/users.d.ts +27 -0
  42. package/dist_ts_web/appstate/users.js +85 -0
  43. package/dist_ts_web/appstate/vpn.d.ts +44 -0
  44. package/dist_ts_web/appstate/vpn.js +148 -0
  45. package/dist_ts_web/appstate.d.ts +20 -568
  46. package/dist_ts_web/appstate.js +24 -2418
  47. package/package.json +1 -1
  48. package/ts/00_commitinfo_data.ts +1 -1
  49. package/ts_web/00_commitinfo_data.ts +1 -1
  50. package/ts_web/appstate/acme.ts +93 -0
  51. package/ts_web/appstate/certificates.ts +159 -0
  52. package/ts_web/appstate/config.ts +49 -0
  53. package/ts_web/appstate/domains.ts +429 -0
  54. package/ts_web/appstate/email-domains.ts +155 -0
  55. package/ts_web/appstate/email-ops.ts +57 -0
  56. package/ts_web/appstate/login.ts +128 -0
  57. package/ts_web/appstate/logs.ts +50 -0
  58. package/ts_web/appstate/network.ts +161 -0
  59. package/ts_web/appstate/profiles-targets.ts +240 -0
  60. package/ts_web/appstate/remoteingress.ts +300 -0
  61. package/ts_web/appstate/routes.ts +447 -0
  62. package/ts_web/appstate/runtime.ts +308 -0
  63. package/ts_web/appstate/security.ts +229 -0
  64. package/ts_web/appstate/shared.ts +15 -0
  65. package/ts_web/appstate/stats.ts +79 -0
  66. package/ts_web/appstate/target-profiles.ts +164 -0
  67. package/ts_web/appstate/ui.ts +75 -0
  68. package/ts_web/appstate/users.ts +133 -0
  69. package/ts_web/appstate/vpn.ts +234 -0
  70. package/ts_web/appstate.ts +24 -3403
@@ -0,0 +1,276 @@
1
+ import * as plugins from '../plugins.js';
2
+ import * as interfaces from '../../dist_ts_interfaces/index.js';
3
+ import { runBackgroundRefresh } from './shared.js';
4
+ import { getActionContext, loginStatePart, logoutAction } from './login.js';
5
+ import { uiStatePart } from './ui.js';
6
+ import { statsStatePart } from './stats.js';
7
+ import { logStatePart } from './logs.js';
8
+ import { networkStatePart, refreshNetworkIpIntelligence } from './network.js';
9
+ import { securityPolicyStatePart, fetchSecurityPolicyAction } from './security.js';
10
+ import { certificateStatePart, fetchCertificateOverviewAction } from './certificates.js';
11
+ import { remoteIngressStatePart, fetchRemoteIngressAction } from './remoteingress.js';
12
+ import { vpnStatePart, fetchVpnAction } from './vpn.js';
13
+ // ============================================================================
14
+ // TypedSocket Client for Real-time Log Streaming
15
+ // ============================================================================
16
+ let socketClient = null;
17
+ const socketRouter = new plugins.domtools.plugins.typedrequest.TypedRouter();
18
+ // Batched log entry handler — buffers incoming entries and flushes once per animation frame
19
+ let logEntryBuffer = [];
20
+ let logFlushScheduled = false;
21
+ function flushLogEntries() {
22
+ logFlushScheduled = false;
23
+ if (logEntryBuffer.length === 0)
24
+ return;
25
+ const current = logStatePart.getState();
26
+ const updated = [...current.recentLogs, ...logEntryBuffer];
27
+ logEntryBuffer = [];
28
+ // Cap at 2000 entries
29
+ if (updated.length > 2000) {
30
+ updated.splice(0, updated.length - 2000);
31
+ }
32
+ logStatePart.setState({ ...current, recentLogs: updated });
33
+ }
34
+ // Register handler for pushed log entries from the server
35
+ socketRouter.addTypedHandler(new plugins.domtools.plugins.typedrequest.TypedHandler('pushLogEntry', async (dataArg) => {
36
+ logEntryBuffer.push(dataArg.entry);
37
+ if (!logFlushScheduled) {
38
+ logFlushScheduled = true;
39
+ requestAnimationFrame(flushLogEntries);
40
+ }
41
+ return {};
42
+ }));
43
+ async function connectSocket() {
44
+ if (socketClient)
45
+ return;
46
+ try {
47
+ socketClient = await plugins.typedsocket.TypedSocket.createClient(socketRouter, plugins.typedsocket.TypedSocket.useWindowLocationOriginUrl());
48
+ await socketClient.setTag('role', 'ops_dashboard');
49
+ }
50
+ catch (err) {
51
+ console.error('TypedSocket connection failed:', err);
52
+ socketClient = null;
53
+ }
54
+ }
55
+ async function disconnectSocket() {
56
+ if (socketClient) {
57
+ try {
58
+ await socketClient.stop();
59
+ }
60
+ catch {
61
+ // ignore disconnect errors
62
+ }
63
+ socketClient = null;
64
+ }
65
+ }
66
+ // In-flight guard to prevent concurrent refresh requests
67
+ let isRefreshing = false;
68
+ // Combined refresh action for efficient polling
69
+ async function dispatchCombinedRefreshAction() {
70
+ if (isRefreshing)
71
+ return;
72
+ isRefreshing = true;
73
+ try {
74
+ await dispatchCombinedRefreshActionInner();
75
+ }
76
+ finally {
77
+ isRefreshing = false;
78
+ }
79
+ }
80
+ async function dispatchCombinedRefreshActionInner() {
81
+ const context = getActionContext();
82
+ if (!context.identity)
83
+ return;
84
+ const currentView = uiStatePart.getState().activeView;
85
+ const currentSubview = uiStatePart.getState().activeSubview;
86
+ try {
87
+ // Always fetch basic stats for dashboard widgets
88
+ const combinedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCombinedMetrics');
89
+ const combinedResponse = await combinedRequest.fire({
90
+ identity: context.identity,
91
+ sections: {
92
+ server: true,
93
+ email: true,
94
+ dns: true,
95
+ security: true,
96
+ network: currentView === 'network' && currentSubview === 'activity',
97
+ radius: true,
98
+ vpn: true,
99
+ },
100
+ });
101
+ // Update all stats from combined response
102
+ const currentStatsState = statsStatePart.getState();
103
+ statsStatePart.setState({
104
+ ...currentStatsState,
105
+ serverStats: combinedResponse.metrics.server || currentStatsState.serverStats,
106
+ emailStats: combinedResponse.metrics.email || currentStatsState.emailStats,
107
+ dnsStats: combinedResponse.metrics.dns || currentStatsState.dnsStats,
108
+ securityMetrics: combinedResponse.metrics.security || currentStatsState.securityMetrics,
109
+ radiusStats: combinedResponse.metrics.radius || currentStatsState.radiusStats,
110
+ vpnStats: combinedResponse.metrics.vpn || currentStatsState.vpnStats,
111
+ lastUpdated: Date.now(),
112
+ isLoading: false,
113
+ error: null,
114
+ });
115
+ // Update network stats if included
116
+ if (combinedResponse.metrics.network && currentView === 'network') {
117
+ const network = combinedResponse.metrics.network;
118
+ const connectionsByIP = {};
119
+ // Build connectionsByIP from connectionDetails (now populated with real per-IP data)
120
+ network.connectionDetails.forEach(conn => {
121
+ connectionsByIP[conn.remoteAddress] = (connectionsByIP[conn.remoteAddress] || 0) + (conn.connectionCount || 1);
122
+ });
123
+ // Build connections from connectionDetails (real per-IP aggregates)
124
+ const connections = network.connectionDetails.map((conn, i) => ({
125
+ id: `ip-${conn.remoteAddress}`,
126
+ remoteAddress: conn.remoteAddress,
127
+ localAddress: 'server',
128
+ startTime: conn.startTime,
129
+ protocol: conn.protocol,
130
+ state: conn.state,
131
+ bytesReceived: conn.bytesIn,
132
+ bytesSent: conn.bytesOut,
133
+ connectionCount: conn.connectionCount,
134
+ }));
135
+ networkStatePart.setState({
136
+ ...networkStatePart.getState(),
137
+ connections,
138
+ connectionsByIP,
139
+ throughputRate: {
140
+ bytesInPerSecond: network.totalBandwidth.in,
141
+ bytesOutPerSecond: network.totalBandwidth.out,
142
+ },
143
+ totalBytes: network.totalBytes || { in: 0, out: 0 },
144
+ topIPs: network.topEndpoints.map(e => ({ ip: e.endpoint, count: e.connections })),
145
+ topIPsByBandwidth: (network.topEndpointsByBandwidth || []).map(e => ({
146
+ ip: e.endpoint,
147
+ count: e.connections,
148
+ bwIn: e.bandwidth?.in || 0,
149
+ bwOut: e.bandwidth?.out || 0,
150
+ })),
151
+ topASNs: network.topASNs || [],
152
+ throughputByIP: network.topEndpoints.map(e => ({ ip: e.endpoint, in: e.bandwidth?.in || 0, out: e.bandwidth?.out || 0 })),
153
+ domainActivity: network.domainActivity || [],
154
+ throughputHistory: network.throughputHistory || [],
155
+ requestsPerSecond: network.requestsPerSecond || 0,
156
+ requestsTotal: network.requestsTotal || 0,
157
+ backends: network.backends || [],
158
+ frontendProtocols: network.frontendProtocols || null,
159
+ backendProtocols: network.backendProtocols || null,
160
+ lastUpdated: Date.now(),
161
+ isLoading: false,
162
+ error: null,
163
+ });
164
+ refreshNetworkIpIntelligence(context.identity, [
165
+ ...network.connectionDetails.map((conn) => conn.remoteAddress),
166
+ ...network.topEndpoints.map((endpoint) => endpoint.endpoint),
167
+ ...(network.topEndpointsByBandwidth || []).map((endpoint) => endpoint.endpoint),
168
+ ]);
169
+ }
170
+ if (currentView === 'security') {
171
+ runBackgroundRefresh('securityPolicy', 'Security policy refresh failed:', async () => {
172
+ await securityPolicyStatePart.dispatchAction(fetchSecurityPolicyAction, null);
173
+ });
174
+ }
175
+ // Refresh certificate data if on Domains > Certificates subview
176
+ if (currentView === 'domains' && currentSubview === 'certificates') {
177
+ runBackgroundRefresh('certificates', 'Certificate refresh failed:', async () => {
178
+ await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
179
+ });
180
+ }
181
+ // Refresh remote ingress data if on the Network → Remote Ingress subview
182
+ if (currentView === 'network' && currentSubview === 'remoteingress') {
183
+ runBackgroundRefresh('remoteIngress', 'Remote ingress refresh failed:', async () => {
184
+ await remoteIngressStatePart.dispatchAction(fetchRemoteIngressAction, null);
185
+ });
186
+ }
187
+ // Refresh VPN data if on the Network → VPN subview
188
+ if (currentView === 'network' && currentSubview === 'vpn') {
189
+ runBackgroundRefresh('vpn', 'VPN refresh failed:', async () => {
190
+ await vpnStatePart.dispatchAction(fetchVpnAction, null);
191
+ });
192
+ }
193
+ }
194
+ catch (error) {
195
+ console.error('Combined refresh failed:', error);
196
+ // If the error looks like an auth failure (invalid JWT), force re-login
197
+ const errMsg = String(error);
198
+ if (errMsg.includes('invalid') || errMsg.includes('unauthorized') || errMsg.includes('401')) {
199
+ await loginStatePart.dispatchAction(logoutAction, null);
200
+ window.location.reload();
201
+ }
202
+ }
203
+ }
204
+ // Create a proper action for the combined refresh so we can use createScheduledAction
205
+ const combinedRefreshAction = statsStatePart.createAction(async (statePartArg) => {
206
+ await dispatchCombinedRefreshAction();
207
+ // Return current state — dispatchCombinedRefreshAction already updates all state parts directly
208
+ return statePartArg.getState();
209
+ });
210
+ // Scheduled refresh process with autoPause: 'visibility' — automatically pauses when tab is hidden
211
+ let refreshProcess = null;
212
+ const startAutoRefresh = () => {
213
+ const uiState = uiStatePart.getState();
214
+ const loginState = loginStatePart.getState();
215
+ if (uiState.autoRefresh && loginState.isLoggedIn) {
216
+ // Dispose old process if interval changed or not running
217
+ if (refreshProcess) {
218
+ refreshProcess.dispose();
219
+ refreshProcess = null;
220
+ }
221
+ refreshProcess = statsStatePart.createScheduledAction({
222
+ action: combinedRefreshAction,
223
+ payload: undefined,
224
+ intervalMs: uiState.refreshInterval,
225
+ autoPause: 'visibility',
226
+ });
227
+ }
228
+ else {
229
+ if (refreshProcess) {
230
+ refreshProcess.dispose();
231
+ refreshProcess = null;
232
+ }
233
+ }
234
+ };
235
+ // Watch for relevant changes
236
+ let previousAutoRefresh = uiStatePart.getState().autoRefresh;
237
+ let previousRefreshInterval = uiStatePart.getState().refreshInterval;
238
+ let previousIsLoggedIn = loginStatePart.getState().isLoggedIn;
239
+ uiStatePart.select((s) => ({ autoRefresh: s.autoRefresh, refreshInterval: s.refreshInterval }))
240
+ .subscribe((state) => {
241
+ if (state.autoRefresh !== previousAutoRefresh ||
242
+ state.refreshInterval !== previousRefreshInterval) {
243
+ previousAutoRefresh = state.autoRefresh;
244
+ previousRefreshInterval = state.refreshInterval;
245
+ startAutoRefresh();
246
+ }
247
+ });
248
+ loginStatePart.select((s) => s.isLoggedIn).subscribe((isLoggedIn) => {
249
+ if (isLoggedIn !== previousIsLoggedIn) {
250
+ previousIsLoggedIn = isLoggedIn;
251
+ startAutoRefresh();
252
+ // Connect/disconnect TypedSocket based on login state
253
+ if (isLoggedIn) {
254
+ connectSocket();
255
+ }
256
+ else {
257
+ disconnectSocket();
258
+ }
259
+ }
260
+ });
261
+ // Pause/resume WebSocket when tab visibility changes
262
+ document.addEventListener('visibilitychange', () => {
263
+ if (document.hidden) {
264
+ disconnectSocket();
265
+ }
266
+ else if (loginStatePart.getState().isLoggedIn) {
267
+ connectSocket();
268
+ }
269
+ });
270
+ // Initial start
271
+ startAutoRefresh();
272
+ // Connect TypedSocket if already logged in (e.g., persistent session)
273
+ if (loginStatePart.getState().isLoggedIn) {
274
+ connectSocket();
275
+ }
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzX3dlYi9hcHBzdGF0ZS9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxVQUFVLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsWUFBWSxFQUFrQixNQUFNLFdBQVcsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLHlCQUF5QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBR3hELCtFQUErRTtBQUMvRSxpREFBaUQ7QUFDakQsK0VBQStFO0FBRS9FLElBQUksWUFBWSxHQUEyQyxJQUFJLENBQUM7QUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7QUFFN0UsNEZBQTRGO0FBQzVGLElBQUksY0FBYyxHQUFnQyxFQUFFLENBQUM7QUFD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
@@ -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,3 @@
1
+ import * as plugins from '../plugins.js';
2
+ export declare const appState: plugins.deesElement.domtools.plugins.smartstate.Smartstate<string>;
3
+ export declare function runBackgroundRefresh(key: string, errorMessage: string, task: () => Promise<void>): void;
@@ -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
+ }>;