@serve.zone/dcrouter 13.16.0 → 13.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/dist_serve/bundle.js +729 -721
  2. package/package.json +2 -2
  3. package/ts/00_commitinfo_data.ts +1 -1
  4. package/ts/monitoring/classes.metricsmanager.ts +43 -34
  5. package/ts_web/00_commitinfo_data.ts +1 -1
  6. package/ts_web/elements/network/ops-view-network-activity.ts +2 -1
  7. package/ts_web/elements/network/ops-view-routes.ts +24 -8
  8. package/dist_ts/00_commitinfo_data.d.ts +0 -8
  9. package/dist_ts/00_commitinfo_data.js +0 -9
  10. package/dist_ts/acme/index.d.ts +0 -1
  11. package/dist_ts/acme/index.js +0 -2
  12. package/dist_ts/acme/manager.acme-config.d.ts +0 -48
  13. package/dist_ts/acme/manager.acme-config.js +0 -156
  14. package/dist_ts/classes.cert-provision-scheduler.d.ts +0 -52
  15. package/dist_ts/classes.cert-provision-scheduler.js +0 -138
  16. package/dist_ts/classes.dcrouter.d.ts +0 -401
  17. package/dist_ts/classes.dcrouter.js +0 -1852
  18. package/dist_ts/classes.storage-cert-manager.d.ts +0 -15
  19. package/dist_ts/classes.storage-cert-manager.js +0 -53
  20. package/dist_ts/config/classes.api-token-manager.d.ts +0 -44
  21. package/dist_ts/config/classes.api-token-manager.js +0 -180
  22. package/dist_ts/config/classes.db-seeder.d.ts +0 -25
  23. package/dist_ts/config/classes.db-seeder.js +0 -69
  24. package/dist_ts/config/classes.reference-resolver.d.ts +0 -80
  25. package/dist_ts/config/classes.reference-resolver.js +0 -483
  26. package/dist_ts/config/classes.route-config-manager.d.ts +0 -54
  27. package/dist_ts/config/classes.route-config-manager.js +0 -370
  28. package/dist_ts/config/classes.target-profile-manager.d.ts +0 -82
  29. package/dist_ts/config/classes.target-profile-manager.js +0 -349
  30. package/dist_ts/config/index.d.ts +0 -6
  31. package/dist_ts/config/index.js +0 -8
  32. package/dist_ts/config/validator.d.ts +0 -104
  33. package/dist_ts/config/validator.js +0 -152
  34. package/dist_ts/db/classes.cache.cleaner.d.ts +0 -47
  35. package/dist_ts/db/classes.cache.cleaner.js +0 -130
  36. package/dist_ts/db/classes.cached.document.d.ts +0 -76
  37. package/dist_ts/db/classes.cached.document.js +0 -100
  38. package/dist_ts/db/classes.dcrouter-db.d.ts +0 -70
  39. package/dist_ts/db/classes.dcrouter-db.js +0 -146
  40. package/dist_ts/db/documents/classes.accounting-session.doc.d.ts +0 -32
  41. package/dist_ts/db/documents/classes.accounting-session.doc.js +0 -214
  42. package/dist_ts/db/documents/classes.acme-cert.doc.d.ts +0 -13
  43. package/dist_ts/db/documents/classes.acme-cert.doc.js +0 -109
  44. package/dist_ts/db/documents/classes.acme-config.doc.d.ts +0 -22
  45. package/dist_ts/db/documents/classes.acme-config.doc.js +0 -121
  46. package/dist_ts/db/documents/classes.api-token.doc.d.ts +0 -18
  47. package/dist_ts/db/documents/classes.api-token.doc.js +0 -127
  48. package/dist_ts/db/documents/classes.cached.email.d.ts +0 -125
  49. package/dist_ts/db/documents/classes.cached.email.js +0 -337
  50. package/dist_ts/db/documents/classes.cached.ip.reputation.d.ts +0 -119
  51. package/dist_ts/db/documents/classes.cached.ip.reputation.js +0 -323
  52. package/dist_ts/db/documents/classes.cert-backoff.doc.d.ts +0 -11
  53. package/dist_ts/db/documents/classes.cert-backoff.doc.js +0 -97
  54. package/dist_ts/db/documents/classes.dns-provider.doc.d.ts +0 -22
  55. package/dist_ts/db/documents/classes.dns-provider.doc.js +0 -134
  56. package/dist_ts/db/documents/classes.dns-record.doc.d.ts +0 -21
  57. package/dist_ts/db/documents/classes.dns-record.doc.js +0 -143
  58. package/dist_ts/db/documents/classes.domain.doc.d.ts +0 -22
  59. package/dist_ts/db/documents/classes.domain.doc.js +0 -146
  60. package/dist_ts/db/documents/classes.email-domain.doc.d.ts +0 -17
  61. package/dist_ts/db/documents/classes.email-domain.doc.js +0 -124
  62. package/dist_ts/db/documents/classes.network-target.doc.d.ts +0 -15
  63. package/dist_ts/db/documents/classes.network-target.doc.js +0 -118
  64. package/dist_ts/db/documents/classes.proxy-cert.doc.d.ts +0 -12
  65. package/dist_ts/db/documents/classes.proxy-cert.doc.js +0 -103
  66. package/dist_ts/db/documents/classes.remote-ingress-edge.doc.d.ts +0 -17
  67. package/dist_ts/db/documents/classes.remote-ingress-edge.doc.js +0 -130
  68. package/dist_ts/db/documents/classes.route.doc.d.ts +0 -18
  69. package/dist_ts/db/documents/classes.route.doc.js +0 -121
  70. package/dist_ts/db/documents/classes.source-profile.doc.d.ts +0 -15
  71. package/dist_ts/db/documents/classes.source-profile.doc.js +0 -115
  72. package/dist_ts/db/documents/classes.target-profile.doc.d.ts +0 -16
  73. package/dist_ts/db/documents/classes.target-profile.doc.js +0 -121
  74. package/dist_ts/db/documents/classes.vlan-mappings.doc.d.ts +0 -15
  75. package/dist_ts/db/documents/classes.vlan-mappings.doc.js +0 -77
  76. package/dist_ts/db/documents/classes.vpn-client.doc.d.ts +0 -23
  77. package/dist_ts/db/documents/classes.vpn-client.doc.js +0 -172
  78. package/dist_ts/db/documents/classes.vpn-server-keys.doc.d.ts +0 -10
  79. package/dist_ts/db/documents/classes.vpn-server-keys.doc.js +0 -94
  80. package/dist_ts/db/documents/index.d.ts +0 -20
  81. package/dist_ts/db/documents/index.js +0 -30
  82. package/dist_ts/db/index.d.ts +0 -4
  83. package/dist_ts/db/index.js +0 -9
  84. package/dist_ts/dns/index.d.ts +0 -2
  85. package/dist_ts/dns/index.js +0 -3
  86. package/dist_ts/dns/manager.dns.d.ts +0 -267
  87. package/dist_ts/dns/manager.dns.js +0 -906
  88. package/dist_ts/dns/providers/cloudflare.provider.d.ts +0 -21
  89. package/dist_ts/dns/providers/cloudflare.provider.js +0 -106
  90. package/dist_ts/dns/providers/factory.d.ts +0 -23
  91. package/dist_ts/dns/providers/factory.js +0 -47
  92. package/dist_ts/dns/providers/index.d.ts +0 -3
  93. package/dist_ts/dns/providers/index.js +0 -4
  94. package/dist_ts/dns/providers/interfaces.d.ts +0 -54
  95. package/dist_ts/dns/providers/interfaces.js +0 -2
  96. package/dist_ts/email/classes.email-domain.manager.d.ts +0 -46
  97. package/dist_ts/email/classes.email-domain.manager.js +0 -276
  98. package/dist_ts/email/index.d.ts +0 -1
  99. package/dist_ts/email/index.js +0 -2
  100. package/dist_ts/errors/base.errors.d.ts +0 -224
  101. package/dist_ts/errors/base.errors.js +0 -320
  102. package/dist_ts/errors/error-handler.d.ts +0 -98
  103. package/dist_ts/errors/error-handler.js +0 -282
  104. package/dist_ts/errors/error.codes.d.ts +0 -115
  105. package/dist_ts/errors/error.codes.js +0 -136
  106. package/dist_ts/errors/index.d.ts +0 -54
  107. package/dist_ts/errors/index.js +0 -136
  108. package/dist_ts/errors/reputation.errors.d.ts +0 -183
  109. package/dist_ts/errors/reputation.errors.js +0 -292
  110. package/dist_ts/http3/http3-route-augmentation.d.ts +0 -50
  111. package/dist_ts/http3/http3-route-augmentation.js +0 -98
  112. package/dist_ts/http3/index.d.ts +0 -1
  113. package/dist_ts/http3/index.js +0 -2
  114. package/dist_ts/index.d.ts +0 -8
  115. package/dist_ts/index.js +0 -29
  116. package/dist_ts/logger.d.ts +0 -21
  117. package/dist_ts/logger.js +0 -81
  118. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  119. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  120. package/dist_ts/monitoring/classes.metricsmanager.d.ts +0 -233
  121. package/dist_ts/monitoring/classes.metricsmanager.js +0 -897
  122. package/dist_ts/monitoring/index.d.ts +0 -1
  123. package/dist_ts/monitoring/index.js +0 -2
  124. package/dist_ts/opsserver/classes.opsserver.d.ts +0 -47
  125. package/dist_ts/opsserver/classes.opsserver.js +0 -105
  126. package/dist_ts/opsserver/handlers/acme-config.handler.d.ts +0 -16
  127. package/dist_ts/opsserver/handlers/acme-config.handler.js +0 -77
  128. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -40
  129. package/dist_ts/opsserver/handlers/admin.handler.js +0 -191
  130. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +0 -6
  131. package/dist_ts/opsserver/handlers/api-token.handler.js +0 -62
  132. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +0 -77
  133. package/dist_ts/opsserver/handlers/certificate.handler.js +0 -574
  134. package/dist_ts/opsserver/handlers/config.handler.d.ts +0 -7
  135. package/dist_ts/opsserver/handlers/config.handler.js +0 -200
  136. package/dist_ts/opsserver/handlers/dns-provider.handler.d.ts +0 -16
  137. package/dist_ts/opsserver/handlers/dns-provider.handler.js +0 -156
  138. package/dist_ts/opsserver/handlers/dns-record.handler.d.ts +0 -13
  139. package/dist_ts/opsserver/handlers/dns-record.handler.js +0 -98
  140. package/dist_ts/opsserver/handlers/domain.handler.d.ts +0 -13
  141. package/dist_ts/opsserver/handlers/domain.handler.js +0 -137
  142. package/dist_ts/opsserver/handlers/email-domain.handler.d.ts +0 -16
  143. package/dist_ts/opsserver/handlers/email-domain.handler.js +0 -150
  144. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +0 -30
  145. package/dist_ts/opsserver/handlers/email-ops.handler.js +0 -227
  146. package/dist_ts/opsserver/handlers/index.d.ts +0 -21
  147. package/dist_ts/opsserver/handlers/index.js +0 -22
  148. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -25
  149. package/dist_ts/opsserver/handlers/logs.handler.js +0 -264
  150. package/dist_ts/opsserver/handlers/network-target.handler.d.ts +0 -10
  151. package/dist_ts/opsserver/handlers/network-target.handler.js +0 -117
  152. package/dist_ts/opsserver/handlers/radius.handler.d.ts +0 -6
  153. package/dist_ts/opsserver/handlers/radius.handler.js +0 -295
  154. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +0 -6
  155. package/dist_ts/opsserver/handlers/remoteingress.handler.js +0 -156
  156. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +0 -14
  157. package/dist_ts/opsserver/handlers/route-management.handler.js +0 -98
  158. package/dist_ts/opsserver/handlers/security.handler.d.ts +0 -9
  159. package/dist_ts/opsserver/handlers/security.handler.js +0 -237
  160. package/dist_ts/opsserver/handlers/source-profile.handler.d.ts +0 -10
  161. package/dist_ts/opsserver/handlers/source-profile.handler.js +0 -119
  162. package/dist_ts/opsserver/handlers/stats.handler.d.ts +0 -11
  163. package/dist_ts/opsserver/handlers/stats.handler.js +0 -461
  164. package/dist_ts/opsserver/handlers/target-profile.handler.d.ts +0 -10
  165. package/dist_ts/opsserver/handlers/target-profile.handler.js +0 -117
  166. package/dist_ts/opsserver/handlers/users.handler.d.ts +0 -12
  167. package/dist_ts/opsserver/handlers/users.handler.js +0 -24
  168. package/dist_ts/opsserver/handlers/vpn.handler.d.ts +0 -6
  169. package/dist_ts/opsserver/handlers/vpn.handler.js +0 -262
  170. package/dist_ts/opsserver/helpers/guards.d.ts +0 -27
  171. package/dist_ts/opsserver/helpers/guards.js +0 -43
  172. package/dist_ts/opsserver/index.d.ts +0 -1
  173. package/dist_ts/opsserver/index.js +0 -2
  174. package/dist_ts/paths.d.ts +0 -25
  175. package/dist_ts/paths.js +0 -44
  176. package/dist_ts/plugins.d.ts +0 -81
  177. package/dist_ts/plugins.js +0 -115
  178. package/dist_ts/radius/classes.accounting.manager.d.ts +0 -223
  179. package/dist_ts/radius/classes.accounting.manager.js +0 -449
  180. package/dist_ts/radius/classes.radius.server.d.ts +0 -169
  181. package/dist_ts/radius/classes.radius.server.js +0 -384
  182. package/dist_ts/radius/classes.vlan.manager.d.ts +0 -124
  183. package/dist_ts/radius/classes.vlan.manager.js +0 -272
  184. package/dist_ts/radius/index.d.ts +0 -13
  185. package/dist_ts/radius/index.js +0 -14
  186. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +0 -92
  187. package/dist_ts/remoteingress/classes.remoteingress-manager.js +0 -291
  188. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +0 -59
  189. package/dist_ts/remoteingress/classes.tunnel-manager.js +0 -165
  190. package/dist_ts/remoteingress/index.d.ts +0 -2
  191. package/dist_ts/remoteingress/index.js +0 -3
  192. package/dist_ts/security/classes.contentscanner.d.ts +0 -164
  193. package/dist_ts/security/classes.contentscanner.js +0 -642
  194. package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -145
  195. package/dist_ts/security/classes.ipreputationchecker.js +0 -458
  196. package/dist_ts/security/classes.securitylogger.d.ts +0 -144
  197. package/dist_ts/security/classes.securitylogger.js +0 -235
  198. package/dist_ts/security/index.d.ts +0 -3
  199. package/dist_ts/security/index.js +0 -4
  200. package/dist_ts/sms/classes.smsservice.d.ts +0 -15
  201. package/dist_ts/sms/classes.smsservice.js +0 -72
  202. package/dist_ts/sms/config/sms.config.d.ts +0 -93
  203. package/dist_ts/sms/config/sms.config.js +0 -2
  204. package/dist_ts/sms/config/sms.schema.d.ts +0 -5
  205. package/dist_ts/sms/config/sms.schema.js +0 -121
  206. package/dist_ts/sms/index.d.ts +0 -1
  207. package/dist_ts/sms/index.js +0 -2
  208. package/dist_ts/vpn/classes.vpn-manager.d.ts +0 -159
  209. package/dist_ts/vpn/classes.vpn-manager.js +0 -459
  210. package/dist_ts/vpn/index.d.ts +0 -1
  211. package/dist_ts/vpn/index.js +0 -2
  212. package/dist_ts_apiclient/classes.apitoken.d.ts +0 -41
  213. package/dist_ts_apiclient/classes.apitoken.js +0 -115
  214. package/dist_ts_apiclient/classes.certificate.d.ts +0 -57
  215. package/dist_ts_apiclient/classes.certificate.js +0 -69
  216. package/dist_ts_apiclient/classes.config.d.ts +0 -7
  217. package/dist_ts_apiclient/classes.config.js +0 -11
  218. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +0 -41
  219. package/dist_ts_apiclient/classes.dcrouterapiclient.js +0 -81
  220. package/dist_ts_apiclient/classes.email.d.ts +0 -30
  221. package/dist_ts_apiclient/classes.email.js +0 -52
  222. package/dist_ts_apiclient/classes.logs.d.ts +0 -21
  223. package/dist_ts_apiclient/classes.logs.js +0 -14
  224. package/dist_ts_apiclient/classes.radius.d.ts +0 -59
  225. package/dist_ts_apiclient/classes.radius.js +0 -95
  226. package/dist_ts_apiclient/classes.remoteingress.d.ts +0 -54
  227. package/dist_ts_apiclient/classes.remoteingress.js +0 -136
  228. package/dist_ts_apiclient/classes.route.d.ts +0 -39
  229. package/dist_ts_apiclient/classes.route.js +0 -125
  230. package/dist_ts_apiclient/classes.stats.d.ts +0 -47
  231. package/dist_ts_apiclient/classes.stats.js +0 -38
  232. package/dist_ts_apiclient/index.d.ts +0 -10
  233. package/dist_ts_apiclient/index.js +0 -14
  234. package/dist_ts_apiclient/plugins.d.ts +0 -3
  235. package/dist_ts_apiclient/plugins.js +0 -5
  236. package/dist_ts_interfaces/data/acme-config.d.ts +0 -25
  237. package/dist_ts_interfaces/data/acme-config.js +0 -2
  238. package/dist_ts_interfaces/data/auth.d.ts +0 -8
  239. package/dist_ts_interfaces/data/auth.js +0 -2
  240. package/dist_ts_interfaces/data/dns-provider.d.ts +0 -136
  241. package/dist_ts_interfaces/data/dns-provider.js +0 -41
  242. package/dist_ts_interfaces/data/dns-record.d.ts +0 -42
  243. package/dist_ts_interfaces/data/dns-record.js +0 -2
  244. package/dist_ts_interfaces/data/domain.d.ts +0 -35
  245. package/dist_ts_interfaces/data/domain.js +0 -2
  246. package/dist_ts_interfaces/data/email-domain.d.ts +0 -70
  247. package/dist_ts_interfaces/data/email-domain.js +0 -2
  248. package/dist_ts_interfaces/data/index.d.ts +0 -11
  249. package/dist_ts_interfaces/data/index.js +0 -12
  250. package/dist_ts_interfaces/data/remoteingress.d.ts +0 -60
  251. package/dist_ts_interfaces/data/remoteingress.js +0 -2
  252. package/dist_ts_interfaces/data/route-management.d.ts +0 -110
  253. package/dist_ts_interfaces/data/route-management.js +0 -2
  254. package/dist_ts_interfaces/data/stats.d.ts +0 -238
  255. package/dist_ts_interfaces/data/stats.js +0 -2
  256. package/dist_ts_interfaces/data/target-profile.d.ts +0 -28
  257. package/dist_ts_interfaces/data/target-profile.js +0 -2
  258. package/dist_ts_interfaces/data/vpn.d.ts +0 -61
  259. package/dist_ts_interfaces/data/vpn.js +0 -2
  260. package/dist_ts_interfaces/index.d.ts +0 -5
  261. package/dist_ts_interfaces/index.js +0 -8
  262. package/dist_ts_interfaces/plugins.d.ts +0 -2
  263. package/dist_ts_interfaces/plugins.js +0 -4
  264. package/dist_ts_interfaces/requests/acme-config.d.ts +0 -42
  265. package/dist_ts_interfaces/requests/acme-config.js +0 -2
  266. package/dist_ts_interfaces/requests/admin.d.ts +0 -31
  267. package/dist_ts_interfaces/requests/admin.js +0 -3
  268. package/dist_ts_interfaces/requests/api-tokens.d.ts +0 -79
  269. package/dist_ts_interfaces/requests/api-tokens.js +0 -2
  270. package/dist_ts_interfaces/requests/certificate.d.ts +0 -111
  271. package/dist_ts_interfaces/requests/certificate.js +0 -3
  272. package/dist_ts_interfaces/requests/combined.stats.d.ts +0 -28
  273. package/dist_ts_interfaces/requests/combined.stats.js +0 -2
  274. package/dist_ts_interfaces/requests/config.d.ts +0 -90
  275. package/dist_ts_interfaces/requests/config.js +0 -3
  276. package/dist_ts_interfaces/requests/dns-providers.d.ts +0 -117
  277. package/dist_ts_interfaces/requests/dns-providers.js +0 -2
  278. package/dist_ts_interfaces/requests/dns-records.d.ts +0 -89
  279. package/dist_ts_interfaces/requests/dns-records.js +0 -2
  280. package/dist_ts_interfaces/requests/domains.d.ts +0 -142
  281. package/dist_ts_interfaces/requests/domains.js +0 -2
  282. package/dist_ts_interfaces/requests/email-domains.d.ts +0 -142
  283. package/dist_ts_interfaces/requests/email-domains.js +0 -2
  284. package/dist_ts_interfaces/requests/email-ops.d.ts +0 -82
  285. package/dist_ts_interfaces/requests/email-ops.js +0 -3
  286. package/dist_ts_interfaces/requests/index.d.ts +0 -21
  287. package/dist_ts_interfaces/requests/index.js +0 -22
  288. package/dist_ts_interfaces/requests/logs.d.ts +0 -41
  289. package/dist_ts_interfaces/requests/logs.js +0 -4
  290. package/dist_ts_interfaces/requests/network-targets.d.ts +0 -102
  291. package/dist_ts_interfaces/requests/network-targets.js +0 -2
  292. package/dist_ts_interfaces/requests/radius.d.ts +0 -268
  293. package/dist_ts_interfaces/requests/radius.js +0 -3
  294. package/dist_ts_interfaces/requests/remoteingress.d.ts +0 -108
  295. package/dist_ts_interfaces/requests/remoteingress.js +0 -3
  296. package/dist_ts_interfaces/requests/route-management.d.ts +0 -85
  297. package/dist_ts_interfaces/requests/route-management.js +0 -2
  298. package/dist_ts_interfaces/requests/source-profiles.d.ts +0 -102
  299. package/dist_ts_interfaces/requests/source-profiles.js +0 -2
  300. package/dist_ts_interfaces/requests/stats.d.ts +0 -177
  301. package/dist_ts_interfaces/requests/stats.js +0 -4
  302. package/dist_ts_interfaces/requests/target-profiles.d.ts +0 -103
  303. package/dist_ts_interfaces/requests/target-profiles.js +0 -2
  304. package/dist_ts_interfaces/requests/users.d.ts +0 -19
  305. package/dist_ts_interfaces/requests/users.js +0 -3
  306. package/dist_ts_interfaces/requests/vpn.d.ts +0 -177
  307. package/dist_ts_interfaces/requests/vpn.js +0 -3
  308. package/dist_ts_migrations/index.d.ts +0 -28
  309. package/dist_ts_migrations/index.js +0 -82
  310. package/dist_ts_oci_container/index.d.ts +0 -8
  311. package/dist_ts_oci_container/index.js +0 -110
  312. package/dist_ts_oci_container/plugins.d.ts +0 -3
  313. package/dist_ts_oci_container/plugins.js +0 -4
  314. package/dist_ts_web/00_commitinfo_data.d.ts +0 -8
  315. package/dist_ts_web/00_commitinfo_data.js +0 -9
  316. package/dist_ts_web/appstate.d.ts +0 -478
  317. package/dist_ts_web/appstate.js +0 -1968
  318. package/dist_ts_web/elements/access/index.d.ts +0 -2
  319. package/dist_ts_web/elements/access/index.js +0 -3
  320. package/dist_ts_web/elements/access/ops-view-apitokens.d.ts +0 -13
  321. package/dist_ts_web/elements/access/ops-view-apitokens.js +0 -372
  322. package/dist_ts_web/elements/access/ops-view-users.d.ts +0 -11
  323. package/dist_ts_web/elements/access/ops-view-users.js +0 -190
  324. package/dist_ts_web/elements/domains/dns-provider-form.d.ts +0 -60
  325. package/dist_ts_web/elements/domains/dns-provider-form.js +0 -259
  326. package/dist_ts_web/elements/domains/index.d.ts +0 -5
  327. package/dist_ts_web/elements/domains/index.js +0 -6
  328. package/dist_ts_web/elements/domains/ops-view-certificates.d.ts +0 -25
  329. package/dist_ts_web/elements/domains/ops-view-certificates.js +0 -669
  330. package/dist_ts_web/elements/domains/ops-view-dns.d.ts +0 -17
  331. package/dist_ts_web/elements/domains/ops-view-dns.js +0 -305
  332. package/dist_ts_web/elements/domains/ops-view-domains.d.ts +0 -19
  333. package/dist_ts_web/elements/domains/ops-view-domains.js +0 -456
  334. package/dist_ts_web/elements/domains/ops-view-providers.d.ts +0 -21
  335. package/dist_ts_web/elements/domains/ops-view-providers.js +0 -330
  336. package/dist_ts_web/elements/email/index.d.ts +0 -3
  337. package/dist_ts_web/elements/email/index.js +0 -4
  338. package/dist_ts_web/elements/email/ops-view-email-domains.d.ts +0 -19
  339. package/dist_ts_web/elements/email/ops-view-email-domains.js +0 -410
  340. package/dist_ts_web/elements/email/ops-view-email-security.d.ts +0 -14
  341. package/dist_ts_web/elements/email/ops-view-email-security.js +0 -178
  342. package/dist_ts_web/elements/email/ops-view-emails.d.ts +0 -21
  343. package/dist_ts_web/elements/email/ops-view-emails.js +0 -165
  344. package/dist_ts_web/elements/index.d.ts +0 -9
  345. package/dist_ts_web/elements/index.js +0 -10
  346. package/dist_ts_web/elements/network/index.d.ts +0 -7
  347. package/dist_ts_web/elements/network/index.js +0 -8
  348. package/dist_ts_web/elements/network/ops-view-network-activity.d.ts +0 -60
  349. package/dist_ts_web/elements/network/ops-view-network-activity.js +0 -753
  350. package/dist_ts_web/elements/network/ops-view-networktargets.d.ts +0 -17
  351. package/dist_ts_web/elements/network/ops-view-networktargets.js +0 -255
  352. package/dist_ts_web/elements/network/ops-view-remoteingress.d.ts +0 -20
  353. package/dist_ts_web/elements/network/ops-view-remoteingress.js +0 -497
  354. package/dist_ts_web/elements/network/ops-view-routes.d.ts +0 -16
  355. package/dist_ts_web/elements/network/ops-view-routes.js +0 -674
  356. package/dist_ts_web/elements/network/ops-view-sourceprofiles.d.ts +0 -17
  357. package/dist_ts_web/elements/network/ops-view-sourceprofiles.js +0 -278
  358. package/dist_ts_web/elements/network/ops-view-targetprofiles.d.ts +0 -21
  359. package/dist_ts_web/elements/network/ops-view-targetprofiles.js +0 -420
  360. package/dist_ts_web/elements/network/ops-view-vpn.d.ts +0 -31
  361. package/dist_ts_web/elements/network/ops-view-vpn.js +0 -873
  362. package/dist_ts_web/elements/ops-dashboard.d.ts +0 -31
  363. package/dist_ts_web/elements/ops-dashboard.js +0 -405
  364. package/dist_ts_web/elements/ops-view-logs.d.ts +0 -13
  365. package/dist_ts_web/elements/ops-view-logs.js +0 -159
  366. package/dist_ts_web/elements/overview/index.d.ts +0 -2
  367. package/dist_ts_web/elements/overview/index.js +0 -3
  368. package/dist_ts_web/elements/overview/ops-view-config.d.ts +0 -19
  369. package/dist_ts_web/elements/overview/ops-view-config.js +0 -339
  370. package/dist_ts_web/elements/overview/ops-view-overview.d.ts +0 -24
  371. package/dist_ts_web/elements/overview/ops-view-overview.js +0 -545
  372. package/dist_ts_web/elements/security/index.d.ts +0 -3
  373. package/dist_ts_web/elements/security/index.js +0 -4
  374. package/dist_ts_web/elements/security/ops-view-security-authentication.d.ts +0 -13
  375. package/dist_ts_web/elements/security/ops-view-security-authentication.js +0 -157
  376. package/dist_ts_web/elements/security/ops-view-security-blocked.d.ts +0 -15
  377. package/dist_ts_web/elements/security/ops-view-security-blocked.js +0 -153
  378. package/dist_ts_web/elements/security/ops-view-security-overview.d.ts +0 -16
  379. package/dist_ts_web/elements/security/ops-view-security-overview.js +0 -205
  380. package/dist_ts_web/elements/shared/css.d.ts +0 -1
  381. package/dist_ts_web/elements/shared/css.js +0 -10
  382. package/dist_ts_web/elements/shared/index.d.ts +0 -1
  383. package/dist_ts_web/elements/shared/index.js +0 -2
  384. package/dist_ts_web/index.d.ts +0 -1
  385. package/dist_ts_web/index.js +0 -10
  386. package/dist_ts_web/plugins.d.ts +0 -7
  387. package/dist_ts_web/plugins.js +0 -13
  388. package/dist_ts_web/router.d.ts +0 -21
  389. package/dist_ts_web/router.js +0 -151
