@stacksjs/ts-cloud 0.16.70 → 0.16.72

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 (178) hide show
  1. package/dist/aws/index.js +1 -1
  2. package/dist/bin/{chunk-9j6040sq.js → chunk-00hq474q.js} +2 -2
  3. package/dist/bin/chunk-0g9ze9v3.js +1 -0
  4. package/dist/bin/chunk-0k75pjkr.js +1 -0
  5. package/dist/bin/{chunk-vveaxany.js → chunk-1c91h57k.js} +5 -5
  6. package/dist/bin/{chunk-tx2mh4bw.js → chunk-1g3gvxy2.js} +2 -2
  7. package/dist/bin/{chunk-fmz6qv0v.js → chunk-1n1s649d.js} +3 -3
  8. package/dist/bin/{chunk-6wz74ram.js → chunk-27t4ve22.js} +60 -60
  9. package/dist/bin/{chunk-rsqzyxmz.js → chunk-2j2xcq2h.js} +1 -1
  10. package/dist/bin/{chunk-atsg4tw3.js → chunk-5z0g7y0s.js} +110 -110
  11. package/dist/bin/{chunk-dbmtygg1.js → chunk-648xb030.js} +2 -2
  12. package/dist/bin/{chunk-4w6n5wht.js → chunk-6wvgwn9q.js} +2 -2
  13. package/dist/bin/{chunk-tkj474c6.js → chunk-79n440fm.js} +1 -1
  14. package/dist/bin/{chunk-rkcr1xth.js → chunk-7rb06mds.js} +120 -120
  15. package/dist/bin/chunk-7x4vs33k.js +1 -0
  16. package/dist/bin/{chunk-6vryg8kw.js → chunk-7xd2tnjb.js} +2 -2
  17. package/dist/bin/chunk-8bs3m2x7.js +1 -0
  18. package/dist/bin/{chunk-mt8yss58.js → chunk-8wvtmxpw.js} +2 -2
  19. package/dist/bin/chunk-8yv9ech5.js +1 -0
  20. package/dist/bin/{chunk-8cw7a6c7.js → chunk-9362t52n.js} +2 -2
  21. package/dist/bin/chunk-93pj5314.js +1 -0
  22. package/dist/bin/{chunk-nxkbvmz2.js → chunk-9cqzzkrd.js} +1 -1
  23. package/dist/bin/chunk-9xs1fh7q.js +1 -0
  24. package/dist/bin/{chunk-rhy7gbt1.js → chunk-a8fqqd62.js} +2 -2
  25. package/dist/bin/{chunk-h5m9tan5.js → chunk-ae9epvrr.js} +1 -1
  26. package/dist/bin/{chunk-reexpdfk.js → chunk-bj94s3a7.js} +2 -2
  27. package/dist/bin/chunk-cq7gxt10.js +1 -0
  28. package/dist/bin/{chunk-gcz6twdg.js → chunk-efafd6hw.js} +5 -5
  29. package/dist/bin/{chunk-ey3wcb9c.js → chunk-efghc0tr.js} +2 -2
  30. package/dist/bin/{chunk-bn0c836y.js → chunk-erdkgb1d.js} +3 -3
  31. package/dist/bin/chunk-fvj9ktkm.js +1 -0
  32. package/dist/bin/chunk-fy62gtke.js +1 -0
  33. package/dist/bin/{chunk-6d80tpq9.js → chunk-gsp1secn.js} +2 -2
  34. package/dist/bin/{chunk-1gypqjyd.js → chunk-gwn9pezq.js} +5 -5
  35. package/dist/bin/chunk-h03hh7qw.js +1 -0
  36. package/dist/bin/chunk-h28tfah9.js +1 -0
  37. package/dist/bin/{chunk-e0scvrf7.js → chunk-jcbtp3aj.js} +3 -3
  38. package/dist/bin/{chunk-w4e696gz.js → chunk-jk4v9sj1.js} +4 -4
  39. package/dist/bin/{chunk-rqwgs1fs.js → chunk-jnt0ypm6.js} +15 -15
  40. package/dist/bin/chunk-jvwbq6j5.js +1 -0
  41. package/dist/bin/{chunk-xfr0nfdq.js → chunk-kb0yy9t1.js} +5 -5
  42. package/dist/bin/chunk-kcgs4z6p.js +1 -0
  43. package/dist/bin/{chunk-b2gmbf1r.js → chunk-kyqe19mh.js} +2 -2
  44. package/dist/bin/chunk-rdqcr78z.js +2 -0
  45. package/dist/bin/chunk-s5gyhgw1.js +1 -0
  46. package/dist/bin/{chunk-k61k237r.js → chunk-whecvra8.js} +3 -3
  47. package/dist/bin/chunk-x9dep4ew.js +1 -0
  48. package/dist/bin/chunk-xt3jhs2k.js +1 -0
  49. package/dist/bin/chunk-z7fnx9gx.js +1 -0
  50. package/dist/bin/cli.js +244 -244
  51. package/dist/bin/dashboard-server.js +1 -1
  52. package/dist/{chunk-h5yx54ks.js → chunk-0cd0mk3e.js} +5 -5
  53. package/dist/{chunk-tb8azghz.js → chunk-0nmtzbqn.js} +20 -20
  54. package/dist/{chunk-1wc2zfct.js → chunk-1eg5wsn2.js} +5 -5
  55. package/dist/{chunk-z585dfjz.js → chunk-1y1b1jy0.js} +1 -1
  56. package/dist/{chunk-qqn369pf.js → chunk-207hnnpp.js} +2 -2
  57. package/dist/chunk-2b4knhhy.js +1 -0
  58. package/dist/{chunk-tq7nsdnd.js → chunk-2dffxn73.js} +6 -6
  59. package/dist/{chunk-t8fbwcdk.js → chunk-3k9kdbsc.js} +2 -2
  60. package/dist/{chunk-yh9tmx00.js → chunk-3m5x6nrt.js} +19 -19
  61. package/dist/{chunk-nkx9pn64.js → chunk-42vtybcm.js} +4 -4
  62. package/dist/{chunk-qrpy0h2n.js → chunk-65dddt6g.js} +4 -4
  63. package/dist/{chunk-p9gqv8vt.js → chunk-68pafbpe.js} +109 -109
  64. package/dist/{chunk-v0s8vpa3.js → chunk-78xspqp6.js} +2 -2
  65. package/dist/{chunk-m2a60evh.js → chunk-928z0h9b.js} +3 -3
  66. package/dist/chunk-az9wzy1w.js +1 -0
  67. package/dist/{chunk-040rbk7k.js → chunk-e32qtz2d.js} +73 -73
  68. package/dist/chunk-fjs0wgyw.js +2 -0
  69. package/dist/chunk-g96mv4z5.js +1 -0
  70. package/dist/{chunk-je8tky8z.js → chunk-gssa1974.js} +1 -1
  71. package/dist/chunk-h3e1qc75.js +1 -0
  72. package/dist/{chunk-eva9hz6q.js → chunk-k05g8vy5.js} +1 -1
  73. package/dist/{chunk-3nrnbk63.js → chunk-me647jxj.js} +103 -103
  74. package/dist/{chunk-hvttzk9q.js → chunk-ms84y9kg.js} +2 -2
  75. package/dist/chunk-nh7rcks9.js +1 -0
  76. package/dist/{chunk-kbr9nc8y.js → chunk-nx8dbae2.js} +3 -3
  77. package/dist/{chunk-1yj07hbw.js → chunk-pydkxpf9.js} +1 -1
  78. package/dist/chunk-qy8r2vwh.js +1 -0
  79. package/dist/{chunk-h360gwrf.js → chunk-rkashc9e.js} +3 -3
  80. package/dist/{chunk-qb25wesa.js → chunk-tdhm38cg.js} +2 -2
  81. package/dist/{chunk-a07kew2q.js → chunk-ts2n068z.js} +5 -5
  82. package/dist/{chunk-xyem7g21.js → chunk-v3z51fs0.js} +1 -1
  83. package/dist/{chunk-41fwhvp7.js → chunk-vx5n4bhb.js} +1 -1
  84. package/dist/chunk-ypsfkgme.js +1 -0
  85. package/dist/{chunk-p21vbrgk.js → chunk-ysv0f0k5.js} +1 -1
  86. package/dist/{chunk-s4wz0csj.js → chunk-zthcwfbg.js} +1 -1
  87. package/dist/deploy/dashboard-database.d.ts +33 -6
  88. package/dist/deploy/index.js +1 -1
  89. package/dist/deploy/residency.d.ts +10 -0
  90. package/dist/dns/index.js +1 -1
  91. package/dist/drivers/hetzner/driver.d.ts +5 -0
  92. package/dist/drivers/index.js +1 -1
  93. package/dist/drivers/shared/deploy-script.d.ts +1 -0
  94. package/dist/drivers/shared/runtime-isolation.d.ts +5 -0
  95. package/dist/index.d.ts +2 -0
  96. package/dist/index.js +27 -27
  97. package/dist/mail/index.js +1 -1
  98. package/dist/operations/index.js +1 -1
  99. package/dist/protection/index.js +1 -1
  100. package/dist/spend/index.js +1 -1
  101. package/dist/ui/404.html +1 -1
  102. package/dist/ui/accept-invitation.html +1 -1
  103. package/dist/ui/access-denied.html +1 -1
  104. package/dist/ui/account/automation.html +6 -6
  105. package/dist/ui/account/security.html +2 -2
  106. package/dist/ui/applications/compose.html +6 -6
  107. package/dist/ui/applications/new.html +2 -2
  108. package/dist/ui/data/backups.html +6 -6
  109. package/dist/ui/data/services.html +6 -6
  110. package/dist/ui/data/volumes.html +6 -6
  111. package/dist/ui/index.html +6 -6
  112. package/dist/ui/infrastructure/topology.html +5 -5
  113. package/dist/ui/integrations.html +2 -2
  114. package/dist/ui/operations/alerts.html +6 -6
  115. package/dist/ui/operations/configuration.html +6 -6
  116. package/dist/ui/operations/jobs.html +5 -5
  117. package/dist/ui/operations/maintenance.html +6 -6
  118. package/dist/ui/operations/observability.html +6 -6
  119. package/dist/ui/operations/previews.html +6 -6
  120. package/dist/ui/operations/queue.html +6 -6
  121. package/dist/ui/operations/regions.html +6 -6
  122. package/dist/ui/operations/releases.html +6 -6
  123. package/dist/ui/operations/spend.html +6 -6
  124. package/dist/ui/operations/workloads.html +6 -6
  125. package/dist/ui/security.html +1 -1
  126. package/dist/ui/server/actions.html +6 -6
  127. package/dist/ui/server/activity.html +2 -2
  128. package/dist/ui/server/capacity.html +6 -6
  129. package/dist/ui/server/database.html +5 -5
  130. package/dist/ui/server/deployments.html +6 -6
  131. package/dist/ui/server/diagnostics.html +2 -2
  132. package/dist/ui/server/firewall.html +6 -6
  133. package/dist/ui/server/fleet.html +6 -6
  134. package/dist/ui/server/logs.html +6 -6
  135. package/dist/ui/server/metrics.html +6 -6
  136. package/dist/ui/server/security.html +2 -2
  137. package/dist/ui/server/services.html +1 -1
  138. package/dist/ui/server/sites.html +6 -6
  139. package/dist/ui/server/ssh-keys.html +6 -6
  140. package/dist/ui/server/team.html +6 -6
  141. package/dist/ui/server/terminal.html +2 -2
  142. package/dist/ui/serverless/alarms.html +5 -5
  143. package/dist/ui/serverless/assets.html +2 -2
  144. package/dist/ui/serverless/cost.html +2 -2
  145. package/dist/ui/serverless/data.html +6 -6
  146. package/dist/ui/serverless/deployments.html +1 -1
  147. package/dist/ui/serverless/firewall.html +1 -1
  148. package/dist/ui/serverless/functions.html +6 -6
  149. package/dist/ui/serverless/logs.html +6 -6
  150. package/dist/ui/serverless/metrics.html +2 -2
  151. package/dist/ui/serverless/queues.html +6 -6
  152. package/dist/ui/serverless/secrets.html +6 -6
  153. package/dist/ui/serverless/traces.html +6 -6
  154. package/dist/ui/serverless.html +6 -6
  155. package/package.json +3 -3
  156. package/dist/bin/chunk-04jkzt83.js +0 -1
  157. package/dist/bin/chunk-0rb8hp47.js +0 -1
  158. package/dist/bin/chunk-4c6bmvwq.js +0 -1
  159. package/dist/bin/chunk-5bsgbfaa.js +0 -1
  160. package/dist/bin/chunk-6dwj78tg.js +0 -1
  161. package/dist/bin/chunk-7qkc4af5.js +0 -1
  162. package/dist/bin/chunk-7tvepzyw.js +0 -1
  163. package/dist/bin/chunk-87ycafdr.js +0 -1
  164. package/dist/bin/chunk-8vm3veyc.js +0 -1
  165. package/dist/bin/chunk-axv264y9.js +0 -1
  166. package/dist/bin/chunk-b96qbfmt.js +0 -1
  167. package/dist/bin/chunk-j77zj12s.js +0 -1
  168. package/dist/bin/chunk-jegvamsc.js +0 -1
  169. package/dist/bin/chunk-mrnc8esz.js +0 -1
  170. package/dist/bin/chunk-r58k9cj8.js +0 -1
  171. package/dist/bin/chunk-s15gpps2.js +0 -1
  172. package/dist/bin/chunk-sb0v3vej.js +0 -1
  173. package/dist/chunk-426k7fgf.js +0 -1
  174. package/dist/chunk-4b0ynr9y.js +0 -1
  175. package/dist/chunk-ecnzvq90.js +0 -1
  176. package/dist/chunk-emkp3dsp.js +0 -1
  177. package/dist/chunk-pcagajw1.js +0 -1
  178. package/dist/chunk-sybwn2y6.js +0 -1
