@serve.zone/dcrouter 13.17.0 → 13.17.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/dist_serve/bundle.js +3 -3
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/acme/index.d.ts +1 -0
  5. package/dist_ts/acme/index.js +2 -0
  6. package/dist_ts/acme/manager.acme-config.d.ts +48 -0
  7. package/dist_ts/acme/manager.acme-config.js +156 -0
  8. package/dist_ts/classes.cert-provision-scheduler.d.ts +52 -0
  9. package/dist_ts/classes.cert-provision-scheduler.js +138 -0
  10. package/dist_ts/classes.dcrouter.d.ts +401 -0
  11. package/dist_ts/classes.dcrouter.js +1852 -0
  12. package/dist_ts/classes.storage-cert-manager.d.ts +15 -0
  13. package/dist_ts/classes.storage-cert-manager.js +53 -0
  14. package/dist_ts/config/classes.api-token-manager.d.ts +44 -0
  15. package/dist_ts/config/classes.api-token-manager.js +180 -0
  16. package/dist_ts/config/classes.db-seeder.d.ts +25 -0
  17. package/dist_ts/config/classes.db-seeder.js +69 -0
  18. package/dist_ts/config/classes.reference-resolver.d.ts +80 -0
  19. package/dist_ts/config/classes.reference-resolver.js +483 -0
  20. package/dist_ts/config/classes.route-config-manager.d.ts +54 -0
  21. package/dist_ts/config/classes.route-config-manager.js +370 -0
  22. package/dist_ts/config/classes.target-profile-manager.d.ts +82 -0
  23. package/dist_ts/config/classes.target-profile-manager.js +349 -0
  24. package/dist_ts/config/index.d.ts +6 -0
  25. package/dist_ts/config/index.js +8 -0
  26. package/dist_ts/config/validator.d.ts +104 -0
  27. package/dist_ts/config/validator.js +152 -0
  28. package/dist_ts/db/classes.cache.cleaner.d.ts +47 -0
  29. package/dist_ts/db/classes.cache.cleaner.js +130 -0
  30. package/dist_ts/db/classes.cached.document.d.ts +76 -0
  31. package/dist_ts/db/classes.cached.document.js +100 -0
  32. package/dist_ts/db/classes.dcrouter-db.d.ts +70 -0
  33. package/dist_ts/db/classes.dcrouter-db.js +146 -0
  34. package/dist_ts/db/documents/classes.accounting-session.doc.d.ts +32 -0
  35. package/dist_ts/db/documents/classes.accounting-session.doc.js +214 -0
  36. package/dist_ts/db/documents/classes.acme-cert.doc.d.ts +13 -0
  37. package/dist_ts/db/documents/classes.acme-cert.doc.js +109 -0
  38. package/dist_ts/db/documents/classes.acme-config.doc.d.ts +22 -0
  39. package/dist_ts/db/documents/classes.acme-config.doc.js +121 -0
  40. package/dist_ts/db/documents/classes.api-token.doc.d.ts +18 -0
  41. package/dist_ts/db/documents/classes.api-token.doc.js +127 -0
  42. package/dist_ts/db/documents/classes.cached.email.d.ts +125 -0
  43. package/dist_ts/db/documents/classes.cached.email.js +337 -0
  44. package/dist_ts/db/documents/classes.cached.ip.reputation.d.ts +119 -0
  45. package/dist_ts/db/documents/classes.cached.ip.reputation.js +323 -0
  46. package/dist_ts/db/documents/classes.cert-backoff.doc.d.ts +11 -0
  47. package/dist_ts/db/documents/classes.cert-backoff.doc.js +97 -0
  48. package/dist_ts/db/documents/classes.dns-provider.doc.d.ts +22 -0
  49. package/dist_ts/db/documents/classes.dns-provider.doc.js +134 -0
  50. package/dist_ts/db/documents/classes.dns-record.doc.d.ts +21 -0
  51. package/dist_ts/db/documents/classes.dns-record.doc.js +143 -0
  52. package/dist_ts/db/documents/classes.domain.doc.d.ts +22 -0
  53. package/dist_ts/db/documents/classes.domain.doc.js +146 -0
  54. package/dist_ts/db/documents/classes.email-domain.doc.d.ts +17 -0
  55. package/dist_ts/db/documents/classes.email-domain.doc.js +124 -0
  56. package/dist_ts/db/documents/classes.network-target.doc.d.ts +15 -0
  57. package/dist_ts/db/documents/classes.network-target.doc.js +118 -0
  58. package/dist_ts/db/documents/classes.proxy-cert.doc.d.ts +12 -0
  59. package/dist_ts/db/documents/classes.proxy-cert.doc.js +103 -0
  60. package/dist_ts/db/documents/classes.remote-ingress-edge.doc.d.ts +17 -0
  61. package/dist_ts/db/documents/classes.remote-ingress-edge.doc.js +130 -0
  62. package/dist_ts/db/documents/classes.route.doc.d.ts +18 -0
  63. package/dist_ts/db/documents/classes.route.doc.js +121 -0
  64. package/dist_ts/db/documents/classes.source-profile.doc.d.ts +15 -0
  65. package/dist_ts/db/documents/classes.source-profile.doc.js +115 -0
  66. package/dist_ts/db/documents/classes.target-profile.doc.d.ts +16 -0
  67. package/dist_ts/db/documents/classes.target-profile.doc.js +121 -0
  68. package/dist_ts/db/documents/classes.vlan-mappings.doc.d.ts +15 -0
  69. package/dist_ts/db/documents/classes.vlan-mappings.doc.js +77 -0
  70. package/dist_ts/db/documents/classes.vpn-client.doc.d.ts +23 -0
  71. package/dist_ts/db/documents/classes.vpn-client.doc.js +172 -0
  72. package/dist_ts/db/documents/classes.vpn-server-keys.doc.d.ts +10 -0
  73. package/dist_ts/db/documents/classes.vpn-server-keys.doc.js +94 -0
  74. package/dist_ts/db/documents/index.d.ts +20 -0
  75. package/dist_ts/db/documents/index.js +30 -0
  76. package/dist_ts/db/index.d.ts +4 -0
  77. package/dist_ts/db/index.js +9 -0
  78. package/dist_ts/dns/index.d.ts +2 -0
  79. package/dist_ts/dns/index.js +3 -0
  80. package/dist_ts/dns/manager.dns.d.ts +267 -0
  81. package/dist_ts/dns/manager.dns.js +906 -0
  82. package/dist_ts/dns/providers/cloudflare.provider.d.ts +21 -0
  83. package/dist_ts/dns/providers/cloudflare.provider.js +106 -0
  84. package/dist_ts/dns/providers/factory.d.ts +23 -0
  85. package/dist_ts/dns/providers/factory.js +47 -0
  86. package/dist_ts/dns/providers/index.d.ts +3 -0
  87. package/dist_ts/dns/providers/index.js +4 -0
  88. package/dist_ts/dns/providers/interfaces.d.ts +54 -0
  89. package/dist_ts/dns/providers/interfaces.js +2 -0
  90. package/dist_ts/email/classes.email-domain.manager.d.ts +46 -0
  91. package/dist_ts/email/classes.email-domain.manager.js +276 -0
  92. package/dist_ts/email/index.d.ts +1 -0
  93. package/dist_ts/email/index.js +2 -0
  94. package/dist_ts/errors/base.errors.d.ts +224 -0
  95. package/dist_ts/errors/base.errors.js +320 -0
  96. package/dist_ts/errors/error-handler.d.ts +98 -0
  97. package/dist_ts/errors/error-handler.js +282 -0
  98. package/dist_ts/errors/error.codes.d.ts +115 -0
  99. package/dist_ts/errors/error.codes.js +136 -0
  100. package/dist_ts/errors/index.d.ts +54 -0
  101. package/dist_ts/errors/index.js +136 -0
  102. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  103. package/dist_ts/errors/reputation.errors.js +292 -0
  104. package/dist_ts/http3/http3-route-augmentation.d.ts +50 -0
  105. package/dist_ts/http3/http3-route-augmentation.js +98 -0
  106. package/dist_ts/http3/index.d.ts +1 -0
  107. package/dist_ts/http3/index.js +2 -0
  108. package/dist_ts/index.d.ts +8 -0
  109. package/dist_ts/index.js +29 -0
  110. package/dist_ts/logger.d.ts +21 -0
  111. package/dist_ts/logger.js +81 -0
  112. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  113. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  114. package/dist_ts/monitoring/classes.metricsmanager.d.ts +235 -0
  115. package/dist_ts/monitoring/classes.metricsmanager.js +875 -0
  116. package/dist_ts/monitoring/index.d.ts +1 -0
  117. package/dist_ts/monitoring/index.js +2 -0
  118. package/dist_ts/opsserver/classes.opsserver.d.ts +47 -0
  119. package/dist_ts/opsserver/classes.opsserver.js +105 -0
  120. package/dist_ts/opsserver/handlers/acme-config.handler.d.ts +16 -0
  121. package/dist_ts/opsserver/handlers/acme-config.handler.js +77 -0
  122. package/dist_ts/opsserver/handlers/admin.handler.d.ts +40 -0
  123. package/dist_ts/opsserver/handlers/admin.handler.js +191 -0
  124. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
  125. package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
  126. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +77 -0
  127. package/dist_ts/opsserver/handlers/certificate.handler.js +574 -0
  128. package/dist_ts/opsserver/handlers/config.handler.d.ts +7 -0
  129. package/dist_ts/opsserver/handlers/config.handler.js +200 -0
  130. package/dist_ts/opsserver/handlers/dns-provider.handler.d.ts +16 -0
  131. package/dist_ts/opsserver/handlers/dns-provider.handler.js +156 -0
  132. package/dist_ts/opsserver/handlers/dns-record.handler.d.ts +13 -0
  133. package/dist_ts/opsserver/handlers/dns-record.handler.js +98 -0
  134. package/dist_ts/opsserver/handlers/domain.handler.d.ts +13 -0
  135. package/dist_ts/opsserver/handlers/domain.handler.js +137 -0
  136. package/dist_ts/opsserver/handlers/email-domain.handler.d.ts +16 -0
  137. package/dist_ts/opsserver/handlers/email-domain.handler.js +150 -0
  138. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
  139. package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
  140. package/dist_ts/opsserver/handlers/index.d.ts +21 -0
  141. package/dist_ts/opsserver/handlers/index.js +22 -0
  142. package/dist_ts/opsserver/handlers/logs.handler.d.ts +25 -0
  143. package/dist_ts/opsserver/handlers/logs.handler.js +264 -0
  144. package/dist_ts/opsserver/handlers/network-target.handler.d.ts +10 -0
  145. package/dist_ts/opsserver/handlers/network-target.handler.js +117 -0
  146. package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
  147. package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
  148. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
  149. package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
  150. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
  151. package/dist_ts/opsserver/handlers/route-management.handler.js +98 -0
  152. package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
  153. package/dist_ts/opsserver/handlers/security.handler.js +237 -0
  154. package/dist_ts/opsserver/handlers/source-profile.handler.d.ts +10 -0
  155. package/dist_ts/opsserver/handlers/source-profile.handler.js +119 -0
  156. package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
  157. package/dist_ts/opsserver/handlers/stats.handler.js +461 -0
  158. package/dist_ts/opsserver/handlers/target-profile.handler.d.ts +10 -0
  159. package/dist_ts/opsserver/handlers/target-profile.handler.js +117 -0
  160. package/dist_ts/opsserver/handlers/users.handler.d.ts +12 -0
  161. package/dist_ts/opsserver/handlers/users.handler.js +24 -0
  162. package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
  163. package/dist_ts/opsserver/handlers/vpn.handler.js +262 -0
  164. package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
  165. package/dist_ts/opsserver/helpers/guards.js +43 -0
  166. package/dist_ts/opsserver/index.d.ts +1 -0
  167. package/dist_ts/opsserver/index.js +2 -0
  168. package/dist_ts/paths.d.ts +25 -0
  169. package/dist_ts/paths.js +44 -0
  170. package/dist_ts/plugins.d.ts +81 -0
  171. package/dist_ts/plugins.js +115 -0
  172. package/dist_ts/radius/classes.accounting.manager.d.ts +223 -0
  173. package/dist_ts/radius/classes.accounting.manager.js +449 -0
  174. package/dist_ts/radius/classes.radius.server.d.ts +169 -0
  175. package/dist_ts/radius/classes.radius.server.js +384 -0
  176. package/dist_ts/radius/classes.vlan.manager.d.ts +124 -0
  177. package/dist_ts/radius/classes.vlan.manager.js +272 -0
  178. package/dist_ts/radius/index.d.ts +13 -0
  179. package/dist_ts/radius/index.js +14 -0
  180. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +92 -0
  181. package/dist_ts/remoteingress/classes.remoteingress-manager.js +291 -0
  182. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
  183. package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
  184. package/dist_ts/remoteingress/index.d.ts +2 -0
  185. package/dist_ts/remoteingress/index.js +3 -0
  186. package/dist_ts/security/classes.contentscanner.d.ts +164 -0
  187. package/dist_ts/security/classes.contentscanner.js +642 -0
  188. package/dist_ts/security/classes.ipreputationchecker.d.ts +145 -0
  189. package/dist_ts/security/classes.ipreputationchecker.js +458 -0
  190. package/dist_ts/security/classes.securitylogger.d.ts +144 -0
  191. package/dist_ts/security/classes.securitylogger.js +235 -0
  192. package/dist_ts/security/index.d.ts +3 -0
  193. package/dist_ts/security/index.js +4 -0
  194. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  195. package/dist_ts/sms/classes.smsservice.js +72 -0
  196. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  197. package/dist_ts/sms/config/sms.config.js +2 -0
  198. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  199. package/dist_ts/sms/config/sms.schema.js +121 -0
  200. package/dist_ts/sms/index.d.ts +1 -0
  201. package/dist_ts/sms/index.js +2 -0
  202. package/dist_ts/vpn/classes.vpn-manager.d.ts +159 -0
  203. package/dist_ts/vpn/classes.vpn-manager.js +459 -0
  204. package/dist_ts/vpn/index.d.ts +1 -0
  205. package/dist_ts/vpn/index.js +2 -0
  206. package/dist_ts_apiclient/classes.apitoken.d.ts +41 -0
  207. package/dist_ts_apiclient/classes.apitoken.js +115 -0
  208. package/dist_ts_apiclient/classes.certificate.d.ts +57 -0
  209. package/dist_ts_apiclient/classes.certificate.js +69 -0
  210. package/dist_ts_apiclient/classes.config.d.ts +7 -0
  211. package/dist_ts_apiclient/classes.config.js +11 -0
  212. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +41 -0
  213. package/dist_ts_apiclient/classes.dcrouterapiclient.js +81 -0
  214. package/dist_ts_apiclient/classes.email.d.ts +30 -0
  215. package/dist_ts_apiclient/classes.email.js +52 -0
  216. package/dist_ts_apiclient/classes.logs.d.ts +21 -0
  217. package/dist_ts_apiclient/classes.logs.js +14 -0
  218. package/dist_ts_apiclient/classes.radius.d.ts +59 -0
  219. package/dist_ts_apiclient/classes.radius.js +95 -0
  220. package/dist_ts_apiclient/classes.remoteingress.d.ts +54 -0
  221. package/dist_ts_apiclient/classes.remoteingress.js +136 -0
  222. package/dist_ts_apiclient/classes.route.d.ts +39 -0
  223. package/dist_ts_apiclient/classes.route.js +125 -0
  224. package/dist_ts_apiclient/classes.stats.d.ts +47 -0
  225. package/dist_ts_apiclient/classes.stats.js +38 -0
  226. package/dist_ts_apiclient/index.d.ts +10 -0
  227. package/dist_ts_apiclient/index.js +14 -0
  228. package/dist_ts_apiclient/plugins.d.ts +3 -0
  229. package/dist_ts_apiclient/plugins.js +5 -0
  230. package/dist_ts_interfaces/data/acme-config.d.ts +25 -0
  231. package/dist_ts_interfaces/data/acme-config.js +2 -0
  232. package/dist_ts_interfaces/data/auth.d.ts +8 -0
  233. package/dist_ts_interfaces/data/auth.js +2 -0
  234. package/dist_ts_interfaces/data/dns-provider.d.ts +136 -0
  235. package/dist_ts_interfaces/data/dns-provider.js +41 -0
  236. package/dist_ts_interfaces/data/dns-record.d.ts +42 -0
  237. package/dist_ts_interfaces/data/dns-record.js +2 -0
  238. package/dist_ts_interfaces/data/domain.d.ts +35 -0
  239. package/dist_ts_interfaces/data/domain.js +2 -0
  240. package/dist_ts_interfaces/data/email-domain.d.ts +70 -0
  241. package/dist_ts_interfaces/data/email-domain.js +2 -0
  242. package/dist_ts_interfaces/data/index.d.ts +11 -0
  243. package/dist_ts_interfaces/data/index.js +12 -0
  244. package/dist_ts_interfaces/data/remoteingress.d.ts +60 -0
  245. package/dist_ts_interfaces/data/remoteingress.js +2 -0
  246. package/dist_ts_interfaces/data/route-management.d.ts +110 -0
  247. package/dist_ts_interfaces/data/route-management.js +2 -0
  248. package/dist_ts_interfaces/data/stats.d.ts +239 -0
  249. package/dist_ts_interfaces/data/stats.js +2 -0
  250. package/dist_ts_interfaces/data/target-profile.d.ts +28 -0
  251. package/dist_ts_interfaces/data/target-profile.js +2 -0
  252. package/dist_ts_interfaces/data/vpn.d.ts +61 -0
  253. package/dist_ts_interfaces/data/vpn.js +2 -0
  254. package/dist_ts_interfaces/index.d.ts +5 -0
  255. package/dist_ts_interfaces/index.js +8 -0
  256. package/dist_ts_interfaces/plugins.d.ts +2 -0
  257. package/dist_ts_interfaces/plugins.js +4 -0
  258. package/dist_ts_interfaces/requests/acme-config.d.ts +42 -0
  259. package/dist_ts_interfaces/requests/acme-config.js +2 -0
  260. package/dist_ts_interfaces/requests/admin.d.ts +31 -0
  261. package/dist_ts_interfaces/requests/admin.js +3 -0
  262. package/dist_ts_interfaces/requests/api-tokens.d.ts +79 -0
  263. package/dist_ts_interfaces/requests/api-tokens.js +2 -0
  264. package/dist_ts_interfaces/requests/certificate.d.ts +111 -0
  265. package/dist_ts_interfaces/requests/certificate.js +3 -0
  266. package/dist_ts_interfaces/requests/combined.stats.d.ts +28 -0
  267. package/dist_ts_interfaces/requests/combined.stats.js +2 -0
  268. package/dist_ts_interfaces/requests/config.d.ts +90 -0
  269. package/dist_ts_interfaces/requests/config.js +3 -0
  270. package/dist_ts_interfaces/requests/dns-providers.d.ts +117 -0
  271. package/dist_ts_interfaces/requests/dns-providers.js +2 -0
  272. package/dist_ts_interfaces/requests/dns-records.d.ts +89 -0
  273. package/dist_ts_interfaces/requests/dns-records.js +2 -0
  274. package/dist_ts_interfaces/requests/domains.d.ts +142 -0
  275. package/dist_ts_interfaces/requests/domains.js +2 -0
  276. package/dist_ts_interfaces/requests/email-domains.d.ts +142 -0
  277. package/dist_ts_interfaces/requests/email-domains.js +2 -0
  278. package/dist_ts_interfaces/requests/email-ops.d.ts +82 -0
  279. package/dist_ts_interfaces/requests/email-ops.js +3 -0
  280. package/dist_ts_interfaces/requests/index.d.ts +21 -0
  281. package/dist_ts_interfaces/requests/index.js +22 -0
  282. package/dist_ts_interfaces/requests/logs.d.ts +41 -0
  283. package/dist_ts_interfaces/requests/logs.js +4 -0
  284. package/dist_ts_interfaces/requests/network-targets.d.ts +102 -0
  285. package/dist_ts_interfaces/requests/network-targets.js +2 -0
  286. package/dist_ts_interfaces/requests/radius.d.ts +268 -0
  287. package/dist_ts_interfaces/requests/radius.js +3 -0
  288. package/dist_ts_interfaces/requests/remoteingress.d.ts +108 -0
  289. package/dist_ts_interfaces/requests/remoteingress.js +3 -0
  290. package/dist_ts_interfaces/requests/route-management.d.ts +85 -0
  291. package/dist_ts_interfaces/requests/route-management.js +2 -0
  292. package/dist_ts_interfaces/requests/source-profiles.d.ts +102 -0
  293. package/dist_ts_interfaces/requests/source-profiles.js +2 -0
  294. package/dist_ts_interfaces/requests/stats.d.ts +177 -0
  295. package/dist_ts_interfaces/requests/stats.js +4 -0
  296. package/dist_ts_interfaces/requests/target-profiles.d.ts +103 -0
  297. package/dist_ts_interfaces/requests/target-profiles.js +2 -0
  298. package/dist_ts_interfaces/requests/users.d.ts +19 -0
  299. package/dist_ts_interfaces/requests/users.js +3 -0
  300. package/dist_ts_interfaces/requests/vpn.d.ts +177 -0
  301. package/dist_ts_interfaces/requests/vpn.js +3 -0
  302. package/dist_ts_migrations/index.d.ts +28 -0
  303. package/dist_ts_migrations/index.js +82 -0
  304. package/dist_ts_oci_container/index.d.ts +8 -0
  305. package/dist_ts_oci_container/index.js +110 -0
  306. package/dist_ts_oci_container/plugins.d.ts +3 -0
  307. package/dist_ts_oci_container/plugins.js +4 -0
  308. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  309. package/dist_ts_web/00_commitinfo_data.js +9 -0
  310. package/dist_ts_web/appstate.d.ts +478 -0
  311. package/dist_ts_web/appstate.js +1968 -0
  312. package/dist_ts_web/elements/access/index.d.ts +2 -0
  313. package/dist_ts_web/elements/access/index.js +3 -0
  314. package/dist_ts_web/elements/access/ops-view-apitokens.d.ts +13 -0
  315. package/dist_ts_web/elements/access/ops-view-apitokens.js +372 -0
  316. package/dist_ts_web/elements/access/ops-view-users.d.ts +11 -0
  317. package/dist_ts_web/elements/access/ops-view-users.js +190 -0
  318. package/dist_ts_web/elements/domains/dns-provider-form.d.ts +60 -0
  319. package/dist_ts_web/elements/domains/dns-provider-form.js +259 -0
  320. package/dist_ts_web/elements/domains/index.d.ts +5 -0
  321. package/dist_ts_web/elements/domains/index.js +6 -0
  322. package/dist_ts_web/elements/domains/ops-view-certificates.d.ts +25 -0
  323. package/dist_ts_web/elements/domains/ops-view-certificates.js +669 -0
  324. package/dist_ts_web/elements/domains/ops-view-dns.d.ts +17 -0
  325. package/dist_ts_web/elements/domains/ops-view-dns.js +305 -0
  326. package/dist_ts_web/elements/domains/ops-view-domains.d.ts +19 -0
  327. package/dist_ts_web/elements/domains/ops-view-domains.js +456 -0
  328. package/dist_ts_web/elements/domains/ops-view-providers.d.ts +21 -0
  329. package/dist_ts_web/elements/domains/ops-view-providers.js +330 -0
  330. package/dist_ts_web/elements/email/index.d.ts +3 -0
  331. package/dist_ts_web/elements/email/index.js +4 -0
  332. package/dist_ts_web/elements/email/ops-view-email-domains.d.ts +19 -0
  333. package/dist_ts_web/elements/email/ops-view-email-domains.js +410 -0
  334. package/dist_ts_web/elements/email/ops-view-email-security.d.ts +14 -0
  335. package/dist_ts_web/elements/email/ops-view-email-security.js +178 -0
  336. package/dist_ts_web/elements/email/ops-view-emails.d.ts +21 -0
  337. package/dist_ts_web/elements/email/ops-view-emails.js +165 -0
  338. package/dist_ts_web/elements/index.d.ts +9 -0
  339. package/dist_ts_web/elements/index.js +10 -0
  340. package/dist_ts_web/elements/network/index.d.ts +7 -0
  341. package/dist_ts_web/elements/network/index.js +8 -0
  342. package/dist_ts_web/elements/network/ops-view-network-activity.d.ts +60 -0
  343. package/dist_ts_web/elements/network/ops-view-network-activity.js +754 -0
  344. package/dist_ts_web/elements/network/ops-view-networktargets.d.ts +17 -0
  345. package/dist_ts_web/elements/network/ops-view-networktargets.js +255 -0
  346. package/dist_ts_web/elements/network/ops-view-remoteingress.d.ts +20 -0
  347. package/dist_ts_web/elements/network/ops-view-remoteingress.js +497 -0
  348. package/dist_ts_web/elements/network/ops-view-routes.d.ts +17 -0
  349. package/dist_ts_web/elements/network/ops-view-routes.js +700 -0
  350. package/dist_ts_web/elements/network/ops-view-sourceprofiles.d.ts +17 -0
  351. package/dist_ts_web/elements/network/ops-view-sourceprofiles.js +278 -0
  352. package/dist_ts_web/elements/network/ops-view-targetprofiles.d.ts +21 -0
  353. package/dist_ts_web/elements/network/ops-view-targetprofiles.js +420 -0
  354. package/dist_ts_web/elements/network/ops-view-vpn.d.ts +31 -0
  355. package/dist_ts_web/elements/network/ops-view-vpn.js +873 -0
  356. package/dist_ts_web/elements/ops-dashboard.d.ts +31 -0
  357. package/dist_ts_web/elements/ops-dashboard.js +405 -0
  358. package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
  359. package/dist_ts_web/elements/ops-view-logs.js +159 -0
  360. package/dist_ts_web/elements/overview/index.d.ts +2 -0
  361. package/dist_ts_web/elements/overview/index.js +3 -0
  362. package/dist_ts_web/elements/overview/ops-view-config.d.ts +19 -0
  363. package/dist_ts_web/elements/overview/ops-view-config.js +339 -0
  364. package/dist_ts_web/elements/overview/ops-view-overview.d.ts +24 -0
  365. package/dist_ts_web/elements/overview/ops-view-overview.js +545 -0
  366. package/dist_ts_web/elements/security/index.d.ts +3 -0
  367. package/dist_ts_web/elements/security/index.js +4 -0
  368. package/dist_ts_web/elements/security/ops-view-security-authentication.d.ts +13 -0
  369. package/dist_ts_web/elements/security/ops-view-security-authentication.js +157 -0
  370. package/dist_ts_web/elements/security/ops-view-security-blocked.d.ts +15 -0
  371. package/dist_ts_web/elements/security/ops-view-security-blocked.js +153 -0
  372. package/dist_ts_web/elements/security/ops-view-security-overview.d.ts +16 -0
  373. package/dist_ts_web/elements/security/ops-view-security-overview.js +205 -0
  374. package/dist_ts_web/elements/shared/css.d.ts +1 -0
  375. package/dist_ts_web/elements/shared/css.js +10 -0
  376. package/dist_ts_web/elements/shared/index.d.ts +1 -0
  377. package/dist_ts_web/elements/shared/index.js +2 -0
  378. package/dist_ts_web/index.d.ts +1 -0
  379. package/dist_ts_web/index.js +10 -0
  380. package/dist_ts_web/plugins.d.ts +7 -0
  381. package/dist_ts_web/plugins.js +13 -0
  382. package/dist_ts_web/router.d.ts +21 -0
  383. package/dist_ts_web/router.js +151 -0
  384. package/package.json +1 -1
  385. package/ts/00_commitinfo_data.ts +1 -1
  386. package/ts/monitoring/classes.metricsmanager.ts +0 -25
  387. package/ts_web/00_commitinfo_data.ts +1 -1
  388. package/ts_web/elements/network/ops-view-routes.ts +9 -1
