[{"data":1,"prerenderedAt":992},["ShallowReactive",2],{"navigation_docs":3,"-quayel-gateway-architecture":91,"-quayel-gateway-architecture-surround":991},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":90},"Quayel Gateway","i-lucide-network","\u002Fquayel-gateway","quayel-gateway",[10,29,68],{"title":11,"icon":12,"path":13,"stem":14,"children":15},"Getting Started","i-lucide-rocket","\u002Fquayel-gateway\u002Fgetting-started","quayel-gateway\u002F01.getting-started\u002Findex",[16,19,24],{"title":17,"path":13,"stem":14,"icon":18},"Introduction","i-lucide-book-open",{"title":20,"path":21,"stem":22,"icon":23},"Installation","\u002Fquayel-gateway\u002Fgetting-started\u002Finstallation","quayel-gateway\u002F01.getting-started\u002F1.installation","i-lucide-container",{"title":25,"path":26,"stem":27,"icon":28},"Project Structure","\u002Fquayel-gateway\u002Fgetting-started\u002Fproject-structure","quayel-gateway\u002F01.getting-started\u002F2.project-structure","i-lucide-folder-tree",{"title":30,"icon":31,"path":32,"stem":33,"children":34},"Plugins","i-lucide-puzzle","\u002Fquayel-gateway\u002Fplugins","quayel-gateway\u002F02.plugins\u002Findex",[35,38,43,48,53,58,63],{"title":36,"path":32,"stem":33,"icon":37},"Overview","i-lucide-workflow",{"title":39,"path":40,"stem":41,"icon":42},"IP Intelligence","\u002Fquayel-gateway\u002Fplugins\u002Fip-intel","quayel-gateway\u002F02.plugins\u002F1.ip-intel","i-lucide-radar",{"title":44,"path":45,"stem":46,"icon":47},"Firewall","\u002Fquayel-gateway\u002Fplugins\u002Ffirewall","quayel-gateway\u002F02.plugins\u002F2.firewall","i-lucide-shield",{"title":49,"path":50,"stem":51,"icon":52},"Rate Limiting","\u002Fquayel-gateway\u002Fplugins\u002Frate-limiting","quayel-gateway\u002F02.plugins\u002F3.rate-limiting","i-lucide-gauge",{"title":54,"path":55,"stem":56,"icon":57},"Cache","\u002Fquayel-gateway\u002Fplugins\u002Fcache","quayel-gateway\u002F02.plugins\u002F4.cache","i-lucide-database",{"title":59,"path":60,"stem":61,"icon":62},"Load Balancer","\u002Fquayel-gateway\u002Fplugins\u002Fload-balancer","quayel-gateway\u002F02.plugins\u002F5.load-balancer","i-lucide-scale",{"title":64,"path":65,"stem":66,"icon":67},"Auto-SSL","\u002Fquayel-gateway\u002Fplugins\u002Fauto-ssl","quayel-gateway\u002F02.plugins\u002F6.auto-ssl","i-lucide-lock",{"title":69,"icon":70,"path":71,"stem":72,"children":73},"AI","i-lucide-bot","\u002Fquayel-gateway\u002Fai","quayel-gateway\u002F03.ai\u002Findex",[74,75,80,85],{"title":36,"path":71,"stem":72,"icon":70},{"title":76,"path":77,"stem":78,"icon":79},"The Quayel Gateway Skill","\u002Fquayel-gateway\u002Fai\u002Fskill","quayel-gateway\u002F03.ai\u002F1.skill","i-lucide-wand-sparkles",{"title":81,"path":82,"stem":83,"icon":84},"Installing the Skill","\u002Fquayel-gateway\u002Fai\u002Finstallation","quayel-gateway\u002F03.ai\u002F2.installation","i-lucide-download",{"title":86,"path":87,"stem":88,"icon":89},"AI Agent Guide","\u002Fquayel-gateway\u002Fai\u002Fagent-guide","quayel-gateway\u002F03.ai\u002F3.agent-guide","i-lucide-braces",false,{"id":92,"title":93,"body":94,"description":983,"extension":984,"links":985,"meta":986,"navigation":90,"path":987,"seo":988,"stem":989,"__hash__":990},"docs\u002Fquayel-gateway\u002F02.architecture.md","Architecture",{"type":95,"value":96,"toc":967},"minimark",[97,101,106,117,121,125,131,136,208,212,219,480,484,498,502,513,542,549,715,725,729,821,828,832,873,877,963],[98,99,93],"h1",{"id":100},"architecture",[102,103,105],"h2",{"id":104},"system-overview","System overview",[107,108,113],"pre",{"className":109,"code":111,"language":112},[110],"language-text","┌─────────────────────────────────────────────────────────┐\n│                    QUAYEL GATEWAY                        │\n│                  (Single Rust Binary)                    │\n│                                                         │\n│  ┌─────────────────────────────────────────────────┐   │\n│  │              Pingora HTTP Proxy                  │   │\n│  │  (Connection handling, TLS, HTTP\u002F1.1, H2)       │   │\n│  └──────────────────────┬──────────────────────────┘   │\n│                         │                               │\n│                         ▼                               │\n│  ┌─────────────────────────────────────────────────┐   │\n│  │           Request Context (per-request)          │   │\n│  │  client_ip, headers, path, method, scheme, ...   │   │\n│  └──────────────────────┬──────────────────────────┘   │\n│                         │                               │\n│                         ▼                               │\n│  ┌─────────────────────────────────────────────────┐   │\n│  │             PLUGIN PIPELINE (fixed order)        │   │\n│  │                                                  │   │\n│  │  1. IP Intelligence   ─→  country, ASN, VPN,     │   │\n│  │                            Tor, DC, risk score   │   │\n│  │                                                  │   │\n│  │  2. Firewall          ─→  allow\u002Fblock\u002Fredirect   │   │\n│  │                                                  │   │\n│  │  3. Rate Limiting     ─→  throttle\u002Fblock         │   │\n│  │                                                  │   │\n│  │  4. Load Balancer     ─→  select upstream target  │   │\n│  │                                                  │   │\n│  │  5. Cache             ─→  HIT\u002FMISS\u002FREVALIDATING\u002FSTALE\u002FBYPASS  │\n│  └──────────────────────┬──────────────────────────┘   │\n│                         │                               │\n│                         ▼                               │\n│  ┌─────────────────────────────────────────────────┐   │\n│  │           Upstream Proxy → Backend Servers       │   │\n│  └──────────────────────┬──────────────────────────┘   │\n│                         │                               │\n│                         ▼                               │\n│  ┌─────────────────────────────────────────────────┐   │\n│  │        Response Filter + Logging (JSONL)         │   │\n│  └─────────────────────────────────────────────────┘   │\n│                                                         │\n│  ┌─────────────────────────────────────────────────┐   │\n│  │        EMBEDDED DATA (140 MB in binary)          │   │\n│  │  MMDB: city, ASN, country                        │   │\n│  │  CIDR: VPN, Tor, Cloudflare, proxy               │   │\n│  │  ASN:  provider registry, hosting\u002Fabuse ASNs     │   │\n│  └─────────────────────────────────────────────────┘   │\n└─────────────────────────────────────────────────────────┘\n","text",[114,115,111],"code",{"__ignoreMap":116},"",[102,118,120],{"id":119},"plugin-pipeline","Plugin pipeline",[122,123,124],"p",{},"Every request flows through the pipeline in this exact order:",[107,126,129],{"className":127,"code":128,"language":112},[110],"Request In\n    │\n    ▼\n┌──────────────┐    ┌──────────────┐    ┌──────────────┐\n│  IP Intel    │───→│  Firewall    │───→│ Rate Limit   │\n│              │    │              │    │              │\n│ geo, ASN,    │    │ allow\u002Fblock\u002F │    │ throttle\u002F    │\n│ VPN, Tor, DC │    │ redirect     │    │ 429          │\n└──────┬───────┘    └──────┬───────┘    └──────┬───────┘\n       │                   │                   │\n       │   Any plugin can return Respond ──────┘\n       │   (short-circuits remaining plugins)\n       ▼\n┌──────────────┐    ┌──────────────┐\n│Load Balancer │───→│    Cache     │───→ Upstream\n│              │    │              │\n│ select target│    │ HIT → respond│\n│ round-robin  │    │ MISS → fetch │\n│              │    │ REVALIDATING │\n│              │    │ → serve stale│\n│              │    │ → first req  │\n│              │    │   fetches    │\n└──────────────┘    └──────────────┘\n                            │\n                            ▼\n                    ┌──────────────┐\n                    │   Logging    │\n                    │   (JSONL)    │\n                    └──────────────┘\n",[114,130,128],{"__ignoreMap":116},[132,133,135],"h3",{"id":134},"short-circuit-behavior","Short-circuit behavior",[137,138,139,155],"table",{},[140,141,142],"thead",{},[143,144,145,149,152],"tr",{},[146,147,148],"th",{},"Plugin",[146,150,151],{},"Can short-circuit?",[146,153,154],{},"When?",[156,157,158,170,180,190,199],"tbody",{},[143,159,160,164,167],{},[161,162,163],"td",{},"IP Intel",[161,165,166],{},"No",[161,168,169],{},"Always continues",[143,171,172,174,177],{},[161,173,44],{},[161,175,176],{},"Yes",[161,178,179],{},"Block, redirect, or set-header action",[143,181,182,185,187],{},[161,183,184],{},"Rate Limit",[161,186,176],{},[161,188,189],{},"Limit exceeded → 429",[143,191,192,194,196],{},[161,193,54],{},[161,195,176],{},[161,197,198],{},"Cache HIT → serve cached response; REVALIDATING\u002FSTALE → serve stale cached data",[143,200,201,203,205],{},[161,202,59],{},[161,204,176],{},[161,206,207],{},"No healthy upstream → 503",[102,209,211],{"id":210},"request-context","Request context",[122,213,214,215,218],{},"One ",[114,216,217],{},"RequestContext"," is created per request. All plugins read and write to the same context:",[107,220,224],{"className":221,"code":222,"language":223,"meta":116,"style":116},"language-rust shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","struct RequestContext {\n    \u002F\u002F Identity\n    gateway_id, gateway_name, server_name, config_version,\n    request_id: UUID v4,\n\n    \u002F\u002F Client\n    peer_ip,          \u002F\u002F Direct connection IP\n    client_ip,        \u002F\u002F Resolved real client IP\n    client_ip_source, \u002F\u002F How client_ip was determined\n\n    \u002F\u002F HTTP\n    host, path, method, scheme, user_agent,\n    headers: HashMap\u003CString, String>,\n\n    \u002F\u002F IP Intelligence (populated by ip_intel plugin)\n    ip_intel: IpIntel,\n\n    \u002F\u002F Plugin results\n    firewall: FirewallResult,\n    rate_limit: RateLimitResult,\n    cache: CacheResult,\n    load_balancer: LoadBalancerResult,\n\n    \u002F\u002F Upstream\n    upstream_name, upstream_target, upstream_protocol,\n\n    \u002F\u002F Response \u002F cache capture\n    status_code: Option\u003Cu16>,\n    response_headers_captured: Option\u003CVec\u003C(String, String)>>,\n    response_body_buffer: Vec\u003Cu8>,\n    cache_should_store: bool,              \u002F\u002F Signal to store response in cache\n    revalidation_guard: Option\u003CRevalidationGuard>, \u002F\u002F Per-key lock for stale revalidation\n\n    \u002F\u002F Bandwidth\n    client_bytes_in, client_bytes_out,\n    upstream_bytes_in, upstream_bytes_out,\n\n    \u002F\u002F Timing (microseconds)\n    ip_intel_latency_us, firewall_latency_us,\n    rate_limit_latency_us, cache_lookup_latency_us,\n    lb_latency_us, upstream_connect_latency_us,\n    upstream_ttfb_us, total_latency_us,\n}\n","rust",[114,225,226,234,240,246,252,259,265,271,277,283,288,294,300,306,311,317,323,328,334,340,346,352,358,363,369,375,380,386,392,398,404,410,416,421,427,433,439,444,450,456,462,468,474],{"__ignoreMap":116},[227,228,231],"span",{"class":229,"line":230},"line",1,[227,232,233],{},"struct RequestContext {\n",[227,235,237],{"class":229,"line":236},2,[227,238,239],{},"    \u002F\u002F Identity\n",[227,241,243],{"class":229,"line":242},3,[227,244,245],{},"    gateway_id, gateway_name, server_name, config_version,\n",[227,247,249],{"class":229,"line":248},4,[227,250,251],{},"    request_id: UUID v4,\n",[227,253,255],{"class":229,"line":254},5,[227,256,258],{"emptyLinePlaceholder":257},true,"\n",[227,260,262],{"class":229,"line":261},6,[227,263,264],{},"    \u002F\u002F Client\n",[227,266,268],{"class":229,"line":267},7,[227,269,270],{},"    peer_ip,          \u002F\u002F Direct connection IP\n",[227,272,274],{"class":229,"line":273},8,[227,275,276],{},"    client_ip,        \u002F\u002F Resolved real client IP\n",[227,278,280],{"class":229,"line":279},9,[227,281,282],{},"    client_ip_source, \u002F\u002F How client_ip was determined\n",[227,284,286],{"class":229,"line":285},10,[227,287,258],{"emptyLinePlaceholder":257},[227,289,291],{"class":229,"line":290},11,[227,292,293],{},"    \u002F\u002F HTTP\n",[227,295,297],{"class":229,"line":296},12,[227,298,299],{},"    host, path, method, scheme, user_agent,\n",[227,301,303],{"class":229,"line":302},13,[227,304,305],{},"    headers: HashMap\u003CString, String>,\n",[227,307,309],{"class":229,"line":308},14,[227,310,258],{"emptyLinePlaceholder":257},[227,312,314],{"class":229,"line":313},15,[227,315,316],{},"    \u002F\u002F IP Intelligence (populated by ip_intel plugin)\n",[227,318,320],{"class":229,"line":319},16,[227,321,322],{},"    ip_intel: IpIntel,\n",[227,324,326],{"class":229,"line":325},17,[227,327,258],{"emptyLinePlaceholder":257},[227,329,331],{"class":229,"line":330},18,[227,332,333],{},"    \u002F\u002F Plugin results\n",[227,335,337],{"class":229,"line":336},19,[227,338,339],{},"    firewall: FirewallResult,\n",[227,341,343],{"class":229,"line":342},20,[227,344,345],{},"    rate_limit: RateLimitResult,\n",[227,347,349],{"class":229,"line":348},21,[227,350,351],{},"    cache: CacheResult,\n",[227,353,355],{"class":229,"line":354},22,[227,356,357],{},"    load_balancer: LoadBalancerResult,\n",[227,359,361],{"class":229,"line":360},23,[227,362,258],{"emptyLinePlaceholder":257},[227,364,366],{"class":229,"line":365},24,[227,367,368],{},"    \u002F\u002F Upstream\n",[227,370,372],{"class":229,"line":371},25,[227,373,374],{},"    upstream_name, upstream_target, upstream_protocol,\n",[227,376,378],{"class":229,"line":377},26,[227,379,258],{"emptyLinePlaceholder":257},[227,381,383],{"class":229,"line":382},27,[227,384,385],{},"    \u002F\u002F Response \u002F cache capture\n",[227,387,389],{"class":229,"line":388},28,[227,390,391],{},"    status_code: Option\u003Cu16>,\n",[227,393,395],{"class":229,"line":394},29,[227,396,397],{},"    response_headers_captured: Option\u003CVec\u003C(String, String)>>,\n",[227,399,401],{"class":229,"line":400},30,[227,402,403],{},"    response_body_buffer: Vec\u003Cu8>,\n",[227,405,407],{"class":229,"line":406},31,[227,408,409],{},"    cache_should_store: bool,              \u002F\u002F Signal to store response in cache\n",[227,411,413],{"class":229,"line":412},32,[227,414,415],{},"    revalidation_guard: Option\u003CRevalidationGuard>, \u002F\u002F Per-key lock for stale revalidation\n",[227,417,419],{"class":229,"line":418},33,[227,420,258],{"emptyLinePlaceholder":257},[227,422,424],{"class":229,"line":423},34,[227,425,426],{},"    \u002F\u002F Bandwidth\n",[227,428,430],{"class":229,"line":429},35,[227,431,432],{},"    client_bytes_in, client_bytes_out,\n",[227,434,436],{"class":229,"line":435},36,[227,437,438],{},"    upstream_bytes_in, upstream_bytes_out,\n",[227,440,442],{"class":229,"line":441},37,[227,443,258],{"emptyLinePlaceholder":257},[227,445,447],{"class":229,"line":446},38,[227,448,449],{},"    \u002F\u002F Timing (microseconds)\n",[227,451,453],{"class":229,"line":452},39,[227,454,455],{},"    ip_intel_latency_us, firewall_latency_us,\n",[227,457,459],{"class":229,"line":458},40,[227,460,461],{},"    rate_limit_latency_us, cache_lookup_latency_us,\n",[227,463,465],{"class":229,"line":464},41,[227,466,467],{},"    lb_latency_us, upstream_connect_latency_us,\n",[227,469,471],{"class":229,"line":470},42,[227,472,473],{},"    upstream_ttfb_us, total_latency_us,\n",[227,475,477],{"class":229,"line":476},43,[227,478,479],{},"}\n",[132,481,483],{"id":482},"revalidationguard","RevalidationGuard",[122,485,486,487,489,490,493,494,497],{},"The ",[114,488,483],{}," holds a per-key ",[114,491,492],{},"OwnedMutexGuard\u003C()>"," for the duration of a stale cache refresh request. When the request completes and ",[114,495,496],{},"ctx"," is dropped, the guard drops → lock releases → concurrent requests see fresh cache data.",[102,499,501],{"id":500},"embedded-data-architecture","Embedded data architecture",[122,503,504,505,508,509,512],{},"All IP intelligence data is compiled into the binary at build time using Rust's ",[114,506,507],{},"include_bytes!()"," and ",[114,510,511],{},"include_str!()"," macros. This means:",[514,515,516,524,530,536],"ul",{},[517,518,519,523],"li",{},[520,521,522],"strong",{},"Zero network requests"," on startup",[517,525,526,529],{},[520,527,528],{},"Zero disk I\u002FO"," for IP intel lookups",[517,531,532,535],{},[520,533,534],{},"Deterministic startup"," — no download failures, no timeouts",[517,537,538,541],{},[520,539,540],{},"~140 MB"," added to binary size (3 MMDB files + 4 CIDR lists + 2 ASN lists)",[132,543,545,546],{"id":544},"data-files-in-srcdata","Data files in ",[114,547,548],{},"src\u002Fdata\u002F",[137,550,551,567],{},[140,552,553],{},[143,554,555,558,561,564],{},[146,556,557],{},"File",[146,559,560],{},"Size",[146,562,563],{},"Format",[146,565,566],{},"Purpose",[156,568,569,585,600,615,638,654,669,685,700],{},[143,570,571,576,579,582],{},[161,572,573],{},[114,574,575],{},"dbip-city-lite.mmdb",[161,577,578],{},"122 MB",[161,580,581],{},"MMDB",[161,583,584],{},"Country, region, city, lat\u002Flon",[143,586,587,592,595,597],{},[161,588,589],{},[114,590,591],{},"dbip-asn-lite.mmdb",[161,593,594],{},"9.2 MB",[161,596,581],{},[161,598,599],{},"ASN number + organization",[143,601,602,607,610,612],{},[161,603,604],{},[114,605,606],{},"dbip-country.mmdb",[161,608,609],{},"8.0 MB",[161,611,581],{},[161,613,614],{},"Country-only fallback",[143,616,617,622,625,628],{},[161,618,619],{},[114,620,621],{},"provider-asns.txt",[161,623,624],{},"~1.5 KB",[161,626,627],{},"ASN registry",[161,629,630,633,634,637],{},[114,631,632],{},"ASN|Label"," provider map (e.g. ",[114,635,636],{},"47583|Hostinger",")",[143,639,640,645,648,651],{},[161,641,642],{},[114,643,644],{},"vpn.txt",[161,646,647],{},"177 KB",[161,649,650],{},"CIDR list",[161,652,653],{},"11K VPN provider ranges",[143,655,656,661,664,666],{},[161,657,658],{},[114,659,660],{},"tor.txt",[161,662,663],{},"19 KB",[161,665,650],{},[161,667,668],{},"1.3K Tor exit node IPs",[143,670,671,676,679,682],{},[161,672,673],{},[114,674,675],{},"hosting-asns.txt",[161,677,678],{},"4.3 KB",[161,680,681],{},"ASN list",[161,683,684],{},"Bad\u002Fhosting ASN numbers",[143,686,687,692,695,697],{},[161,688,689],{},[114,690,691],{},"cloudflare.txt",[161,693,694],{},"336 B",[161,696,650],{},[161,698,699],{},"Cloudflare edge ranges",[143,701,702,707,710,712],{},[161,703,704],{},[114,705,706],{},"proxy.txt",[161,708,709],{},"0 B",[161,711,650],{},[161,713,714],{},"FireHOL anonymous (empty)",[716,717,718,719,724],"tip",{},"See ",[720,721,723],"a",{"href":722},"\u002Fquayel-gateway\u002Fdata-sources","Data Sources"," for complete dataset documentation, source URLs, and update instructions.",[132,726,728],{"id":727},"update-process","Update process",[107,730,734],{"className":731,"code":732,"language":733,"meta":116,"style":116},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1. Copy fresh data files\ncp \u002Fpath\u002Fto\u002Fnew\u002Fdbip-city-lite.mmdb src\u002Fdata\u002F\ncp \u002Fpath\u002Fto\u002Fnew\u002Fdbip-asn-lite.mmdb src\u002Fdata\u002F\ncp \u002Fpath\u002Fto\u002Fnew\u002Fvpn.txt src\u002Fdata\u002F\n\n# 2. Rebuild\ncargo build --release\nstrip target\u002Frelease\u002Fquayel-gateway\n\n# 3. Deploy\nsystemctl restart quayel-gateway\n","bash",[114,735,736,742,755,764,773,777,782,793,801,805,810],{"__ignoreMap":116},[227,737,738],{"class":229,"line":230},[227,739,741],{"class":740},"sHwdD","# 1. Copy fresh data files\n",[227,743,744,748,752],{"class":229,"line":236},[227,745,747],{"class":746},"sBMFI","cp",[227,749,751],{"class":750},"sfazB"," \u002Fpath\u002Fto\u002Fnew\u002Fdbip-city-lite.mmdb",[227,753,754],{"class":750}," src\u002Fdata\u002F\n",[227,756,757,759,762],{"class":229,"line":242},[227,758,747],{"class":746},[227,760,761],{"class":750}," \u002Fpath\u002Fto\u002Fnew\u002Fdbip-asn-lite.mmdb",[227,763,754],{"class":750},[227,765,766,768,771],{"class":229,"line":248},[227,767,747],{"class":746},[227,769,770],{"class":750}," \u002Fpath\u002Fto\u002Fnew\u002Fvpn.txt",[227,772,754],{"class":750},[227,774,775],{"class":229,"line":254},[227,776,258],{"emptyLinePlaceholder":257},[227,778,779],{"class":229,"line":261},[227,780,781],{"class":740},"# 2. Rebuild\n",[227,783,784,787,790],{"class":229,"line":267},[227,785,786],{"class":746},"cargo",[227,788,789],{"class":750}," build",[227,791,792],{"class":750}," --release\n",[227,794,795,798],{"class":229,"line":273},[227,796,797],{"class":746},"strip",[227,799,800],{"class":750}," target\u002Frelease\u002Fquayel-gateway\n",[227,802,803],{"class":229,"line":279},[227,804,258],{"emptyLinePlaceholder":257},[227,806,807],{"class":229,"line":285},[227,808,809],{"class":740},"# 3. Deploy\n",[227,811,812,815,818],{"class":229,"line":290},[227,813,814],{"class":746},"systemctl",[227,816,817],{"class":750}," restart",[227,819,820],{"class":750}," quayel-gateway\n",[122,822,718,823,827],{},[720,824,826],{"href":825},"\u002Fquayel-gateway\u002Fdata-sources#updating-embedded-data","Data Sources — Updating Embedded Data"," for detailed instructions.",[102,829,831],{"id":830},"concurrency-model","Concurrency model",[514,833,834,840,845,855,861,867],{},[517,835,836,839],{},[520,837,838],{},"Pingora"," handles connection management and HTTP parsing on Tokio",[517,841,842,844],{},[520,843,120],{}," is async but most operations are CPU-bound (CIDR lookups, MMDB queries)",[517,846,847,850,851,854],{},[520,848,849],{},"LRU cache"," uses ",[114,852,853],{},"parking_lot::RwLock"," for concurrent read access",[517,856,857,860],{},[520,858,859],{},"DashMap"," for rate limit counters and cache store (lock-free sharded HashMap)",[517,862,863,866],{},[520,864,865],{},"ArcSwap"," for hot-reloading config without restarts",[517,868,869,872],{},[520,870,871],{},"Per-key Mutex"," for cache revalidation singleflight (prevents stampedes)",[102,874,876],{"id":875},"memory-layout","Memory layout",[137,878,879,891],{},[140,880,881],{},[143,882,883,886,888],{},[146,884,885],{},"Component",[146,887,560],{},[146,889,890],{},"Notes",[156,892,893,904,914,923,934,948],{},[143,894,895,898,901],{},[161,896,897],{},"Binary (code)",[161,899,900],{},"~13 MB",[161,902,903],{},"Stripped release",[143,905,906,909,911],{},[161,907,908],{},"Embedded data",[161,910,540],{},[161,912,913],{},"MMDB + CIDR lists",[143,915,916,918,920],{},[161,917,849],{},[161,919,900],{},[161,921,922],{},"65K entries × ~200 bytes",[143,924,925,928,931],{},[161,926,927],{},"Rate limit counters",[161,929,930],{},"~1 MB",[161,932,933],{},"Grows with unique keys",[143,935,936,939,942],{},[161,937,938],{},"Cache store",[161,940,941],{},"Variable",[161,943,944,945],{},"Bounded by ",[114,946,947],{},"max_object_size",[143,949,950,955,960],{},[161,951,952],{},[520,953,954],{},"Total RSS",[161,956,957],{},[520,958,959],{},"~29 MB",[161,961,962],{},"At startup",[964,965,966],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":116,"searchDepth":236,"depth":236,"links":968},[969,970,973,976,981,982],{"id":104,"depth":236,"text":105},{"id":119,"depth":236,"text":120,"children":971},[972],{"id":134,"depth":242,"text":135},{"id":210,"depth":236,"text":211,"children":974},[975],{"id":482,"depth":242,"text":483},{"id":500,"depth":236,"text":501,"children":977},[978,980],{"id":544,"depth":242,"text":979},"Data files in src\u002Fdata\u002F",{"id":727,"depth":242,"text":728},{"id":830,"depth":236,"text":831},{"id":875,"depth":236,"text":876},"System design, plugin pipeline, request context, embedded data, and concurrency model.","md",null,{},"\u002Fquayel-gateway\u002Farchitecture",{"title":93,"description":983},"quayel-gateway\u002F02.architecture","00mEJ-IKmoc0gNtAvsic0Hd5EcuxpXjJRDFxF79VMNI",[985,985],1791649769058]