@@ -0,0 +1,2 @@
1
+ function ru(t,e){if(!Array.isArray(t.countries)||!t.countries.length||t.countries.some((n)=>!/^[A-Z]{2}$/.test(n)))throw Error("Residency requires an explicit country allowlist");if(!e.country||!t.countries.includes(e.country)||t.locations&&(!t.locations.length||!e.location||!t.locations.includes(e.location)))throw Error("Compute target is outside the required residency policy, or its provider location is unknown")}
2
+ export{ru};
@@ -0,0 +1 @@
1
+ import{ne}from"./chunk-v3z51fs0.js";import"./chunk-1eg5wsn2.js";export{ne as RDSClient};
@@ -1,4 +1,4 @@
1
- import{n}from"./chunk-1wc2zfct.js";class b{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async createHostedZone(e){let t=e.CallerReference||`${Date.now()}-${Math.random().toString(36).slice(2)}`,o=`<?xml version="1.0" encoding="UTF-8"?>
1
+ import{n}from"./chunk-1eg5wsn2.js";class b{client;region;constructor(e="us-east-1"){this.region=e,this.client=new n}async createHostedZone(e){let t=e.CallerReference||`${Date.now()}-${Math.random().toString(36).slice(2)}`,o=`<?xml version="1.0" encoding="UTF-8"?>
2
2
  <CreateHostedZoneRequest xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
3
3
  <Name>${e.Name}</Name>
4
4
  <CallerReference>${t}</CallerReference>`;if(e.HostedZoneConfig){if(o+=`
@@ -0,0 +1 @@
1
+ import{Ac}from"./chunk-65dddt6g.js";import"./chunk-ysv0f0k5.js";import"./chunk-1eg5wsn2.js";import"./chunk-e32qtz2d.js";import"./chunk-928z0h9b.js";export{Ac as buildAndPushServerlessImage};
@@ -1 +1 @@
1
- import{on}from"./chunk-qqn369pf.js";var Jl="\x00";function na(t,i){if(t==="*"||t==="**")return!0;let e=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"\x01").replace(/\*/g,"[^/]*").replace(/\u0001/g,".*");return new RegExp(`^${e}$`).test(i)}function f(t,i){if(t.startsWith("*.")){let e=t.slice(1);return i.endsWith(e)&&i.length>e.length}return t===i}function ss(t,i){if(t.enabled===!1)return!1;if(t.methods?.length&&!t.methods.some((e)=>e.toUpperCase()===i.method.toUpperCase()))return!1;if(t.path&&!na(t.path,i.path))return!1;if(t.host&&!f(t.host,i.host??""))return!1;return!0}function os(t,i){let e=t.key??{source:"ip"},o=e.fallbackToIp!==!1,r;if(e.source==="ip")r=i.ip;else if(e.source==="global")r="global";else if(e.source==="host")r=i.host??"";else if(e.source==="path")r=i.path;else if(e.source==="header")r=e.name?i.headers?.[e.name.toLowerCase()]:void 0;else if(e.source==="cookie")r=e.name?i.cookies?.[e.name]:void 0;if(!r&&e.source!=="global")r=o?i.ip:"__missing__";return`${t.id}\x00${r}`}class ia{clock;maxTrackedKeys;buckets=new Map;windows=new Map;rules;constructor(t,i=()=>Date.now(),e=1e5){this.clock=i;this.maxTrackedKeys=e;this.rules=[...t].sort((o,r)=>(o.priority??0)-(r.priority??0))}check(t){let i=this.clock(),e=this.rules.filter((n)=>ss(n,t)),o;for(let n of e){let s=this.test(n,t,i);if(s.allowed)continue;if(!o||d(s.action)>d(o.action))o=s}if(o)return o;let r={action:"allow",allowed:!0};for(let n of e){let s=this.consume(n,t,i);if(s.remaining!=null&&(r.remaining??1/0)>s.remaining)r=s}return r}test(t,i,e){let o=os(t,i);if((t.algorithm??"token_bucket")==="token_bucket"){let n=t.burst??t.limit,s=this.buckets.get(o),a=s?Math.min(n,s.tokens+this.refill(t,e-s.updatedAt)):n;if(a>=1)return{action:"allow",allowed:!0};return this.blocked(t,o,0,this.msPerToken(t)*(1-a),e)}let r=(this.windows.get(o)?.hits??[]).filter((n)=>n>e-t.windowMs);if(r.length<t.limit)return{action:"allow",allowed:!0};return this.blocked(t,o,0,r[0]+t.windowMs-e,e)}peek(t){let i=this.clock();for(let e of this.rules){if(!ss(e,t))continue;let o=this.test(e,t,i);if(!o.allowed)return o}return{action:"allow",allowed:!0}}msPerToken(t){return t.windowMs/Math.max(1,t.limit)}refill(t,i){return Math.max(0,i)/this.msPerToken(t)}blocked(t,i,e,o,r){let n=t.action??"deny";return{action:n,allowed:n==="allow"||n==="log",ruleId:t.id,limit:t.limit,remaining:e,retryAfterMs:Math.max(0,Math.ceil(o)),resetAt:r+Math.max(0,o),key:i}}consume(t,i,e){let o=os(t,i);if((t.algorithm??"token_bucket")==="token_bucket"){let l=t.burst??t.limit,u=this.buckets.get(o)??{tokens:l,updatedAt:e},c=Math.min(l,u.tokens+this.refill(t,e-u.updatedAt));if(c<1)return this.buckets.set(o,{tokens:c,updatedAt:e}),this.blocked(t,o,0,this.msPerToken(t)*(1-c),e);return this.evictIfNeeded(this.buckets),this.buckets.set(o,{tokens:c-1,updatedAt:e}),{action:"allow",allowed:!0,ruleId:t.id,limit:l,remaining:Math.floor(c-1),resetAt:e+this.msPerToken(t)*(l-(c-1)),key:o}}let n=this.windows.get(o)??{hits:[]},s=e-t.windowMs,a=n.hits.filter((l)=>l>s);if(a.length>=t.limit)return this.windows.set(o,{hits:a}),this.blocked(t,o,0,a[0]+t.windowMs-e,e);return a.push(e),this.evictIfNeeded(this.windows),this.windows.set(o,{hits:a}),{action:"allow",allowed:!0,ruleId:t.id,limit:t.limit,remaining:t.limit-a.length,resetAt:a[0]+t.windowMs,key:o}}evictIfNeeded(t){if(t.size<this.maxTrackedKeys)return;let i=t.size-this.maxTrackedKeys+1,e=0;for(let o of t.keys())if(t.delete(o),++e>=i)break}sweep(){let t=this.clock(),i=0;for(let[e,o]of this.windows){let r=e.split("\x00")[0],n=this.rules.find((s)=>s.id===r);if(!n){this.windows.delete(e),i++;continue}if(o.hits.every((s)=>s<=t-n.windowMs))this.windows.delete(e),i++}for(let[e,o]of this.buckets){let r=e.split("\x00")[0],n=this.rules.find((s)=>s.id===r);if(!n||t-o.updatedAt>n.windowMs*2)this.buckets.delete(e),i++}return i}get trackedKeys(){return this.buckets.size+this.windows.size}}function d(t){return{allow:0,log:1,throttle:2,challenge:3,deny:4}[t]}function Xl(t){let i={};if(t.limit!=null)i["ratelimit-limit"]=String(t.limit);if(t.remaining!=null)i["ratelimit-remaining"]=String(t.remaining);if(t.resetAt!=null)i["ratelimit-reset"]=String(Math.max(0,Math.ceil((t.resetAt-Date.now())/1000)));if(!t.allowed&&t.retryAfterMs!=null)i["retry-after"]=String(Math.max(1,Math.ceil(t.retryAfterMs/1000)));return i}function Yl(){return[{id:"global-ip",limit:600,windowMs:60000,burst:100,key:{source:"ip"},action:"deny",priority:100},{id:"api-ip",limit:120,windowMs:60000,burst:30,path:"/api/**",key:{source:"ip"},action:"deny",priority:50},{id:"auth-ip",limit:10,windowMs:60000,algorithm:"sliding_window",path:"/auth/**",methods:["POST"],key:{source:"ip"},action:"challenge",priority:10}]}var Zl="protection.controls",as=24,sa=4,g={ipRules:{allow:[],block:[]}};function m(t,i){if(!t?.enabled)return;return new Date(t.expiresAt).getTime()>i.getTime()?t:void 0}function p(t,i){let e=Number.isFinite(t)?Number(t):i;return Math.min(as,Math.max(0.25,e))}var h=500;class oa{controlPlane;options;constructor(t,i={}){this.controlPlane=t;this.options=i}now(){return this.options.now?.()??new Date}read(){let t=this.controlPlane.getSetting(Zl);if(!t||typeof t!=="object"||Array.isArray(t))return{...g,ipRules:{allow:[],block:[]}};let i=t;return{attackMode:i.attackMode,mitigationPause:i.mitigationPause,ipRules:{allow:Array.isArray(i.ipRules?.allow)?i.ipRules.allow:[],block:Array.isArray(i.ipRules?.block)?i.ipRules.block:[]},updatedAt:i.updatedAt}}write(t){let i={...t,updatedAt:this.now().toISOString()};return this.controlPlane.setSetting(Zl,i),i}raw(){return this.read()}current(){let t=this.now(),i=this.read();return{attackMode:m(i.attackMode,t),mitigationPause:m(i.mitigationPause,t),ipRules:i.ipRules}}enableAttackMode(t){let i=this.now(),e={enabled:!0,startedAt:i.toISOString(),expiresAt:new Date(i.getTime()+p(t.hours,sa)*3600000).toISOString(),reason:t.reason.trim()||"Attack mode enabled by an operator.",actorId:t.actorId};return this.write({...this.read(),attackMode:e}),e}disableAttackMode(){let t=this.read();if(!t.attackMode?.enabled)return!1;return this.write({...t,attackMode:{...t.attackMode,enabled:!1}}),!0}pauseMitigations(t){let i=t.reason.trim();if(!i)throw Error("Pausing mitigations requires a reason: you are liable for the traffic it admits.");let e=this.now(),o={enabled:!0,startedAt:e.toISOString(),expiresAt:new Date(e.getTime()+p(t.hours,as)*3600000).toISOString(),reason:i,actorId:t.actorId};return this.write({...this.read(),mitigationPause:o}),o}resumeMitigations(){let t=this.read();if(!t.mitigationPause?.enabled)return!1;return this.write({...t,mitigationPause:{...t.mitigationPause,enabled:!1}}),!0}addIpRule(t,i){let e=i.trim();if(!on(e))throw Error(`Not a valid IP or CIDR: ${i}`);let o=this.read(),r={...o.ipRules,[t]:[...new Set([...o.ipRules[t],e])]};if(r[t].length>h)throw Error(`At most ${h} ${t} rules are supported.`);let n=t==="allow"?"block":"allow";return r[n]=r[n].filter((s)=>s!==e),this.write({...o,ipRules:r}),r}removeIpRule(t,i){let e=this.read(),o={...e.ipRules,[t]:e.ipRules[t].filter((r)=>r!==i.trim())};return this.write({...e,ipRules:o}),o}}function eu(t){if(t.mitigationPause)return{attackMode:!!t.attackMode,mitigationPaused:!0,summary:`Automatic mitigation is paused until ${t.mitigationPause.expiresAt}. All traffic is being served and billed.`,expiresAt:t.mitigationPause.expiresAt};if(t.attackMode)return{attackMode:!0,mitigationPaused:!1,summary:`Attack mode is on until ${t.attackMode.expiresAt}. Every visitor is being challenged.`,expiresAt:t.attackMode.expiresAt};return{attackMode:!1,mitigationPaused:!1,summary:"Protection is in its normal posture."}}function tu(t,i){if(i.mitigationPause)return t.map((e)=>({...e,enabled:!1}));if(!i.attackMode)return[...t];return t.map((e)=>({...e,action:e.action==="deny"?"deny":"challenge",burst:Math.max(1,Math.min(e.burst??e.limit,5))}))}function aa(t,i){let e=[...new Set([...t.allowlist??[],...i.ipRules.allow])],o=[...new Set([...t.blocklist??[],...i.ipRules.block])];if(i.mitigationPause)return{...t,allowlist:e,blocklist:o,monitorOnly:!0};if(!i.attackMode)return{...t,allowlist:e,blocklist:o};let r=t.thresholds??{};return{...t,allowlist:e,blocklist:o,thresholds:{...r,newConnectionsPerSecond:Math.max(1,Math.floor((r.newConnectionsPerSecond??50)/5)),concurrentPerSource:Math.max(1,Math.floor((r.concurrentPerSource??100)/5))}}}function OS(t,i){let e=t?.infrastructure?.compute;if(!e||e.ddos===!1)return t;let o=typeof e.ddos==="object"&&e.ddos!==null?e.ddos:{};return{...t,infrastructure:{...t.infrastructure,compute:{...e,ddos:aa(o,i)}}}}export{Jl,na,ss,os,ia,Xl,Yl,Zl,as,sa,oa,eu,tu,aa,OS};
1
+ import{on}from"./chunk-207hnnpp.js";var Jl="\x00";function ia(t,i){if(t==="*"||t==="**")return!0;let e=t.replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"\x01").replace(/\*/g,"[^/]*").replace(/\u0001/g,".*");return new RegExp(`^${e}$`).test(i)}function f(t,i){if(t.startsWith("*.")){let e=t.slice(1);return i.endsWith(e)&&i.length>e.length}return t===i}function ss(t,i){if(t.enabled===!1)return!1;if(t.methods?.length&&!t.methods.some((e)=>e.toUpperCase()===i.method.toUpperCase()))return!1;if(t.path&&!ia(t.path,i.path))return!1;if(t.host&&!f(t.host,i.host??""))return!1;return!0}function os(t,i){let e=t.key??{source:"ip"},o=e.fallbackToIp!==!1,r;if(e.source==="ip")r=i.ip;else if(e.source==="global")r="global";else if(e.source==="host")r=i.host??"";else if(e.source==="path")r=i.path;else if(e.source==="header")r=e.name?i.headers?.[e.name.toLowerCase()]:void 0;else if(e.source==="cookie")r=e.name?i.cookies?.[e.name]:void 0;if(!r&&e.source!=="global")r=o?i.ip:"__missing__";return`${t.id}\x00${r}`}class sa{clock;maxTrackedKeys;buckets=new Map;windows=new Map;rules;constructor(t,i=()=>Date.now(),e=1e5){this.clock=i;this.maxTrackedKeys=e;this.rules=[...t].sort((o,r)=>(o.priority??0)-(r.priority??0))}check(t){let i=this.clock(),e=this.rules.filter((n)=>ss(n,t)),o;for(let n of e){let s=this.test(n,t,i);if(s.allowed)continue;if(!o||d(s.action)>d(o.action))o=s}if(o)return o;let r={action:"allow",allowed:!0};for(let n of e){let s=this.consume(n,t,i);if(s.remaining!=null&&(r.remaining??1/0)>s.remaining)r=s}return r}test(t,i,e){let o=os(t,i);if((t.algorithm??"token_bucket")==="token_bucket"){let n=t.burst??t.limit,s=this.buckets.get(o),a=s?Math.min(n,s.tokens+this.refill(t,e-s.updatedAt)):n;if(a>=1)return{action:"allow",allowed:!0};return this.blocked(t,o,0,this.msPerToken(t)*(1-a),e)}let r=(this.windows.get(o)?.hits??[]).filter((n)=>n>e-t.windowMs);if(r.length<t.limit)return{action:"allow",allowed:!0};return this.blocked(t,o,0,r[0]+t.windowMs-e,e)}peek(t){let i=this.clock();for(let e of this.rules){if(!ss(e,t))continue;let o=this.test(e,t,i);if(!o.allowed)return o}return{action:"allow",allowed:!0}}msPerToken(t){return t.windowMs/Math.max(1,t.limit)}refill(t,i){return Math.max(0,i)/this.msPerToken(t)}blocked(t,i,e,o,r){let n=t.action??"deny";return{action:n,allowed:n==="allow"||n==="log",ruleId:t.id,limit:t.limit,remaining:e,retryAfterMs:Math.max(0,Math.ceil(o)),resetAt:r+Math.max(0,o),key:i}}consume(t,i,e){let o=os(t,i);if((t.algorithm??"token_bucket")==="token_bucket"){let l=t.burst??t.limit,u=this.buckets.get(o)??{tokens:l,updatedAt:e},c=Math.min(l,u.tokens+this.refill(t,e-u.updatedAt));if(c<1)return this.buckets.set(o,{tokens:c,updatedAt:e}),this.blocked(t,o,0,this.msPerToken(t)*(1-c),e);return this.evictIfNeeded(this.buckets),this.buckets.set(o,{tokens:c-1,updatedAt:e}),{action:"allow",allowed:!0,ruleId:t.id,limit:l,remaining:Math.floor(c-1),resetAt:e+this.msPerToken(t)*(l-(c-1)),key:o}}let n=this.windows.get(o)??{hits:[]},s=e-t.windowMs,a=n.hits.filter((l)=>l>s);if(a.length>=t.limit)return this.windows.set(o,{hits:a}),this.blocked(t,o,0,a[0]+t.windowMs-e,e);return a.push(e),this.evictIfNeeded(this.windows),this.windows.set(o,{hits:a}),{action:"allow",allowed:!0,ruleId:t.id,limit:t.limit,remaining:t.limit-a.length,resetAt:a[0]+t.windowMs,key:o}}evictIfNeeded(t){if(t.size<this.maxTrackedKeys)return;let i=t.size-this.maxTrackedKeys+1,e=0;for(let o of t.keys())if(t.delete(o),++e>=i)break}sweep(){let t=this.clock(),i=0;for(let[e,o]of this.windows){let r=e.split("\x00")[0],n=this.rules.find((s)=>s.id===r);if(!n){this.windows.delete(e),i++;continue}if(o.hits.every((s)=>s<=t-n.windowMs))this.windows.delete(e),i++}for(let[e,o]of this.buckets){let r=e.split("\x00")[0],n=this.rules.find((s)=>s.id===r);if(!n||t-o.updatedAt>n.windowMs*2)this.buckets.delete(e),i++}return i}get trackedKeys(){return this.buckets.size+this.windows.size}}function d(t){return{allow:0,log:1,throttle:2,challenge:3,deny:4}[t]}function Xl(t){let i={};if(t.limit!=null)i["ratelimit-limit"]=String(t.limit);if(t.remaining!=null)i["ratelimit-remaining"]=String(t.remaining);if(t.resetAt!=null)i["ratelimit-reset"]=String(Math.max(0,Math.ceil((t.resetAt-Date.now())/1000)));if(!t.allowed&&t.retryAfterMs!=null)i["retry-after"]=String(Math.max(1,Math.ceil(t.retryAfterMs/1000)));return i}function Yl(){return[{id:"global-ip",limit:600,windowMs:60000,burst:100,key:{source:"ip"},action:"deny",priority:100},{id:"api-ip",limit:120,windowMs:60000,burst:30,path:"/api/**",key:{source:"ip"},action:"deny",priority:50},{id:"auth-ip",limit:10,windowMs:60000,algorithm:"sliding_window",path:"/auth/**",methods:["POST"],key:{source:"ip"},action:"challenge",priority:10}]}var Zl="protection.controls",as=24,oa=4,g={ipRules:{allow:[],block:[]}};function m(t,i){if(!t?.enabled)return;return new Date(t.expiresAt).getTime()>i.getTime()?t:void 0}function p(t,i){let e=Number.isFinite(t)?Number(t):i;return Math.min(as,Math.max(0.25,e))}var h=500;class aa{controlPlane;options;constructor(t,i={}){this.controlPlane=t;this.options=i}now(){return this.options.now?.()??new Date}read(){let t=this.controlPlane.getSetting(Zl);if(!t||typeof t!=="object"||Array.isArray(t))return{...g,ipRules:{allow:[],block:[]}};let i=t;return{attackMode:i.attackMode,mitigationPause:i.mitigationPause,ipRules:{allow:Array.isArray(i.ipRules?.allow)?i.ipRules.allow:[],block:Array.isArray(i.ipRules?.block)?i.ipRules.block:[]},updatedAt:i.updatedAt}}write(t){let i={...t,updatedAt:this.now().toISOString()};return this.controlPlane.setSetting(Zl,i),i}raw(){return this.read()}current(){let t=this.now(),i=this.read();return{attackMode:m(i.attackMode,t),mitigationPause:m(i.mitigationPause,t),ipRules:i.ipRules}}enableAttackMode(t){let i=this.now(),e={enabled:!0,startedAt:i.toISOString(),expiresAt:new Date(i.getTime()+p(t.hours,oa)*3600000).toISOString(),reason:t.reason.trim()||"Attack mode enabled by an operator.",actorId:t.actorId};return this.write({...this.read(),attackMode:e}),e}disableAttackMode(){let t=this.read();if(!t.attackMode?.enabled)return!1;return this.write({...t,attackMode:{...t.attackMode,enabled:!1}}),!0}pauseMitigations(t){let i=t.reason.trim();if(!i)throw Error("Pausing mitigations requires a reason: you are liable for the traffic it admits.");let e=this.now(),o={enabled:!0,startedAt:e.toISOString(),expiresAt:new Date(e.getTime()+p(t.hours,as)*3600000).toISOString(),reason:i,actorId:t.actorId};return this.write({...this.read(),mitigationPause:o}),o}resumeMitigations(){let t=this.read();if(!t.mitigationPause?.enabled)return!1;return this.write({...t,mitigationPause:{...t.mitigationPause,enabled:!1}}),!0}addIpRule(t,i){let e=i.trim();if(!on(e))throw Error(`Not a valid IP or CIDR: ${i}`);let o=this.read(),r={...o.ipRules,[t]:[...new Set([...o.ipRules[t],e])]};if(r[t].length>h)throw Error(`At most ${h} ${t} rules are supported.`);let n=t==="allow"?"block":"allow";return r[n]=r[n].filter((s)=>s!==e),this.write({...o,ipRules:r}),r}removeIpRule(t,i){let e=this.read(),o={...e.ipRules,[t]:e.ipRules[t].filter((r)=>r!==i.trim())};return this.write({...e,ipRules:o}),o}}function eu(t){if(t.mitigationPause)return{attackMode:!!t.attackMode,mitigationPaused:!0,summary:`Automatic mitigation is paused until ${t.mitigationPause.expiresAt}. All traffic is being served and billed.`,expiresAt:t.mitigationPause.expiresAt};if(t.attackMode)return{attackMode:!0,mitigationPaused:!1,summary:`Attack mode is on until ${t.attackMode.expiresAt}. Every visitor is being challenged.`,expiresAt:t.attackMode.expiresAt};return{attackMode:!1,mitigationPaused:!1,summary:"Protection is in its normal posture."}}function tu(t,i){if(i.mitigationPause)return t.map((e)=>({...e,enabled:!1}));if(!i.attackMode)return[...t];return t.map((e)=>({...e,action:e.action==="deny"?"deny":"challenge",burst:Math.max(1,Math.min(e.burst??e.limit,5))}))}function ca(t,i){let e=[...new Set([...t.allowlist??[],...i.ipRules.allow])],o=[...new Set([...t.blocklist??[],...i.ipRules.block])];if(i.mitigationPause)return{...t,allowlist:e,blocklist:o,monitorOnly:!0};if(!i.attackMode)return{...t,allowlist:e,blocklist:o};let r=t.thresholds??{};return{...t,allowlist:e,blocklist:o,thresholds:{...r,newConnectionsPerSecond:Math.max(1,Math.floor((r.newConnectionsPerSecond??50)/5)),concurrentPerSource:Math.max(1,Math.floor((r.concurrentPerSource??100)/5))}}}function _S(t,i){let e=t?.infrastructure?.compute;if(!e||e.ddos===!1)return t;let o=typeof e.ddos==="object"&&e.ddos!==null?e.ddos:{};return{...t,infrastructure:{...t.infrastructure,compute:{...e,ddos:ca(o,i)}}}}export{Jl,ia,ss,os,sa,Xl,Yl,Zl,as,oa,aa,eu,tu,ca,_S};