@serve.zone/dcrouter 15.0.1 → 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 (117) 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/acme/classes.smartacme-lifecycle.d.ts +25 -0
  5. package/dist_ts/acme/classes.smartacme-lifecycle.js +144 -0
  6. package/dist_ts/acme/index.d.ts +1 -0
  7. package/dist_ts/acme/index.js +2 -1
  8. package/dist_ts/classes.dcrouter.d.ts +21 -139
  9. package/dist_ts/classes.dcrouter.js +71 -1585
  10. package/dist_ts/dns/classes.dns-server-runtime.d.ts +37 -0
  11. package/dist_ts/dns/classes.dns-server-runtime.js +449 -0
  12. package/dist_ts/dns/index.d.ts +1 -0
  13. package/dist_ts/dns/index.js +2 -1
  14. package/dist_ts/email/classes.accepted-email-spool.d.ts +55 -0
  15. package/dist_ts/email/classes.accepted-email-spool.js +345 -0
  16. package/dist_ts/email/classes.email-route-builder.d.ts +28 -0
  17. package/dist_ts/email/classes.email-route-builder.js +260 -0
  18. package/dist_ts/email/index.d.ts +2 -0
  19. package/dist_ts/email/index.js +3 -1
  20. package/dist_ts/opsserver/handlers/gatewayclient.handler.js +10 -8
  21. package/dist_ts/remoteingress/classes.hub-lifecycle.d.ts +27 -0
  22. package/dist_ts/remoteingress/classes.hub-lifecycle.js +241 -0
  23. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +1 -2
  24. package/dist_ts/remoteingress/index.d.ts +1 -0
  25. package/dist_ts/remoteingress/index.js +2 -1
  26. package/dist_ts/security/classes.route-policy-augmenter.d.ts +22 -0
  27. package/dist_ts/security/classes.route-policy-augmenter.js +120 -0
  28. package/dist_ts/security/index.d.ts +1 -0
  29. package/dist_ts/security/index.js +2 -1
  30. package/dist_ts/vpn/classes.vpn-access-resolver.d.ts +34 -0
  31. package/dist_ts/vpn/classes.vpn-access-resolver.js +101 -0
  32. package/dist_ts/vpn/index.d.ts +1 -0
  33. package/dist_ts/vpn/index.js +2 -1
  34. package/dist_ts_migrations/index.js +92 -9
  35. package/dist_ts_web/00_commitinfo_data.js +1 -1
  36. package/dist_ts_web/appstate/acme.d.ts +17 -0
  37. package/dist_ts_web/appstate/acme.js +64 -0
  38. package/dist_ts_web/appstate/certificates.d.ts +37 -0
  39. package/dist_ts_web/appstate/certificates.js +107 -0
  40. package/dist_ts_web/appstate/config.d.ts +9 -0
  41. package/dist_ts_web/appstate/config.js +35 -0
  42. package/dist_ts_web/appstate/domains.d.ts +80 -0
  43. package/dist_ts_web/appstate/domains.js +324 -0
  44. package/dist_ts_web/appstate/email-domains.d.ts +25 -0
  45. package/dist_ts_web/appstate/email-domains.js +104 -0
  46. package/dist_ts_web/appstate/email-ops.d.ts +10 -0
  47. package/dist_ts_web/appstate/email-ops.js +40 -0
  48. package/dist_ts_web/appstate/login.d.ts +30 -0
  49. package/dist_ts_web/appstate/login.js +83 -0
  50. package/dist_ts_web/appstate/logs.d.ts +16 -0
  51. package/dist_ts_web/appstate/logs.js +27 -0
  52. package/dist_ts_web/appstate/network.d.ts +50 -0
  53. package/dist_ts_web/appstate/network.js +122 -0
  54. package/dist_ts_web/appstate/profiles-targets.d.ts +45 -0
  55. package/dist_ts_web/appstate/profiles-targets.js +173 -0
  56. package/dist_ts_web/appstate/remoteingress.d.ts +47 -0
  57. package/dist_ts_web/appstate/remoteingress.js +204 -0
  58. package/dist_ts_web/appstate/routes.d.ts +76 -0
  59. package/dist_ts_web/appstate/routes.js +316 -0
  60. package/dist_ts_web/appstate/runtime.d.ts +1 -0
  61. package/dist_ts_web/appstate/runtime.js +276 -0
  62. package/dist_ts_web/appstate/security.d.ts +29 -0
  63. package/dist_ts_web/appstate/security.js +167 -0
  64. package/dist_ts_web/appstate/shared.d.ts +3 -0
  65. package/dist_ts_web/appstate/shared.js +13 -0
  66. package/dist_ts_web/appstate/stats.d.ts +15 -0
  67. package/dist_ts_web/appstate/stats.js +59 -0
  68. package/dist_ts_web/appstate/target-profiles.d.ts +37 -0
  69. package/dist_ts_web/appstate/target-profiles.js +118 -0
  70. package/dist_ts_web/appstate/ui.d.ts +11 -0
  71. package/dist_ts_web/appstate/ui.js +55 -0
  72. package/dist_ts_web/appstate/users.d.ts +27 -0
  73. package/dist_ts_web/appstate/users.js +85 -0
  74. package/dist_ts_web/appstate/vpn.d.ts +44 -0
  75. package/dist_ts_web/appstate/vpn.js +148 -0
  76. package/dist_ts_web/appstate.d.ts +20 -568
  77. package/dist_ts_web/appstate.js +24 -2418
  78. package/package.json +1 -1
  79. package/ts/00_commitinfo_data.ts +1 -1
  80. package/ts/acme/classes.smartacme-lifecycle.ts +155 -0
  81. package/ts/acme/index.ts +1 -0
  82. package/ts/classes.dcrouter.ts +118 -1919
  83. package/ts/dns/classes.dns-server-runtime.ts +525 -0
  84. package/ts/dns/index.ts +1 -0
  85. package/ts/email/classes.accepted-email-spool.ts +434 -0
  86. package/ts/email/classes.email-route-builder.ts +312 -0
  87. package/ts/email/index.ts +2 -0
  88. package/ts/opsserver/handlers/gatewayclient.handler.ts +9 -7
  89. package/ts/remoteingress/classes.hub-lifecycle.ts +278 -0
  90. package/ts/remoteingress/classes.remoteingress-manager.ts +1 -1
  91. package/ts/remoteingress/index.ts +1 -0
  92. package/ts/security/classes.route-policy-augmenter.ts +140 -0
  93. package/ts/security/index.ts +1 -0
  94. package/ts/vpn/classes.vpn-access-resolver.ts +126 -0
  95. package/ts/vpn/index.ts +1 -0
  96. package/ts_web/00_commitinfo_data.ts +1 -1
  97. package/ts_web/appstate/acme.ts +93 -0
  98. package/ts_web/appstate/certificates.ts +159 -0
  99. package/ts_web/appstate/config.ts +49 -0
  100. package/ts_web/appstate/domains.ts +429 -0
  101. package/ts_web/appstate/email-domains.ts +155 -0
  102. package/ts_web/appstate/email-ops.ts +57 -0
  103. package/ts_web/appstate/login.ts +128 -0
  104. package/ts_web/appstate/logs.ts +50 -0
  105. package/ts_web/appstate/network.ts +161 -0
  106. package/ts_web/appstate/profiles-targets.ts +240 -0
  107. package/ts_web/appstate/remoteingress.ts +300 -0
  108. package/ts_web/appstate/routes.ts +447 -0
  109. package/ts_web/appstate/runtime.ts +308 -0
  110. package/ts_web/appstate/security.ts +229 -0
  111. package/ts_web/appstate/shared.ts +15 -0
  112. package/ts_web/appstate/stats.ts +79 -0
  113. package/ts_web/appstate/target-profiles.ts +164 -0
  114. package/ts_web/appstate/ui.ts +75 -0
  115. package/ts_web/appstate/users.ts +133 -0
  116. package/ts_web/appstate/vpn.ts +234 -0
  117. package/ts_web/appstate.ts +24 -3403