@@ -0,0 +1,459 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { logger } from '../logger.js';
3
+ import { VpnServerKeysDoc, VpnClientDoc } from '../db/index.js';
4
+ /**
5
+ * Manages the SmartVPN server lifecycle and VPN client CRUD.
6
+ * Persists server keys and client registrations via smartdata document classes.
7
+ */
8
+ export class VpnManager {
9
+ config;
10
+ vpnServer;
11
+ clients = new Map();
12
+ serverKeys;
13
+ constructor(config) {
14
+ this.config = config;
15
+ }
16
+ /** The VPN subnet CIDR. */
17
+ getSubnet() {
18
+ return this.config.subnet || '10.8.0.0/24';
19
+ }
20
+ /** Whether the VPN server is running. */
21
+ get running() {
22
+ return this.vpnServer?.running ?? false;
23
+ }
24
+ /**
25
+ * Start the VPN server.
26
+ * Loads or generates server keys, loads persisted clients, starts VpnServer.
27
+ */
28
+ async start() {
29
+ // Load or generate server keys
30
+ this.serverKeys = await this.loadOrGenerateServerKeys();
31
+ // Load persisted clients
32
+ await this.loadPersistedClients();
33
+ // Build client entries for the daemon
34
+ const clientEntries = [];
35
+ let anyClientUsesHostIp = false;
36
+ for (const client of this.clients.values()) {
37
+ if (client.useHostIp) {
38
+ anyClientUsesHostIp = true;
39
+ }
40
+ const entry = {
41
+ clientId: client.clientId,
42
+ publicKey: client.noisePublicKey,
43
+ wgPublicKey: client.wgPublicKey,
44
+ enabled: client.enabled,
45
+ description: client.description,
46
+ assignedIp: client.assignedIp,
47
+ expiresAt: client.expiresAt,
48
+ security: this.buildClientSecurity(client),
49
+ };
50
+ // Pass per-client bridge fields if present (for hybrid/bridge mode)
51
+ if (client.useHostIp !== undefined)
52
+ entry.useHostIp = client.useHostIp;
53
+ if (client.useDhcp !== undefined)
54
+ entry.useDhcp = client.useDhcp;
55
+ if (client.staticIp !== undefined)
56
+ entry.staticIp = client.staticIp;
57
+ if (client.forceVlan !== undefined)
58
+ entry.forceVlan = client.forceVlan;
59
+ if (client.vlanId !== undefined)
60
+ entry.vlanId = client.vlanId;
61
+ clientEntries.push(entry);
62
+ }
63
+ const subnet = this.getSubnet();
64
+ const wgListenPort = this.config.wgListenPort ?? 51820;
65
+ // Auto-detect hybrid mode: if any persisted client uses host IP and mode is
66
+ // 'socket' (or unset), upgrade to 'hybrid' so the daemon can handle both
67
+ let configuredMode = this.config.forwardingMode ?? 'socket';
68
+ if (anyClientUsesHostIp && configuredMode === 'socket') {
69
+ configuredMode = 'hybrid';
70
+ logger.log('info', 'VPN: Auto-upgrading forwarding mode to hybrid (client with useHostIp detected)');
71
+ }
72
+ const forwardingMode = configuredMode === 'hybrid' ? 'hybrid' : configuredMode;
73
+ const isBridge = forwardingMode === 'bridge';
74
+ // Create and start VpnServer
75
+ this.vpnServer = new plugins.smartvpn.VpnServer({
76
+ transport: { transport: 'stdio' },
77
+ });
78
+ // Default destination policy: bridge mode allows traffic through directly,
79
+ // socket mode forces traffic to SmartProxy on 127.0.0.1
80
+ const defaultDestinationPolicy = isBridge
81
+ ? { default: 'allow' }
82
+ : { default: 'forceTarget', target: '127.0.0.1' };
83
+ const serverConfig = {
84
+ listenAddr: '0.0.0.0:0', // WS listener not strictly needed but required field
85
+ privateKey: this.serverKeys.noisePrivateKey,
86
+ publicKey: this.serverKeys.noisePublicKey,
87
+ subnet,
88
+ dns: this.config.dns,
89
+ forwardingMode: forwardingMode,
90
+ transportMode: 'all',
91
+ wgPrivateKey: this.serverKeys.wgPrivateKey,
92
+ wgListenPort,
93
+ clients: clientEntries,
94
+ socketForwardProxyProtocol: !isBridge,
95
+ destinationPolicy: this.config.destinationPolicy ?? defaultDestinationPolicy,
96
+ serverEndpoint: this.config.serverEndpoint
97
+ ? `${this.config.serverEndpoint}:${wgListenPort}`
98
+ : undefined,
99
+ clientAllowedIPs: [subnet],
100
+ // Bridge-specific config
101
+ ...(isBridge ? {
102
+ bridgeLanSubnet: this.config.bridgeLanSubnet,
103
+ bridgePhysicalInterface: this.config.bridgePhysicalInterface,
104
+ bridgeIpRangeStart: this.config.bridgeIpRangeStart,
105
+ bridgeIpRangeEnd: this.config.bridgeIpRangeEnd,
106
+ } : {}),
107
+ };
108
+ await this.vpnServer.start(serverConfig);
109
+ // Create initial clients from config (idempotent — skip already-persisted)
110
+ if (this.config.initialClients) {
111
+ for (const initial of this.config.initialClients) {
112
+ if (!this.clients.has(initial.clientId)) {
113
+ const bundle = await this.createClient({
114
+ clientId: initial.clientId,
115
+ targetProfileIds: initial.targetProfileIds,
116
+ description: initial.description,
117
+ });
118
+ logger.log('info', `VPN: Created initial client '${initial.clientId}' (IP: ${bundle.entry.assignedIp})`);
119
+ }
120
+ }
121
+ }
122
+ logger.log('info', `VPN server started: subnet=${subnet}, wg=:${wgListenPort}, clients=${this.clients.size}`);
123
+ }
124
+ /**
125
+ * Stop the VPN server.
126
+ */
127
+ async stop() {
128
+ if (this.vpnServer) {
129
+ try {
130
+ await this.vpnServer.stopServer();
131
+ }
132
+ catch {
133
+ // Ignore stop errors
134
+ }
135
+ this.vpnServer.stop();
136
+ this.vpnServer = undefined;
137
+ }
138
+ logger.log('info', 'VPN server stopped');
139
+ }
140
+ // ── Client CRUD ────────────────────────────────────────────────────────
141
+ /**
142
+ * Create a new VPN client. Returns the config bundle (secrets only shown once).
143
+ */
144
+ async createClient(opts) {
145
+ if (!this.vpnServer) {
146
+ throw new Error('VPN server not running');
147
+ }
148
+ const bundle = await this.vpnServer.createClient({
149
+ clientId: opts.clientId,
150
+ description: opts.description,
151
+ });
152
+ // Override AllowedIPs with per-client values based on target profiles
153
+ if (this.config.getClientAllowedIPs && bundle.wireguardConfig) {
154
+ const allowedIPs = await this.config.getClientAllowedIPs(opts.targetProfileIds || []);
155
+ bundle.wireguardConfig = bundle.wireguardConfig.replace(/AllowedIPs\s*=\s*.+/, `AllowedIPs = ${allowedIPs.join(', ')}`);
156
+ }
157
+ // Persist client entry (including WG private key for export/QR)
158
+ const doc = new VpnClientDoc();
159
+ doc.clientId = bundle.entry.clientId;
160
+ doc.enabled = bundle.entry.enabled ?? true;
161
+ doc.targetProfileIds = opts.targetProfileIds;
162
+ doc.description = bundle.entry.description;
163
+ doc.assignedIp = bundle.entry.assignedIp;
164
+ doc.noisePublicKey = bundle.entry.publicKey;
165
+ doc.wgPublicKey = bundle.entry.wgPublicKey || '';
166
+ doc.wgPrivateKey = bundle.secrets?.wgPrivateKey
167
+ || bundle.wireguardConfig?.match(/PrivateKey\s*=\s*(.+)/)?.[1]?.trim();
168
+ doc.createdAt = Date.now();
169
+ doc.updatedAt = Date.now();
170
+ doc.expiresAt = bundle.entry.expiresAt;
171
+ if (opts.destinationAllowList !== undefined) {
172
+ doc.destinationAllowList = opts.destinationAllowList;
173
+ }
174
+ if (opts.destinationBlockList !== undefined) {
175
+ doc.destinationBlockList = opts.destinationBlockList;
176
+ }
177
+ if (opts.useHostIp !== undefined) {
178
+ doc.useHostIp = opts.useHostIp;
179
+ }
180
+ if (opts.useDhcp !== undefined) {
181
+ doc.useDhcp = opts.useDhcp;
182
+ }
183
+ if (opts.staticIp !== undefined) {
184
+ doc.staticIp = opts.staticIp;
185
+ }
186
+ if (opts.forceVlan !== undefined) {
187
+ doc.forceVlan = opts.forceVlan;
188
+ }
189
+ if (opts.vlanId !== undefined) {
190
+ doc.vlanId = opts.vlanId;
191
+ }
192
+ this.clients.set(doc.clientId, doc);
193
+ try {
194
+ await this.persistClient(doc);
195
+ }
196
+ catch (err) {
197
+ // Rollback: remove from in-memory map and daemon to stay consistent with DB
198
+ this.clients.delete(doc.clientId);
199
+ try {
200
+ await this.vpnServer.removeClient(doc.clientId);
201
+ }
202
+ catch {
203
+ // best-effort daemon cleanup
204
+ }
205
+ throw err;
206
+ }
207
+ // Sync per-client security to the running daemon
208
+ const security = this.buildClientSecurity(doc);
209
+ if (security.destinationPolicy) {
210
+ await this.vpnServer.updateClient(doc.clientId, { security });
211
+ }
212
+ this.config.onClientChanged?.();
213
+ return bundle;
214
+ }
215
+ /**
216
+ * Remove a VPN client.
217
+ */
218
+ async removeClient(clientId) {
219
+ if (!this.vpnServer) {
220
+ throw new Error('VPN server not running');
221
+ }
222
+ await this.vpnServer.removeClient(clientId);
223
+ const doc = this.clients.get(clientId);
224
+ this.clients.delete(clientId);
225
+ if (doc) {
226
+ await doc.delete();
227
+ }
228
+ this.config.onClientChanged?.();
229
+ }
230
+ /**
231
+ * List all registered clients (without secrets).
232
+ */
233
+ listClients() {
234
+ return [...this.clients.values()];
235
+ }
236
+ /**
237
+ * Enable a client.
238
+ */
239
+ async enableClient(clientId) {
240
+ if (!this.vpnServer)
241
+ throw new Error('VPN server not running');
242
+ await this.vpnServer.enableClient(clientId);
243
+ const client = this.clients.get(clientId);
244
+ if (client) {
245
+ client.enabled = true;
246
+ client.updatedAt = Date.now();
247
+ await this.persistClient(client);
248
+ }
249
+ this.config.onClientChanged?.();
250
+ }
251
+ /**
252
+ * Disable a client.
253
+ */
254
+ async disableClient(clientId) {
255
+ if (!this.vpnServer)
256
+ throw new Error('VPN server not running');
257
+ await this.vpnServer.disableClient(clientId);
258
+ const client = this.clients.get(clientId);
259
+ if (client) {
260
+ client.enabled = false;
261
+ client.updatedAt = Date.now();
262
+ await this.persistClient(client);
263
+ }
264
+ this.config.onClientChanged?.();
265
+ }
266
+ /**
267
+ * Update a client's metadata (description, target profiles) without rotating keys.
268
+ */
269
+ async updateClient(clientId, update) {
270
+ const client = this.clients.get(clientId);
271
+ if (!client)
272
+ throw new Error(`Client not found: ${clientId}`);
273
+ if (update.description !== undefined)
274
+ client.description = update.description;
275
+ if (update.targetProfileIds !== undefined)
276
+ client.targetProfileIds = update.targetProfileIds;
277
+ if (update.destinationAllowList !== undefined)
278
+ client.destinationAllowList = update.destinationAllowList;
279
+ if (update.destinationBlockList !== undefined)
280
+ client.destinationBlockList = update.destinationBlockList;
281
+ if (update.useHostIp !== undefined)
282
+ client.useHostIp = update.useHostIp;
283
+ if (update.useDhcp !== undefined)
284
+ client.useDhcp = update.useDhcp;
285
+ if (update.staticIp !== undefined)
286
+ client.staticIp = update.staticIp;
287
+ if (update.forceVlan !== undefined)
288
+ client.forceVlan = update.forceVlan;
289
+ if (update.vlanId !== undefined)
290
+ client.vlanId = update.vlanId;
291
+ client.updatedAt = Date.now();
292
+ await this.persistClient(client);
293
+ // Sync per-client security to the running daemon
294
+ if (this.vpnServer) {
295
+ const security = this.buildClientSecurity(client);
296
+ await this.vpnServer.updateClient(clientId, { security });
297
+ }
298
+ this.config.onClientChanged?.();
299
+ }
300
+ /**
301
+ * Rotate a client's keys. Returns the new config bundle.
302
+ */
303
+ async rotateClientKey(clientId) {
304
+ if (!this.vpnServer)
305
+ throw new Error('VPN server not running');
306
+ const bundle = await this.vpnServer.rotateClientKey(clientId);
307
+ // Update persisted entry with new keys (including private key for export/QR)
308
+ const client = this.clients.get(clientId);
309
+ if (client) {
310
+ client.noisePublicKey = bundle.entry.publicKey;
311
+ client.wgPublicKey = bundle.entry.wgPublicKey || '';
312
+ client.wgPrivateKey = bundle.secrets?.wgPrivateKey
313
+ || bundle.wireguardConfig?.match(/PrivateKey\s*=\s*(.+)/)?.[1]?.trim();
314
+ client.updatedAt = Date.now();
315
+ await this.persistClient(client);
316
+ }
317
+ return bundle;
318
+ }
319
+ /**
320
+ * Export a client config. Injects stored WG private key and per-client AllowedIPs.
321
+ */
322
+ async exportClientConfig(clientId, format) {
323
+ if (!this.vpnServer)
324
+ throw new Error('VPN server not running');
325
+ let config = await this.vpnServer.exportClientConfig(clientId, format);
326
+ if (format === 'wireguard') {
327
+ const persisted = this.clients.get(clientId);
328
+ // Inject stored WG private key so exports produce valid, scannable configs
329
+ if (persisted?.wgPrivateKey) {
330
+ config = config.replace('[Interface]\n', `[Interface]\nPrivateKey = ${persisted.wgPrivateKey}\n`);
331
+ }
332
+ // Override AllowedIPs with per-client values based on target profiles
333
+ if (this.config.getClientAllowedIPs) {
334
+ const profileIds = persisted?.targetProfileIds || [];
335
+ const allowedIPs = await this.config.getClientAllowedIPs(profileIds);
336
+ config = config.replace(/AllowedIPs\s*=\s*.+/, `AllowedIPs = ${allowedIPs.join(', ')}`);
337
+ }
338
+ }
339
+ return config;
340
+ }
341
+ // ── Status and telemetry ───────────────────────────────────────────────
342
+ /**
343
+ * Get server status.
344
+ */
345
+ async getStatus() {
346
+ if (!this.vpnServer)
347
+ return null;
348
+ return this.vpnServer.getStatus();
349
+ }
350
+ /**
351
+ * Get server statistics.
352
+ */
353
+ async getStatistics() {
354
+ if (!this.vpnServer)
355
+ return null;
356
+ return this.vpnServer.getStatistics();
357
+ }
358
+ /**
359
+ * List currently connected clients.
360
+ */
361
+ async getConnectedClients() {
362
+ if (!this.vpnServer)
363
+ return [];
364
+ return this.vpnServer.listClients();
365
+ }
366
+ /**
367
+ * Get telemetry for a specific client.
368
+ */
369
+ async getClientTelemetry(clientId) {
370
+ if (!this.vpnServer)
371
+ return null;
372
+ return this.vpnServer.getClientTelemetry(clientId);
373
+ }
374
+ /**
375
+ * Get server public keys (for display/info).
376
+ */
377
+ getServerPublicKeys() {
378
+ if (!this.serverKeys)
379
+ return null;
380
+ return {
381
+ noisePublicKey: this.serverKeys.noisePublicKey,
382
+ wgPublicKey: this.serverKeys.wgPublicKey,
383
+ };
384
+ }
385
+ // ── Per-client security ────────────────────────────────────────────────
386
+ /**
387
+ * Build per-client security settings for the smartvpn daemon.
388
+ * All VPN traffic is forced through SmartProxy (forceTarget to 127.0.0.1).
389
+ * TargetProfile direct IP:port targets bypass SmartProxy via allowList.
390
+ */
391
+ buildClientSecurity(client) {
392
+ const security = {};
393
+ // Collect direct targets from assigned TargetProfiles (bypass forceTarget for these IPs)
394
+ const profileDirectTargets = this.config.getClientDirectTargets?.(client.targetProfileIds || []) || [];
395
+ // Merge with per-client explicit allow list
396
+ const mergedAllowList = [
397
+ ...(client.destinationAllowList || []),
398
+ ...profileDirectTargets,
399
+ ];
400
+ security.destinationPolicy = {
401
+ default: 'forceTarget',
402
+ target: '127.0.0.1',
403
+ allowList: mergedAllowList.length ? mergedAllowList : undefined,
404
+ blockList: client.destinationBlockList,
405
+ };
406
+ return security;
407
+ }
408
+ /**
409
+ * Refresh all client security policies against the running daemon.
410
+ * Call this when TargetProfiles change so destination allow-lists stay in sync.
411
+ */
412
+ async refreshAllClientSecurity() {
413
+ if (!this.vpnServer)
414
+ return;
415
+ for (const client of this.clients.values()) {
416
+ const security = this.buildClientSecurity(client);
417
+ if (security.destinationPolicy) {
418
+ await this.vpnServer.updateClient(client.clientId, { security });
419
+ }
420
+ }
421
+ }
422
+ // ── Private helpers ────────────────────────────────────────────────────
423
+ async loadOrGenerateServerKeys() {
424
+ const stored = await VpnServerKeysDoc.load();
425
+ if (stored?.noisePrivateKey && stored?.wgPrivateKey) {
426
+ logger.log('info', 'Loaded VPN server keys from storage');
427
+ return stored;
428
+ }
429
+ // Generate new keys via the daemon
430
+ const tempServer = new plugins.smartvpn.VpnServer({
431
+ transport: { transport: 'stdio' },
432
+ });
433
+ await tempServer.start();
434
+ const noiseKeys = await tempServer.generateKeypair();
435
+ const wgKeys = await tempServer.generateWgKeypair();
436
+ tempServer.stop();
437
+ const doc = stored || new VpnServerKeysDoc();
438
+ doc.noisePrivateKey = noiseKeys.privateKey;
439
+ doc.noisePublicKey = noiseKeys.publicKey;
440
+ doc.wgPrivateKey = wgKeys.privateKey;
441
+ doc.wgPublicKey = wgKeys.publicKey;
442
+ await doc.save();
443
+ logger.log('info', 'Generated and persisted new VPN server keys');
444
+ return doc;
445
+ }
446
+ async loadPersistedClients() {
447
+ const docs = await VpnClientDoc.findAll();
448
+ for (const doc of docs) {
449
+ this.clients.set(doc.clientId, doc);
450
+ }
451
+ if (this.clients.size > 0) {
452
+ logger.log('info', `Loaded ${this.clients.size} persisted VPN client(s)`);
453
+ }
454
+ }
455
+ async persistClient(client) {
456
+ await client.save();
457
+ }
458
+ }
459
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52cG4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Zwbi9jbGFzc2VzLnZwbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBOENoRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUNiLE1BQU0sQ0FBb0I7SUFDMUIsU0FBUyxDQUE4QjtJQUN2QyxPQUFPLEdBQThCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDL0MsVUFBVSxDQUFvQjtJQUV0QyxZQUFZLE1BQXlCO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCwyQkFBMkI7SUFDcEIsU0FBUztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDO0lBQzdDLENBQUM7SUFFRCx5Q0FBeUM7SUFDekMsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsS0FBSztRQUNoQiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBRXhELHlCQUF5QjtRQUN6QixNQUFNLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBRWxDLHNDQUFzQztRQUN0QyxNQUFNLGFBQWEsR0FBb0MsRUFBRSxDQUFDO1FBQzFELElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8s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
@@ -0,0 +1 @@
1
+ export * from './classes.vpn-manager.js';
@@ -0,0 +1,2 @@
1
+ export * from './classes.vpn-manager.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy92cG4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywwQkFBMEIsQ0FBQyJ9
@@ -0,0 +1,41 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ import type { DcRouterApiClient } from './classes.dcrouterapiclient.js';
3
+ export declare class ApiToken {
4
+ private clientRef;
5
+ id: string;
6
+ name: string;
7
+ scopes: interfaces.data.TApiTokenScope[];
8
+ createdAt: number;
9
+ expiresAt: number | null;
10
+ lastUsedAt: number | null;
11
+ enabled: boolean;
12
+ /** Only set on creation or roll. Not persisted on server side. */
13
+ tokenValue?: string;
14
+ constructor(clientRef: DcRouterApiClient, data: interfaces.data.IApiTokenInfo, tokenValue?: string);
15
+ revoke(): Promise<void>;
16
+ roll(): Promise<string>;
17
+ toggle(enabled: boolean): Promise<void>;
18
+ }
19
+ export declare class ApiTokenBuilder {
20
+ private clientRef;
21
+ private tokenName;
22
+ private tokenScopes;
23
+ private tokenExpiresInDays?;
24
+ constructor(clientRef: DcRouterApiClient);
25
+ setName(name: string): this;
26
+ setScopes(scopes: interfaces.data.TApiTokenScope[]): this;
27
+ addScope(scope: interfaces.data.TApiTokenScope): this;
28
+ setExpiresInDays(days: number | null): this;
29
+ save(): Promise<ApiToken>;
30
+ }
31
+ export declare class ApiTokenManager {
32
+ private clientRef;
33
+ constructor(clientRef: DcRouterApiClient);
34
+ list(): Promise<ApiToken[]>;
35
+ create(options: {
36
+ name: string;
37
+ scopes: interfaces.data.TApiTokenScope[];
38
+ expiresInDays?: number | null;
39
+ }): Promise<ApiToken>;
40
+ build(): ApiTokenBuilder;
41
+ }
@@ -0,0 +1,115 @@
1
+ import * as interfaces from '../dist_ts_interfaces/index.js';
2
+ export class ApiToken {
3
+ clientRef;
4
+ // Data from IApiTokenInfo
5
+ id;
6
+ name;
7
+ scopes;
8
+ createdAt;
9
+ expiresAt;
10
+ lastUsedAt;
11
+ enabled;
12
+ /** Only set on creation or roll. Not persisted on server side. */
13
+ tokenValue;
14
+ constructor(clientRef, data, tokenValue) {
15
+ this.clientRef = clientRef;
16
+ this.id = data.id;
17
+ this.name = data.name;
18
+ this.scopes = data.scopes;
19
+ this.createdAt = data.createdAt;
20
+ this.expiresAt = data.expiresAt;
21
+ this.lastUsedAt = data.lastUsedAt;
22
+ this.enabled = data.enabled;
23
+ this.tokenValue = tokenValue;
24
+ }
25
+ async revoke() {
26
+ const response = await this.clientRef.request('revokeApiToken', this.clientRef.buildRequestPayload({ id: this.id }));
27
+ if (!response.success) {
28
+ throw new Error(response.message || 'Failed to revoke token');
29
+ }
30
+ }
31
+ async roll() {
32
+ const response = await this.clientRef.request('rollApiToken', this.clientRef.buildRequestPayload({ id: this.id }));
33
+ if (!response.success) {
34
+ throw new Error(response.message || 'Failed to roll token');
35
+ }
36
+ this.tokenValue = response.tokenValue;
37
+ return response.tokenValue;
38
+ }
39
+ async toggle(enabled) {
40
+ const response = await this.clientRef.request('toggleApiToken', this.clientRef.buildRequestPayload({ id: this.id, enabled }));
41
+ if (!response.success) {
42
+ throw new Error(response.message || 'Failed to toggle token');
43
+ }
44
+ this.enabled = enabled;
45
+ }
46
+ }
47
+ export class ApiTokenBuilder {
48
+ clientRef;
49
+ tokenName = '';
50
+ tokenScopes = [];
51
+ tokenExpiresInDays;
52
+ constructor(clientRef) {
53
+ this.clientRef = clientRef;
54
+ }
55
+ setName(name) {
56
+ this.tokenName = name;
57
+ return this;
58
+ }
59
+ setScopes(scopes) {
60
+ this.tokenScopes = scopes;
61
+ return this;
62
+ }
63
+ addScope(scope) {
64
+ if (!this.tokenScopes.includes(scope)) {
65
+ this.tokenScopes.push(scope);
66
+ }
67
+ return this;
68
+ }
69
+ setExpiresInDays(days) {
70
+ this.tokenExpiresInDays = days;
71
+ return this;
72
+ }
73
+ async save() {
74
+ const response = await this.clientRef.request('createApiToken', this.clientRef.buildRequestPayload({
75
+ name: this.tokenName,
76
+ scopes: this.tokenScopes,
77
+ expiresInDays: this.tokenExpiresInDays,
78
+ }));
79
+ if (!response.success) {
80
+ throw new Error(response.message || 'Failed to create API token');
81
+ }
82
+ return new ApiToken(this.clientRef, {
83
+ id: response.tokenId,
84
+ name: this.tokenName,
85
+ scopes: this.tokenScopes,
86
+ createdAt: Date.now(),
87
+ expiresAt: this.tokenExpiresInDays
88
+ ? Date.now() + this.tokenExpiresInDays * 24 * 60 * 60 * 1000
89
+ : null,
90
+ lastUsedAt: null,
91
+ enabled: true,
92
+ }, response.tokenValue);
93
+ }
94
+ }
95
+ export class ApiTokenManager {
96
+ clientRef;
97
+ constructor(clientRef) {
98
+ this.clientRef = clientRef;
99
+ }
100
+ async list() {
101
+ const response = await this.clientRef.request('listApiTokens', this.clientRef.buildRequestPayload());
102
+ return response.tokens.map((t) => new ApiToken(this.clientRef, t));
103
+ }
104
+ async create(options) {
105
+ return this.build()
106
+ .setName(options.name)
107
+ .setScopes(options.scopes)
108
+ .setExpiresInDays(options.expiresInDays ?? null)
109
+ .save();
110
+ }
111
+ build() {
112
+ return new ApiTokenBuilder(this.clientRef);
113
+ }
114
+ }
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hcGl0b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2FwaWNsaWVudC9jbGFzc2VzLmFwaXRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxVQUFVLE1BQU0sMkJBQTJCLENBQUM7QUFHeEQsTUFBTSxPQUFPLFFBQVE7SUFDWCxTQUFTLENBQW9CO0lBRXJDLDBCQUEwQjtJQUNuQixFQUFFLENBQVM7SUFDWCxJQUFJLENBQVM7SUFDYixNQUFNLENBQW1DO0lBQ3pDLFNBQVMsQ0FBUztJQUNsQixTQUFTLENBQWdCO0lBQ3pCLFVBQVUsQ0FBZ0I7SUFDMUIsT0FBTyxDQUFVO0lBRXhCLGtFQUFrRTtJQUMzRCxVQUFVLENBQVU7SUFFM0IsWUFBWSxTQUE0QixFQUFFLElBQW1DLEVBQUUsVUFBbUI7UUFDaEcsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTTtRQUNqQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUMzQyxnQkFBZ0IsRUFDaEIsSUFB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