[{"data":1,"prerenderedAt":864},["ShallowReactive",2],{"doc:\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting":3,"surround:\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting":613,"navigation":624},{"id":4,"title":5,"body":6,"description":606,"extension":607,"meta":608,"navigation":388,"path":609,"seo":610,"stem":611,"__hash__":612},"docs\u002F02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting.md","Rate limiting",{"type":7,"value":8,"toc":591},"minimark",[9,14,18,35,90,97,101,109,113,124,157,175,179,182,204,247,254,259,266,274,277,281,285,328,332,361,365,428,432,472,497,501,575,581,587],[10,11,13],"h2",{"id":12},"token-bucket-per-ip","Token bucket per IP",[15,16,17],"p",{},"Każdy klient (IP) ma własny token bucket:",[19,20,21,29],"ul",{},[22,23,24,28],"li",{},[25,26,27],"code",{},"requests_per_minute"," — sustained rate (domyślnie 100),",[22,30,31,34],{},[25,32,33],{},"burst"," — maksymalny jednorazowy wystrzał (domyślnie 50).",[36,37,42],"pre",{"className":38,"code":39,"language":40,"meta":41,"style":41},"language-yaml shiki shiki-themes github-light github-dark","rate_limit:\n  requests_per_minute: 100\n  burst: 50\n  trusted_proxies: []\n","yaml","",[25,43,44,57,70,81],{"__ignoreMap":41},[45,46,49,53],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"s9eBZ","rate_limit",[45,54,56],{"class":55},"sVt8B",":\n",[45,58,60,63,66],{"class":47,"line":59},2,[45,61,62],{"class":51},"  requests_per_minute",[45,64,65],{"class":55},": ",[45,67,69],{"class":68},"sj4cs","100\n",[45,71,73,76,78],{"class":47,"line":72},3,[45,74,75],{"class":51},"  burst",[45,77,65],{"class":55},[45,79,80],{"class":68},"50\n",[45,82,84,87],{"class":47,"line":83},4,[45,85,86],{"class":51},"  trusted_proxies",[45,88,89],{"class":55},": []\n",[15,91,92,93,96],{},"Bucket napełnia się ze stałą prędkością; każdy request zabiera token. Brak tokenu → ",[25,94,95],{},"429 rate_limit_exceeded",".",[10,98,100],{"id":99},"bounded-memory","Bounded memory",[15,102,103,104,108],{},"Limiter memory ma ",[105,106,107],"strong",{},"ograniczoną pamięć",": wpisy bezczynnych klientów są usuwane (idle-entry eviction), więc atak z milionów unikalnych IP nie zjada RAM-u.",[10,110,112],{"id":111},"trusted-proxies","Trusted proxies",[15,114,115,116,119,120,123],{},"Za load balancerem\u002FCDN socket address to adres pośrednika, nie klienta. ",[25,117,118],{},"trusted_proxies"," mówi, którym pośrednikom ufać przy czytaniu ",[25,121,122],{},"X-Forwarded-For",":",[36,125,127],{"className":38,"code":126,"language":40,"meta":41,"style":41},"rate_limit:\n  trusted_proxies:\n    - 10.0.0.0\u002F8\n    - 192.168.1.1\n",[25,128,129,135,141,150],{"__ignoreMap":41},[45,130,131,133],{"class":47,"line":48},[45,132,52],{"class":51},[45,134,56],{"class":55},[45,136,137,139],{"class":47,"line":59},[45,138,86],{"class":51},[45,140,56],{"class":55},[45,142,143,146],{"class":47,"line":72},[45,144,145],{"class":55},"    - ",[45,147,149],{"class":148},"sZZnC","10.0.0.0\u002F8\n",[45,151,152,154],{"class":47,"line":83},[45,153,145],{"class":55},[45,155,156],{"class":68},"192.168.1.1\n",[158,159,162],"callout",{"title":160,"type":161},"Bez trusted proxies nagłówki są ignorowane","danger",[15,163,164,165,167,168,170,171,174],{},"Jeśli ",[25,166,118],{}," jest puste, client-supplied ",[25,169,122],{}," jest ",[105,172,173],{},"ignorowany",", a limit liczony po socket address. Inaczej każdy klient mógłby spoofować IP i omijać limity.",[10,176,178],{"id":177},"rozproszony-rate-limiting-redis","Rozproszony rate limiting (Redis)",[15,180,181],{},"Wiele instancji proxy może współdzielić jeden budżet limitów przez Redis:",[36,183,185],{"className":38,"code":184,"language":40,"meta":41,"style":41},"redis:\n  addr: redis:6379\n",[25,186,187,194],{"__ignoreMap":41},[45,188,189,192],{"class":47,"line":48},[45,190,191],{"class":51},"redis",[45,193,56],{"class":55},[45,195,196,199,201],{"class":47,"line":59},[45,197,198],{"class":51},"  addr",[45,200,65],{"class":55},[45,202,203],{"class":148},"redis:6379\n",[36,205,209],{"className":206,"code":207,"language":208,"meta":41,"style":41},"language-bash shiki shiki-themes github-light github-dark","export REDIS_PASSWORD=secret\ndocker compose --profile redis up -d\n","bash",[25,210,211,226],{"__ignoreMap":41},[45,212,213,217,220,223],{"class":47,"line":48},[45,214,216],{"class":215},"szBVR","export",[45,218,219],{"class":55}," REDIS_PASSWORD",[45,221,222],{"class":215},"=",[45,224,225],{"class":55},"secret\n",[45,227,228,232,235,238,241,244],{"class":47,"line":59},[45,229,231],{"class":230},"sScJk","docker",[45,233,234],{"class":148}," compose",[45,236,237],{"class":68}," --profile",[45,239,240],{"class":148}," redis",[45,242,243],{"class":148}," up",[45,245,246],{"class":68}," -d\n",[15,248,249,250,253],{},"Limity są egzekwowane ",[105,251,252],{},"atomowo w Redis"," skryptem Lua (token bucket), więc wszystkie instancje widzą ten sam stan licznika.",[255,256,258],"h3",{"id":257},"fail-open","Fail-open",[15,260,261,262,265],{},"Jeśli Redis jest nieosiągalny, ruch ",[105,263,264],{},"płynie dalej"," (availability over strict limiting), a błędy są liczone:",[36,267,272],{"className":268,"code":270,"language":271,"meta":41},[269],"language-text","rate_limit_errors_total 3\n","text",[25,273,270],{"__ignoreMap":41},[15,275,276],{},"To świadoma decyzja: lepiej przepuścić ruch niż zabić produkcję przy awarii Redis.",[10,278,280],{"id":279},"przykłady-konfiguracji","Przykłady konfiguracji",[255,282,284],{"id":283},"publiczne-api","Publiczne API",[36,286,288],{"className":38,"code":287,"language":40,"meta":41,"style":41},"rate_limit:\n  requests_per_minute: 60\n  burst: 20\n  trusted_proxies:\n    - 172.16.0.0\u002F12\n",[25,289,290,296,305,314,320],{"__ignoreMap":41},[45,291,292,294],{"class":47,"line":48},[45,293,52],{"class":51},[45,295,56],{"class":55},[45,297,298,300,302],{"class":47,"line":59},[45,299,62],{"class":51},[45,301,65],{"class":55},[45,303,304],{"class":68},"60\n",[45,306,307,309,311],{"class":47,"line":72},[45,308,75],{"class":51},[45,310,65],{"class":55},[45,312,313],{"class":68},"20\n",[45,315,316,318],{"class":47,"line":83},[45,317,86],{"class":51},[45,319,56],{"class":55},[45,321,323,325],{"class":47,"line":322},5,[45,324,145],{"class":55},[45,326,327],{"class":148},"172.16.0.0\u002F12\n",[255,329,331],{"id":330},"wewnętrzny-mikroserwis-hojny-limit","Wewnętrzny mikroserwis (hojny limit)",[36,333,335],{"className":38,"code":334,"language":40,"meta":41,"style":41},"rate_limit:\n  requests_per_minute: 6000\n  burst: 1000\n",[25,336,337,343,352],{"__ignoreMap":41},[45,338,339,341],{"class":47,"line":48},[45,340,52],{"class":51},[45,342,56],{"class":55},[45,344,345,347,349],{"class":47,"line":59},[45,346,62],{"class":51},[45,348,65],{"class":55},[45,350,351],{"class":68},"6000\n",[45,353,354,356,358],{"class":47,"line":72},[45,355,75],{"class":51},[45,357,65],{"class":55},[45,359,360],{"class":68},"1000\n",[255,362,364],{"id":363},"wiele-instancji-proxy-redis","Wiele instancji proxy + Redis",[36,366,368],{"className":38,"code":367,"language":40,"meta":41,"style":41},"redis:\n  addr: redis:6379\n\nrate_limit:\n  requests_per_minute: 300\n  burst: 100\n  trusted_proxies:\n    - 10.0.0.0\u002F8\n",[25,369,370,376,384,390,396,405,414,421],{"__ignoreMap":41},[45,371,372,374],{"class":47,"line":48},[45,373,191],{"class":51},[45,375,56],{"class":55},[45,377,378,380,382],{"class":47,"line":59},[45,379,198],{"class":51},[45,381,65],{"class":55},[45,383,203],{"class":148},[45,385,386],{"class":47,"line":72},[45,387,389],{"emptyLinePlaceholder":388},true,"\n",[45,391,392,394],{"class":47,"line":83},[45,393,52],{"class":51},[45,395,56],{"class":55},[45,397,398,400,402],{"class":47,"line":322},[45,399,62],{"class":51},[45,401,65],{"class":55},[45,403,404],{"class":68},"300\n",[45,406,408,410,412],{"class":47,"line":407},6,[45,409,75],{"class":51},[45,411,65],{"class":55},[45,413,69],{"class":68},[45,415,417,419],{"class":47,"line":416},7,[45,418,86],{"class":51},[45,420,56],{"class":55},[45,422,424,426],{"class":47,"line":423},8,[45,425,145],{"class":55},[45,427,149],{"class":148},[10,429,431],{"id":430},"metryki","Metryki",[433,434,435,448],"table",{},[436,437,438],"thead",{},[439,440,441,445],"tr",{},[442,443,444],"th",{},"Metryka",[442,446,447],{},"Opis",[449,450,451,462],"tbody",{},[439,452,453,459],{},[454,455,456],"td",{},[25,457,458],{},"rate_limit_rejected_total",[454,460,461],{},"Requesty odrzucone z 429",[439,463,464,469],{},[454,465,466],{},[25,467,468],{},"rate_limit_errors_total",[454,470,471],{},"Błędy backendu limitingu (np. Redis down)",[36,473,475],{"className":206,"code":474,"language":208,"meta":41,"style":41},"curl -s http:\u002F\u002Flocalhost:8080\u002Fmetrics | grep rate_limit\n",[25,476,477],{"__ignoreMap":41},[45,478,479,482,485,488,491,494],{"class":47,"line":48},[45,480,481],{"class":230},"curl",[45,483,484],{"class":68}," -s",[45,486,487],{"class":148}," http:\u002F\u002Flocalhost:8080\u002Fmetrics",[45,489,490],{"class":215}," |",[45,492,493],{"class":230}," grep",[45,495,496],{"class":148}," rate_limit\n",[10,498,500],{"id":499},"testowanie-limitów","Testowanie limitów",[36,502,504],{"className":206,"code":503,"language":208,"meta":41,"style":41},"for i in $(seq 1 60); do\n  curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\\n\" http:\u002F\u002Flocalhost:8080\u002F\ndone | sort | uniq -c\n",[25,505,506,535,557],{"__ignoreMap":41},[45,507,508,511,514,517,520,523,526,529,532],{"class":47,"line":48},[45,509,510],{"class":215},"for",[45,512,513],{"class":55}," i ",[45,515,516],{"class":215},"in",[45,518,519],{"class":55}," $(",[45,521,522],{"class":230},"seq",[45,524,525],{"class":68}," 1",[45,527,528],{"class":68}," 60",[45,530,531],{"class":55},"); ",[45,533,534],{"class":215},"do\n",[45,536,537,540,542,545,548,551,554],{"class":47,"line":59},[45,538,539],{"class":230},"  curl",[45,541,484],{"class":68},[45,543,544],{"class":68}," -o",[45,546,547],{"class":148}," \u002Fdev\u002Fnull",[45,549,550],{"class":68}," -w",[45,552,553],{"class":148}," \"%{http_code}\\n\"",[45,555,556],{"class":148}," http:\u002F\u002Flocalhost:8080\u002F\n",[45,558,559,562,564,567,569,572],{"class":47,"line":72},[45,560,561],{"class":215},"done",[45,563,490],{"class":215},[45,565,566],{"class":230}," sort",[45,568,490],{"class":215},[45,570,571],{"class":230}," uniq",[45,573,574],{"class":68}," -c\n",[36,576,579],{"className":577,"code":578,"language":271,"meta":41},[269],"  50 200\n  10 429\n",[25,580,578],{"__ignoreMap":41},[15,582,583,584,586],{},"Pierwsze ",[25,585,33],{}," requestów przechodzi, kolejne dostają 429, aż bucket się napełni.",[588,589,590],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}",{"title":41,"searchDepth":72,"depth":72,"links":592},[593,594,595,596,599,604,605],{"id":12,"depth":59,"text":13},{"id":99,"depth":59,"text":100},{"id":111,"depth":59,"text":112},{"id":177,"depth":59,"text":178,"children":597},[598],{"id":257,"depth":72,"text":258},{"id":279,"depth":59,"text":280,"children":600},[601,602,603],{"id":283,"depth":72,"text":284},{"id":330,"depth":72,"text":331},{"id":363,"depth":72,"text":364},{"id":430,"depth":59,"text":431},{"id":499,"depth":59,"text":500},"Token bucket per IP z bounded memory, rozproszony limiting przez Redis (atomowy Lua) i fail-open. Konfiguracja i trusted proxies.","md",{},"\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting",{"title":5,"description":606},"02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting","6Mo297qzgIF9CTW8PHDHNb--vCz3O8YZt6V800EN6PQ",[614,619],{"title":615,"path":616,"stem":617,"description":618,"children":-1},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience","Maszyna stanów closed → open → half-open, fast-fail, bezpieczna polityka ponowień i koperty błędów z request ID.",{"title":620,"path":621,"stem":622,"description":623,"children":-1},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api","Token-authenticated API do podglądu i sterowania backendami. Bearer token, fail-closed, endpointy i przykłady curl.",[625,745,797],{"title":626,"path":627,"stem":628,"children":629},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[630,632,636,640,644,670,699,712,733,737,741],{"title":631,"path":627,"stem":628},"Przegląd",{"title":633,"path":634,"stem":635},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":637,"path":638,"stem":639},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":641,"path":642,"stem":643},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":645,"path":646,"stem":647,"children":648,"page":669},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[649,653,657,661,665],{"title":650,"path":651,"stem":652},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":654,"path":655,"stem":656},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":658,"path":659,"stem":660},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":662,"path":663,"stem":664},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":666,"path":667,"stem":668},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":671,"path":672,"stem":673,"children":674,"page":669},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[675,679,683,687,691,695],{"title":676,"path":677,"stem":678},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":680,"path":681,"stem":682},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":684,"path":685,"stem":686},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":688,"path":689,"stem":690},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":692,"path":693,"stem":694},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":696,"path":697,"stem":698},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":700,"path":701,"stem":702,"children":703,"page":669},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[704,708],{"title":705,"path":706,"stem":707},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":709,"path":710,"stem":711},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":713,"path":714,"stem":715,"children":716,"page":669},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[717,721,725,729],{"title":718,"path":719,"stem":720},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":722,"path":723,"stem":724},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":726,"path":727,"stem":728},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":730,"path":731,"stem":732},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":734,"path":735,"stem":736},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":738,"path":739,"stem":740},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":742,"path":743,"stem":744},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":746,"path":747,"stem":748,"children":749},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[750,751,754,757,772],{"title":631,"path":747,"stem":748},{"title":633,"path":752,"stem":753},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":637,"path":755,"stem":756},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":758,"path":759,"stem":760,"children":761,"page":669},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[762,766,770,771],{"title":763,"path":764,"stem":765},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":767,"path":768,"stem":769},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":615,"path":616,"stem":617},{"title":5,"path":609,"stem":611},{"title":773,"path":774,"stem":775,"children":776,"page":669},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[777,778,782,786,789,793],{"title":620,"path":621,"stem":622},{"title":779,"path":780,"stem":781},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":783,"path":784,"stem":785},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":734,"path":787,"stem":788},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":790,"path":791,"stem":792},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":794,"path":795,"stem":796},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":798,"path":799,"stem":800,"children":801},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[802,803,806,827,840,860],{"title":631,"path":799,"stem":800},{"title":633,"path":804,"stem":805},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":807,"path":808,"stem":809,"children":810,"page":669},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[811,815,819,823],{"title":812,"path":813,"stem":814},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":816,"path":817,"stem":818},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":820,"path":821,"stem":822},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":824,"path":825,"stem":826},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":828,"path":829,"stem":830,"children":831,"page":669},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[832,836],{"title":833,"path":834,"stem":835},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":837,"path":838,"stem":839},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":841,"path":842,"stem":843,"children":844,"page":669},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[845,848,852,856],{"title":641,"path":846,"stem":847},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":849,"path":850,"stem":851},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":853,"path":854,"stem":855},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":857,"path":858,"stem":859},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":861,"path":862,"stem":863},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986308479]