@@ -1,1968 +0,0 @@
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
- throughputByIP: [],
63
- domainActivity: [],
64
- throughputHistory: [],
65
- requestsPerSecond: 0,
66
- requestsTotal: 0,
67
- backends: [],
68
- frontendProtocols: null,
69
- backendProtocols: null,
70
- lastUpdated: 0,
71
- isLoading: false,
72
- error: null,
73
- }, 'soft');
74
- export const emailOpsStatePart = await appState.getStatePart('emailOps', {
75
- emails: [],
76
- isLoading: false,
77
- error: null,
78
- lastUpdated: 0,
79
- }, 'soft');
80
- export const certificateStatePart = await appState.getStatePart('certificates', {
81
- certificates: [],
82
- summary: { total: 0, valid: 0, expiring: 0, expired: 0, failed: 0, unknown: 0 },
83
- isLoading: false,
84
- error: null,
85
- lastUpdated: 0,
86
- }, 'soft');
87
- export const acmeConfigStatePart = await appState.getStatePart('acmeConfig', {
88
- config: null,
89
- isLoading: false,
90
- error: null,
91
- lastUpdated: 0,
92
- }, 'soft');
93
- export const remoteIngressStatePart = await appState.getStatePart('remoteIngress', {
94
- edges: [],
95
- statuses: [],
96
- selectedEdgeId: null,
97
- newEdgeId: null,
98
- isLoading: false,
99
- error: null,
100
- lastUpdated: 0,
101
- }, 'soft');
102
- export const routeManagementStatePart = await appState.getStatePart('routeManagement', {
103
- mergedRoutes: [],
104
- warnings: [],
105
- apiTokens: [],
106
- isLoading: false,
107
- error: null,
108
- lastUpdated: 0,
109
- }, 'soft');
110
- export const usersStatePart = await appState.getStatePart('users', {
111
- users: [],
112
- isLoading: false,
113
- error: null,
114
- lastUpdated: 0,
115
- }, 'soft');
116
- const getActionContext = () => {
117
- const identity = loginStatePart.getState().identity;
118
- // Treat expired JWTs as no identity — prevents stale persisted sessions from firing requests
119
- if (identity && identity.expiresAt && identity.expiresAt < Date.now()) {
120
- return { identity: null };
121
- }
122
- return { identity };
123
- };
124
- // Login Action
125
- export const loginAction = loginStatePart.createAction(async (statePartArg, dataArg) => {
126
- const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'adminLoginWithUsernameAndPassword');
127
- try {
128
- const response = await typedRequest.fire({
129
- username: dataArg.username,
130
- password: dataArg.password,
131
- });
132
- if (response.identity) {
133
- return {
134
- identity: response.identity,
135
- isLoggedIn: true,
136
- };
137
- }
138
- return statePartArg.getState();
139
- }
140
- catch (error) {
141
- console.error('Login failed:', error);
142
- return statePartArg.getState();
143
- }
144
- });
145
- // Logout Action — always clears state, even if identity is expired/missing
146
- export const logoutAction = loginStatePart.createAction(async (statePartArg) => {
147
- const context = getActionContext();
148
- // Try to notify server, but don't block logout if identity is missing/expired
149
- if (context.identity) {
150
- const typedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'adminLogout');
151
- try {
152
- await typedRequest.fire({ identity: context.identity });
153
- }
154
- catch (error) {
155
- console.error('Logout error:', error);
156
- }
157
- }
158
- // Always clear login state
159
- return {
160
- identity: null,
161
- isLoggedIn: false,
162
- };
163
- });
164
- // Fetch All Stats Action - Using combined endpoint for efficiency
165
- export const fetchAllStatsAction = statsStatePart.createAction(async (statePartArg) => {
166
- const context = getActionContext();
167
- const currentState = statePartArg.getState();
168
- if (!context.identity)
169
- return currentState;
170
- try {
171
- // Use combined metrics endpoint - single request instead of 4
172
- const combinedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCombinedMetrics');
173
- const combinedResponse = await combinedRequest.fire({
174
- identity: context.identity,
175
- sections: {
176
- server: true,
177
- email: true,
178
- dns: true,
179
- security: true,
180
- network: false, // Network is fetched separately for the network view
181
- radius: true,
182
- vpn: true,
183
- },
184
- });
185
- // Update state with all stats from combined response
186
- return {
187
- serverStats: combinedResponse.metrics.server || currentState.serverStats,
188
- emailStats: combinedResponse.metrics.email || currentState.emailStats,
189
- dnsStats: combinedResponse.metrics.dns || currentState.dnsStats,
190
- securityMetrics: combinedResponse.metrics.security || currentState.securityMetrics,
191
- radiusStats: combinedResponse.metrics.radius || currentState.radiusStats,
192
- vpnStats: combinedResponse.metrics.vpn || currentState.vpnStats,
193
- lastUpdated: Date.now(),
194
- isLoading: false,
195
- error: null,
196
- };
197
- }
198
- catch (error) {
199
- return {
200
- ...currentState,
201
- isLoading: false,
202
- error: error.message || 'Failed to fetch statistics',
203
- };
204
- }
205
- });
206
- // Fetch Configuration Action (read-only)
207
- export const fetchConfigurationAction = configStatePart.createAction(async (statePartArg) => {
208
- const context = getActionContext();
209
- const currentState = statePartArg.getState();
210
- if (!context.identity)
211
- return currentState;
212
- try {
213
- const configRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getConfiguration');
214
- const response = await configRequest.fire({
215
- identity: context.identity,
216
- });
217
- return {
218
- config: response.config,
219
- isLoading: false,
220
- error: null,
221
- };
222
- }
223
- catch (error) {
224
- return {
225
- ...currentState,
226
- isLoading: false,
227
- error: error.message || 'Failed to fetch configuration',
228
- };
229
- }
230
- });
231
- // Fetch Recent Logs Action
232
- export const fetchRecentLogsAction = logStatePart.createAction(async (statePartArg, dataArg) => {
233
- const context = getActionContext();
234
- if (!context.identity)
235
- return statePartArg.getState();
236
- const logsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRecentLogs');
237
- const response = await logsRequest.fire({
238
- identity: context.identity,
239
- limit: dataArg.limit || 100,
240
- level: dataArg.level,
241
- category: dataArg.category,
242
- });
243
- return {
244
- ...statePartArg.getState(),
245
- recentLogs: response.logs,
246
- };
247
- });
248
- // Toggle Auto Refresh Action
249
- export const toggleAutoRefreshAction = uiStatePart.createAction(async (statePartArg) => {
250
- const currentState = statePartArg.getState();
251
- return {
252
- ...currentState,
253
- autoRefresh: !currentState.autoRefresh,
254
- };
255
- });
256
- // Set Active View Action
257
- export const setActiveViewAction = uiStatePart.createAction(async (statePartArg, viewName) => {
258
- const currentState = statePartArg.getState();
259
- // If switching to network view, ensure we fetch network data
260
- if (viewName === 'network' && currentState.activeView !== 'network') {
261
- setTimeout(() => {
262
- networkStatePart.dispatchAction(fetchNetworkStatsAction, null);
263
- }, 100);
264
- }
265
- // If switching to the Domains group, ensure we fetch certificate data
266
- // (Certificates is a subview of Domains).
267
- if (viewName === 'domains' && currentState.activeView !== 'domains') {
268
- setTimeout(() => {
269
- certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
270
- }, 100);
271
- }
272
- return {
273
- ...currentState,
274
- activeView: viewName,
275
- };
276
- });
277
- // Fetch Network Stats Action
278
- export const fetchNetworkStatsAction = networkStatePart.createAction(async (statePartArg) => {
279
- const context = getActionContext();
280
- const currentState = statePartArg.getState();
281
- if (!context.identity)
282
- return currentState;
283
- try {
284
- // Fetch active connections using the existing endpoint
285
- const connectionsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getActiveConnections');
286
- const connectionsResponse = await connectionsRequest.fire({
287
- identity: context.identity,
288
- });
289
- // Get network stats for throughput and IP data
290
- const networkStatsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getNetworkStats');
291
- const networkStatsResponse = await networkStatsRequest.fire({
292
- identity: context.identity,
293
- });
294
- // Use the connections data for the connection list
295
- // and network stats for throughput and IP analytics
296
- const connectionsByIP = {};
297
- // Build connectionsByIP from network stats if available
298
- if (networkStatsResponse.connectionsByIP && Array.isArray(networkStatsResponse.connectionsByIP)) {
299
- networkStatsResponse.connectionsByIP.forEach((item) => {
300
- connectionsByIP[item.ip] = item.count;
301
- });
302
- }
303
- else {
304
- // Fallback: calculate from connections
305
- connectionsResponse.connections.forEach(conn => {
306
- const ip = conn.remoteAddress;
307
- connectionsByIP[ip] = (connectionsByIP[ip] || 0) + 1;
308
- });
309
- }
310
- return {
311
- connections: connectionsResponse.connections,
312
- connectionsByIP,
313
- throughputRate: networkStatsResponse.throughputRate || { bytesInPerSecond: 0, bytesOutPerSecond: 0 },
314
- totalBytes: networkStatsResponse.totalDataTransferred
315
- ? { in: networkStatsResponse.totalDataTransferred.bytesIn, out: networkStatsResponse.totalDataTransferred.bytesOut }
316
- : { in: 0, out: 0 },
317
- topIPs: networkStatsResponse.topIPs || [],
318
- topIPsByBandwidth: networkStatsResponse.topIPsByBandwidth || [],
319
- throughputByIP: networkStatsResponse.throughputByIP || [],
320
- domainActivity: networkStatsResponse.domainActivity || [],
321
- throughputHistory: networkStatsResponse.throughputHistory || [],
322
- requestsPerSecond: networkStatsResponse.requestsPerSecond || 0,
323
- requestsTotal: networkStatsResponse.requestsTotal || 0,
324
- backends: networkStatsResponse.backends || [],
325
- frontendProtocols: networkStatsResponse.frontendProtocols || null,
326
- backendProtocols: networkStatsResponse.backendProtocols || null,
327
- lastUpdated: Date.now(),
328
- isLoading: false,
329
- error: null,
330
- };
331
- }
332
- catch (error) {
333
- console.error('Failed to fetch network stats:', error);
334
- return {
335
- ...currentState,
336
- isLoading: false,
337
- error: error instanceof Error ? error.message : 'Failed to fetch network stats',
338
- };
339
- }
340
- });
341
- // ============================================================================
342
- // Email Operations Actions
343
- // ============================================================================
344
- // Fetch All Emails Action
345
- export const fetchAllEmailsAction = emailOpsStatePart.createAction(async (statePartArg) => {
346
- const context = getActionContext();
347
- const currentState = statePartArg.getState();
348
- if (!context.identity)
349
- return currentState;
350
- try {
351
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getAllEmails');
352
- const response = await request.fire({
353
- identity: context.identity,
354
- });
355
- return {
356
- emails: response.emails,
357
- isLoading: false,
358
- error: null,
359
- lastUpdated: Date.now(),
360
- };
361
- }
362
- catch (error) {
363
- return {
364
- ...currentState,
365
- isLoading: false,
366
- error: error instanceof Error ? error.message : 'Failed to fetch emails',
367
- };
368
- }
369
- });
370
- // ============================================================================
371
- // Certificate Actions
372
- // ============================================================================
373
- export const fetchCertificateOverviewAction = certificateStatePart.createAction(async (statePartArg) => {
374
- const context = getActionContext();
375
- const currentState = statePartArg.getState();
376
- if (!context.identity)
377
- return currentState;
378
- try {
379
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCertificateOverview');
380
- const response = await request.fire({
381
- identity: context.identity,
382
- });
383
- return {
384
- certificates: response.certificates,
385
- summary: response.summary,
386
- isLoading: false,
387
- error: null,
388
- lastUpdated: Date.now(),
389
- };
390
- }
391
- catch (error) {
392
- return {
393
- ...currentState,
394
- isLoading: false,
395
- error: error instanceof Error ? error.message : 'Failed to fetch certificate overview',
396
- };
397
- }
398
- });
399
- export const reprovisionCertificateAction = certificateStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
400
- const context = getActionContext();
401
- const currentState = statePartArg.getState();
402
- try {
403
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'reprovisionCertificateDomain');
404
- await request.fire({
405
- identity: context.identity,
406
- domain: dataArg.domain,
407
- forceRenew: dataArg.forceRenew,
408
- });
409
- // Re-fetch overview after reprovisioning
410
- return await actionContext.dispatch(fetchCertificateOverviewAction, null);
411
- }
412
- catch (error) {
413
- return {
414
- ...currentState,
415
- error: error instanceof Error ? error.message : 'Failed to reprovision certificate',
416
- };
417
- }
418
- });
419
- export const deleteCertificateAction = certificateStatePart.createAction(async (statePartArg, domain, actionContext) => {
420
- const context = getActionContext();
421
- const currentState = statePartArg.getState();
422
- try {
423
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteCertificate');
424
- await request.fire({
425
- identity: context.identity,
426
- domain,
427
- });
428
- // Re-fetch overview after deletion
429
- return await actionContext.dispatch(fetchCertificateOverviewAction, null);
430
- }
431
- catch (error) {
432
- return {
433
- ...currentState,
434
- error: error instanceof Error ? error.message : 'Failed to delete certificate',
435
- };
436
- }
437
- });
438
- export const importCertificateAction = certificateStatePart.createAction(async (statePartArg, cert, actionContext) => {
439
- const context = getActionContext();
440
- const currentState = statePartArg.getState();
441
- try {
442
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'importCertificate');
443
- await request.fire({
444
- identity: context.identity,
445
- cert,
446
- });
447
- // Re-fetch overview after import
448
- return await actionContext.dispatch(fetchCertificateOverviewAction, null);
449
- }
450
- catch (error) {
451
- return {
452
- ...currentState,
453
- error: error instanceof Error ? error.message : 'Failed to import certificate',
454
- };
455
- }
456
- });
457
- export async function fetchCertificateExport(domain) {
458
- const context = getActionContext();
459
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'exportCertificate');
460
- return request.fire({
461
- identity: context.identity,
462
- domain,
463
- });
464
- }
465
- // ============================================================================
466
- // Remote Ingress Standalone Functions
467
- // ============================================================================
468
- export async function fetchConnectionToken(edgeId) {
469
- const context = getActionContext();
470
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngressConnectionToken');
471
- return request.fire({ identity: context.identity, edgeId });
472
- }
473
- // ============================================================================
474
- // Remote Ingress Actions
475
- // ============================================================================
476
- export const fetchRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg) => {
477
- const context = getActionContext();
478
- const currentState = statePartArg.getState();
479
- if (!context.identity)
480
- return currentState;
481
- try {
482
- const edgesRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngresses');
483
- const statusRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getRemoteIngressStatus');
484
- const [edgesResponse, statusResponse] = await Promise.all([
485
- edgesRequest.fire({ identity: context.identity }),
486
- statusRequest.fire({ identity: context.identity }),
487
- ]);
488
- return {
489
- ...currentState,
490
- edges: edgesResponse.edges,
491
- statuses: statusResponse.statuses,
492
- isLoading: false,
493
- error: null,
494
- lastUpdated: Date.now(),
495
- };
496
- }
497
- catch (error) {
498
- return {
499
- ...currentState,
500
- isLoading: false,
501
- error: error instanceof Error ? error.message : 'Failed to fetch remote ingress data',
502
- };
503
- }
504
- });
505
- export const createRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
506
- const context = getActionContext();
507
- const currentState = statePartArg.getState();
508
- try {
509
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createRemoteIngress');
510
- const response = await request.fire({
511
- identity: context.identity,
512
- name: dataArg.name,
513
- listenPorts: dataArg.listenPorts,
514
- autoDerivePorts: dataArg.autoDerivePorts,
515
- tags: dataArg.tags,
516
- });
517
- if (response.success) {
518
- // Refresh the list
519
- await actionContext.dispatch(fetchRemoteIngressAction, null);
520
- return {
521
- ...statePartArg.getState(),
522
- newEdgeId: response.edge.id,
523
- };
524
- }
525
- return currentState;
526
- }
527
- catch (error) {
528
- return {
529
- ...currentState,
530
- error: error instanceof Error ? error.message : 'Failed to create edge',
531
- };
532
- }
533
- });
534
- export const deleteRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, edgeId, actionContext) => {
535
- const context = getActionContext();
536
- const currentState = statePartArg.getState();
537
- try {
538
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteRemoteIngress');
539
- await request.fire({
540
- identity: context.identity,
541
- id: edgeId,
542
- });
543
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
544
- }
545
- catch (error) {
546
- return {
547
- ...currentState,
548
- error: error instanceof Error ? error.message : 'Failed to delete edge',
549
- };
550
- }
551
- });
552
- export const updateRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
553
- const context = getActionContext();
554
- const currentState = statePartArg.getState();
555
- try {
556
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRemoteIngress');
557
- await request.fire({
558
- identity: context.identity,
559
- id: dataArg.id,
560
- name: dataArg.name,
561
- listenPorts: dataArg.listenPorts,
562
- autoDerivePorts: dataArg.autoDerivePorts,
563
- tags: dataArg.tags,
564
- });
565
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
566
- }
567
- catch (error) {
568
- return {
569
- ...currentState,
570
- error: error instanceof Error ? error.message : 'Failed to update edge',
571
- };
572
- }
573
- });
574
- export const regenerateRemoteIngressSecretAction = remoteIngressStatePart.createAction(async (statePartArg, edgeId) => {
575
- const context = getActionContext();
576
- const currentState = statePartArg.getState();
577
- try {
578
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'regenerateRemoteIngressSecret');
579
- const response = await request.fire({
580
- identity: context.identity,
581
- id: edgeId,
582
- });
583
- if (response.success) {
584
- return {
585
- ...currentState,
586
- newEdgeId: edgeId,
587
- };
588
- }
589
- return currentState;
590
- }
591
- catch (error) {
592
- return {
593
- ...currentState,
594
- error: error instanceof Error ? error.message : 'Failed to regenerate secret',
595
- };
596
- }
597
- });
598
- export const clearNewEdgeIdAction = remoteIngressStatePart.createAction(async (statePartArg) => {
599
- return {
600
- ...statePartArg.getState(),
601
- newEdgeId: null,
602
- };
603
- });
604
- export const toggleRemoteIngressAction = remoteIngressStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
605
- const context = getActionContext();
606
- const currentState = statePartArg.getState();
607
- try {
608
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRemoteIngress');
609
- await request.fire({
610
- identity: context.identity,
611
- id: dataArg.id,
612
- enabled: dataArg.enabled,
613
- });
614
- return await actionContext.dispatch(fetchRemoteIngressAction, null);
615
- }
616
- catch (error) {
617
- return {
618
- ...currentState,
619
- error: error instanceof Error ? error.message : 'Failed to toggle edge',
620
- };
621
- }
622
- });
623
- export const vpnStatePart = await appState.getStatePart('vpn', {
624
- clients: [],
625
- connectedClients: [],
626
- status: null,
627
- isLoading: false,
628
- error: null,
629
- lastUpdated: 0,
630
- newClientConfig: null,
631
- }, 'soft');
632
- // ============================================================================
633
- // VPN Actions
634
- // ============================================================================
635
- export const fetchVpnAction = vpnStatePart.createAction(async (statePartArg) => {
636
- const context = getActionContext();
637
- const currentState = statePartArg.getState();
638
- if (!context.identity)
639
- return currentState;
640
- try {
641
- const clientsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getVpnClients');
642
- const statusRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getVpnStatus');
643
- const connectedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getVpnConnectedClients');
644
- const [clientsResponse, statusResponse, connectedResponse] = await Promise.all([
645
- clientsRequest.fire({ identity: context.identity }),
646
- statusRequest.fire({ identity: context.identity }),
647
- connectedRequest.fire({ identity: context.identity }),
648
- ]);
649
- return {
650
- ...currentState,
651
- clients: clientsResponse.clients,
652
- connectedClients: connectedResponse.connectedClients,
653
- status: statusResponse.status,
654
- isLoading: false,
655
- error: null,
656
- lastUpdated: Date.now(),
657
- };
658
- }
659
- catch (error) {
660
- return {
661
- ...currentState,
662
- isLoading: false,
663
- error: error instanceof Error ? error.message : 'Failed to fetch VPN data',
664
- };
665
- }
666
- });
667
- export const createVpnClientAction = vpnStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
668
- const context = getActionContext();
669
- const currentState = statePartArg.getState();
670
- try {
671
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createVpnClient');
672
- const response = await request.fire({
673
- identity: context.identity,
674
- clientId: dataArg.clientId,
675
- targetProfileIds: dataArg.targetProfileIds,
676
- description: dataArg.description,
677
- destinationAllowList: dataArg.destinationAllowList,
678
- destinationBlockList: dataArg.destinationBlockList,
679
- useHostIp: dataArg.useHostIp,
680
- useDhcp: dataArg.useDhcp,
681
- staticIp: dataArg.staticIp,
682
- forceVlan: dataArg.forceVlan,
683
- vlanId: dataArg.vlanId,
684
- });
685
- if (!response.success) {
686
- return { ...currentState, error: response.message || 'Failed to create client' };
687
- }
688
- const refreshed = await actionContext.dispatch(fetchVpnAction, null);
689
- return {
690
- ...refreshed,
691
- newClientConfig: response.wireguardConfig || null,
692
- };
693
- }
694
- catch (error) {
695
- return {
696
- ...currentState,
697
- error: error instanceof Error ? error.message : 'Failed to create VPN client',
698
- };
699
- }
700
- });
701
- export const deleteVpnClientAction = vpnStatePart.createAction(async (statePartArg, clientId, actionContext) => {
702
- const context = getActionContext();
703
- const currentState = statePartArg.getState();
704
- try {
705
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteVpnClient');
706
- await request.fire({ identity: context.identity, clientId });
707
- return await actionContext.dispatch(fetchVpnAction, null);
708
- }
709
- catch (error) {
710
- return {
711
- ...currentState,
712
- error: error instanceof Error ? error.message : 'Failed to delete VPN client',
713
- };
714
- }
715
- });
716
- export const toggleVpnClientAction = vpnStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
717
- const context = getActionContext();
718
- const currentState = statePartArg.getState();
719
- try {
720
- const method = dataArg.enabled ? 'enableVpnClient' : 'disableVpnClient';
721
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', method);
722
- await request.fire({ identity: context.identity, clientId: dataArg.clientId });
723
- return await actionContext.dispatch(fetchVpnAction, null);
724
- }
725
- catch (error) {
726
- return {
727
- ...currentState,
728
- error: error instanceof Error ? error.message : 'Failed to toggle VPN client',
729
- };
730
- }
731
- });
732
- export const updateVpnClientAction = vpnStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
733
- const context = getActionContext();
734
- const currentState = statePartArg.getState();
735
- try {
736
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateVpnClient');
737
- const response = await request.fire({
738
- identity: context.identity,
739
- clientId: dataArg.clientId,
740
- description: dataArg.description,
741
- targetProfileIds: dataArg.targetProfileIds,
742
- destinationAllowList: dataArg.destinationAllowList,
743
- destinationBlockList: dataArg.destinationBlockList,
744
- useHostIp: dataArg.useHostIp,
745
- useDhcp: dataArg.useDhcp,
746
- staticIp: dataArg.staticIp,
747
- forceVlan: dataArg.forceVlan,
748
- vlanId: dataArg.vlanId,
749
- });
750
- if (!response.success) {
751
- return { ...currentState, error: response.message || 'Failed to update client' };
752
- }
753
- return await actionContext.dispatch(fetchVpnAction, null);
754
- }
755
- catch (error) {
756
- return {
757
- ...currentState,
758
- error: error instanceof Error ? error.message : 'Failed to update VPN client',
759
- };
760
- }
761
- });
762
- export const clearNewClientConfigAction = vpnStatePart.createAction(async (statePartArg) => {
763
- return { ...statePartArg.getState(), newClientConfig: null };
764
- });
765
- export const targetProfilesStatePart = await appState.getStatePart('targetProfiles', {
766
- profiles: [],
767
- isLoading: false,
768
- error: null,
769
- lastUpdated: 0,
770
- }, 'soft');
771
- // ============================================================================
772
- // Target Profiles Actions
773
- // ============================================================================
774
- export const fetchTargetProfilesAction = targetProfilesStatePart.createAction(async (statePartArg) => {
775
- const context = getActionContext();
776
- const currentState = statePartArg.getState();
777
- if (!context.identity)
778
- return currentState;
779
- try {
780
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getTargetProfiles');
781
- const response = await request.fire({ identity: context.identity });
782
- return {
783
- profiles: response.profiles,
784
- isLoading: false,
785
- error: null,
786
- lastUpdated: Date.now(),
787
- };
788
- }
789
- catch (error) {
790
- return {
791
- ...currentState,
792
- isLoading: false,
793
- error: error instanceof Error ? error.message : 'Failed to fetch target profiles',
794
- };
795
- }
796
- });
797
- export const createTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
798
- const context = getActionContext();
799
- try {
800
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createTargetProfile');
801
- const response = await request.fire({
802
- identity: context.identity,
803
- name: dataArg.name,
804
- description: dataArg.description,
805
- domains: dataArg.domains,
806
- targets: dataArg.targets,
807
- routeRefs: dataArg.routeRefs,
808
- });
809
- if (!response.success) {
810
- return {
811
- ...statePartArg.getState(),
812
- error: response.message || 'Failed to create target profile',
813
- };
814
- }
815
- return await actionContext.dispatch(fetchTargetProfilesAction, null);
816
- }
817
- catch (error) {
818
- return {
819
- ...statePartArg.getState(),
820
- error: error instanceof Error ? error.message : 'Failed to create target profile',
821
- };
822
- }
823
- });
824
- export const updateTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
825
- const context = getActionContext();
826
- try {
827
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateTargetProfile');
828
- const response = await request.fire({
829
- identity: context.identity,
830
- id: dataArg.id,
831
- name: dataArg.name,
832
- description: dataArg.description,
833
- domains: dataArg.domains,
834
- targets: dataArg.targets,
835
- routeRefs: dataArg.routeRefs,
836
- });
837
- if (!response.success) {
838
- return {
839
- ...statePartArg.getState(),
840
- error: response.message || 'Failed to update target profile',
841
- };
842
- }
843
- return await actionContext.dispatch(fetchTargetProfilesAction, null);
844
- }
845
- catch (error) {
846
- return {
847
- ...statePartArg.getState(),
848
- error: error instanceof Error ? error.message : 'Failed to update target profile',
849
- };
850
- }
851
- });
852
- export const deleteTargetProfileAction = targetProfilesStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
853
- const context = getActionContext();
854
- try {
855
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteTargetProfile');
856
- const response = await request.fire({
857
- identity: context.identity,
858
- id: dataArg.id,
859
- force: dataArg.force,
860
- });
861
- if (!response.success) {
862
- return {
863
- ...statePartArg.getState(),
864
- error: response.message || 'Failed to delete target profile',
865
- };
866
- }
867
- return await actionContext.dispatch(fetchTargetProfilesAction, null);
868
- }
869
- catch (error) {
870
- return {
871
- ...statePartArg.getState(),
872
- error: error instanceof Error ? error.message : 'Failed to delete target profile',
873
- };
874
- }
875
- });
876
- export const profilesTargetsStatePart = await appState.getStatePart('profilesTargets', {
877
- profiles: [],
878
- targets: [],
879
- isLoading: false,
880
- error: null,
881
- lastUpdated: 0,
882
- }, 'soft');
883
- // ============================================================================
884
- // Source Profiles & Network Targets Actions
885
- // ============================================================================
886
- export const fetchProfilesAndTargetsAction = profilesTargetsStatePart.createAction(async (statePartArg) => {
887
- const context = getActionContext();
888
- const currentState = statePartArg.getState();
889
- if (!context.identity)
890
- return currentState;
891
- try {
892
- const profilesRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getSourceProfiles');
893
- const targetsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getNetworkTargets');
894
- const [profilesResponse, targetsResponse] = await Promise.all([
895
- profilesRequest.fire({ identity: context.identity }),
896
- targetsRequest.fire({ identity: context.identity }),
897
- ]);
898
- return {
899
- profiles: profilesResponse.profiles,
900
- targets: targetsResponse.targets,
901
- isLoading: false,
902
- error: null,
903
- lastUpdated: Date.now(),
904
- };
905
- }
906
- catch (error) {
907
- return {
908
- ...currentState,
909
- isLoading: false,
910
- error: error instanceof Error ? error.message : 'Failed to fetch profiles/targets',
911
- };
912
- }
913
- });
914
- export const createProfileAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
915
- const context = getActionContext();
916
- try {
917
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createSourceProfile');
918
- await request.fire({
919
- identity: context.identity,
920
- name: dataArg.name,
921
- description: dataArg.description,
922
- security: dataArg.security,
923
- extendsProfiles: dataArg.extendsProfiles,
924
- });
925
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
926
- }
927
- catch (error) {
928
- return {
929
- ...statePartArg.getState(),
930
- error: error instanceof Error ? error.message : 'Failed to create profile',
931
- };
932
- }
933
- });
934
- export const updateProfileAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
935
- const context = getActionContext();
936
- try {
937
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateSourceProfile');
938
- await request.fire({
939
- identity: context.identity,
940
- id: dataArg.id,
941
- name: dataArg.name,
942
- description: dataArg.description,
943
- security: dataArg.security,
944
- extendsProfiles: dataArg.extendsProfiles,
945
- });
946
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
947
- }
948
- catch (error) {
949
- return {
950
- ...statePartArg.getState(),
951
- error: error instanceof Error ? error.message : 'Failed to update profile',
952
- };
953
- }
954
- });
955
- export const deleteProfileAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
956
- const context = getActionContext();
957
- try {
958
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteSourceProfile');
959
- const response = await request.fire({
960
- identity: context.identity,
961
- id: dataArg.id,
962
- force: dataArg.force,
963
- });
964
- if (!response.success) {
965
- return {
966
- ...statePartArg.getState(),
967
- error: response.message || 'Failed to delete profile',
968
- };
969
- }
970
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
971
- }
972
- catch (error) {
973
- return {
974
- ...statePartArg.getState(),
975
- error: error instanceof Error ? error.message : 'Failed to delete profile',
976
- };
977
- }
978
- });
979
- export const createTargetAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
980
- const context = getActionContext();
981
- try {
982
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createNetworkTarget');
983
- await request.fire({
984
- identity: context.identity,
985
- name: dataArg.name,
986
- description: dataArg.description,
987
- host: dataArg.host,
988
- port: dataArg.port,
989
- });
990
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
991
- }
992
- catch (error) {
993
- return {
994
- ...statePartArg.getState(),
995
- error: error instanceof Error ? error.message : 'Failed to create target',
996
- };
997
- }
998
- });
999
- export const updateTargetAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1000
- const context = getActionContext();
1001
- try {
1002
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateNetworkTarget');
1003
- await request.fire({
1004
- identity: context.identity,
1005
- id: dataArg.id,
1006
- name: dataArg.name,
1007
- description: dataArg.description,
1008
- host: dataArg.host,
1009
- port: dataArg.port,
1010
- });
1011
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1012
- }
1013
- catch (error) {
1014
- return {
1015
- ...statePartArg.getState(),
1016
- error: error instanceof Error ? error.message : 'Failed to update target',
1017
- };
1018
- }
1019
- });
1020
- export const deleteTargetAction = profilesTargetsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1021
- const context = getActionContext();
1022
- try {
1023
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteNetworkTarget');
1024
- const response = await request.fire({
1025
- identity: context.identity,
1026
- id: dataArg.id,
1027
- force: dataArg.force,
1028
- });
1029
- if (!response.success) {
1030
- return {
1031
- ...statePartArg.getState(),
1032
- error: response.message || 'Failed to delete target',
1033
- };
1034
- }
1035
- return await actionContext.dispatch(fetchProfilesAndTargetsAction, null);
1036
- }
1037
- catch (error) {
1038
- return {
1039
- ...statePartArg.getState(),
1040
- error: error instanceof Error ? error.message : 'Failed to delete target',
1041
- };
1042
- }
1043
- });
1044
- export const domainsStatePart = await appState.getStatePart('domains', {
1045
- providers: [],
1046
- domains: [],
1047
- records: [],
1048
- selectedDomainId: null,
1049
- isLoading: false,
1050
- error: null,
1051
- lastUpdated: 0,
1052
- }, 'soft');
1053
- export const fetchDomainsAndProvidersAction = domainsStatePart.createAction(async (statePartArg) => {
1054
- const context = getActionContext();
1055
- const currentState = statePartArg.getState();
1056
- if (!context.identity)
1057
- return currentState;
1058
- try {
1059
- const providersRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getDnsProviders');
1060
- const domainsRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getDomains');
1061
- const [providersResponse, domainsResponse] = await Promise.all([
1062
- providersRequest.fire({ identity: context.identity }),
1063
- domainsRequest.fire({ identity: context.identity }),
1064
- ]);
1065
- return {
1066
- ...currentState,
1067
- providers: providersResponse.providers,
1068
- domains: domainsResponse.domains,
1069
- isLoading: false,
1070
- error: null,
1071
- lastUpdated: Date.now(),
1072
- };
1073
- }
1074
- catch (error) {
1075
- return {
1076
- ...currentState,
1077
- isLoading: false,
1078
- error: error instanceof Error ? error.message : 'Failed to fetch domains/providers',
1079
- };
1080
- }
1081
- });
1082
- export const fetchDnsRecordsForDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg) => {
1083
- const context = getActionContext();
1084
- const currentState = statePartArg.getState();
1085
- if (!context.identity)
1086
- return currentState;
1087
- try {
1088
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getDnsRecords');
1089
- const response = await request.fire({
1090
- identity: context.identity,
1091
- domainId: dataArg.domainId,
1092
- });
1093
- return {
1094
- ...currentState,
1095
- records: response.records,
1096
- selectedDomainId: dataArg.domainId,
1097
- error: null,
1098
- };
1099
- }
1100
- catch (error) {
1101
- return {
1102
- ...currentState,
1103
- error: error instanceof Error ? error.message : 'Failed to fetch DNS records',
1104
- };
1105
- }
1106
- });
1107
- export const createDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1108
- const context = getActionContext();
1109
- try {
1110
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createDnsProvider');
1111
- const response = await request.fire({
1112
- identity: context.identity,
1113
- name: dataArg.name,
1114
- type: dataArg.type,
1115
- credentials: dataArg.credentials,
1116
- });
1117
- if (!response.success) {
1118
- return {
1119
- ...statePartArg.getState(),
1120
- error: response.message || 'Failed to create provider',
1121
- };
1122
- }
1123
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1124
- }
1125
- catch (error) {
1126
- return {
1127
- ...statePartArg.getState(),
1128
- error: error instanceof Error ? error.message : 'Failed to create provider',
1129
- };
1130
- }
1131
- });
1132
- export const updateDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1133
- const context = getActionContext();
1134
- try {
1135
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateDnsProvider');
1136
- const response = await request.fire({
1137
- identity: context.identity,
1138
- id: dataArg.id,
1139
- name: dataArg.name,
1140
- credentials: dataArg.credentials,
1141
- });
1142
- if (!response.success) {
1143
- return {
1144
- ...statePartArg.getState(),
1145
- error: response.message || 'Failed to update provider',
1146
- };
1147
- }
1148
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1149
- }
1150
- catch (error) {
1151
- return {
1152
- ...statePartArg.getState(),
1153
- error: error instanceof Error ? error.message : 'Failed to update provider',
1154
- };
1155
- }
1156
- });
1157
- export const deleteDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1158
- const context = getActionContext();
1159
- try {
1160
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteDnsProvider');
1161
- const response = await request.fire({
1162
- identity: context.identity,
1163
- id: dataArg.id,
1164
- force: dataArg.force,
1165
- });
1166
- if (!response.success) {
1167
- return {
1168
- ...statePartArg.getState(),
1169
- error: response.message || 'Failed to delete provider',
1170
- };
1171
- }
1172
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1173
- }
1174
- catch (error) {
1175
- return {
1176
- ...statePartArg.getState(),
1177
- error: error instanceof Error ? error.message : 'Failed to delete provider',
1178
- };
1179
- }
1180
- });
1181
- export const testDnsProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1182
- const context = getActionContext();
1183
- try {
1184
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'testDnsProvider');
1185
- await request.fire({ identity: context.identity, id: dataArg.id });
1186
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1187
- }
1188
- catch (error) {
1189
- return {
1190
- ...statePartArg.getState(),
1191
- error: error instanceof Error ? error.message : 'Failed to test provider',
1192
- };
1193
- }
1194
- });
1195
- /** One-shot fetch for the import-domain modal. Does NOT modify state. */
1196
- export async function fetchProviderDomains(providerId) {
1197
- const context = getActionContext();
1198
- if (!context.identity)
1199
- return { success: false, message: 'Not authenticated' };
1200
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listProviderDomains');
1201
- return await request.fire({ identity: context.identity, providerId });
1202
- }
1203
- export const createDcrouterDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1204
- const context = getActionContext();
1205
- try {
1206
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createDomain');
1207
- const response = await request.fire({
1208
- identity: context.identity,
1209
- name: dataArg.name,
1210
- description: dataArg.description,
1211
- });
1212
- if (!response.success) {
1213
- return { ...statePartArg.getState(), error: response.message || 'Failed to create domain' };
1214
- }
1215
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1216
- }
1217
- catch (error) {
1218
- return {
1219
- ...statePartArg.getState(),
1220
- error: error instanceof Error ? error.message : 'Failed to create domain',
1221
- };
1222
- }
1223
- });
1224
- export const importDomainsFromProviderAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1225
- const context = getActionContext();
1226
- try {
1227
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'importDomain');
1228
- const response = await request.fire({
1229
- identity: context.identity,
1230
- providerId: dataArg.providerId,
1231
- domainNames: dataArg.domainNames,
1232
- });
1233
- if (!response.success) {
1234
- return { ...statePartArg.getState(), error: response.message || 'Failed to import domains' };
1235
- }
1236
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1237
- }
1238
- catch (error) {
1239
- return {
1240
- ...statePartArg.getState(),
1241
- error: error instanceof Error ? error.message : 'Failed to import domains',
1242
- };
1243
- }
1244
- });
1245
- export const deleteDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1246
- const context = getActionContext();
1247
- try {
1248
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteDomain');
1249
- const response = await request.fire({ identity: context.identity, id: dataArg.id });
1250
- if (!response.success) {
1251
- return { ...statePartArg.getState(), error: response.message || 'Failed to delete domain' };
1252
- }
1253
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1254
- }
1255
- catch (error) {
1256
- return {
1257
- ...statePartArg.getState(),
1258
- error: error instanceof Error ? error.message : 'Failed to delete domain',
1259
- };
1260
- }
1261
- });
1262
- export const syncDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1263
- const context = getActionContext();
1264
- try {
1265
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'syncDomain');
1266
- const response = await request.fire({ identity: context.identity, id: dataArg.id });
1267
- if (!response.success) {
1268
- return { ...statePartArg.getState(), error: response.message || 'Failed to sync domain' };
1269
- }
1270
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1271
- }
1272
- catch (error) {
1273
- return {
1274
- ...statePartArg.getState(),
1275
- error: error instanceof Error ? error.message : 'Failed to sync domain',
1276
- };
1277
- }
1278
- });
1279
- export const migrateDomainAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1280
- const context = getActionContext();
1281
- try {
1282
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'migrateDomain');
1283
- const response = await request.fire({ identity: context.identity, ...dataArg });
1284
- if (!response.success) {
1285
- return { ...statePartArg.getState(), error: response.message || 'Migration failed' };
1286
- }
1287
- return await actionContext.dispatch(fetchDomainsAndProvidersAction, null);
1288
- }
1289
- catch (error) {
1290
- return {
1291
- ...statePartArg.getState(),
1292
- error: error instanceof Error ? error.message : 'Migration failed',
1293
- };
1294
- }
1295
- });
1296
- export const createDnsRecordAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1297
- const context = getActionContext();
1298
- try {
1299
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createDnsRecord');
1300
- const response = await request.fire({
1301
- identity: context.identity,
1302
- domainId: dataArg.domainId,
1303
- name: dataArg.name,
1304
- type: dataArg.type,
1305
- value: dataArg.value,
1306
- ttl: dataArg.ttl,
1307
- proxied: dataArg.proxied,
1308
- });
1309
- if (!response.success) {
1310
- return { ...statePartArg.getState(), error: response.message || 'Failed to create record' };
1311
- }
1312
- return await actionContext.dispatch(fetchDnsRecordsForDomainAction, { domainId: dataArg.domainId });
1313
- }
1314
- catch (error) {
1315
- return {
1316
- ...statePartArg.getState(),
1317
- error: error instanceof Error ? error.message : 'Failed to create record',
1318
- };
1319
- }
1320
- });
1321
- export const updateDnsRecordAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1322
- const context = getActionContext();
1323
- try {
1324
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateDnsRecord');
1325
- const response = await request.fire({
1326
- identity: context.identity,
1327
- id: dataArg.id,
1328
- name: dataArg.name,
1329
- value: dataArg.value,
1330
- ttl: dataArg.ttl,
1331
- proxied: dataArg.proxied,
1332
- });
1333
- if (!response.success) {
1334
- return { ...statePartArg.getState(), error: response.message || 'Failed to update record' };
1335
- }
1336
- return await actionContext.dispatch(fetchDnsRecordsForDomainAction, { domainId: dataArg.domainId });
1337
- }
1338
- catch (error) {
1339
- return {
1340
- ...statePartArg.getState(),
1341
- error: error instanceof Error ? error.message : 'Failed to update record',
1342
- };
1343
- }
1344
- });
1345
- export const deleteDnsRecordAction = domainsStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1346
- const context = getActionContext();
1347
- try {
1348
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteDnsRecord');
1349
- const response = await request.fire({ identity: context.identity, id: dataArg.id });
1350
- if (!response.success) {
1351
- return { ...statePartArg.getState(), error: response.message || 'Failed to delete record' };
1352
- }
1353
- return await actionContext.dispatch(fetchDnsRecordsForDomainAction, { domainId: dataArg.domainId });
1354
- }
1355
- catch (error) {
1356
- return {
1357
- ...statePartArg.getState(),
1358
- error: error instanceof Error ? error.message : 'Failed to delete record',
1359
- };
1360
- }
1361
- });
1362
- // ============================================================================
1363
- // ACME Config Actions
1364
- // ============================================================================
1365
- export const fetchAcmeConfigAction = acmeConfigStatePart.createAction(async (statePartArg) => {
1366
- const context = getActionContext();
1367
- const currentState = statePartArg.getState();
1368
- if (!context.identity)
1369
- return currentState;
1370
- try {
1371
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getAcmeConfig');
1372
- const response = await request.fire({ identity: context.identity });
1373
- return {
1374
- config: response.config,
1375
- isLoading: false,
1376
- error: null,
1377
- lastUpdated: Date.now(),
1378
- };
1379
- }
1380
- catch (error) {
1381
- return {
1382
- ...currentState,
1383
- isLoading: false,
1384
- error: error instanceof Error ? error.message : 'Failed to fetch ACME config',
1385
- };
1386
- }
1387
- });
1388
- export const updateAcmeConfigAction = acmeConfigStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1389
- const context = getActionContext();
1390
- try {
1391
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateAcmeConfig');
1392
- const response = await request.fire({
1393
- identity: context.identity,
1394
- accountEmail: dataArg.accountEmail,
1395
- enabled: dataArg.enabled,
1396
- useProduction: dataArg.useProduction,
1397
- autoRenew: dataArg.autoRenew,
1398
- renewThresholdDays: dataArg.renewThresholdDays,
1399
- });
1400
- if (!response.success) {
1401
- return {
1402
- ...statePartArg.getState(),
1403
- error: response.message || 'Failed to update ACME config',
1404
- };
1405
- }
1406
- return await actionContext.dispatch(fetchAcmeConfigAction, null);
1407
- }
1408
- catch (error) {
1409
- return {
1410
- ...statePartArg.getState(),
1411
- error: error instanceof Error ? error.message : 'Failed to update ACME config',
1412
- };
1413
- }
1414
- });
1415
- // ============================================================================
1416
- // Route Management Actions
1417
- // ============================================================================
1418
- export const fetchMergedRoutesAction = routeManagementStatePart.createAction(async (statePartArg) => {
1419
- const context = getActionContext();
1420
- const currentState = statePartArg.getState();
1421
- if (!context.identity)
1422
- return currentState;
1423
- try {
1424
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getMergedRoutes');
1425
- const response = await request.fire({
1426
- identity: context.identity,
1427
- });
1428
- return {
1429
- ...currentState,
1430
- mergedRoutes: response.routes,
1431
- warnings: response.warnings,
1432
- isLoading: false,
1433
- error: null,
1434
- lastUpdated: Date.now(),
1435
- };
1436
- }
1437
- catch (error) {
1438
- return {
1439
- ...currentState,
1440
- isLoading: false,
1441
- error: error instanceof Error ? error.message : 'Failed to fetch routes',
1442
- };
1443
- }
1444
- });
1445
- export const createRouteAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1446
- const context = getActionContext();
1447
- const currentState = statePartArg.getState();
1448
- try {
1449
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createRoute');
1450
- await request.fire({
1451
- identity: context.identity,
1452
- route: dataArg.route,
1453
- enabled: dataArg.enabled,
1454
- metadata: dataArg.metadata,
1455
- });
1456
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1457
- }
1458
- catch (error) {
1459
- return {
1460
- ...currentState,
1461
- error: error instanceof Error ? error.message : 'Failed to create route',
1462
- };
1463
- }
1464
- });
1465
- export const updateRouteAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1466
- const context = getActionContext();
1467
- const currentState = statePartArg.getState();
1468
- try {
1469
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'updateRoute');
1470
- await request.fire({
1471
- identity: context.identity,
1472
- id: dataArg.id,
1473
- route: dataArg.route,
1474
- enabled: dataArg.enabled,
1475
- metadata: dataArg.metadata,
1476
- });
1477
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1478
- }
1479
- catch (error) {
1480
- return {
1481
- ...currentState,
1482
- error: error instanceof Error ? error.message : 'Failed to update route',
1483
- };
1484
- }
1485
- });
1486
- export const deleteRouteAction = routeManagementStatePart.createAction(async (statePartArg, routeId, actionContext) => {
1487
- const context = getActionContext();
1488
- const currentState = statePartArg.getState();
1489
- try {
1490
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteRoute');
1491
- await request.fire({
1492
- identity: context.identity,
1493
- id: routeId,
1494
- });
1495
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1496
- }
1497
- catch (error) {
1498
- return {
1499
- ...currentState,
1500
- error: error instanceof Error ? error.message : 'Failed to delete route',
1501
- };
1502
- }
1503
- });
1504
- export const toggleRouteAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1505
- const context = getActionContext();
1506
- const currentState = statePartArg.getState();
1507
- try {
1508
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'toggleRoute');
1509
- await request.fire({
1510
- identity: context.identity,
1511
- id: dataArg.id,
1512
- enabled: dataArg.enabled,
1513
- });
1514
- return await actionContext.dispatch(fetchMergedRoutesAction, null);
1515
- }
1516
- catch (error) {
1517
- return {
1518
- ...currentState,
1519
- error: error instanceof Error ? error.message : 'Failed to toggle route',
1520
- };
1521
- }
1522
- });
1523
- // ============================================================================
1524
- // API Token Actions
1525
- // ============================================================================
1526
- export const fetchApiTokensAction = routeManagementStatePart.createAction(async (statePartArg) => {
1527
- const context = getActionContext();
1528
- const currentState = statePartArg.getState();
1529
- if (!context.identity)
1530
- return currentState;
1531
- try {
1532
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listApiTokens');
1533
- const response = await request.fire({
1534
- identity: context.identity,
1535
- });
1536
- return {
1537
- ...currentState,
1538
- apiTokens: response.tokens,
1539
- };
1540
- }
1541
- catch (error) {
1542
- return {
1543
- ...currentState,
1544
- error: error instanceof Error ? error.message : 'Failed to fetch tokens',
1545
- };
1546
- }
1547
- });
1548
- // Users (read-only list)
1549
- export const fetchUsersAction = usersStatePart.createAction(async (statePartArg) => {
1550
- const context = getActionContext();
1551
- const currentState = statePartArg.getState();
1552
- if (!context.identity)
1553
- return currentState;
1554
- try {
1555
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'listUsers');
1556
- const response = await request.fire({
1557
- identity: context.identity,
1558
- });
1559
- return {
1560
- ...currentState,
1561
- users: response.users,
1562
- error: null,
1563
- lastUpdated: Date.now(),
1564
- };
1565
- }
1566
- catch (error) {
1567
- return {
1568
- ...currentState,
1569
- error: error instanceof Error ? error.message : 'Failed to fetch users',
1570
- };
1571
- }
1572
- });
1573
- export async function createApiToken(name, scopes, expiresInDays) {
1574
- const context = getActionContext();
1575
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createApiToken');
1576
- return request.fire({
1577
- identity: context.identity,
1578
- name,
1579
- scopes,
1580
- expiresInDays,
1581
- });
1582
- }
1583
- export async function rollApiToken(id) {
1584
- const context = getActionContext();
1585
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'rollApiToken');
1586
- return request.fire({
1587
- identity: context.identity,
1588
- id,
1589
- });
1590
- }
1591
- export const revokeApiTokenAction = routeManagementStatePart.createAction(async (statePartArg, tokenId, actionContext) => {
1592
- const context = getActionContext();
1593
- const currentState = statePartArg.getState();
1594
- try {
1595
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'revokeApiToken');
1596
- await request.fire({
1597
- identity: context.identity,
1598
- id: tokenId,
1599
- });
1600
- return await actionContext.dispatch(fetchApiTokensAction, null);
1601
- }
1602
- catch (error) {
1603
- return {
1604
- ...currentState,
1605
- error: error instanceof Error ? error.message : 'Failed to revoke token',
1606
- };
1607
- }
1608
- });
1609
- export const toggleApiTokenAction = routeManagementStatePart.createAction(async (statePartArg, dataArg, actionContext) => {
1610
- const context = getActionContext();
1611
- const currentState = statePartArg.getState();
1612
- try {
1613
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'toggleApiToken');
1614
- await request.fire({
1615
- identity: context.identity,
1616
- id: dataArg.id,
1617
- enabled: dataArg.enabled,
1618
- });
1619
- return await actionContext.dispatch(fetchApiTokensAction, null);
1620
- }
1621
- catch (error) {
1622
- return {
1623
- ...currentState,
1624
- error: error instanceof Error ? error.message : 'Failed to toggle token',
1625
- };
1626
- }
1627
- });
1628
- export const emailDomainsStatePart = await appState.getStatePart('emailDomains', {
1629
- domains: [],
1630
- isLoading: false,
1631
- lastUpdated: 0,
1632
- }, 'soft');
1633
- export const fetchEmailDomainsAction = emailDomainsStatePart.createAction(async (statePartArg) => {
1634
- const context = getActionContext();
1635
- const currentState = statePartArg.getState();
1636
- if (!context.identity)
1637
- return currentState;
1638
- try {
1639
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getEmailDomains');
1640
- const response = await request.fire({ identity: context.identity });
1641
- return {
1642
- ...currentState,
1643
- domains: response.domains,
1644
- isLoading: false,
1645
- lastUpdated: Date.now(),
1646
- };
1647
- }
1648
- catch {
1649
- return { ...currentState, isLoading: false };
1650
- }
1651
- });
1652
- export const createEmailDomainAction = emailDomainsStatePart.createAction(async (statePartArg, args, actionContext) => {
1653
- const context = getActionContext();
1654
- const currentState = statePartArg.getState();
1655
- try {
1656
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'createEmailDomain');
1657
- await request.fire({ identity: context.identity, ...args });
1658
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
1659
- }
1660
- catch {
1661
- return currentState;
1662
- }
1663
- });
1664
- export const deleteEmailDomainAction = emailDomainsStatePart.createAction(async (statePartArg, id, actionContext) => {
1665
- const context = getActionContext();
1666
- const currentState = statePartArg.getState();
1667
- try {
1668
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'deleteEmailDomain');
1669
- await request.fire({ identity: context.identity, id });
1670
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
1671
- }
1672
- catch {
1673
- return currentState;
1674
- }
1675
- });
1676
- export const validateEmailDomainAction = emailDomainsStatePart.createAction(async (statePartArg, id, actionContext) => {
1677
- const context = getActionContext();
1678
- const currentState = statePartArg.getState();
1679
- try {
1680
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'validateEmailDomain');
1681
- await request.fire({ identity: context.identity, id });
1682
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
1683
- }
1684
- catch {
1685
- return currentState;
1686
- }
1687
- });
1688
- export const provisionEmailDomainDnsAction = emailDomainsStatePart.createAction(async (statePartArg, id, actionContext) => {
1689
- const context = getActionContext();
1690
- const currentState = statePartArg.getState();
1691
- try {
1692
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'provisionEmailDomainDns');
1693
- await request.fire({ identity: context.identity, id });
1694
- return await actionContext.dispatch(fetchEmailDomainsAction, null);
1695
- }
1696
- catch {
1697
- return currentState;
1698
- }
1699
- });
1700
- // ============================================================================
1701
- // Email Domain Standalone Functions
1702
- // ============================================================================
1703
- export async function fetchEmailDomainDnsRecords(id) {
1704
- const context = getActionContext();
1705
- const request = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getEmailDomainDnsRecords');
1706
- return request.fire({ identity: context.identity, id });
1707
- }
1708
- // ============================================================================
1709
- // TypedSocket Client for Real-time Log Streaming
1710
- // ============================================================================
1711
- let socketClient = null;
1712
- const socketRouter = new plugins.domtools.plugins.typedrequest.TypedRouter();
1713
- // Batched log entry handler — buffers incoming entries and flushes once per animation frame
1714
- let logEntryBuffer = [];
1715
- let logFlushScheduled = false;
1716
- function flushLogEntries() {
1717
- logFlushScheduled = false;
1718
- if (logEntryBuffer.length === 0)
1719
- return;
1720
- const current = logStatePart.getState();
1721
- const updated = [...current.recentLogs, ...logEntryBuffer];
1722
- logEntryBuffer = [];
1723
- // Cap at 2000 entries
1724
- if (updated.length > 2000) {
1725
- updated.splice(0, updated.length - 2000);
1726
- }
1727
- logStatePart.setState({ ...current, recentLogs: updated });
1728
- }
1729
- // Register handler for pushed log entries from the server
1730
- socketRouter.addTypedHandler(new plugins.domtools.plugins.typedrequest.TypedHandler('pushLogEntry', async (dataArg) => {
1731
- logEntryBuffer.push(dataArg.entry);
1732
- if (!logFlushScheduled) {
1733
- logFlushScheduled = true;
1734
- requestAnimationFrame(flushLogEntries);
1735
- }
1736
- return {};
1737
- }));
1738
- async function connectSocket() {
1739
- if (socketClient)
1740
- return;
1741
- try {
1742
- socketClient = await plugins.typedsocket.TypedSocket.createClient(socketRouter, plugins.typedsocket.TypedSocket.useWindowLocationOriginUrl());
1743
- await socketClient.setTag('role', 'ops_dashboard');
1744
- }
1745
- catch (err) {
1746
- console.error('TypedSocket connection failed:', err);
1747
- socketClient = null;
1748
- }
1749
- }
1750
- async function disconnectSocket() {
1751
- if (socketClient) {
1752
- try {
1753
- await socketClient.stop();
1754
- }
1755
- catch {
1756
- // ignore disconnect errors
1757
- }
1758
- socketClient = null;
1759
- }
1760
- }
1761
- // In-flight guard to prevent concurrent refresh requests
1762
- let isRefreshing = false;
1763
- // Combined refresh action for efficient polling
1764
- async function dispatchCombinedRefreshAction() {
1765
- if (isRefreshing)
1766
- return;
1767
- isRefreshing = true;
1768
- try {
1769
- await dispatchCombinedRefreshActionInner();
1770
- }
1771
- finally {
1772
- isRefreshing = false;
1773
- }
1774
- }
1775
- async function dispatchCombinedRefreshActionInner() {
1776
- const context = getActionContext();
1777
- if (!context.identity)
1778
- return;
1779
- const currentView = uiStatePart.getState().activeView;
1780
- const currentSubview = uiStatePart.getState().activeSubview;
1781
- try {
1782
- // Always fetch basic stats for dashboard widgets
1783
- const combinedRequest = new plugins.domtools.plugins.typedrequest.TypedRequest('/typedrequest', 'getCombinedMetrics');
1784
- const combinedResponse = await combinedRequest.fire({
1785
- identity: context.identity,
1786
- sections: {
1787
- server: true,
1788
- email: true,
1789
- dns: true,
1790
- security: true,
1791
- network: currentView === 'network', // Only fetch network if on network view
1792
- radius: true,
1793
- vpn: true,
1794
- },
1795
- });
1796
- // Update all stats from combined response
1797
- const currentStatsState = statsStatePart.getState();
1798
- statsStatePart.setState({
1799
- ...currentStatsState,
1800
- serverStats: combinedResponse.metrics.server || currentStatsState.serverStats,
1801
- emailStats: combinedResponse.metrics.email || currentStatsState.emailStats,
1802
- dnsStats: combinedResponse.metrics.dns || currentStatsState.dnsStats,
1803
- securityMetrics: combinedResponse.metrics.security || currentStatsState.securityMetrics,
1804
- radiusStats: combinedResponse.metrics.radius || currentStatsState.radiusStats,
1805
- vpnStats: combinedResponse.metrics.vpn || currentStatsState.vpnStats,
1806
- lastUpdated: Date.now(),
1807
- isLoading: false,
1808
- error: null,
1809
- });
1810
- // Update network stats if included
1811
- if (combinedResponse.metrics.network && currentView === 'network') {
1812
- const network = combinedResponse.metrics.network;
1813
- const connectionsByIP = {};
1814
- // Build connectionsByIP from connectionDetails (now populated with real per-IP data)
1815
- network.connectionDetails.forEach(conn => {
1816
- connectionsByIP[conn.remoteAddress] = (connectionsByIP[conn.remoteAddress] || 0) + 1;
1817
- });
1818
- // Build connections from connectionDetails (real per-IP aggregates)
1819
- const connections = network.connectionDetails.map((conn, i) => ({
1820
- id: `ip-${conn.remoteAddress}`,
1821
- remoteAddress: conn.remoteAddress,
1822
- localAddress: 'server',
1823
- startTime: conn.startTime,
1824
- protocol: conn.protocol,
1825
- state: conn.state,
1826
- bytesReceived: conn.bytesIn,
1827
- bytesSent: conn.bytesOut,
1828
- }));
1829
- networkStatePart.setState({
1830
- ...networkStatePart.getState(),
1831
- connections,
1832
- connectionsByIP,
1833
- throughputRate: {
1834
- bytesInPerSecond: network.totalBandwidth.in,
1835
- bytesOutPerSecond: network.totalBandwidth.out,
1836
- },
1837
- totalBytes: network.totalBytes || { in: 0, out: 0 },
1838
- topIPs: network.topEndpoints.map(e => ({ ip: e.endpoint, count: e.connections })),
1839
- topIPsByBandwidth: (network.topEndpointsByBandwidth || []).map(e => ({
1840
- ip: e.endpoint,
1841
- count: e.connections,
1842
- bwIn: e.bandwidth?.in || 0,
1843
- bwOut: e.bandwidth?.out || 0,
1844
- })),
1845
- throughputByIP: network.topEndpoints.map(e => ({ ip: e.endpoint, in: e.bandwidth?.in || 0, out: e.bandwidth?.out || 0 })),
1846
- domainActivity: network.domainActivity || [],
1847
- throughputHistory: network.throughputHistory || [],
1848
- requestsPerSecond: network.requestsPerSecond || 0,
1849
- requestsTotal: network.requestsTotal || 0,
1850
- backends: network.backends || [],
1851
- frontendProtocols: network.frontendProtocols || null,
1852
- backendProtocols: network.backendProtocols || null,
1853
- lastUpdated: Date.now(),
1854
- isLoading: false,
1855
- error: null,
1856
- });
1857
- }
1858
- // Refresh certificate data if on Domains > Certificates subview
1859
- if (currentView === 'domains' && currentSubview === 'certificates') {
1860
- try {
1861
- await certificateStatePart.dispatchAction(fetchCertificateOverviewAction, null);
1862
- }
1863
- catch (error) {
1864
- console.error('Certificate refresh failed:', error);
1865
- }
1866
- }
1867
- // Refresh remote ingress data if on the Network → Remote Ingress subview
1868
- if (currentView === 'network' && currentSubview === 'remoteingress') {
1869
- try {
1870
- await remoteIngressStatePart.dispatchAction(fetchRemoteIngressAction, null);
1871
- }
1872
- catch (error) {
1873
- console.error('Remote ingress refresh failed:', error);
1874
- }
1875
- }
1876
- // Refresh VPN data if on the Network → VPN subview
1877
- if (currentView === 'network' && currentSubview === 'vpn') {
1878
- try {
1879
- await vpnStatePart.dispatchAction(fetchVpnAction, null);
1880
- }
1881
- catch (error) {
1882
- console.error('VPN refresh failed:', error);
1883
- }
1884
- }
1885
- }
1886
- catch (error) {
1887
- console.error('Combined refresh failed:', error);
1888
- // If the error looks like an auth failure (invalid JWT), force re-login
1889
- const errMsg = String(error);
1890
- if (errMsg.includes('invalid') || errMsg.includes('unauthorized') || errMsg.includes('401')) {
1891
- await loginStatePart.dispatchAction(logoutAction, null);
1892
- window.location.reload();
1893
- }
1894
- }
1895
- }
1896
- // Create a proper action for the combined refresh so we can use createScheduledAction
1897
- const combinedRefreshAction = statsStatePart.createAction(async (statePartArg) => {
1898
- await dispatchCombinedRefreshAction();
1899
- // Return current state — dispatchCombinedRefreshAction already updates all state parts directly
1900
- return statePartArg.getState();
1901
- });
1902
- // Scheduled refresh process with autoPause: 'visibility' — automatically pauses when tab is hidden
1903
- let refreshProcess = null;
1904
- const startAutoRefresh = () => {
1905
- const uiState = uiStatePart.getState();
1906
- const loginState = loginStatePart.getState();
1907
- if (uiState.autoRefresh && loginState.isLoggedIn) {
1908
- // Dispose old process if interval changed or not running
1909
- if (refreshProcess) {
1910
- refreshProcess.dispose();
1911
- refreshProcess = null;
1912
- }
1913
- refreshProcess = statsStatePart.createScheduledAction({
1914
- action: combinedRefreshAction,
1915
- payload: undefined,
1916
- intervalMs: uiState.refreshInterval,
1917
- autoPause: 'visibility',
1918
- });
1919
- }
1920
- else {
1921
- if (refreshProcess) {
1922
- refreshProcess.dispose();
1923
- refreshProcess = null;
1924
- }
1925
- }
1926
- };
1927
- // Watch for relevant changes
1928
- let previousAutoRefresh = uiStatePart.getState().autoRefresh;
1929
- let previousRefreshInterval = uiStatePart.getState().refreshInterval;
1930
- let previousIsLoggedIn = loginStatePart.getState().isLoggedIn;
1931
- uiStatePart.select((s) => ({ autoRefresh: s.autoRefresh, refreshInterval: s.refreshInterval }))
1932
- .subscribe((state) => {
1933
- if (state.autoRefresh !== previousAutoRefresh ||
1934
- state.refreshInterval !== previousRefreshInterval) {
1935
- previousAutoRefresh = state.autoRefresh;
1936
- previousRefreshInterval = state.refreshInterval;
1937
- startAutoRefresh();
1938
- }
1939
- });
1940
- loginStatePart.select((s) => s.isLoggedIn).subscribe((isLoggedIn) => {
1941
- if (isLoggedIn !== previousIsLoggedIn) {
1942
- previousIsLoggedIn = isLoggedIn;
1943
- startAutoRefresh();
1944
- // Connect/disconnect TypedSocket based on login state
1945
- if (isLoggedIn) {
1946
- connectSocket();
1947
- }
1948
- else {
1949
- disconnectSocket();
1950
- }
1951
- }
1952
- });
1953
- // Pause/resume WebSocket when tab visibility changes
1954
- document.addEventListener('visibilitychange', () => {
1955
- if (document.hidden) {
1956
- disconnectSocket();
1957
- }
1958
- else if (loginStatePart.getState().isLoggedIn) {
1959
- connectSocket();
1960
- }
1961
- });
1962
- // Initial start
1963
- startAutoRefresh();
1964
- // Connect TypedSocket if already logged in (e.g., persistent session)
1965
- if (loginStatePart.getState().isLoggedIn) {
1966
- connectSocket();
1967
- }
1968
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvYXBwc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSwyQkFBMkIsQ0FBQztBQUV4RCxpQ0FBaUM7QUFDakMsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBK0U3RSxrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FDdkQsT0FBTyxFQUNQO0lBQ0UsUUFBUSxFQUFFLElBQUk7SUFDZCxVQUFVLEVBQUUsS0FBSztDQUNsQixFQUNELFlBQVksQ0FBQywrQ0FBK0M7Q0FDN0QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQ3ZELE9BQU8sRUFDUDtJQUNFLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsZUFBZSxFQUFFLElBQUk7SUFDckIsV0FBVyxFQUFFLElBQUk7SUFDakIsUUFBUSxFQUFFLElBQUk7SUFDZCxXQUFXLEVBQUUsQ0FBQztJQUNkLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0NBQ1osRUFDRCxNQUFNLENBQUMscUNBQXFDO0NBQzdDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxDQUN4RCxRQUFRLEVBQ1I7SUFDRSxNQUFNLEVBQUUsSUFBSTtJQUNaLFNBQVMsRUFBRSxLQUFLO0lBQ2hCLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FDRixDQUFDO0FBRUYsdUNBQXVDO0FBQ3ZDLE1B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