@@ -1,2418 +1,24 @@
1
- import * as plugins from './plugins.js';
2
- import * as interfaces from '../dist_ts_interfaces/index.js';
3
- // Create main app state instance
4
- export const appState = new plugins.domtools.plugins.smartstate.Smartstate();
5
- // Create state parts with appropriate persistence
6
- export const loginStatePart = await appState.getStatePart('login', {
7
- identity: null,
8
- isLoggedIn: false,
9
- }, 'persistent' // Login state persists across browser sessions
10
- );
11
- export const statsStatePart = await appState.getStatePart('stats', {
12
- serverStats: null,
13
- emailStats: null,
14
- dnsStats: null,
15
- securityMetrics: null,
16
- radiusStats: null,
17
- vpnStats: null,
18
- lastUpdated: 0,
19
- isLoading: false,
20
- error: null,
21
- }, 'soft' // Stats are cached but not persisted
22
- );
23
- export const configStatePart = await appState.getStatePart('config', {
24
- config: null,
25
- isLoading: false,
26
- error: null,
27
- });
28
- // Determine initial view from URL path
29
- const getInitialView = () => {
30
- const path = typeof window !== 'undefined' ? window.location.pathname : '/';
31
- const validViews = ['overview', 'network', 'email', 'logs', 'access', 'security', 'domains'];
32
- const segments = path.split('/').filter(Boolean);
33
- const view = segments[0];
34
- return validViews.includes(view) ? view : 'overview';
35
- };
36
- // Determine initial subview (second URL segment) from the path
37
- const getInitialSubview = () => {
38
- const path = typeof window !== 'undefined' ? window.location.pathname : '/';
39
- const segments = path.split('/').filter(Boolean);
40
- return segments[1] ?? null;
41
- };
42
- export const uiStatePart = await appState.getStatePart('ui', {
43
- activeView: getInitialView(),
44
- activeSubview: getInitialSubview(),
45
- sidebarCollapsed: false,
46
- autoRefresh: true,
47
- refreshInterval: 1000, // 1 second
48
- theme: 'light',
49
- });
50
- export const logStatePart = await appState.getStatePart('logs', {
51
- recentLogs: [],
52
- isStreaming: false,
53
- filters: {},
54
- }, 'soft');
55
- export const networkStatePart = await appState.getStatePart('network', {
56
- connections: [],
57
- connectionsByIP: {},
58
- throughputRate: { bytesInPerSecond: 0, bytesOutPerSecond: 0 },
59
- totalBytes: { in: 0, out: 0 },
60
- topIPs: [],
61
- topIPsByBandwidth: [],
62
- topASNs: [],
63
- throughputByIP: [],
64
- ipIntelligence: [],
65
- domainActivity: [],
66
- throughputHistory: [],
67
- requestsPerSecond: 0,
68
- requestsTotal: 0,
69
- backends: [],
70
- frontendProtocols: null,
71
- backendProtocols: null,
72
- lastUpdated: 0,
73
- isLoading: false,
74
- error: null,
75
- }, 'soft');
76
- export const securityPolicyStatePart = await appState.getStatePart('securityPolicy', {
77
- rules: [],
78
- ipIntelligence: [],
79
- compiledPolicy: null,
80
- auditEvents: [],
81
- isLoading: false,
82
- error: null,
83
- lastUpdated: 0,
84
- }, 'soft');
85
- export const emailOpsStatePart = await appState.getStatePart('emailOps', {
86
- emails: [],
87
- isLoading: false,
88
- error: null,
89
- lastUpdated: 0,
90
- }, 'soft');
91
- export const certificateStatePart = await appState.getStatePart('certificates', {
92
- certificates: [],
93
- summary: { total: 0, valid: 0, expiring: 0, expired: 0, failed: 0, unknown: 0 },
94
- isLoading: false,
95
- error: null,
96
- lastUpdated: 0,
97
- }, 'soft');
98
- export const acmeConfigStatePart = await appState.getStatePart('acmeConfig', {
99
- config: null,
100
- isLoading: false,
101
- error: null,
102
- lastUpdated: 0,
103
- }, 'soft');
104
- export const remoteIngressStatePart = await appState.getStatePart('remoteIngress', {
105
- edges: [],
106
- statuses: [],
107
- hubSettings: null,
108
- selectedEdgeId: null,
109
- newEdgeId: null,
110
- isLoading: false,
111
- error: null,
112
- lastUpdated: 0,
113
- }, 'soft');
114
- export const routeManagementStatePart = await appState.getStatePart('routeManagement', {
115
- mergedRoutes: [],
116
- warnings: [],
117
- httpRedirects: [],
118
- apiTokens: [],
119
- gatewayClients: [],
120
- isLoading: false,
121
- error: null,
122
- lastUpdated: 0,
123
- }, 'soft');
124
- export const usersStatePart = await appState.getStatePart('users', {
125
- users: [],
126
- isLoading: false,
127
- error: null,
128
- lastUpdated: 0,
129
- }, 'soft');
130
- const getActionContext = () => {
131
- const identity = loginStatePart.getState().identity;
132
- // Treat expired JWTs as no identity — prevents stale persisted sessions from firing requests
133
- if (identity && identity.expiresAt && identity.expiresAt < Date.now()) {
134
- return { identity: null };
135
- }
136
- return { identity };
137
- };
138
- // Login Action
139
- export const loginAction = loginStatePart.createAction(async (statePartArg, dataArg) => {
140
- const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'adminLoginWithUsernameAndPassword');
141
- try {
142
- const response = await typedRequest.fire({
143
- username: dataArg.username,
144
- password: dataArg.password,
145
- authSource: dataArg.authSource,
146
- });
147
- if (response.identity) {
148
- return {
149
- identity: response.identity,
150
- isLoggedIn: true,
151
- };
152
- }
153
- return statePartArg.getState();
154
- }
155
- catch (error) {
156
- console.error('Login failed:', error);
157
- return statePartArg.getState();
158
- }
159
- });
160
- export async function getAdminBootstrapStatus() {
161
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getAdminBootstrapStatus');
162
- return request.fire({});
163
- }
164
- export async function createInitialAdminUser(optionsArg) {
165
- const context = getActionContext();
166
- if (!context.identity) {
167
- throw new Error('No identity available for admin bootstrap');
168
- }
169
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createInitialAdminUser');
170
- const response = await request.fire({
171
- identity: context.identity,
172
- email: optionsArg.email,
173
- name: optionsArg.name,
174
- password: optionsArg.password,
175
- enableIdpGlobalAuth: optionsArg.enableIdpGlobalAuth,
176
- });
177
- if (response.identity) {
178
- loginStatePart.setState({
179
- identity: response.identity,
180
- isLoggedIn: true,
181
- });
182
- }
183
- return response;
184
- }
185
- // Logout Action — always clears state, even if identity is expired/missing
186
- export const logoutAction = loginStatePart.createAction(async (statePartArg) => {
187
- const context = getActionContext();
188
- // Try to notify server, but don't block logout if identity is missing/expired
189
- if (context.identity) {
190
- const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'adminLogout');
191
- try {
192
- await typedRequest.fire({ identity: context.identity });
193
- }
194
- catch (error) {
195
- console.error('Logout error:', error);
196
- }
197
- }
198
- // Always clear login state
199
- return {
200
- identity: null,
201
- isLoggedIn: false,
202
- };
203
- });
204
- // Fetch All Stats Action - Using combined endpoint for efficiency
205
- export const fetchAllStatsAction = statsStatePart.createAction(async (statePartArg) => {
206
- const context = getActionContext();
207
- const currentState = statePartArg.getState();
208
- if (!context.identity)
209
- return currentState;
210
- try {
211
- // Use combined metrics endpoint - single request instead of 4
212
- const combinedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCombinedMetrics');
213
- const combinedResponse = await combinedRequest.fire({
214
- identity: context.identity,
215
- sections: {
216
- server: true,
217
- email: true,
218
- dns: true,
219
- security: true,
220
- network: false, // Network is fetched separately for the network view
221
- radius: true,
222
- vpn: true,
223
- },
224
- });
225
- // Update state with all stats from combined response
226
- return {
227
- serverStats: combinedResponse.metrics.server || currentState.serverStats,
228
- emailStats: combinedResponse.metrics.email || currentState.emailStats,
229
- dnsStats: combinedResponse.metrics.dns || currentState.dnsStats,
230
- securityMetrics: combinedResponse.metrics.security || currentState.securityMetrics,
231
- radiusStats: combinedResponse.metrics.radius || currentState.radiusStats,
232
- vpnStats: combinedResponse.metrics.vpn || currentState.vpnStats,
233
- lastUpdated: Date.now(),
234
- isLoading: false,
235
- error: null,
236
- };
237
- }
238
- catch (error) {
239
- return {
240
- ...currentState,
241
- isLoading: false,
242
- error: error.message || 'Failed to fetch statistics',
243
- };
244
- }
245
- });
246
- // Fetch Configuration Action (read-only)
247
- export const fetchConfigurationAction = configStatePart.createAction(async (statePartArg) => {
248
- const context = getActionContext();
249
- const currentState = statePartArg.getState();
250
- if (!context.identity)
251
- return currentState;
252
- try {
253
- const configRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getConfiguration');
254
- const response = await configRequest.fire({
255
- identity: context.identity,
256
- });
257
- return {
258
- config: response.config,
259
- isLoading: false,
260
- error: null,
261
- };
262
- }
263
- catch (error) {
264
- return {
265
- ...currentState,
266
- isLoading: false,
267
- error: error.message || 'Failed to fetch configuration',
268
- };
269
- }
270
- });
271
- // Fetch Recent Logs Action
272
- export const fetchRecentLogsAction = logStatePart.createAction(async (statePartArg, dataArg) => {
273
- const context = getActionContext();
274
- if (!context.identity)
275
- return statePartArg.getState();
276
- const logsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRecentLogs');
277
- const response = await logsRequest.fire({
278
- identity: context.identity,
279
- limit: dataArg.limit || 100,
280
- level: dataArg.level,
281
- category: dataArg.category,
282
- });
283
- return {
284
- ...statePartArg.getState(),
285
- recentLogs: response.logs,
286
- };
287
- });
288
- // Toggle Auto Refresh Action
289
- export const toggleAutoRefreshAction = uiStatePart.createAction(async (statePartArg) => {
290
- const currentState = statePartArg.getState();
291
- return {
292
- ...currentState,
293
- autoRefresh: !currentState.autoRefresh,
294
- };
295
- });
296
- // Set Active View Action
297
- export const setActiveViewAction = uiStatePart.createAction(async (statePartArg, viewName) => {
298
- const currentState = statePartArg.getState();
299
- // If switching to network view, ensure we fetch network data
300
- if (viewName === 'network' && currentState.activeView !== 'network') {
301
- setTimeout(() => {
302
- networkStatePart.dispatchAction(fetchNetworkStatsAction, null);
303
- }, 100);
304
- }
305
- // If switching to the Domains group, ensure we fetch certificate data
306
- // (Certificates is a subview of Domains).
307
- if (viewName === 'domains' && currentState.activeView !== 'domains') {
308
- setTimeout(() => {
309
- certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
310
- }, 100);
311
- }
312
- return {
313
- ...currentState,
314
- activeView: viewName,
315
- };
316
- });
317
- const backgroundRefreshesInFlight = new Set();
318
- function runBackgroundRefresh(key, errorMessage, task) {
319
- if (backgroundRefreshesInFlight.has(key))
320
- return;
321
- backgroundRefreshesInFlight.add(key);
322
- void task()
323
- .catch((error) => console.error(errorMessage, error))
324
- .finally(() => backgroundRefreshesInFlight.delete(key));
325
- }
326
- function refreshNetworkIpIntelligence(identity, ipAddresses) {
327
- const ips = [...new Set(ipAddresses.filter(Boolean))].slice(0, 100);
328
- if (ips.length === 0)
329
- return;
330
- runBackgroundRefresh('networkIpIntelligence', 'IP intelligence refresh failed:', async () => {
331
- const intelligenceRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listIpIntelligence');
332
- const intelligenceResponse = await intelligenceRequest.fire({
333
- identity,
334
- ipAddresses: ips,
335
- limit: Math.max(100, ips.length),
336
- });
337
- networkStatePart.setState({
338
- ...networkStatePart.getState(),
339
- ipIntelligence: intelligenceResponse.records || [],
340
- });
341
- });
342
- }
343
- function refreshSecurityIpIntelligence(identity) {
344
- runBackgroundRefresh('securityIpIntelligence', 'Security IP intelligence refresh failed:', async () => {
345
- const intelligenceRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listIpIntelligence');
346
- const intelligenceResponse = await intelligenceRequest.fire({
347
- identity,
348
- limit: 500,
349
- });
350
- securityPolicyStatePart.setState({
351
- ...securityPolicyStatePart.getState(),
352
- ipIntelligence: intelligenceResponse.records || [],
353
- });
354
- });
355
- }
356
- // Fetch Network Stats Action
357
- export const fetchNetworkStatsAction = networkStatePart.createAction(async (statePartArg) => {
358
- const context = getActionContext();
359
- const currentState = statePartArg.getState();
360
- if (!context.identity)
361
- return currentState;
362
- try {
363
- // Get network stats for throughput and IP data
364
- const networkStatsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getNetworkStats');
365
- const networkStatsResponse = await networkStatsRequest.fire({
366
- identity: context.identity,
367
- });
368
- // Use the connections data for the connection list
369
- // and network stats for throughput and IP analytics
370
- const connectionsByIP = {};
371
- const throughputByIP = new Map();
372
- for (const item of networkStatsResponse.throughputByIP || []) {
373
- throughputByIP.set(item.ip, { in: item.in, out: item.out });
374
- }
375
- // Build connectionsByIP from network stats if available
376
- if (networkStatsResponse.connectionsByIP && Array.isArray(networkStatsResponse.connectionsByIP)) {
377
- networkStatsResponse.connectionsByIP.forEach((item) => {
378
- connectionsByIP[item.ip] = item.count;
379
- });
380
- }
381
- const connections = Object.entries(connectionsByIP).map(([ip, count]) => {
382
- const tp = throughputByIP.get(ip);
383
- return {
384
- id: `ip-${ip}`,
385
- remoteAddress: ip,
386
- localAddress: 'server',
387
- startTime: 0,
388
- protocol: 'https',
389
- state: 'connected',
390
- bytesReceived: tp?.in || 0,
391
- bytesSent: tp?.out || 0,
392
- connectionCount: count,
393
- };
394
- });
395
- refreshNetworkIpIntelligence(context.identity, [
396
- ...Object.keys(connectionsByIP),
397
- ...(networkStatsResponse.topIPs || []).map((item) => item.ip),
398
- ...(networkStatsResponse.topIPsByBandwidth || []).map((item) => item.ip),
399
- ]);
400
- return {
401
- connections,
402
- connectionsByIP,
403
- throughputRate: networkStatsResponse.throughputRate || { bytesInPerSecond: 0, bytesOutPerSecond: 0 },
404
- totalBytes: networkStatsResponse.totalDataTransferred
405
- ? { in: networkStatsResponse.totalDataTransferred.bytesIn, out: networkStatsResponse.totalDataTransferred.bytesOut }
406
- : { in: 0, out: 0 },
407
- topIPs: networkStatsResponse.topIPs || [],
408
- topIPsByBandwidth: networkStatsResponse.topIPsByBandwidth || [],
409
- topASNs: networkStatsResponse.topASNs || [],
410
- throughputByIP: networkStatsResponse.throughputByIP || [],
411
- ipIntelligence: currentState.ipIntelligence,
412
- domainActivity: networkStatsResponse.domainActivity || [],
413
- throughputHistory: networkStatsResponse.throughputHistory || [],
414
- requestsPerSecond: networkStatsResponse.requestsPerSecond || 0,
415
- requestsTotal: networkStatsResponse.requestsTotal || 0,
416
- backends: networkStatsResponse.backends || [],
417
- frontendProtocols: networkStatsResponse.frontendProtocols || null,
418
- backendProtocols: networkStatsResponse.backendProtocols || null,
419
- lastUpdated: Date.now(),
420
- isLoading: false,
421
- error: null,
422
- };
423
- }
424
- catch (error) {
425
- console.error('Failed to fetch network stats:', error);
426
- return {
427
- ...currentState,
428
- isLoading: false,
429
- error: error instanceof Error ? error.message : 'Failed to fetch network stats',
430
- };
431
- }
432
- });
433
- // ============================================================================
434
- // Security Policy Actions
435
- // ============================================================================
436
- export const fetchSecurityPolicyAction = securityPolicyStatePart.createAction(async (statePartArg) => {
437
- const context = getActionContext();
438
- const currentState = statePartArg.getState();
439
- if (!context.identity)
440
- return currentState;
441
- try {
442
- const rulesRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listSecurityBlockRules');
443
- const compiledPolicyRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCompiledSecurityPolicy');
444
- const auditRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listSecurityPolicyAudit');
445
- const [rulesResponse, compiledPolicyResponse, auditResponse] = await Promise.all([
446
- rulesRequest.fire({ identity: context.identity }),
447
- compiledPolicyRequest.fire({ identity: context.identity }),
448
- auditRequest.fire({ identity: context.identity, limit: 100 }),
449
- ]);
450
- refreshSecurityIpIntelligence(context.identity);
451
- return {
452
- rules: rulesResponse.rules || [],
453
- ipIntelligence: currentState.ipIntelligence,
454
- compiledPolicy: compiledPolicyResponse.policy,
455
- auditEvents: auditResponse.events || [],
456
- isLoading: false,
457
- error: null,
458
- lastUpdated: Date.now(),
459
- };
460
- }
461
- catch (error) {
462
- return {
463
- ...currentState,
464
- isLoading: false,
465
- error: error instanceof Error ? error.message : 'Failed to fetch security policy',
466
- };
467
- }
468
- });
469
- export const createSecurityBlockRuleAction = securityPolicyStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
470
- const context = getActionContext();
471
- const currentState = statePartArg.getState();
472
- if (!context.identity)
473
- return currentState;
474
- try {
475
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createSecurityBlockRule');
476
- const response = await request.fire({
477
- identity: context.identity,
478
- type: dataArg.type,
479
- value: dataArg.value,
480
- matchMode: dataArg.matchMode,
481
- reason: dataArg.reason,
482
- enabled: dataArg.enabled,
483
- });
484
- if (!response.success) {
485
- return { ...currentState, error: response.message || 'Failed to create security block rule' };
486
- }
487
- return await actionContext.dispatch(fetchSecurityPolicyAction, null);
488
- }
489
- catch (error) {
490
- return {
491
- ...currentState,
492
- error: error instanceof Error ? error.message : 'Failed to create security block rule',
493
- };
494
- }
495
- });
496
- export const updateSecurityBlockRuleAction = securityPolicyStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
497
- const context = getActionContext();
498
- const currentState = statePartArg.getState();
499
- if (!context.identity)
500
- return currentState;
501
- try {
502
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateSecurityBlockRule');
503
- const response = await request.fire({
504
- identity: context.identity,
505
- id: dataArg.id,
506
- value: dataArg.value,
507
- matchMode: dataArg.matchMode,
508
- reason: dataArg.reason,
509
- enabled: dataArg.enabled,
510
- });
511
- if (!response.success) {
512
- return { ...currentState, error: response.message || 'Failed to update security block rule' };
513
- }
514
- return await actionContext.dispatch(fetchSecurityPolicyAction, null);
515
- }
516
- catch (error) {
517
- return {
518
- ...currentState,
519
- error: error instanceof Error ? error.message : 'Failed to update security block rule',
520
- };
521
- }
522
- });
523
- export const deleteSecurityBlockRuleAction = securityPolicyStatePart.createAction(async (statePartArg, ruleId, actionContext) => {
524
- const context = getActionContext();
525
- const currentState = statePartArg.getState();
526
- if (!context.identity)
527
- return currentState;
528
- try {
529
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteSecurityBlockRule');
530
- const response = await request.fire({ identity: context.identity, id: ruleId });
531
- if (!response.success) {
532
- return { ...currentState, error: response.message || 'Failed to delete security block rule' };
533
- }
534
- return await actionContext.dispatch(fetchSecurityPolicyAction, null);
535
- }
536
- catch (error) {
537
- return {
538
- ...currentState,
539
- error: error instanceof Error ? error.message : 'Failed to delete security block rule',
540
- };
541
- }
542
- });
543
- export const refreshIpIntelligenceAction = securityPolicyStatePart.createAction(async (statePartArg, ipAddress, actionContext) => {
544
- const context = getActionContext();
545
- const currentState = statePartArg.getState();
546
- if (!context.identity)
547
- return currentState;
548
- try {
549
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'refreshIpIntelligence');
550
- const response = await request.fire({ identity: context.identity, ipAddress });
551
- if (!response.success) {
552
- return { ...currentState, error: response.message || 'Failed to refresh IP intelligence' };
553
- }
554
- const refreshedState = await actionContext.dispatch(fetchSecurityPolicyAction, null);
555
- if (!response.record)
556
- return refreshedState;
557
- return {
558
- ...refreshedState,
559
- ipIntelligence: [
560
- response.record,
561
- ...refreshedState.ipIntelligence.filter((record) => record.ipAddress !== response.record.ipAddress),
562
- ],
563
- };
564
- }
565
- catch (error) {
566
- return {
567
- ...currentState,
568
- error: error instanceof Error ? error.message : 'Failed to refresh IP intelligence',
569
- };
570
- }
571
- });
572
- // ============================================================================
573
- // Email Operations Actions
574
- // ============================================================================
575
- // Fetch All Emails Action
576
- export const fetchAllEmailsAction = emailOpsStatePart.createAction(async (statePartArg) => {
577
- const context = getActionContext();
578
- const currentState = statePartArg.getState();
579
- if (!context.identity)
580
- return currentState;
581
- try {
582
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getAllEmails');
583
- const response = await request.fire({
584
- identity: context.identity,
585
- });
586
- return {
587
- emails: response.emails,
588
- isLoading: false,
589
- error: null,
590
- lastUpdated: Date.now(),
591
- };
592
- }
593
- catch (error) {
594
- return {
595
- ...currentState,
596
- isLoading: false,
597
- error: error instanceof Error ? error.message : 'Failed to fetch emails',
598
- };
599
- }
600
- });
601
- // ============================================================================
602
- // Certificate Actions
603
- // ============================================================================
604
- export const fetchCertificateOverviewAction = certificateStatePart.createAction(async (statePartArg) => {
605
- const context = getActionContext();
606
- const currentState = statePartArg.getState();
607
- if (!context.identity)
608
- return currentState;
609
- try {
610
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCertificateOverview');
611
- const response = await request.fire({
612
- identity: context.identity,
613
- });
614
- return {
615
- certificates: response.certificates,
616
- summary: response.summary,
617
- isLoading: false,
618
- error: null,
619
- lastUpdated: Date.now(),
620
- };
621
- }
622
- catch (error) {
623
- return {
624
- ...currentState,
625
- isLoading: false,
626
- error: error instanceof Error ? error.message : 'Failed to fetch certificate overview',
627
- };
628
- }
629
- });
630
- export const reprovisionCertificateAction = certificateStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
631
- const context = getActionContext();
632
- const currentState = statePartArg.getState();
633
- try {
634
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'reprovisionCertificateDomain');
635
- await request.fire({
636
- identity: context.identity,
637
- domain: dataArg.domain,
638
- forceRenew: dataArg.forceRenew,
639
- });
640
- // Re-fetch overview after reprovisioning
641
- return await actionContext.dispatch(fetchCertificateOverviewAction, null);
642
- }
643
- catch (error) {
644
- return {
645
- ...currentState,
646
- error: error instanceof Error ? error.message : 'Failed to reprovision certificate',
647
- };
648
- }
649
- });
650
- export const deleteCertificateAction = certificateStatePart.createAction(async (statePartArg, domain, actionContext) => {
651
- const context = getActionContext();
652
- const currentState = statePartArg.getState();
653
- try {
654
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteCertificate');
655
- await request.fire({
656
- identity: context.identity,
657
- domain,
658
- });
659
- // Re-fetch overview after deletion
660
- return await actionContext.dispatch(fetchCertificateOverviewAction, null);
661
- }
662
- catch (error) {
663
- return {
664
- ...currentState,
665
- error: error instanceof Error ? error.message : 'Failed to delete certificate',
666
- };
667
- }
668
- });
669
- export const importCertificateAction = certificateStatePart.createAction(async (statePartArg, cert, actionContext) => {
670
- const context = getActionContext();
671
- const currentState = statePartArg.getState();
672
- try {
673
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'importCertificate');
674
- await request.fire({
675
- identity: context.identity,
676
- cert,
677
- });
678
- // Re-fetch overview after import
679
- return await actionContext.dispatch(fetchCertificateOverviewAction, null);
680
- }
681
- catch (error) {
682
- return {
683
- ...currentState,
684
- error: error instanceof Error ? error.message : 'Failed to import certificate',
685
- };
686
- }
687
- });
688
- export async function fetchCertificateExport(domain) {
689
- const context = getActionContext();
690
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'exportCertificate');
691
- return request.fire({
692
- identity: context.identity,
693
- domain,
694
- });
695
- }
696
- // ============================================================================
697
- // Remote Ingress Standalone Functions
698
- // ============================================================================
699
- export async function fetchConnectionToken(edgeId) {
700
- const context = getActionContext();
701
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngressConnectionToken');
702
- return request.fire({ identity: context.identity, edgeId });
703
- }
704
- // ============================================================================
705
- // Remote Ingress Actions
706
- // ============================================================================
707
- export const fetchRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg) => {
708
- const context = getActionContext();
709
- const currentState = statePartArg.getState();
710
- if (!context.identity)
711
- return currentState;
712
- try {
713
- const edgesRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngresses');
714
- const statusRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngressStatus');
715
- const hubSettingsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngressHubSettings');
716
- const [edgesResponse, statusResponse, hubSettingsResponse] = await Promise.all([
717
- edgesRequest.fire({ identity: context.identity }),
718
- statusRequest.fire({ identity: context.identity }),
719
- hubSettingsRequest.fire({ identity: context.identity }),
720
- ]);
721
- return {
722
- ...currentState,
723
- edges: edgesResponse.edges,
724
- statuses: statusResponse.statuses,
725
- hubSettings: hubSettingsResponse.settings,
726
- isLoading: false,
727
- error: null,
728
- lastUpdated: Date.now(),
729
- };
730
- }
731
- catch (error) {
732
- return {
733
- ...currentState,
734
- isLoading: false,
735
- error: error instanceof Error ? error.message : 'Failed to fetch remote ingress data',
736
- };
737
- }
738
- });
739
- export const createRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
740
- const context = getActionContext();
741
- const currentState = statePartArg.getState();
742
- try {
743
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createRemoteIngress');
744
- const response = await request.fire({
745
- identity: context.identity,
746
- name: dataArg.name,
747
- listenPorts: dataArg.listenPorts,
748
- autoDerivePorts: dataArg.autoDerivePorts,
749
- performance: dataArg.performance,
750
- tags: dataArg.tags,
751
- });
752
- if (response.success) {
753
- // Refresh the list
754
- await actionContext.dispatch(fetchRemoteIngressAction, null);
755
- return {
756
- ...statePartArg.getState(),
757
- newEdgeId: response.edge.id,
758
- };
759
- }
760
- return currentState;
761
- }
762
- catch (error) {
763
- return {
764
- ...currentState,
765
- error: error instanceof Error ? error.message : 'Failed to create edge',
766
- };
767
- }
768
- });
769
- export const deleteRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, edgeId, actionContext) => {
770
- const context = getActionContext();
771
- const currentState = statePartArg.getState();
772
- try {
773
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteRemoteIngress');
774
- await request.fire({
775
- identity: context.identity,
776
- id: edgeId,
777
- });
778
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
779
- }
780
- catch (error) {
781
- return {
782
- ...currentState,
783
- error: error instanceof Error ? error.message : 'Failed to delete edge',
784
- };
785
- }
786
- });
787
- export const updateRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
788
- const context = getActionContext();
789
- const currentState = statePartArg.getState();
790
- try {
791
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRemoteIngress');
792
- await request.fire({
793
- identity: context.identity,
794
- id: dataArg.id,
795
- name: dataArg.name,
796
- listenPorts: dataArg.listenPorts,
797
- autoDerivePorts: dataArg.autoDerivePorts,
798
- performance: dataArg.performance,
799
- tags: dataArg.tags,
800
- });
801
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
802
- }
803
- catch (error) {
804
- return {
805
- ...currentState,
806
- error: error instanceof Error ? error.message : 'Failed to update edge',
807
- };
808
- }
809
- });
810
- export const updateRemoteIngressHubSettingsAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
811
- const context = getActionContext();
812
- const currentState = statePartArg.getState();
813
- try {
814
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRemoteIngressHubSettings');
815
- const response = await request.fire({
816
- identity: context.identity,
817
- enabled: dataArg.enabled,
818
- tunnelPort: dataArg.tunnelPort,
819
- hubDomain: dataArg.hubDomain,
820
- performance: dataArg.performance,
821
- });
822
- if (!response.success) {
823
- return {
824
- ...currentState,
825
- error: response.message || 'Failed to update RemoteIngress hub settings',
826
- };
827
- }
828
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
829
- }
830
- catch (error) {
831
- return {
832
- ...currentState,
833
- error: error instanceof Error ? error.message : 'Failed to update RemoteIngress hub settings',
834
- };
835
- }
836
- });
837
- export const regenerateRemoteIngressSecretAction = remoteIngressStatePart.createAction(async (statePartArg, edgeId) => {
838
- const context = getActionContext();
839
- const currentState = statePartArg.getState();
840
- try {
841
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'regenerateRemoteIngressSecret');
842
- const response = await request.fire({
843
- identity: context.identity,
844
- id: edgeId,
845
- });
846
- if (response.success) {
847
- return {
848
- ...currentState,
849
- newEdgeId: edgeId,
850
- };
851
- }
852
- return currentState;
853
- }
854
- catch (error) {
855
- return {
856
- ...currentState,
857
- error: error instanceof Error ? error.message : 'Failed to regenerate secret',
858
- };
859
- }
860
- });
861
- export const clearNewEdgeIdAction = remoteIngressStatePart.createAction(async (statePartArg) => {
862
- return {
863
- ...statePartArg.getState(),
864
- newEdgeId: null,
865
- };
866
- });
867
- export const toggleRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
868
- const context = getActionContext();
869
- const currentState = statePartArg.getState();
870
- try {
871
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRemoteIngress');
872
- await request.fire({
873
- identity: context.identity,
874
- id: dataArg.id,
875
- enabled: dataArg.enabled,
876
- });
877
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
878
- }
879
- catch (error) {
880
- return {
881
- ...currentState,
882
- error: error instanceof Error ? error.message : 'Failed to toggle edge',
883
- };
884
- }
885
- });
886
- export const vpnStatePart = await appState.getStatePart('vpn', {
887
- clients: [],
888
- connectedClients: [],
889
- status: null,
890
- isLoading: false,
891
- error: null,
892
- lastUpdated: 0,
893
- newClientConfig: null,
894
- }, 'soft');
895
- // ============================================================================
896
- // VPN Actions
897
- // ============================================================================
898
- export const fetchVpnAction = vpnStatePart.createAction(async (statePartArg) => {
899
- const context = getActionContext();
900
- const currentState = statePartArg.getState();
901
- if (!context.identity)
902
- return currentState;
903
- try {
904
- const clientsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getVpnClients');
905
- const statusRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getVpnStatus');
906
- const connectedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getVpnConnectedClients');
907
- const [clientsResponse, statusResponse, connectedResponse] = await Promise.all([
908
- clientsRequest.fire({ identity: context.identity }),
909
- statusRequest.fire({ identity: context.identity }),
910
- connectedRequest.fire({ identity: context.identity }),
911
- ]);
912
- return {
913
- ...currentState,
914
- clients: clientsResponse.clients,
915
- connectedClients: connectedResponse.connectedClients,
916
- status: statusResponse.status,
917
- isLoading: false,
918
- error: null,
919
- lastUpdated: Date.now(),
920
- };
921
- }
922
- catch (error) {
923
- return {
924
- ...currentState,
925
- isLoading: false,
926
- error: error instanceof Error ? error.message : 'Failed to fetch VPN data',
927
- };
928
- }
929
- });
930
- export const createVpnClientAction = vpnStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
931
- const context = getActionContext();
932
- const currentState = statePartArg.getState();
933
- try {
934
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createVpnClient');
935
- const response = await request.fire({
936
- identity: context.identity,
937
- clientId: dataArg.clientId,
938
- targetProfileIds: dataArg.targetProfileIds,
939
- description: dataArg.description,
940
- destinationAllowList: dataArg.destinationAllowList,
941
- destinationBlockList: dataArg.destinationBlockList,
942
- useHostIp: dataArg.useHostIp,
943
- useDhcp: dataArg.useDhcp,
944
- staticIp: dataArg.staticIp,
945
- forceVlan: dataArg.forceVlan,
946
- vlanId: dataArg.vlanId,
947
- });
948
- if (!response.success) {
949
- return { ...currentState, error: response.message || 'Failed to create client' };
950
- }
951
- const refreshed = await actionContext.dispatch(fetchVpnAction, null);
952
- return {
953
- ...refreshed,
954
- newClientConfig: response.wireguardConfig || null,
955
- };
956
- }
957
- catch (error) {
958
- return {
959
- ...currentState,
960
- error: error instanceof Error ? error.message : 'Failed to create VPN client',
961
- };
962
- }
963
- });
964
- export const deleteVpnClientAction = vpnStatePart.createAction(async (statePartArg, clientId, actionContext) => {
965
- const context = getActionContext();
966
- const currentState = statePartArg.getState();
967
- try {
968
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteVpnClient');
969
- await request.fire({ identity: context.identity, clientId });
970
- return await actionContext.dispatch(fetchVpnAction, null);
971
- }
972
- catch (error) {
973
- return {
974
- ...currentState,
975
- error: error instanceof Error ? error.message : 'Failed to delete VPN client',
976
- };
977
- }
978
- });
979
- export const toggleVpnClientAction = vpnStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
980
- const context = getActionContext();
981
- const currentState = statePartArg.getState();
982
- try {
983
- const method = dataArg.enabled ? 'enableVpnClient' : 'disableVpnClient';
984
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', method);
985
- await request.fire({ identity: context.identity, clientId: dataArg.clientId });
986
- return await actionContext.dispatch(fetchVpnAction, null);
987
- }
988
- catch (error) {
989
- return {
990
- ...currentState,
991
- error: error instanceof Error ? error.message : 'Failed to toggle VPN client',
992
- };
993
- }
994
- });
995
- export const updateVpnClientAction = vpnStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
996
- const context = getActionContext();
997
- const currentState = statePartArg.getState();
998
- try {
999
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateVpnClient');
1000
- const response = await request.fire({
1001
- identity: context.identity,
1002
- clientId: dataArg.clientId,
1003
- description: dataArg.description,
1004
- targetProfileIds: dataArg.targetProfileIds,
1005
- destinationAllowList: dataArg.destinationAllowList,
1006
- destinationBlockList: dataArg.destinationBlockList,
1007
- useHostIp: dataArg.useHostIp,
1008
- useDhcp: dataArg.useDhcp,
1009
- staticIp: dataArg.staticIp,
1010
- forceVlan: dataArg.forceVlan,
1011
- vlanId: dataArg.vlanId,
1012
- });
1013
- if (!response.success) {
1014
- return { ...currentState, error: response.message || 'Failed to update client' };
1015
- }
1016
- return await actionContext.dispatch(fetchVpnAction, null);
1017
- }
1018
- catch (error) {
1019
- return {
1020
- ...currentState,
1021
- error: error instanceof Error ? error.message : 'Failed to update VPN client',
1022
- };
1023
- }
1024
- });
1025
- export const clearNewClientConfigAction = vpnStatePart.createAction(async (statePartArg) => {
1026
- return { ...statePartArg.getState(), newClientConfig: null };
1027
- });
1028
- export const targetProfilesStatePart = await appState.getStatePart('targetProfiles', {
1029
- profiles: [],
1030
- isLoading: false,
1031
- error: null,
1032
- lastUpdated: 0,
1033
- }, 'soft');
1034
- // ============================================================================
1035
- // Target Profiles Actions
1036
- // ============================================================================
1037
- export const fetchTargetProfilesAction = targetProfilesStatePart.createAction(async (statePartArg) => {
1038
- const context = getActionContext();
1039
- const currentState = statePartArg.getState();
1040
- if (!context.identity)
1041
- return currentState;
1042
- try {
1043
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getTargetProfiles');
1044
- const response = await request.fire({ identity: context.identity });
1045
- return {
1046
- profiles: response.profiles,
1047
- isLoading: false,
1048
- error: null,
1049
- lastUpdated: Date.now(),
1050
- };
1051
- }
1052
- catch (error) {
1053
- return {
1054
- ...currentState,
1055
- isLoading: false,
1056
- error: error instanceof Error ? error.message : 'Failed to fetch target profiles',
1057
- };
1058
- }
1059
- });
1060
- export const createTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1061
- const context = getActionContext();
1062
- try {
1063
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createTargetProfile');
1064
- const response = await request.fire({
1065
- identity: context.identity,
1066
- name: dataArg.name,
1067
- description: dataArg.description,
1068
- domains: dataArg.domains,
1069
- targets: dataArg.targets,
1070
- routeRefs: dataArg.routeRefs,
1071
- allowRoutesByClientSourceIp: dataArg.allowRoutesByClientSourceIp,
1072
- });
1073
- if (!response.success) {
1074
- return {
1075
- ...statePartArg.getState(),
1076
- error: response.message || 'Failed to create target profile',
1077
- };
1078
- }
1079
- return await actionContext.dispatch(fetchTargetProfilesAction, null);
1080
- }
1081
- catch (error) {
1082
- return {
1083
- ...statePartArg.getState(),
1084
- error: error instanceof Error ? error.message : 'Failed to create target profile',
1085
- };
1086
- }
1087
- });
1088
- export const updateTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1089
- const context = getActionContext();
1090
- try {
1091
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateTargetProfile');
1092
- const response = await request.fire({
1093
- identity: context.identity,
1094
- id: dataArg.id,
1095
- name: dataArg.name,
1096
- description: dataArg.description,
1097
- domains: dataArg.domains,
1098
- targets: dataArg.targets,
1099
- routeRefs: dataArg.routeRefs,
1100
- allowRoutesByClientSourceIp: dataArg.allowRoutesByClientSourceIp,
1101
- });
1102
- if (!response.success) {
1103
- return {
1104
- ...statePartArg.getState(),
1105
- error: response.message || 'Failed to update target profile',
1106
- };
1107
- }
1108
- return await actionContext.dispatch(fetchTargetProfilesAction, null);
1109
- }
1110
- catch (error) {
1111
- return {
1112
- ...statePartArg.getState(),
1113
- error: error instanceof Error ? error.message : 'Failed to update target profile',
1114
- };
1115
- }
1116
- });
1117
- export const deleteTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1118
- const context = getActionContext();
1119
- try {
1120
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteTargetProfile');
1121
- const response = await request.fire({
1122
- identity: context.identity,
1123
- id: dataArg.id,
1124
- force: dataArg.force,
1125
- });
1126
- if (!response.success) {
1127
- return {
1128
- ...statePartArg.getState(),
1129
- error: response.message || 'Failed to delete target profile',
1130
- };
1131
- }
1132
- return await actionContext.dispatch(fetchTargetProfilesAction, null);
1133
- }
1134
- catch (error) {
1135
- return {
1136
- ...statePartArg.getState(),
1137
- error: error instanceof Error ? error.message : 'Failed to delete target profile',
1138
- };
1139
- }
1140
- });
1141
- export const profilesTargetsStatePart = await appState.getStatePart('profilesTargets', {
1142
- profiles: [],
1143
- targets: [],
1144
- isLoading: false,
1145
- error: null,
1146
- lastUpdated: 0,
1147
- }, 'soft');
1148
- // ============================================================================
1149
- // Source Profiles & Network Targets Actions
1150
- // ============================================================================
1151
- export const fetchProfilesAndTargetsAction = profilesTargetsStatePart.createAction(async (statePartArg) => {
1152
- const context = getActionContext();
1153
- const currentState = statePartArg.getState();
1154
- if (!context.identity)
1155
- return currentState;
1156
- try {
1157
- const profilesRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getSourceProfiles');
1158
- const targetsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getNetworkTargets');
1159
- const [profilesResponse, targetsResponse] = await Promise.all([
1160
- profilesRequest.fire({ identity: context.identity }),
1161
- targetsRequest.fire({ identity: context.identity }),
1162
- ]);
1163
- return {
1164
- profiles: profilesResponse.profiles,
1165
- targets: targetsResponse.targets,
1166
- isLoading: false,
1167
- error: null,
1168
- lastUpdated: Date.now(),
1169
- };
1170
- }
1171
- catch (error) {
1172
- return {
1173
- ...currentState,
1174
- isLoading: false,
1175
- error: error instanceof Error ? error.message : 'Failed to fetch profiles/targets',
1176
- };
1177
- }
1178
- });
1179
- export const createProfileAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1180
- const context = getActionContext();
1181
- try {
1182
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createSourceProfile');
1183
- await request.fire({
1184
- identity: context.identity,
1185
- name: dataArg.name,
1186
- description: dataArg.description,
1187
- security: dataArg.security,
1188
- extendsProfiles: dataArg.extendsProfiles,
1189
- });
1190
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1191
- }
1192
- catch (error) {
1193
- return {
1194
- ...statePartArg.getState(),
1195
- error: error instanceof Error ? error.message : 'Failed to create profile',
1196
- };
1197
- }
1198
- });
1199
- export const updateProfileAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1200
- const context = getActionContext();
1201
- try {
1202
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateSourceProfile');
1203
- await request.fire({
1204
- identity: context.identity,
1205
- id: dataArg.id,
1206
- name: dataArg.name,
1207
- description: dataArg.description,
1208
- security: dataArg.security,
1209
- extendsProfiles: dataArg.extendsProfiles,
1210
- });
1211
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1212
- }
1213
- catch (error) {
1214
- return {
1215
- ...statePartArg.getState(),
1216
- error: error instanceof Error ? error.message : 'Failed to update profile',
1217
- };
1218
- }
1219
- });
1220
- export const deleteProfileAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1221
- const context = getActionContext();
1222
- try {
1223
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteSourceProfile');
1224
- const response = await request.fire({
1225
- identity: context.identity,
1226
- id: dataArg.id,
1227
- force: dataArg.force,
1228
- });
1229
- if (!response.success) {
1230
- return {
1231
- ...statePartArg.getState(),
1232
- error: response.message || 'Failed to delete profile',
1233
- };
1234
- }
1235
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1236
- }
1237
- catch (error) {
1238
- return {
1239
- ...statePartArg.getState(),
1240
- error: error instanceof Error ? error.message : 'Failed to delete profile',
1241
- };
1242
- }
1243
- });
1244
- export const createTargetAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1245
- const context = getActionContext();
1246
- try {
1247
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createNetworkTarget');
1248
- await request.fire({
1249
- identity: context.identity,
1250
- name: dataArg.name,
1251
- description: dataArg.description,
1252
- host: dataArg.host,
1253
- port: dataArg.port,
1254
- });
1255
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1256
- }
1257
- catch (error) {
1258
- return {
1259
- ...statePartArg.getState(),
1260
- error: error instanceof Error ? error.message : 'Failed to create target',
1261
- };
1262
- }
1263
- });
1264
- export const updateTargetAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1265
- const context = getActionContext();
1266
- try {
1267
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateNetworkTarget');
1268
- await request.fire({
1269
- identity: context.identity,
1270
- id: dataArg.id,
1271
- name: dataArg.name,
1272
- description: dataArg.description,
1273
- host: dataArg.host,
1274
- port: dataArg.port,
1275
- });
1276
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1277
- }
1278
- catch (error) {
1279
- return {
1280
- ...statePartArg.getState(),
1281
- error: error instanceof Error ? error.message : 'Failed to update target',
1282
- };
1283
- }
1284
- });
1285
- export const deleteTargetAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1286
- const context = getActionContext();
1287
- try {
1288
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteNetworkTarget');
1289
- const response = await request.fire({
1290
- identity: context.identity,
1291
- id: dataArg.id,
1292
- force: dataArg.force,
1293
- });
1294
- if (!response.success) {
1295
- return {
1296
- ...statePartArg.getState(),
1297
- error: response.message || 'Failed to delete target',
1298
- };
1299
- }
1300
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1301
- }
1302
- catch (error) {
1303
- return {
1304
- ...statePartArg.getState(),
1305
- error: error instanceof Error ? error.message : 'Failed to delete target',
1306
- };
1307
- }
1308
- });
1309
- export const domainsStatePart = await appState.getStatePart('domains', {
1310
- providers: [],
1311
- domains: [],
1312
- records: [],
1313
- selectedDomainId: null,
1314
- isLoading: false,
1315
- error: null,
1316
- lastUpdated: 0,
1317
- }, 'soft');
1318
- export const fetchDomainsAndProvidersAction = domainsStatePart.createAction(async (statePartArg) => {
1319
- const context = getActionContext();
1320
- const currentState = statePartArg.getState();
1321
- if (!context.identity)
1322
- return currentState;
1323
- try {
1324
- const providersRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getDnsProviders');
1325
- const domainsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getDomains');
1326
- const [providersResponse, domainsResponse] = await Promise.all([
1327
- providersRequest.fire({ identity: context.identity }),
1328
- domainsRequest.fire({ identity: context.identity }),
1329
- ]);
1330
- return {
1331
- ...currentState,
1332
- providers: providersResponse.providers,
1333
- domains: domainsResponse.domains,
1334
- isLoading: false,
1335
- error: null,
1336
- lastUpdated: Date.now(),
1337
- };
1338
- }
1339
- catch (error) {
1340
- return {
1341
- ...currentState,
1342
- isLoading: false,
1343
- error: error instanceof Error ? error.message : 'Failed to fetch domains/providers',
1344
- };
1345
- }
1346
- });
1347
- export const fetchDnsRecordsForDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg) => {
1348
- const context = getActionContext();
1349
- const currentState = statePartArg.getState();
1350
- if (!context.identity)
1351
- return currentState;
1352
- try {
1353
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getDnsRecords');
1354
- const response = await request.fire({
1355
- identity: context.identity,
1356
- domainId: dataArg.domainId,
1357
- });
1358
- return {
1359
- ...currentState,
1360
- records: response.records,
1361
- selectedDomainId: dataArg.domainId,
1362
- error: null,
1363
- };
1364
- }
1365
- catch (error) {
1366
- return {
1367
- ...currentState,
1368
- error: error instanceof Error ? error.message : 'Failed to fetch DNS records',
1369
- };
1370
- }
1371
- });
1372
- export const createDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1373
- const context = getActionContext();
1374
- try {
1375
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createDnsProvider');
1376
- const response = await request.fire({
1377
- identity: context.identity,
1378
- name: dataArg.name,
1379
- type: dataArg.type,
1380
- credentials: dataArg.credentials,
1381
- });
1382
- if (!response.success) {
1383
- return {
1384
- ...statePartArg.getState(),
1385
- error: response.message || 'Failed to create provider',
1386
- };
1387
- }
1388
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1389
- }
1390
- catch (error) {
1391
- return {
1392
- ...statePartArg.getState(),
1393
- error: error instanceof Error ? error.message : 'Failed to create provider',
1394
- };
1395
- }
1396
- });
1397
- export const updateDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1398
- const context = getActionContext();
1399
- try {
1400
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateDnsProvider');
1401
- const response = await request.fire({
1402
- identity: context.identity,
1403
- id: dataArg.id,
1404
- name: dataArg.name,
1405
- credentials: dataArg.credentials,
1406
- });
1407
- if (!response.success) {
1408
- return {
1409
- ...statePartArg.getState(),
1410
- error: response.message || 'Failed to update provider',
1411
- };
1412
- }
1413
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1414
- }
1415
- catch (error) {
1416
- return {
1417
- ...statePartArg.getState(),
1418
- error: error instanceof Error ? error.message : 'Failed to update provider',
1419
- };
1420
- }
1421
- });
1422
- export const deleteDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1423
- const context = getActionContext();
1424
- try {
1425
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteDnsProvider');
1426
- const response = await request.fire({
1427
- identity: context.identity,
1428
- id: dataArg.id,
1429
- force: dataArg.force,
1430
- });
1431
- if (!response.success) {
1432
- return {
1433
- ...statePartArg.getState(),
1434
- error: response.message || 'Failed to delete provider',
1435
- };
1436
- }
1437
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1438
- }
1439
- catch (error) {
1440
- return {
1441
- ...statePartArg.getState(),
1442
- error: error instanceof Error ? error.message : 'Failed to delete provider',
1443
- };
1444
- }
1445
- });
1446
- export const testDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1447
- const context = getActionContext();
1448
- try {
1449
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'testDnsProvider');
1450
- await request.fire({ identity: context.identity, id: dataArg.id });
1451
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1452
- }
1453
- catch (error) {
1454
- return {
1455
- ...statePartArg.getState(),
1456
- error: error instanceof Error ? error.message : 'Failed to test provider',
1457
- };
1458
- }
1459
- });
1460
- /** One-shot fetch for the import-domain modal. Does NOT modify state. */
1461
- export async function fetchProviderDomains(providerId) {
1462
- const context = getActionContext();
1463
- if (!context.identity)
1464
- return { success: false, message: 'Not authenticated' };
1465
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listProviderDomains');
1466
- return await request.fire({ identity: context.identity, providerId });
1467
- }
1468
- export const createDcrouterDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1469
- const context = getActionContext();
1470
- try {
1471
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createDomain');
1472
- const response = await request.fire({
1473
- identity: context.identity,
1474
- name: dataArg.name,
1475
- description: dataArg.description,
1476
- });
1477
- if (!response.success) {
1478
- return { ...statePartArg.getState(), error: response.message || 'Failed to create domain' };
1479
- }
1480
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1481
- }
1482
- catch (error) {
1483
- return {
1484
- ...statePartArg.getState(),
1485
- error: error instanceof Error ? error.message : 'Failed to create domain',
1486
- };
1487
- }
1488
- });
1489
- export const importDomainsFromProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1490
- const context = getActionContext();
1491
- try {
1492
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'importDomain');
1493
- const response = await request.fire({
1494
- identity: context.identity,
1495
- providerId: dataArg.providerId,
1496
- domainNames: dataArg.domainNames,
1497
- });
1498
- if (!response.success) {
1499
- return { ...statePartArg.getState(), error: response.message || 'Failed to import domains' };
1500
- }
1501
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1502
- }
1503
- catch (error) {
1504
- return {
1505
- ...statePartArg.getState(),
1506
- error: error instanceof Error ? error.message : 'Failed to import domains',
1507
- };
1508
- }
1509
- });
1510
- export const deleteDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1511
- const context = getActionContext();
1512
- try {
1513
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteDomain');
1514
- const response = await request.fire({ identity: context.identity, id: dataArg.id });
1515
- if (!response.success) {
1516
- return { ...statePartArg.getState(), error: response.message || 'Failed to delete domain' };
1517
- }
1518
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1519
- }
1520
- catch (error) {
1521
- return {
1522
- ...statePartArg.getState(),
1523
- error: error instanceof Error ? error.message : 'Failed to delete domain',
1524
- };
1525
- }
1526
- });
1527
- export const syncDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1528
- const context = getActionContext();
1529
- try {
1530
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'syncDomain');
1531
- const response = await request.fire({ identity: context.identity, id: dataArg.id });
1532
- if (!response.success) {
1533
- return { ...statePartArg.getState(), error: response.message || 'Failed to sync domain' };
1534
- }
1535
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1536
- }
1537
- catch (error) {
1538
- return {
1539
- ...statePartArg.getState(),
1540
- error: error instanceof Error ? error.message : 'Failed to sync domain',
1541
- };
1542
- }
1543
- });
1544
- export const migrateDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1545
- const context = getActionContext();
1546
- try {
1547
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'migrateDomain');
1548
- const response = await request.fire({ identity: context.identity, ...dataArg });
1549
- if (!response.success) {
1550
- return { ...statePartArg.getState(), error: response.message || 'Migration failed' };
1551
- }
1552
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1553
- }
1554
- catch (error) {
1555
- return {
1556
- ...statePartArg.getState(),
1557
- error: error instanceof Error ? error.message : 'Migration failed',
1558
- };
1559
- }
1560
- });
1561
- export const createDnsRecordAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1562
- const context = getActionContext();
1563
- try {
1564
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createDnsRecord');
1565
- const response = await request.fire({
1566
- identity: context.identity,
1567
- domainId: dataArg.domainId,
1568
- name: dataArg.name,
1569
- type: dataArg.type,
1570
- value: dataArg.value,
1571
- ttl: dataArg.ttl,
1572
- proxied: dataArg.proxied,
1573
- });
1574
- if (!response.success) {
1575
- return { ...statePartArg.getState(), error: response.message || 'Failed to create record' };
1576
- }
1577
- return await actionContext.dispatch(fetchDnsRecordsForDomainAction, { domainId: dataArg.domainId });
1578
- }
1579
- catch (error) {
1580
- return {
1581
- ...statePartArg.getState(),
1582
- error: error instanceof Error ? error.message : 'Failed to create record',
1583
- };
1584
- }
1585
- });
1586
- export const updateDnsRecordAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1587
- const context = getActionContext();
1588
- try {
1589
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateDnsRecord');
1590
- const response = await request.fire({
1591
- identity: context.identity,
1592
- id: dataArg.id,
1593
- name: dataArg.name,
1594
- value: dataArg.value,
1595
- ttl: dataArg.ttl,
1596
- proxied: dataArg.proxied,
1597
- });
1598
- if (!response.success) {
1599
- return { ...statePartArg.getState(), error: response.message || 'Failed to update record' };
1600
- }
1601
- return await actionContext.dispatch(fetchDnsRecordsForDomainAction, { domainId: dataArg.domainId });
1602
- }
1603
- catch (error) {
1604
- return {
1605
- ...statePartArg.getState(),
1606
- error: error instanceof Error ? error.message : 'Failed to update record',
1607
- };
1608
- }
1609
- });
1610
- export const deleteDnsRecordAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1611
- const context = getActionContext();
1612
- try {
1613
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteDnsRecord');
1614
- const response = await request.fire({ identity: context.identity, id: dataArg.id });
1615
- if (!response.success) {
1616
- return { ...statePartArg.getState(), error: response.message || 'Failed to delete record' };
1617
- }
1618
- return await actionContext.dispatch(fetchDnsRecordsForDomainAction, { domainId: dataArg.domainId });
1619
- }
1620
- catch (error) {
1621
- return {
1622
- ...statePartArg.getState(),
1623
- error: error instanceof Error ? error.message : 'Failed to delete record',
1624
- };
1625
- }
1626
- });
1627
- // ============================================================================
1628
- // ACME Config Actions
1629
- // ============================================================================
1630
- export const fetchAcmeConfigAction = acmeConfigStatePart.createAction(async (statePartArg) => {
1631
- const context = getActionContext();
1632
- const currentState = statePartArg.getState();
1633
- if (!context.identity)
1634
- return currentState;
1635
- try {
1636
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getAcmeConfig');
1637
- const response = await request.fire({ identity: context.identity });
1638
- return {
1639
- config: response.config,
1640
- isLoading: false,
1641
- error: null,
1642
- lastUpdated: Date.now(),
1643
- };
1644
- }
1645
- catch (error) {
1646
- return {
1647
- ...currentState,
1648
- isLoading: false,
1649
- error: error instanceof Error ? error.message : 'Failed to fetch ACME config',
1650
- };
1651
- }
1652
- });
1653
- export const updateAcmeConfigAction = acmeConfigStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1654
- const context = getActionContext();
1655
- try {
1656
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateAcmeConfig');
1657
- const response = await request.fire({
1658
- identity: context.identity,
1659
- accountEmail: dataArg.accountEmail,
1660
- enabled: dataArg.enabled,
1661
- useProduction: dataArg.useProduction,
1662
- autoRenew: dataArg.autoRenew,
1663
- renewThresholdDays: dataArg.renewThresholdDays,
1664
- });
1665
- if (!response.success) {
1666
- return {
1667
- ...statePartArg.getState(),
1668
- error: response.message || 'Failed to update ACME config',
1669
- };
1670
- }
1671
- return await actionContext.dispatch(fetchAcmeConfigAction, null);
1672
- }
1673
- catch (error) {
1674
- return {
1675
- ...statePartArg.getState(),
1676
- error: error instanceof Error ? error.message : 'Failed to update ACME config',
1677
- };
1678
- }
1679
- });
1680
- // ============================================================================
1681
- // Route Management Actions
1682
- // ============================================================================
1683
- export const fetchMergedRoutesAction = routeManagementStatePart.createAction(async (statePartArg) => {
1684
- const context = getActionContext();
1685
- const currentState = statePartArg.getState();
1686
- if (!context.identity)
1687
- return currentState;
1688
- try {
1689
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getMergedRoutes');
1690
- const response = await request.fire({
1691
- identity: context.identity,
1692
- });
1693
- return {
1694
- ...currentState,
1695
- mergedRoutes: response.routes,
1696
- warnings: response.warnings,
1697
- isLoading: false,
1698
- error: null,
1699
- lastUpdated: Date.now(),
1700
- };
1701
- }
1702
- catch (error) {
1703
- return {
1704
- ...currentState,
1705
- isLoading: false,
1706
- error: error instanceof Error ? error.message : 'Failed to fetch routes',
1707
- };
1708
- }
1709
- });
1710
- export const fetchHttpRedirectsAction = routeManagementStatePart.createAction(async (statePartArg) => {
1711
- const context = getActionContext();
1712
- const currentState = statePartArg.getState();
1713
- if (!context.identity)
1714
- return currentState;
1715
- try {
1716
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getHttpRedirects');
1717
- const response = await request.fire({
1718
- identity: context.identity,
1719
- });
1720
- return {
1721
- ...currentState,
1722
- httpRedirects: response.redirects,
1723
- isLoading: false,
1724
- error: null,
1725
- lastUpdated: Date.now(),
1726
- };
1727
- }
1728
- catch (error) {
1729
- return {
1730
- ...currentState,
1731
- isLoading: false,
1732
- error: error instanceof Error ? error.message : 'Failed to fetch HTTP redirects',
1733
- };
1734
- }
1735
- });
1736
- export const createRouteAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1737
- const context = getActionContext();
1738
- const currentState = statePartArg.getState();
1739
- try {
1740
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createRoute');
1741
- await request.fire({
1742
- identity: context.identity,
1743
- route: dataArg.route,
1744
- enabled: dataArg.enabled,
1745
- metadata: dataArg.metadata,
1746
- });
1747
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1748
- }
1749
- catch (error) {
1750
- return {
1751
- ...currentState,
1752
- error: error instanceof Error ? error.message : 'Failed to create route',
1753
- };
1754
- }
1755
- });
1756
- export const updateRouteAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1757
- const context = getActionContext();
1758
- const currentState = statePartArg.getState();
1759
- try {
1760
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRoute');
1761
- const response = await request.fire({
1762
- identity: context.identity,
1763
- id: dataArg.id,
1764
- route: dataArg.route,
1765
- enabled: dataArg.enabled,
1766
- metadata: dataArg.metadata,
1767
- });
1768
- if (!response.success) {
1769
- throw new Error(response.message || 'Failed to update route');
1770
- }
1771
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1772
- }
1773
- catch (error) {
1774
- return {
1775
- ...currentState,
1776
- error: error instanceof Error ? error.message : 'Failed to update route',
1777
- };
1778
- }
1779
- });
1780
- export const deleteRouteAction = routeManagementStatePart.createAction(async (statePartArg, routeId, actionContext) => {
1781
- const context = getActionContext();
1782
- const currentState = statePartArg.getState();
1783
- try {
1784
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteRoute');
1785
- const response = await request.fire({
1786
- identity: context.identity,
1787
- id: routeId,
1788
- });
1789
- if (!response.success) {
1790
- throw new Error(response.message || 'Failed to delete route');
1791
- }
1792
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1793
- }
1794
- catch (error) {
1795
- return {
1796
- ...currentState,
1797
- error: error instanceof Error ? error.message : 'Failed to delete route',
1798
- };
1799
- }
1800
- });
1801
- export const toggleRouteAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1802
- const context = getActionContext();
1803
- const currentState = statePartArg.getState();
1804
- try {
1805
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'toggleRoute');
1806
- const response = await request.fire({
1807
- identity: context.identity,
1808
- id: dataArg.id,
1809
- enabled: dataArg.enabled,
1810
- });
1811
- if (!response.success) {
1812
- throw new Error(response.message || 'Failed to toggle route');
1813
- }
1814
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1815
- }
1816
- catch (error) {
1817
- return {
1818
- ...currentState,
1819
- error: error instanceof Error ? error.message : 'Failed to toggle route',
1820
- };
1821
- }
1822
- });
1823
- // ============================================================================
1824
- // API Token Actions
1825
- // ============================================================================
1826
- export const fetchApiTokensAction = routeManagementStatePart.createAction(async (statePartArg) => {
1827
- const context = getActionContext();
1828
- const currentState = statePartArg.getState();
1829
- if (!context.identity)
1830
- return currentState;
1831
- try {
1832
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listApiTokens');
1833
- const response = await request.fire({
1834
- identity: context.identity,
1835
- });
1836
- return {
1837
- ...currentState,
1838
- apiTokens: response.tokens,
1839
- };
1840
- }
1841
- catch (error) {
1842
- return {
1843
- ...currentState,
1844
- error: error instanceof Error ? error.message : 'Failed to fetch tokens',
1845
- };
1846
- }
1847
- });
1848
- export const fetchGatewayClientsAction = routeManagementStatePart.createAction(async (statePartArg) => {
1849
- const context = getActionContext();
1850
- const currentState = statePartArg.getState();
1851
- if (!context.identity)
1852
- return currentState;
1853
- try {
1854
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listGatewayClients');
1855
- const response = await request.fire({ identity: context.identity });
1856
- return {
1857
- ...currentState,
1858
- gatewayClients: response.gatewayClients,
1859
- error: null,
1860
- lastUpdated: Date.now(),
1861
- };
1862
- }
1863
- catch (error) {
1864
- return {
1865
- ...currentState,
1866
- error: error instanceof Error ? error.message : 'Failed to fetch gateway clients',
1867
- };
1868
- }
1869
- });
1870
- export async function createGatewayClient(data) {
1871
- const context = getActionContext();
1872
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createGatewayClient');
1873
- return request.fire({
1874
- identity: context.identity,
1875
- capabilities: {
1876
- readDomains: true,
1877
- readDnsRecords: true,
1878
- syncRoutes: true,
1879
- syncDnsRecords: false,
1880
- requestCertificates: false,
1881
- },
1882
- ...data,
1883
- });
1884
- }
1885
- export const updateGatewayClientAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1886
- const context = getActionContext();
1887
- const currentState = statePartArg.getState();
1888
- try {
1889
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateGatewayClient');
1890
- await request.fire({ identity: context.identity, ...dataArg });
1891
- return await actionContext.dispatch(fetchGatewayClientsAction, null);
1892
- }
1893
- catch (error) {
1894
- return {
1895
- ...currentState,
1896
- error: error instanceof Error ? error.message : 'Failed to update gateway client',
1897
- };
1898
- }
1899
- });
1900
- export const deleteGatewayClientAction = routeManagementStatePart.createAction(async (statePartArg, gatewayClientId, actionContext) => {
1901
- const context = getActionContext();
1902
- const currentState = statePartArg.getState();
1903
- try {
1904
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteGatewayClient');
1905
- await request.fire({ identity: context.identity, id: gatewayClientId });
1906
- return await actionContext.dispatch(fetchGatewayClientsAction, null);
1907
- }
1908
- catch (error) {
1909
- return {
1910
- ...currentState,
1911
- error: error instanceof Error ? error.message : 'Failed to delete gateway client',
1912
- };
1913
- }
1914
- });
1915
- export async function createGatewayClientToken(gatewayClientId, name, expiresInDays) {
1916
- const context = getActionContext();
1917
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createGatewayClientToken');
1918
- return request.fire({
1919
- identity: context.identity,
1920
- gatewayClientId,
1921
- name,
1922
- expiresInDays,
1923
- });
1924
- }
1925
- // Users
1926
- export const fetchUsersAction = usersStatePart.createAction(async (statePartArg) => {
1927
- const context = getActionContext();
1928
- const currentState = statePartArg.getState();
1929
- if (!context.identity)
1930
- return currentState;
1931
- try {
1932
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listUsers');
1933
- const response = await request.fire({
1934
- identity: context.identity,
1935
- });
1936
- return {
1937
- ...currentState,
1938
- users: response.users,
1939
- error: null,
1940
- lastUpdated: Date.now(),
1941
- };
1942
- }
1943
- catch (error) {
1944
- return {
1945
- ...currentState,
1946
- error: error instanceof Error ? error.message : 'Failed to fetch users',
1947
- };
1948
- }
1949
- });
1950
- export const createUserAction = usersStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1951
- const context = getActionContext();
1952
- const currentState = statePartArg.getState();
1953
- if (!context.identity)
1954
- return currentState;
1955
- try {
1956
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createUser');
1957
- const response = await request.fire({
1958
- identity: context.identity,
1959
- email: dataArg.email,
1960
- name: dataArg.name,
1961
- role: dataArg.role,
1962
- password: dataArg.password,
1963
- enableIdpGlobalAuth: dataArg.enableIdpGlobalAuth,
1964
- });
1965
- if (!response.success) {
1966
- throw new Error(response.message || 'Failed to create user');
1967
- }
1968
- return await actionContext.dispatch(fetchUsersAction, null);
1969
- }
1970
- catch (error) {
1971
- return {
1972
- ...currentState,
1973
- error: error instanceof Error ? error.message : 'Failed to create user',
1974
- };
1975
- }
1976
- });
1977
- export const deleteUserAction = usersStatePart.createAction(async (statePartArg, userIdArg, actionContext) => {
1978
- const context = getActionContext();
1979
- const currentState = statePartArg.getState();
1980
- if (!context.identity)
1981
- return currentState;
1982
- try {
1983
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteUser');
1984
- const response = await request.fire({
1985
- identity: context.identity,
1986
- id: userIdArg,
1987
- });
1988
- if (!response.success) {
1989
- throw new Error(response.message || 'Failed to delete user');
1990
- }
1991
- return await actionContext.dispatch(fetchUsersAction, null);
1992
- }
1993
- catch (error) {
1994
- return {
1995
- ...currentState,
1996
- error: error instanceof Error ? error.message : 'Failed to delete user',
1997
- };
1998
- }
1999
- });
2000
- export async function createApiToken(name, scopes, expiresInDays, policy) {
2001
- const context = getActionContext();
2002
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createApiToken');
2003
- return request.fire({
2004
- identity: context.identity,
2005
- name,
2006
- scopes,
2007
- policy,
2008
- expiresInDays,
2009
- });
2010
- }
2011
- export async function rollApiToken(id) {
2012
- const context = getActionContext();
2013
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'rollApiToken');
2014
- return request.fire({
2015
- identity: context.identity,
2016
- id,
2017
- });
2018
- }
2019
- export const revokeApiTokenAction = routeManagementStatePart.createAction(async (statePartArg, tokenId, actionContext) => {
2020
- const context = getActionContext();
2021
- const currentState = statePartArg.getState();
2022
- try {
2023
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'revokeApiToken');
2024
- await request.fire({
2025
- identity: context.identity,
2026
- id: tokenId,
2027
- });
2028
- return await actionContext.dispatch(fetchApiTokensAction, null);
2029
- }
2030
- catch (error) {
2031
- return {
2032
- ...currentState,
2033
- error: error instanceof Error ? error.message : 'Failed to revoke token',
2034
- };
2035
- }
2036
- });
2037
- export const toggleApiTokenAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
2038
- const context = getActionContext();
2039
- const currentState = statePartArg.getState();
2040
- try {
2041
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'toggleApiToken');
2042
- await request.fire({
2043
- identity: context.identity,
2044
- id: dataArg.id,
2045
- enabled: dataArg.enabled,
2046
- });
2047
- return await actionContext.dispatch(fetchApiTokensAction, null);
2048
- }
2049
- catch (error) {
2050
- return {
2051
- ...currentState,
2052
- error: error instanceof Error ? error.message : 'Failed to toggle token',
2053
- };
2054
- }
2055
- });
2056
- export const emailDomainsStatePart = await appState.getStatePart('emailDomains', {
2057
- domains: [],
2058
- settings: null,
2059
- isLoading: false,
2060
- lastUpdated: 0,
2061
- }, 'soft');
2062
- export const fetchEmailDomainsAction = emailDomainsStatePart.createAction(async (statePartArg) => {
2063
- const context = getActionContext();
2064
- const currentState = statePartArg.getState();
2065
- if (!context.identity)
2066
- return currentState;
2067
- try {
2068
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getEmailDomains');
2069
- const settingsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getEmailServerSettings');
2070
- const response = await request.fire({ identity: context.identity });
2071
- const settingsResponse = await settingsRequest.fire({ identity: context.identity });
2072
- return {
2073
- ...currentState,
2074
- domains: response.domains,
2075
- settings: settingsResponse.settings,
2076
- isLoading: false,
2077
- lastUpdated: Date.now(),
2078
- };
2079
- }
2080
- catch {
2081
- return { ...currentState, isLoading: false };
2082
- }
2083
- });
2084
- export const createEmailDomainAction = emailDomainsStatePart.createAction(async (statePartArg, args, actionContext) => {
2085
- const context = getActionContext();
2086
- const currentState = statePartArg.getState();
2087
- try {
2088
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createEmailDomain');
2089
- await request.fire({ identity: context.identity, ...args });
2090
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
2091
- }
2092
- catch {
2093
- return currentState;
2094
- }
2095
- });
2096
- export const updateEmailServerSettingsAction = emailDomainsStatePart.createAction(async (statePartArg, settings, actionContext) => {
2097
- const context = getActionContext();
2098
- const currentState = statePartArg.getState();
2099
- try {
2100
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateEmailServerSettings');
2101
- const response = await request.fire({ identity: context.identity, settings });
2102
- if (!response.success) {
2103
- return currentState;
2104
- }
2105
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
2106
- }
2107
- catch {
2108
- return currentState;
2109
- }
2110
- });
2111
- export const deleteEmailDomainAction = emailDomainsStatePart.createAction(async (statePartArg, id, actionContext) => {
2112
- const context = getActionContext();
2113
- const currentState = statePartArg.getState();
2114
- try {
2115
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteEmailDomain');
2116
- await request.fire({ identity: context.identity, id });
2117
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
2118
- }
2119
- catch {
2120
- return currentState;
2121
- }
2122
- });
2123
- export const validateEmailDomainAction = emailDomainsStatePart.createAction(async (statePartArg, id, actionContext) => {
2124
- const context = getActionContext();
2125
- const currentState = statePartArg.getState();
2126
- try {
2127
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'validateEmailDomain');
2128
- await request.fire({ identity: context.identity, id });
2129
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
2130
- }
2131
- catch {
2132
- return currentState;
2133
- }
2134
- });
2135
- export const provisionEmailDomainDnsAction = emailDomainsStatePart.createAction(async (statePartArg, id, actionContext) => {
2136
- const context = getActionContext();
2137
- const currentState = statePartArg.getState();
2138
- try {
2139
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'provisionEmailDomainDns');
2140
- await request.fire({ identity: context.identity, id });
2141
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
2142
- }
2143
- catch {
2144
- return currentState;
2145
- }
2146
- });
2147
- // ============================================================================
2148
- // Email Domain Standalone Functions
2149
- // ============================================================================
2150
- export async function fetchEmailDomainDnsRecords(id) {
2151
- const context = getActionContext();
2152
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getEmailDomainDnsRecords');
2153
- return request.fire({ identity: context.identity, id });
2154
- }
2155
- // ============================================================================
2156
- // TypedSocket Client for Real-time Log Streaming
2157
- // ============================================================================
2158
- let socketClient = null;
2159
- const socketRouter = new plugins.domtools.plugins.typedrequest.TypedRouter();
2160
- // Batched log entry handler — buffers incoming entries and flushes once per animation frame
2161
- let logEntryBuffer = [];
2162
- let logFlushScheduled = false;
2163
- function flushLogEntries() {
2164
- logFlushScheduled = false;
2165
- if (logEntryBuffer.length === 0)
2166
- return;
2167
- const current = logStatePart.getState();
2168
- const updated = [...current.recentLogs, ...logEntryBuffer];
2169
- logEntryBuffer = [];
2170
- // Cap at 2000 entries
2171
- if (updated.length > 2000) {
2172
- updated.splice(0, updated.length - 2000);
2173
- }
2174
- logStatePart.setState({ ...current, recentLogs: updated });
2175
- }
2176
- // Register handler for pushed log entries from the server
2177
- socketRouter.addTypedHandler(new plugins.domtools.plugins.typedrequest.TypedHandler('pushLogEntry', async (dataArg) => {
2178
- logEntryBuffer.push(dataArg.entry);
2179
- if (!logFlushScheduled) {
2180
- logFlushScheduled = true;
2181
- requestAnimationFrame(flushLogEntries);
2182
- }
2183
- return {};
2184
- }));
2185
- async function connectSocket() {
2186
- if (socketClient)
2187
- return;
2188
- try {
2189
- socketClient = await plugins.typedsocket.TypedSocket.createClient(socketRouter, plugins.typedsocket.TypedSocket.useWindowLocationOriginUrl());
2190
- await socketClient.setTag('role', 'ops_dashboard');
2191
- }
2192
- catch (err) {
2193
- console.error('TypedSocket connection failed:', err);
2194
- socketClient = null;
2195
- }
2196
- }
2197
- async function disconnectSocket() {
2198
- if (socketClient) {
2199
- try {
2200
- await socketClient.stop();
2201
- }
2202
- catch {
2203
- // ignore disconnect errors
2204
- }
2205
- socketClient = null;
2206
- }
2207
- }
2208
- // In-flight guard to prevent concurrent refresh requests
2209
- let isRefreshing = false;
2210
- // Combined refresh action for efficient polling
2211
- async function dispatchCombinedRefreshAction() {
2212
- if (isRefreshing)
2213
- return;
2214
- isRefreshing = true;
2215
- try {
2216
- await dispatchCombinedRefreshActionInner();
2217
- }
2218
- finally {
2219
- isRefreshing = false;
2220
- }
2221
- }
2222
- async function dispatchCombinedRefreshActionInner() {
2223
- const context = getActionContext();
2224
- if (!context.identity)
2225
- return;
2226
- const currentView = uiStatePart.getState().activeView;
2227
- const currentSubview = uiStatePart.getState().activeSubview;
2228
- try {
2229
- // Always fetch basic stats for dashboard widgets
2230
- const combinedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCombinedMetrics');
2231
- const combinedResponse = await combinedRequest.fire({
2232
- identity: context.identity,
2233
- sections: {
2234
- server: true,
2235
- email: true,
2236
- dns: true,
2237
- security: true,
2238
- network: currentView === 'network' && currentSubview === 'activity',
2239
- radius: true,
2240
- vpn: true,
2241
- },
2242
- });
2243
- // Update all stats from combined response
2244
- const currentStatsState = statsStatePart.getState();
2245
- statsStatePart.setState({
2246
- ...currentStatsState,
2247
- serverStats: combinedResponse.metrics.server || currentStatsState.serverStats,
2248
- emailStats: combinedResponse.metrics.email || currentStatsState.emailStats,
2249
- dnsStats: combinedResponse.metrics.dns || currentStatsState.dnsStats,
2250
- securityMetrics: combinedResponse.metrics.security || currentStatsState.securityMetrics,
2251
- radiusStats: combinedResponse.metrics.radius || currentStatsState.radiusStats,
2252
- vpnStats: combinedResponse.metrics.vpn || currentStatsState.vpnStats,
2253
- lastUpdated: Date.now(),
2254
- isLoading: false,
2255
- error: null,
2256
- });
2257
- // Update network stats if included
2258
- if (combinedResponse.metrics.network && currentView === 'network') {
2259
- const network = combinedResponse.metrics.network;
2260
- const connectionsByIP = {};
2261
- // Build connectionsByIP from connectionDetails (now populated with real per-IP data)
2262
- network.connectionDetails.forEach(conn => {
2263
- connectionsByIP[conn.remoteAddress] = (connectionsByIP[conn.remoteAddress] || 0) + (conn.connectionCount || 1);
2264
- });
2265
- // Build connections from connectionDetails (real per-IP aggregates)
2266
- const connections = network.connectionDetails.map((conn, i) => ({
2267
- id: `ip-${conn.remoteAddress}`,
2268
- remoteAddress: conn.remoteAddress,
2269
- localAddress: 'server',
2270
- startTime: conn.startTime,
2271
- protocol: conn.protocol,
2272
- state: conn.state,
2273
- bytesReceived: conn.bytesIn,
2274
- bytesSent: conn.bytesOut,
2275
- connectionCount: conn.connectionCount,
2276
- }));
2277
- networkStatePart.setState({
2278
- ...networkStatePart.getState(),
2279
- connections,
2280
- connectionsByIP,
2281
- throughputRate: {
2282
- bytesInPerSecond: network.totalBandwidth.in,
2283
- bytesOutPerSecond: network.totalBandwidth.out,
2284
- },
2285
- totalBytes: network.totalBytes || { in: 0, out: 0 },
2286
- topIPs: network.topEndpoints.map(e => ({ ip: e.endpoint, count: e.connections })),
2287
- topIPsByBandwidth: (network.topEndpointsByBandwidth || []).map(e => ({
2288
- ip: e.endpoint,
2289
- count: e.connections,
2290
- bwIn: e.bandwidth?.in || 0,
2291
- bwOut: e.bandwidth?.out || 0,
2292
- })),
2293
- topASNs: network.topASNs || [],
2294
- throughputByIP: network.topEndpoints.map(e => ({ ip: e.endpoint, in: e.bandwidth?.in || 0, out: e.bandwidth?.out || 0 })),
2295
- domainActivity: network.domainActivity || [],
2296
- throughputHistory: network.throughputHistory || [],
2297
- requestsPerSecond: network.requestsPerSecond || 0,
2298
- requestsTotal: network.requestsTotal || 0,
2299
- backends: network.backends || [],
2300
- frontendProtocols: network.frontendProtocols || null,
2301
- backendProtocols: network.backendProtocols || null,
2302
- lastUpdated: Date.now(),
2303
- isLoading: false,
2304
- error: null,
2305
- });
2306
- refreshNetworkIpIntelligence(context.identity, [
2307
- ...network.connectionDetails.map((conn) => conn.remoteAddress),
2308
- ...network.topEndpoints.map((endpoint) => endpoint.endpoint),
2309
- ...(network.topEndpointsByBandwidth || []).map((endpoint) => endpoint.endpoint),
2310
- ]);
2311
- }
2312
- if (currentView === 'security') {
2313
- runBackgroundRefresh('securityPolicy', 'Security policy refresh failed:', async () => {
2314
- await securityPolicyStatePart.dispatchAction(fetchSecurityPolicyAction, null);
2315
- });
2316
- }
2317
- // Refresh certificate data if on Domains > Certificates subview
2318
- if (currentView === 'domains' && currentSubview === 'certificates') {
2319
- runBackgroundRefresh('certificates', 'Certificate refresh failed:', async () => {
2320
- await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
2321
- });
2322
- }
2323
- // Refresh remote ingress data if on the Network → Remote Ingress subview
2324
- if (currentView === 'network' && currentSubview === 'remoteingress') {
2325
- runBackgroundRefresh('remoteIngress', 'Remote ingress refresh failed:', async () => {
2326
- await remoteIngressStatePart.dispatchAction(fetchRemoteIngressAction, null);
2327
- });
2328
- }
2329
- // Refresh VPN data if on the Network → VPN subview
2330
- if (currentView === 'network' && currentSubview === 'vpn') {
2331
- runBackgroundRefresh('vpn', 'VPN refresh failed:', async () => {
2332
- await vpnStatePart.dispatchAction(fetchVpnAction, null);
2333
- });
2334
- }
2335
- }
2336
- catch (error) {
2337
- console.error('Combined refresh failed:', error);
2338
- // If the error looks like an auth failure (invalid JWT), force re-login
2339
- const errMsg = String(error);
2340
- if (errMsg.includes('invalid') || errMsg.includes('unauthorized') || errMsg.includes('401')) {
2341
- await loginStatePart.dispatchAction(logoutAction, null);
2342
- window.location.reload();
2343
- }
2344
- }
2345
- }
2346
- // Create a proper action for the combined refresh so we can use createScheduledAction
2347
- const combinedRefreshAction = statsStatePart.createAction(async (statePartArg) => {
2348
- await dispatchCombinedRefreshAction();
2349
- // Return current state — dispatchCombinedRefreshAction already updates all state parts directly
2350
- return statePartArg.getState();
2351
- });
2352
- // Scheduled refresh process with autoPause: 'visibility' — automatically pauses when tab is hidden
2353
- let refreshProcess = null;
2354
- const startAutoRefresh = () => {
2355
- const uiState = uiStatePart.getState();
2356
- const loginState = loginStatePart.getState();
2357
- if (uiState.autoRefresh && loginState.isLoggedIn) {
2358
- // Dispose old process if interval changed or not running
2359
- if (refreshProcess) {
2360
- refreshProcess.dispose();
2361
- refreshProcess = null;
2362
- }
2363
- refreshProcess = statsStatePart.createScheduledAction({
2364
- action: combinedRefreshAction,
2365
- payload: undefined,
2366
- intervalMs: uiState.refreshInterval,
2367
- autoPause: 'visibility',
2368
- });
2369
- }
2370
- else {
2371
- if (refreshProcess) {
2372
- refreshProcess.dispose();
2373
- refreshProcess = null;
2374
- }
2375
- }
2376
- };
2377
- // Watch for relevant changes
2378
- let previousAutoRefresh = uiStatePart.getState().autoRefresh;
2379
- let previousRefreshInterval = uiStatePart.getState().refreshInterval;
2380
- let previousIsLoggedIn = loginStatePart.getState().isLoggedIn;
2381
- uiStatePart.select((s) => ({ autoRefresh: s.autoRefresh, refreshInterval: s.refreshInterval }))
2382
- .subscribe((state) => {
2383
- if (state.autoRefresh !== previousAutoRefresh ||
2384
- state.refreshInterval !== previousRefreshInterval) {
2385
- previousAutoRefresh = state.autoRefresh;
2386
- previousRefreshInterval = state.refreshInterval;
2387
- startAutoRefresh();
2388
- }
2389
- });
2390
- loginStatePart.select((s) => s.isLoggedIn).subscribe((isLoggedIn) => {
2391
- if (isLoggedIn !== previousIsLoggedIn) {
2392
- previousIsLoggedIn = isLoggedIn;
2393
- startAutoRefresh();
2394
- // Connect/disconnect TypedSocket based on login state
2395
- if (isLoggedIn) {
2396
- connectSocket();
2397
- }
2398
- else {
2399
- disconnectSocket();
2400
- }
2401
- }
2402
- });
2403
- // Pause/resume WebSocket when tab visibility changes
2404
- document.addEventListener('visibilitychange', () => {
2405
- if (document.hidden) {
2406
- disconnectSocket();
2407
- }
2408
- else if (loginStatePart.getState().isLoggedIn) {
2409
- connectSocket();
2410
- }
2411
- });
2412
- // Initial start
2413
- startAutoRefresh();
2414
- // Connect TypedSocket if already logged in (e.g., persistent session)
2415
- if (loginStatePart.getState().isLoggedIn) {
2416
- connectSocket();
2417
- }
2418
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvYXBwc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxpQ0FBaUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBNkY3RSxrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FDdkQsT0FBTyxFQUNQO0lBQ0UsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsS0FBSztDQUNsQixFQUNELFlBQVksQ0FBQywrQ0FBK0M7Q0FDN0QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQ3ZELE9BQU8sRUFDUDtJQUNFLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsZUFBZSxFQUFFLElBQUk7SUFDckIsV0FBVyxFQUFFLElBQUk7SUFDakIsUUFBUSxFQUFFLElBQUk7SUFDZCxXQUFXLEVBQUUsQ0FBQztJQUNkLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0NBQ1osRUFDRCxNQUFNLENBQUMscUNBQXFDO0NBQzdDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUN4RCxRQUFRLEVBQ1I7SUFDRSxNQUFNLEVBQUUsSUFBSTtJQUNaLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FDRixDQUFDO0FBRUYsdUNBQXVDO0FBQ3ZDLE1B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
1
+ // State management for the dcrouter Ops UI, split into per-domain modules.
2
+ // This barrel preserves the historical import path for all elements.
3
+ export * from './appstate/shared.js';
4
+ export * from './appstate/login.js';
5
+ export * from './appstate/stats.js';
6
+ export * from './appstate/config.js';
7
+ export * from './appstate/logs.js';
8
+ export * from './appstate/network.js';
9
+ export * from './appstate/security.js';
10
+ export * from './appstate/ui.js';
11
+ export * from './appstate/email-ops.js';
12
+ export * from './appstate/certificates.js';
13
+ export * from './appstate/acme.js';
14
+ export * from './appstate/remoteingress.js';
15
+ export * from './appstate/vpn.js';
16
+ export * from './appstate/target-profiles.js';
17
+ export * from './appstate/profiles-targets.js';
18
+ export * from './appstate/domains.js';
19
+ export * from './appstate/routes.js';
20
+ export * from './appstate/users.js';
21
+ export * from './appstate/email-domains.js';
22
+ // Side-effect module: auto-refresh scheduling and TypedSocket log streaming.
23
+ import './appstate/runtime.js';
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvYXBwc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsMkVBQTJFO0FBQzNFLHFFQUFxRTtBQUNyRSxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLDZCQUE2QixDQUFDO0FBRTVDLDZFQUE2RTtBQUM3RSxPQUFPLHVCQUF1QixDQUFDIn0=