[{"data":1,"prerenderedAt":3864},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-kit-server":442,"-hu-kit-server-surround":3859},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":258,"body":444,"description":3852,"extension":3853,"links":3854,"meta":3855,"navigation":3856,"path":259,"seo":3857,"stem":260,"__hash__":3858},"docs_hu\u002Fhu\u002F3.kit\u002F3.server.md",{"type":445,"value":446,"toc":3830},"minimark",[447,492,521,539,544,557,627,630,868,874,879,882,911,915,978,1003,1006,1040,1044,1079,1083,1106,1151,1160,1166,1170,1293,1331,1334,1498,1514,1518,1521,1566,1570,1576,2176,2185,2189,2367,2434,2438,2457,2804,2807,2892,2896,3014,3029,3054,3058,3078,3527,3554,3588,3591,3600,3754,3757,3761,3793,3797,3826],[448,449,450,451,455,456,463,464,467,468,471,472,476,477,479,480,483,484,487,488,491],"p",{},"A ",[452,453,454],"code",{},"server"," a kit HTTP-chassis-a: egy ",[457,458,462],"a",{"href":459,"rel":460},"https:\u002F\u002Fgithub.com\u002Fgo-chi\u002Fchi",[461],"nofollow","chi"," router a standard ",[452,465,466],{},"net\u002Fhttp"," fölött, a kit hibakezelésével, validációjával és telemetriájával bekötve, a ",[457,469,470],{"href":254},"közös életciklus"," alatt futtatva. A pozicionálása ",[473,474,475],"strong",{},"stdlib-first",": a chi nem framework, hanem routing a ",[452,478,466],{}," fölött. Minden middleware sima ",[452,481,482],{},"func(http.Handler) http.Handler",", minden handler ",[452,485,486],{},"http.HandlerFunc","-kompatibilis, így a Go-ökoszisztéma bármely net\u002Fhttp-eszköze (middleware-libek, ",[452,489,490],{},"httptest",", profilerek) módosítás nélkül működik.",[493,494,499],"pre",{"className":495,"code":496,"language":497,"meta":498,"style":498},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver\"\n","go","",[452,500,501],{"__ignoreMap":498},[502,503,506,510,514,518],"span",{"class":504,"line":505},"line",1,[502,507,509],{"class":508},"s7zQu","import",[502,511,513],{"class":512},"sMK4o"," \"",[502,515,517],{"class":516},"sBMFI","github.com\u002Fgp-system\u002Fgpsystem\u002Fserver",[502,519,520],{"class":512},"\"\n",[448,522,523,524,527,528,530,531,534,535,538],{},"Ez a chassis-a minden ",[457,525,526],{"href":321},"generált"," projektnek; az alkalmazáskód sosem beszél közvetlenül a ",[452,529,466],{},"-vel, egyszer, a ",[452,532,533],{},"main","-ben hívja meg a ",[452,536,537],{},"server.Run","-t.",[540,541,543],"h2",{"id":542},"config","Config",[448,545,546,547,550,551,556],{},"A generált projektben a ",[452,548,549],{},"server.Config"," prefix nélkül ágyazódik az alkalmazás konfigjába, és az ",[457,552,553],{"href":379},[452,554,555],{},"envconf.MustLoad"," tölti env-változókból:",[493,558,561],{"className":495,"code":559,"filename":560,"language":497,"meta":498,"style":498},"type Config struct {\n    Server server.Config\n    DB     dbx.Config `envPrefix:\"DB_\"`\n    \u002F\u002F ...\n}\n","internal\u002Fplatform\u002Fconfig\u002Fconfig.go",[452,562,563,577,592,614,621],{"__ignoreMap":498},[502,564,565,568,571,574],{"class":504,"line":505},[502,566,567],{"class":512},"type",[502,569,570],{"class":516}," Config",[502,572,573],{"class":512}," struct",[502,575,576],{"class":512}," {\n",[502,578,580,584,586,589],{"class":504,"line":579},2,[502,581,583],{"class":582},"sTEyZ","    Server ",[502,585,454],{"class":516},[502,587,588],{"class":512},".",[502,590,591],{"class":516},"Config\n",[502,593,595,598,600,602,604,607,611],{"class":504,"line":594},3,[502,596,597],{"class":582},"    DB     ",[502,599,405],{"class":516},[502,601,588],{"class":512},[502,603,543],{"class":516},[502,605,606],{"class":512}," `",[502,608,610],{"class":609},"sfazB","envPrefix:\"DB_\"",[502,612,613],{"class":512},"`\n",[502,615,617],{"class":504,"line":616},4,[502,618,620],{"class":619},"sHwdD","    \u002F\u002F ...\n",[502,622,624],{"class":504,"line":623},5,[502,625,626],{"class":512},"}\n",[448,628,629],{},"A mezők és env-változóik:",[631,632,633,652],"table",{},[634,635,636],"thead",{},[637,638,639,643,646,649],"tr",{},[640,641,642],"th",{},"Mező",[640,644,645],{},"Env",[640,647,648],{},"Default",[640,650,651],{},"Mit szabályoz",[653,654,655,676,704,724,744,765,785,805,826,846],"tbody",{},[637,656,657,663,668,673],{},[658,659,660],"td",{},[452,661,662],{},"ListenAddr",[658,664,665],{},[452,666,667],{},"LISTEN_ADDR",[658,669,670],{},[452,671,672],{},":3000",[658,674,675],{},"a cím, amin a szerver hallgat",[637,677,678,683,688,693],{},[658,679,680],{},[452,681,682],{},"ShutdownTimeout",[658,684,685],{},[452,686,687],{},"SHUTDOWN_TIMEOUT",[658,689,690],{},[452,691,692],{},"10s",[658,694,695,696,699,700,703],{},"mennyi ideje van az in-flight kéréseknek ",[452,697,698],{},"SIGINT","\u002F",[452,701,702],{},"SIGTERM"," után",[637,705,706,711,716,721],{},[658,707,708],{},[452,709,710],{},"ReadHeaderTimeout",[658,712,713],{},[452,714,715],{},"READ_HEADER_TIMEOUT",[658,717,718],{},[452,719,720],{},"5s",[658,722,723],{},"meddig küldheti a kliens a kérés fejléceit (Slowloris-védelem)",[637,725,726,731,736,741],{},[658,727,728],{},[452,729,730],{},"ReadTimeout",[658,732,733],{},[452,734,735],{},"READ_TIMEOUT",[658,737,738],{},[452,739,740],{},"30s",[658,742,743],{},"a teljes kérés (fejléc + body) beolvasásának kerete",[637,745,746,751,756,762],{},[658,747,748],{},[452,749,750],{},"WriteTimeout",[658,752,753],{},[452,754,755],{},"WRITE_TIMEOUT",[658,757,758,761],{},[452,759,760],{},"0s"," (kikapcsolva)",[658,763,764],{},"a válasz kiírásának kerete",[637,766,767,772,777,782],{},[658,768,769],{},[452,770,771],{},"IdleTimeout",[658,773,774],{},[452,775,776],{},"IDLE_TIMEOUT",[658,778,779],{},[452,780,781],{},"120s",[658,783,784],{},"meddig marad nyitva egy tétlen keep-alive kapcsolat",[637,786,787,792,797,802],{},[658,788,789],{},[452,790,791],{},"CORSOrigins",[658,793,794],{},[452,795,796],{},"CORS_ORIGINS",[658,798,799],{},[452,800,801],{},"*",[658,803,804],{},"engedélyezett originok, vesszővel elválasztva",[637,806,807,812,817,823],{},[658,808,809],{},[452,810,811],{},"BodyLimit",[658,813,814],{},[452,815,816],{},"BODY_LIMIT",[658,818,819,822],{},[452,820,821],{},"4194304"," (4 MiB)",[658,824,825],{},"max kérés-body méret bájtban",[637,827,828,833,838,843],{},[658,829,830],{},[452,831,832],{},"ExposeInternalErrors",[658,834,835],{},[452,836,837],{},"HTTP_EXPOSE_INTERNAL_ERRORS",[658,839,840],{},[452,841,842],{},"false",[658,844,845],{},"belső hibarészletek az 5xx válaszokban (csak dev!)",[637,847,848,853,859,862],{},[658,849,850],{},[452,851,852],{},"Telemetry",[658,854,855],{},[856,857,858],"em",{},"(beágyazott)",[658,860,861],{},"nincs",[658,863,864,867],{},[452,865,866],{},"telemetry.Config"," (OTel, logger, Sentry)",[448,869,870,871,588],{},"A teljes env-referencia (a DB-, worker- és telemetria-változókkal együtt): ",[457,872,873],{"href":205},"Konfiguráció-referencia",[875,876,878],"h3",{"id":877},"timeoutok","Timeoutok",[448,880,881],{},"A defaultok éles forgalomra vannak hangolva, nem demókra:",[883,884,885,893,900],"ul",{},[886,887,888,892],"li",{},[473,889,890],{},[452,891,710],{}," a Slowloris-védelem első vonala: egy kliens, aki bájtonként csöpögteti a fejléceket, 5 másodperc után lekapcsolódik.",[886,894,895,899],{},[473,896,897],{},[452,898,730],{}," a teljes kérés beolvasását fedi.",[886,901,902,906,907,910],{},[473,903,904],{},[452,905,750],{}," szándékosan ",[452,908,909],{},"0"," (kikapcsolva): a lassú vagy streamelő válaszokat (nagy letöltés, SSE) is elvágná. Kapcsold be, ha minden endpointod rövid életű.",[875,912,914],{"id":913},"body-limit-sosem-kapcsolható-ki-véletlenül","Body limit: sosem kapcsolható ki véletlenül",[493,916,918],{"className":495,"code":917,"language":497,"meta":498,"style":498},"const DefaultBodyLimit = 4 \u003C\u003C 20 \u002F\u002F 4 MiB\n\nfunc (c Config) EffectiveBodyLimit() int\n",[452,919,920,944,950],{"__ignoreMap":498},[502,921,922,925,928,931,935,938,941],{"class":504,"line":505},[502,923,924],{"class":512},"const",[502,926,927],{"class":582}," DefaultBodyLimit ",[502,929,930],{"class":512},"=",[502,932,934],{"class":933},"sbssI"," 4",[502,936,937],{"class":512}," \u003C\u003C",[502,939,940],{"class":933}," 20",[502,942,943],{"class":619}," \u002F\u002F 4 MiB\n",[502,945,946],{"class":504,"line":579},[502,947,949],{"emptyLinePlaceholder":948},true,"\n",[502,951,952,955,958,962,964,967,971,974],{"class":504,"line":594},[502,953,954],{"class":512},"func",[502,956,957],{"class":512}," (",[502,959,961],{"class":960},"sHdIc","c ",[502,963,543],{"class":516},[502,965,966],{"class":512},")",[502,968,970],{"class":969},"s2Zo4"," EffectiveBodyLimit",[502,972,973],{"class":512},"()",[502,975,977],{"class":976},"spNyl"," int\n",[448,979,450,980,982,983,985,986,989,990,992,993,996,997,999,1000,588],{},[452,981,454],{}," sosem a nyers ",[452,984,811],{}," mezőt olvassa, hanem az ",[452,987,988],{},"EffectiveBodyLimit()","-et: egy ",[452,991,909],{}," vagy negatív érték ",[473,994,995],{},"nem"," „korlátlant\" jelent, hanem visszaesik a 4 MiB defaultra. Egy elgépelt vagy üresen hagyott ",[452,998,816],{}," így nem tudja észrevétlenül levenni a sapkát. A limit túllépése 413-as ",[457,1001,1002],{"href":396},"problem-válasz",[875,1004,837],{"id":1005},"http_expose_internal_errors",[448,1007,1008,1011,1012,1015,1016,1020,1021,1024,1025,1028,1029,1032,1033,1036,1037,1039],{},[452,1009,1010],{},"true"," értékkel az 5xx válaszok ",[452,1013,1014],{},"detail","-je a mögöttes hibaüzenetet hordozza, és, ha a láncban ",[457,1017,1018],{"href":363},[452,1019,358],{}," hiba van, a válasz ",[452,1022,1023],{},"stack"," és ",[452,1026,1027],{},"chain"," extension membereket is kap. Szándékosan ",[473,1030,1031],{},"külön"," kapcsoló az ",[452,1034,1035],{},"OTEL_DEV_MODE","-tól: a dev-logolás bekapcsolása így nem kezdhet el véletlenül belső részleteket szivárogtatni a klienseknek. Productionben hagyd ",[452,1038,842],{},"-on: a részletek ott a logba és a Sentry-be mennek, nem a válaszba.",[875,1041,1043],{"id":1042},"a-beágyazott-telemetria","A beágyazott telemetria",[448,1045,450,1046,1048,1049,1051,1052,1055,1056,1059,1060,1059,1062,1059,1065,1068,1069,1071,1072,1075,1076,588],{},[452,1047,852],{}," mező egy ",[452,1050,866],{},": az OTel bootstrap, az alapértelmezett ",[452,1053,1054],{},"slog"," logger és az opcionális Sentry-integráció beállításai (",[452,1057,1058],{},"OTEL_SERVICE_NAME",", ",[452,1061,1035],{},[452,1063,1064],{},"LOG_LEVEL",[452,1066,1067],{},"SENTRY_DSN",", ..., mind standard név, prefix nélkül). A ",[452,1070,537],{}," ebből hívja a ",[452,1073,1074],{},"telemetry.Setup","-ot, mielőtt bármi más elindulna. Részletek: ",[457,1077,1078],{"href":180},"Observability",[540,1080,1082],{"id":1081},"a-közös-életciklus","A közös életciklus",[448,1084,450,1085,1087,1088,1093,1094,1099,1100,1105],{},[452,1086,454],{}," nem maga implementálja a graceful shutdownt: az engine-agnosztikus ",[457,1089,1090],{"href":254},[452,1091,1092],{},"app"," csomagra delegál, ugyanarra, amire a ",[457,1095,1096],{"href":264},[452,1097,1098],{},"worker"," és a ",[457,1101,1102],{"href":269},[452,1103,1104],{},"realtime"," is épül. A folyamat minden gpsystem-processzben ugyanaz:",[1107,1108,1109,1114,1121,1124,1138,1148],"ol",{},[886,1110,1111,1113],{},[452,1112,1074],{},": OTel, logger, Sentry.",[886,1115,1116,1117,1120],{},"Route-regisztráció (a te ",[452,1118,1119],{},"register"," függvényed).",[886,1122,1123],{},"Listen: a processz innentől blokkol.",[886,1125,1126,699,1128,1130,1131,1133,1134,1137],{},[452,1127,698],{},[452,1129,702],{},"-re: a szerver nem fogad új kérést, és a ",[452,1132,682],{},"-on belül kivárja az in-flight kéréseket. Egy ",[473,1135,1136],{},"második"," signal azonnal öli a processzt.",[886,1139,450,1140,1143,1144,1147],{},[452,1141,1142],{},"WithCloser","-rel regisztrált cleanupok ",[473,1145,1146],{},"LIFO"," sorrendben lefutnak (saját türelmi idővel, akkor is, ha a drain elfogyasztotta a keretet).",[886,1149,1150],{},"Utolsóként a telemetria flush-ol: a closerekben keletkező spanok így még exportálódnak.",[448,1152,1153,1154,1156,1157,1159],{},"A pontos sorrendet és a signal-kezelés részleteit az ",[457,1155,253],{"href":254}," oldal írja le; ez az oldal azt mutatja, mit köt be a ",[452,1158,537],{}," erre a közös vázra.",[1161,1162,450,1163,1165],"note",{},[452,1164,549],{}," a teljes webszerver-konfigurációt hordozza: minden mező env-változóból töltődik be, típusosan, és a graceful shutdown nem egy külső process manager dolga, hanem a binárisé.",[540,1167,1169],{"id":1168},"mit-köt-be-a-serverrun","Mit köt be a server.Run",[493,1171,1173],{"className":495,"code":1172,"language":497,"meta":498,"style":498},"func Run(ctx context.Context, cfg Config, register RegisterFunc, opts ...Option) error\nfunc New(cfg Config, opts ...Option) *chi.Mux \u002F\u002F tesztekhez, speciális esetekre\n\ntype RegisterFunc func(r chi.Router) error\n",[452,1174,1175,1228,1265,1269],{"__ignoreMap":498},[502,1176,1177,1179,1182,1185,1188,1191,1193,1196,1199,1202,1204,1206,1209,1212,1214,1217,1220,1223,1225],{"class":504,"line":505},[502,1178,954],{"class":512},[502,1180,1181],{"class":969}," Run",[502,1183,1184],{"class":512},"(",[502,1186,1187],{"class":960},"ctx",[502,1189,1190],{"class":516}," context",[502,1192,588],{"class":512},[502,1194,1195],{"class":516},"Context",[502,1197,1198],{"class":512},",",[502,1200,1201],{"class":960}," cfg",[502,1203,570],{"class":516},[502,1205,1198],{"class":512},[502,1207,1208],{"class":960}," register",[502,1210,1211],{"class":516}," RegisterFunc",[502,1213,1198],{"class":512},[502,1215,1216],{"class":960}," opts",[502,1218,1219],{"class":512}," ...",[502,1221,1222],{"class":516},"Option",[502,1224,966],{"class":512},[502,1226,1227],{"class":976}," error\n",[502,1229,1230,1232,1235,1237,1240,1242,1244,1246,1248,1250,1252,1255,1257,1259,1262],{"class":504,"line":579},[502,1231,954],{"class":512},[502,1233,1234],{"class":969}," New",[502,1236,1184],{"class":512},[502,1238,1239],{"class":960},"cfg",[502,1241,570],{"class":516},[502,1243,1198],{"class":512},[502,1245,1216],{"class":960},[502,1247,1219],{"class":512},[502,1249,1222],{"class":516},[502,1251,966],{"class":512},[502,1253,1254],{"class":512}," *",[502,1256,462],{"class":516},[502,1258,588],{"class":512},[502,1260,1261],{"class":516},"Mux",[502,1263,1264],{"class":619}," \u002F\u002F tesztekhez, speciális esetekre\n",[502,1266,1267],{"class":504,"line":594},[502,1268,949],{"emptyLinePlaceholder":948},[502,1270,1271,1273,1275,1278,1281,1284,1286,1289,1291],{"class":504,"line":616},[502,1272,567],{"class":512},[502,1274,1211],{"class":516},[502,1276,1277],{"class":512}," func(",[502,1279,1280],{"class":960},"r",[502,1282,1283],{"class":516}," chi",[502,1285,588],{"class":512},[502,1287,1288],{"class":516},"Router",[502,1290,966],{"class":512},[502,1292,1227],{"class":976},[448,1294,450,1295,1298,1299,1302,1303,1306,1307,1310,1311,699,1313,1315,1316,1319,1320,1323,1324,1326,1327,1330],{},[452,1296,1297],{},"Run"," blokkol a kilépésig: telemetria bootstrap → router felépítése → ",[452,1300,1301],{},"register(r)"," → ",[452,1304,1305],{},"http.Server"," + ",[452,1308,1309],{},"ListenAndServe"," → graceful shutdown ",[452,1312,698],{},[452,1314,702],{},"-re. Tiszta leállásnál ",[452,1317,1318],{},"nil","-t ad vissza. A ",[452,1321,1322],{},"New"," a teljesen bekötött routert adja vissza futtatás és telemetria-bootstrap nélkül: a ",[452,1325,490],{},"-tel párosítod (lásd ",[457,1328,169],{"href":1329},"#tesztel%C3%A9s",").",[448,1332,1333],{},"A middleware-lánc és a router-szintű kezelők, ebben a sorrendben:",[631,1335,1336,1349],{},[634,1337,1338],{},[637,1339,1340,1343,1346],{},[640,1341,1342],{},"Mi",[640,1344,1345],{},"Honnan",[640,1347,1348],{},"Mit csinál",[653,1350,1351,1373,1391,1406,1419,1436,1461,1482],{},[637,1352,1353,1356,1359],{},[658,1354,1355],{},"recoverer",[658,1357,1358],{},"kit",[658,1360,1361,1362,1364,1365,1368,1369,1372],{},"egy panicból ",[452,1363,358],{}," hiba lesz, aminek a stackje a ",[473,1366,1367],{},"panic helyére"," mutat, és 500-as problem-válaszként renderelődik (az ",[452,1370,1371],{},"http.ErrAbortHandler","-t, a net\u002Fhttp flow-control szignálját, továbbengedi)",[637,1374,1375,1378,1380],{},[658,1376,1377],{},"validátor-injektor",[658,1379,1358],{},[658,1381,1382,1383,1386,1387,1390],{},"a ",[452,1384,1385],{},"WithValidator","-ral adott validátort a request contextbe teszi, ahol a ",[452,1388,1389],{},"StrictValidator(nil)"," megtalálja (lásd lent)",[637,1392,1393,1396,1401],{},[658,1394,1395],{},"OTel middleware",[658,1397,1398],{},[452,1399,1400],{},"otelhttp",[658,1402,1403,1404],{},"kérésenkénti szerver-span + HTTP-metrikák: ",[457,1405,188],{"href":189},[637,1407,1408,1411,1413],{},[658,1409,1410],{},"Sentry request hub",[658,1412,1358],{},[658,1414,1415,1416,1418],{},"kérésenkénti izolált Sentry hub, hogy a breadcrumbök ne keveredjenek kérések között; no-op, ha a ",[457,1417,193],{"href":194}," ki van kapcsolva",[637,1420,1421,1424,1429],{},[658,1422,1423],{},"dev logger",[658,1425,1426],{},[452,1427,1428],{},"chi\u002Fmiddleware.Logger",[658,1430,1431,1432,1435],{},"csak ",[452,1433,1434],{},"OTEL_DEV_MODE=true"," mellett: kérés-log a konzolra",[637,1437,1438,1441,1446],{},[658,1439,1440],{},"CORS",[658,1442,1443],{},[452,1444,1445],{},"go-chi\u002Fcors",[658,1447,1448,1450,1451,1059,1454,1306,1457,1460],{},[452,1449,796],{},"-ból; ",[452,1452,1453],{},"GET\u002FPOST\u002FPUT\u002FPATCH\u002FDELETE\u002FOPTIONS",[452,1455,1456],{},"Content-Type",[452,1458,1459],{},"Authorization"," fejlécek",[637,1462,1463,1466,1471],{},[658,1464,1465],{},"body limit",[658,1467,1468],{},[452,1469,1470],{},"chi\u002Fmiddleware.RequestSize",[658,1472,1473,1474,1477,1478,1481],{},"a body-t ",[452,1475,1476],{},"http.MaxBytesReader","-be csomagolja ",[452,1479,1480],{},"cfg.EffectiveBodyLimit()","-tel: túllépésnél 413-as problem",[637,1483,1484,1493,1495],{},[658,1485,1486,1489,1490],{},[452,1487,1488],{},"NotFound"," \u002F ",[452,1491,1492],{},"MethodNotAllowed",[658,1494,1358],{},[658,1496,1497],{},"a chi gyári plain-text hibái helyett 404\u002F405 problem+json; a mountolt subrouterek öröklik",[448,1499,450,1500,1502,1503,1505,1506,1059,1508,1059,1510,1059,1512,1330],{},[452,1501,549],{}," timeoutjai a ",[452,1504,1305],{},"-be fordulnak (",[452,1507,710],{},[452,1509,730],{},[452,1511,750],{},[452,1513,771],{},[875,1515,1517],{"id":1516},"hibarenderelés-a-nethttp-ban-nincs-központi-error-handler","Hibarenderelés: a net\u002Fhttp-ban nincs központi error handler",[448,1519,1520],{},"A beépített error hookkal rendelkező frameworkökkel szemben a net\u002Fhttp nem ad módot arra, hogy egy handler „visszaadjon\" egy hibát a frameworknek: a handler maga írja meg a választ. A kit ezt három ponton hidalja át, hogy a drót-oldali viselkedés mindenhol egységes legyen:",[883,1522,1523,1546,1552],{},[886,1524,1382,1525,1528,1529,1534,1535,1059,1538,1541,1542,1545],{},[473,1526,1527],{},"generált szerverkód hibahookjai"," a ",[457,1530,1531,1533],{"href":396},[452,1532,386],{}," net\u002Fhttp íróira"," vannak kötve (",[452,1536,1537],{},"WriteError",[452,1539,1540],{},"WriteBadRequest","): a handleredből visszaadott hiba így a ",[457,1543,1544],{"href":396},"teljes mappingen"," megy át;",[886,1547,1382,1548,1551],{},[473,1549,1550],{},"router-szintű esetek"," (panic, 404, 405, body limit) a fenti táblázat szerint problemként renderelődnek;",[886,1553,1382,1554,1557,1558,1561,1562,1565],{},[473,1555,1556],{},"kérés-validáció"," nem bind-time fut (a strict szerver ",[452,1559,1560],{},"json.Decoder","-rel dekódol), hanem a ",[452,1563,1564],{},"server.StrictValidator"," strict middleware-ben (lásd lent).",[540,1567,1569],{"id":1568},"a-shop-belépési-pontja","A shop belépési pontja",[448,1571,450,1572,1575],{},[457,1573,1574],{"href":41},"mintaalkalmazás"," HTTP-binárisa, amelynek minden sorát a generátor írta:",[493,1577,1580],{"className":495,"code":1578,"filename":1579,"language":497,"meta":498,"style":498},"package main\n\nimport (\n    \"context\"\n    \"log\"\n\n    \"github.com\u002Fgo-chi\u002Fchi\u002Fv5\"\n\n    \"github.com\u002Fgp-system\u002Fdbx\u002Fpg\"\n    \"github.com\u002Fgp-system\u002Fenvconf\"\n    \"github.com\u002Fgp-system\u002Fevents\u002Foutbox\"\n    \"github.com\u002Fgp-system\u002Fgpsystem\u002Fserver\"\n\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop\"\n    \"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig\"\n)\n\nfunc main() {\n    cfg := envconf.MustLoad[config.Config]()\n    ctx := context.Background()\n    pool := pg.MustNewPool(ctx, cfg.DB)\n\n    err := server.Run(ctx, cfg.Server, func(r chi.Router) error {\n        api := chi.NewRouter()\n        deps := shop.Dependencies{\n            DB:         pg.NewDB(pool),\n            Transactor: pg.NewTransactor(pool),\n            Dispatcher: outbox.NewDispatcher(outbox.NewStore(pg.NewDB(pool))),\n        }\n        shop.RegisterApi(api, deps)\n        shop.RegisterAdmin(api, deps)\n        r.Mount(\"\u002Fapi\u002Fv1\", api)\n        return nil\n    }, server.WithCloser(\"pgxpool\", func(context.Context) error {\n        pool.Close()\n        return nil\n    }))\n    if err != nil {\n        log.Fatal(err)\n    }\n}\n","cmd\u002Fshop\u002Fmain.go",[452,1581,1582,1590,1594,1601,1611,1620,1625,1635,1640,1650,1660,1670,1679,1684,1694,1704,1710,1715,1727,1756,1774,1805,1810,1857,1874,1893,1918,1939,1981,1987,2010,2030,2058,2067,2104,2117,2124,2130,2147,2165,2171],{"__ignoreMap":498},[502,1583,1584,1587],{"class":504,"line":505},[502,1585,1586],{"class":512},"package",[502,1588,1589],{"class":516}," main\n",[502,1591,1592],{"class":504,"line":579},[502,1593,949],{"emptyLinePlaceholder":948},[502,1595,1596,1598],{"class":504,"line":594},[502,1597,509],{"class":508},[502,1599,1600],{"class":512}," (\n",[502,1602,1603,1606,1609],{"class":504,"line":616},[502,1604,1605],{"class":512},"    \"",[502,1607,1608],{"class":516},"context",[502,1610,520],{"class":512},[502,1612,1613,1615,1618],{"class":504,"line":623},[502,1614,1605],{"class":512},[502,1616,1617],{"class":516},"log",[502,1619,520],{"class":512},[502,1621,1623],{"class":504,"line":1622},6,[502,1624,949],{"emptyLinePlaceholder":948},[502,1626,1628,1630,1633],{"class":504,"line":1627},7,[502,1629,1605],{"class":512},[502,1631,1632],{"class":516},"github.com\u002Fgo-chi\u002Fchi\u002Fv5",[502,1634,520],{"class":512},[502,1636,1638],{"class":504,"line":1637},8,[502,1639,949],{"emptyLinePlaceholder":948},[502,1641,1643,1645,1648],{"class":504,"line":1642},9,[502,1644,1605],{"class":512},[502,1646,1647],{"class":516},"github.com\u002Fgp-system\u002Fdbx\u002Fpg",[502,1649,520],{"class":512},[502,1651,1653,1655,1658],{"class":504,"line":1652},10,[502,1654,1605],{"class":512},[502,1656,1657],{"class":516},"github.com\u002Fgp-system\u002Fenvconf",[502,1659,520],{"class":512},[502,1661,1663,1665,1668],{"class":504,"line":1662},11,[502,1664,1605],{"class":512},[502,1666,1667],{"class":516},"github.com\u002Fgp-system\u002Fevents\u002Foutbox",[502,1669,520],{"class":512},[502,1671,1673,1675,1677],{"class":504,"line":1672},12,[502,1674,1605],{"class":512},[502,1676,517],{"class":516},[502,1678,520],{"class":512},[502,1680,1682],{"class":504,"line":1681},13,[502,1683,949],{"emptyLinePlaceholder":948},[502,1685,1687,1689,1692],{"class":504,"line":1686},14,[502,1688,1605],{"class":512},[502,1690,1691],{"class":516},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fmodules\u002Fshop",[502,1693,520],{"class":512},[502,1695,1697,1699,1702],{"class":504,"line":1696},15,[502,1698,1605],{"class":512},[502,1700,1701],{"class":516},"github.com\u002Facme\u002Fshop\u002Finternal\u002Fplatform\u002Fconfig",[502,1703,520],{"class":512},[502,1705,1707],{"class":504,"line":1706},16,[502,1708,1709],{"class":512},")\n",[502,1711,1713],{"class":504,"line":1712},17,[502,1714,949],{"emptyLinePlaceholder":948},[502,1716,1718,1720,1723,1725],{"class":504,"line":1717},18,[502,1719,954],{"class":512},[502,1721,1722],{"class":969}," main",[502,1724,973],{"class":512},[502,1726,576],{"class":512},[502,1728,1730,1733,1736,1739,1741,1744,1747,1749,1751,1753],{"class":504,"line":1729},19,[502,1731,1732],{"class":582},"    cfg ",[502,1734,1735],{"class":512},":=",[502,1737,1738],{"class":582}," envconf",[502,1740,588],{"class":512},[502,1742,1743],{"class":969},"MustLoad",[502,1745,1746],{"class":512},"[",[502,1748,542],{"class":516},[502,1750,588],{"class":512},[502,1752,543],{"class":516},[502,1754,1755],{"class":512},"]()\n",[502,1757,1759,1762,1764,1766,1768,1771],{"class":504,"line":1758},20,[502,1760,1761],{"class":582},"    ctx ",[502,1763,1735],{"class":512},[502,1765,1190],{"class":582},[502,1767,588],{"class":512},[502,1769,1770],{"class":969},"Background",[502,1772,1773],{"class":512},"()\n",[502,1775,1777,1780,1782,1785,1787,1790,1792,1794,1796,1798,1800,1803],{"class":504,"line":1776},21,[502,1778,1779],{"class":582},"    pool ",[502,1781,1735],{"class":512},[502,1783,1784],{"class":582}," pg",[502,1786,588],{"class":512},[502,1788,1789],{"class":969},"MustNewPool",[502,1791,1184],{"class":512},[502,1793,1187],{"class":582},[502,1795,1198],{"class":512},[502,1797,1201],{"class":582},[502,1799,588],{"class":512},[502,1801,1802],{"class":582},"DB",[502,1804,1709],{"class":512},[502,1806,1808],{"class":504,"line":1807},22,[502,1809,949],{"emptyLinePlaceholder":948},[502,1811,1813,1816,1818,1821,1823,1825,1827,1829,1831,1833,1835,1838,1840,1842,1844,1846,1848,1850,1852,1855],{"class":504,"line":1812},23,[502,1814,1815],{"class":582},"    err ",[502,1817,1735],{"class":512},[502,1819,1820],{"class":582}," server",[502,1822,588],{"class":512},[502,1824,1297],{"class":969},[502,1826,1184],{"class":512},[502,1828,1187],{"class":582},[502,1830,1198],{"class":512},[502,1832,1201],{"class":582},[502,1834,588],{"class":512},[502,1836,1837],{"class":582},"Server",[502,1839,1198],{"class":512},[502,1841,1277],{"class":512},[502,1843,1280],{"class":960},[502,1845,1283],{"class":516},[502,1847,588],{"class":512},[502,1849,1288],{"class":516},[502,1851,966],{"class":512},[502,1853,1854],{"class":976}," error",[502,1856,576],{"class":512},[502,1858,1860,1863,1865,1867,1869,1872],{"class":504,"line":1859},24,[502,1861,1862],{"class":582},"        api ",[502,1864,1735],{"class":512},[502,1866,1283],{"class":582},[502,1868,588],{"class":512},[502,1870,1871],{"class":969},"NewRouter",[502,1873,1773],{"class":512},[502,1875,1877,1880,1882,1885,1887,1890],{"class":504,"line":1876},25,[502,1878,1879],{"class":582},"        deps ",[502,1881,1735],{"class":512},[502,1883,1884],{"class":516}," shop",[502,1886,588],{"class":512},[502,1888,1889],{"class":516},"Dependencies",[502,1891,1892],{"class":512},"{\n",[502,1894,1896,1899,1902,1905,1907,1910,1912,1915],{"class":504,"line":1895},26,[502,1897,1898],{"class":582},"            DB",[502,1900,1901],{"class":512},":",[502,1903,1904],{"class":582},"         pg",[502,1906,588],{"class":512},[502,1908,1909],{"class":969},"NewDB",[502,1911,1184],{"class":512},[502,1913,1914],{"class":582},"pool",[502,1916,1917],{"class":512},"),\n",[502,1919,1921,1924,1926,1928,1930,1933,1935,1937],{"class":504,"line":1920},27,[502,1922,1923],{"class":582},"            Transactor",[502,1925,1901],{"class":512},[502,1927,1784],{"class":582},[502,1929,588],{"class":512},[502,1931,1932],{"class":969},"NewTransactor",[502,1934,1184],{"class":512},[502,1936,1914],{"class":582},[502,1938,1917],{"class":512},[502,1940,1942,1945,1947,1950,1952,1955,1957,1960,1962,1965,1967,1970,1972,1974,1976,1978],{"class":504,"line":1941},28,[502,1943,1944],{"class":582},"            Dispatcher",[502,1946,1901],{"class":512},[502,1948,1949],{"class":582}," outbox",[502,1951,588],{"class":512},[502,1953,1954],{"class":969},"NewDispatcher",[502,1956,1184],{"class":512},[502,1958,1959],{"class":582},"outbox",[502,1961,588],{"class":512},[502,1963,1964],{"class":969},"NewStore",[502,1966,1184],{"class":512},[502,1968,1969],{"class":582},"pg",[502,1971,588],{"class":512},[502,1973,1909],{"class":969},[502,1975,1184],{"class":512},[502,1977,1914],{"class":582},[502,1979,1980],{"class":512},"))),\n",[502,1982,1984],{"class":504,"line":1983},29,[502,1985,1986],{"class":512},"        }\n",[502,1988,1990,1993,1995,1998,2000,2003,2005,2008],{"class":504,"line":1989},30,[502,1991,1992],{"class":582},"        shop",[502,1994,588],{"class":512},[502,1996,1997],{"class":969},"RegisterApi",[502,1999,1184],{"class":512},[502,2001,2002],{"class":582},"api",[502,2004,1198],{"class":512},[502,2006,2007],{"class":582}," deps",[502,2009,1709],{"class":512},[502,2011,2013,2015,2017,2020,2022,2024,2026,2028],{"class":504,"line":2012},31,[502,2014,1992],{"class":582},[502,2016,588],{"class":512},[502,2018,2019],{"class":969},"RegisterAdmin",[502,2021,1184],{"class":512},[502,2023,2002],{"class":582},[502,2025,1198],{"class":512},[502,2027,2007],{"class":582},[502,2029,1709],{"class":512},[502,2031,2033,2036,2038,2041,2043,2046,2049,2051,2053,2056],{"class":504,"line":2032},32,[502,2034,2035],{"class":582},"        r",[502,2037,588],{"class":512},[502,2039,2040],{"class":969},"Mount",[502,2042,1184],{"class":512},[502,2044,2045],{"class":512},"\"",[502,2047,2048],{"class":609},"\u002Fapi\u002Fv1",[502,2050,2045],{"class":512},[502,2052,1198],{"class":512},[502,2054,2055],{"class":582}," api",[502,2057,1709],{"class":512},[502,2059,2061,2064],{"class":504,"line":2060},33,[502,2062,2063],{"class":508},"        return",[502,2065,2066],{"class":512}," nil\n",[502,2068,2070,2073,2075,2077,2079,2081,2083,2086,2088,2090,2092,2094,2096,2098,2100,2102],{"class":504,"line":2069},34,[502,2071,2072],{"class":512},"    },",[502,2074,1820],{"class":582},[502,2076,588],{"class":512},[502,2078,1142],{"class":969},[502,2080,1184],{"class":512},[502,2082,2045],{"class":512},[502,2084,2085],{"class":609},"pgxpool",[502,2087,2045],{"class":512},[502,2089,1198],{"class":512},[502,2091,1277],{"class":512},[502,2093,1608],{"class":516},[502,2095,588],{"class":512},[502,2097,1195],{"class":516},[502,2099,966],{"class":512},[502,2101,1854],{"class":976},[502,2103,576],{"class":512},[502,2105,2107,2110,2112,2115],{"class":504,"line":2106},35,[502,2108,2109],{"class":582},"        pool",[502,2111,588],{"class":512},[502,2113,2114],{"class":969},"Close",[502,2116,1773],{"class":512},[502,2118,2120,2122],{"class":504,"line":2119},36,[502,2121,2063],{"class":508},[502,2123,2066],{"class":512},[502,2125,2127],{"class":504,"line":2126},37,[502,2128,2129],{"class":512},"    }))\n",[502,2131,2133,2136,2139,2142,2145],{"class":504,"line":2132},38,[502,2134,2135],{"class":508},"    if",[502,2137,2138],{"class":582}," err ",[502,2140,2141],{"class":512},"!=",[502,2143,2144],{"class":512}," nil",[502,2146,576],{"class":512},[502,2148,2150,2153,2155,2158,2160,2163],{"class":504,"line":2149},39,[502,2151,2152],{"class":582},"        log",[502,2154,588],{"class":512},[502,2156,2157],{"class":969},"Fatal",[502,2159,1184],{"class":512},[502,2161,2162],{"class":582},"err",[502,2164,1709],{"class":512},[502,2166,2168],{"class":504,"line":2167},40,[502,2169,2170],{"class":512},"    }\n",[502,2172,2174],{"class":504,"line":2173},41,[502,2175,626],{"class":512},[448,2177,2178,2179,2181,2182,2184],{},"A prefixelés ",[452,2180,2040],{},"-tal történik: minden modul surface-ei egy friss subrouterre regisztrálnak, ami a ",[452,2183,2048],{}," alá mountolódik.",[875,2186,2188],{"id":2187},"opciók","Opciók",[493,2190,2192],{"className":495,"code":2191,"language":497,"meta":498,"style":498},"server.WithCloser(\"pgxpool\", func(ctx context.Context) error { pool.Close(); return nil })\nserver.WithMiddleware(myRateLimiter, myRequestID)          \u002F\u002F ...func(http.Handler) http.Handler\nserver.WithHTTPServer(func(s *http.Server) { s.MaxHeaderBytes = 1 \u003C\u003C 16 })\nserver.WithValidator(validate.New(validate.WithRegister(registerCustomTags)))\nserver.WithoutTelemetry()                                  \u002F\u002F tesztek \u002F külső OTel setup\n",[452,2193,2194,2247,2271,2319,2353],{"__ignoreMap":498},[502,2195,2196,2198,2200,2202,2204,2206,2208,2210,2212,2214,2216,2218,2220,2222,2224,2226,2229,2232,2234,2236,2239,2242,2244],{"class":504,"line":505},[502,2197,454],{"class":582},[502,2199,588],{"class":512},[502,2201,1142],{"class":969},[502,2203,1184],{"class":512},[502,2205,2045],{"class":512},[502,2207,2085],{"class":609},[502,2209,2045],{"class":512},[502,2211,1198],{"class":512},[502,2213,1277],{"class":512},[502,2215,1187],{"class":960},[502,2217,1190],{"class":516},[502,2219,588],{"class":512},[502,2221,1195],{"class":516},[502,2223,966],{"class":512},[502,2225,1854],{"class":976},[502,2227,2228],{"class":512}," {",[502,2230,2231],{"class":582}," pool",[502,2233,588],{"class":512},[502,2235,2114],{"class":969},[502,2237,2238],{"class":512},"();",[502,2240,2241],{"class":508}," return",[502,2243,2144],{"class":512},[502,2245,2246],{"class":512}," })\n",[502,2248,2249,2251,2253,2256,2258,2261,2263,2266,2268],{"class":504,"line":579},[502,2250,454],{"class":582},[502,2252,588],{"class":512},[502,2254,2255],{"class":969},"WithMiddleware",[502,2257,1184],{"class":512},[502,2259,2260],{"class":582},"myRateLimiter",[502,2262,1198],{"class":512},[502,2264,2265],{"class":582}," myRequestID",[502,2267,966],{"class":512},[502,2269,2270],{"class":619},"          \u002F\u002F ...func(http.Handler) http.Handler\n",[502,2272,2273,2275,2277,2280,2283,2286,2288,2291,2293,2295,2297,2299,2302,2304,2307,2309,2312,2314,2317],{"class":504,"line":594},[502,2274,454],{"class":582},[502,2276,588],{"class":512},[502,2278,2279],{"class":969},"WithHTTPServer",[502,2281,2282],{"class":512},"(func(",[502,2284,2285],{"class":960},"s",[502,2287,1254],{"class":512},[502,2289,2290],{"class":516},"http",[502,2292,588],{"class":512},[502,2294,1837],{"class":516},[502,2296,966],{"class":512},[502,2298,2228],{"class":512},[502,2300,2301],{"class":582}," s",[502,2303,588],{"class":512},[502,2305,2306],{"class":582},"MaxHeaderBytes ",[502,2308,930],{"class":512},[502,2310,2311],{"class":933}," 1",[502,2313,937],{"class":512},[502,2315,2316],{"class":933}," 16",[502,2318,2246],{"class":512},[502,2320,2321,2323,2325,2327,2329,2332,2334,2336,2338,2340,2342,2345,2347,2350],{"class":504,"line":616},[502,2322,454],{"class":582},[502,2324,588],{"class":512},[502,2326,1385],{"class":969},[502,2328,1184],{"class":512},[502,2330,2331],{"class":582},"validate",[502,2333,588],{"class":512},[502,2335,1322],{"class":969},[502,2337,1184],{"class":512},[502,2339,2331],{"class":582},[502,2341,588],{"class":512},[502,2343,2344],{"class":969},"WithRegister",[502,2346,1184],{"class":512},[502,2348,2349],{"class":582},"registerCustomTags",[502,2351,2352],{"class":512},")))\n",[502,2354,2355,2357,2359,2362,2364],{"class":504,"line":623},[502,2356,454],{"class":582},[502,2358,588],{"class":512},[502,2360,2361],{"class":969},"WithoutTelemetry",[502,2363,973],{"class":512},[502,2365,2366],{"class":619},"                                  \u002F\u002F tesztek \u002F külső OTel setup\n",[883,2368,2369,2380,2392,2407,2423],{},[886,2370,2371,2376,2377,2379],{},[473,2372,2373],{},[452,2374,2375],{},"WithCloser(name, fn)",": cleanup graceful shutdownkor, miután a szerver már nem fogad kérést. A closerek ",[473,2378,1146],{}," sorrendben futnak; a telemetria utolsóként flush-ol, így egy closerben emittált span még exportálódik.",[886,2381,2382,2387,2388,2391],{},[473,2383,2384],{},[452,2385,2386],{},"WithMiddleware(...func(http.Handler) http.Handler)",": router-szintű middleware a kit defaultjai után. A standard net\u002Fhttp middleware-forma: bármely ökoszisztéma-middleware ide passzol. Ami csak egy surface-re kell, azt a surface ",[452,2389,2390],{},"Route","-jára tedd (lásd lent).",[886,2393,2394,2399,2400,2402,2403,2406],{},[473,2395,2396],{},[452,2397,2398],{},"WithHTTPServer(func(*http.Server))",": escape hatch a ",[452,2401,1305],{}," azon mezőihez, amiket a kit nem exponál (TLS, ",[452,2404,2405],{},"MaxHeaderBytes",", ...). A kit által beállított mezőket is felülírhatod: a te mutációd fut utoljára.",[886,2408,2409,2414,2415,2419,2420,2422],{},[473,2410,2411],{},[452,2412,2413],{},"WithValidator(*validate.Validator)",": az alkalmazás-szintű request-validátor, tipikusan ",[457,2416,2418],{"href":2417},"\u002Fhu\u002Fhttperr\u002Fvalidation#saj%C3%A1t-tagek","saját validációs tagekkel","; a ",[452,2421,1389],{}," middleware-ek request-időben ezt oldják fel.",[886,2424,2425,2430,2431,2433],{},[473,2426,2427],{},[452,2428,2429],{},"WithoutTelemetry()",": kihagyja a ",[452,2432,1074],{},"-ot és az OTel middleware-t; tesztekhez, vagy ha a processz maga konfigurálja a telemetriát.",[540,2435,2437],{"id":2436},"registerfunc-és-strictvalidator","RegisterFunc és StrictValidator",[448,2439,2440,2441,2445,2446,2449,2450,2453,2454,2456],{},"Az ",[457,2442,2443],{"href":331},[452,2444,330],{}," surface-enként egy ",[452,2447,2448],{},"Register\u003CSurface>"," függvényt illeszt a modul ",[452,2451,2452],{},"register.go","-jába. A shop ",[452,2455,2002],{}," surface-ére szó szerint ez generálódik:",[493,2458,2461],{"className":495,"code":2459,"filename":2460,"language":497,"meta":498,"style":498},"func RegisterApi(router chi.Router, deps Dependencies) {\n    apiSvc := apiservice.New()\n    apiHandler := apihttp.New(apiSvc)\n    apiPolicies := apipolicy.New()\n    router.Route(\"\u002Fshop\", func(r chi.Router) {\n        shopapigen.HandlerWithOptions(shopapigen.NewStrictHandlerWithOptions(\n            apiHandler,\n            []shopapigen.StrictMiddlewareFunc{\n                server.StrictValidator[shopapigen.StrictHandlerFunc](nil),\n                \u002F\u002F Az utolsó a legkülső: az authorizáció a validáció előtt fut.\n                kitpolicy.Enforcer[shopapigen.StrictHandlerFunc](apiPolicies, shopapigen.PermissionByOperation, shopapigen.PolicyByOperation),\n            },\n            shopapigen.StrictHTTPServerOptions{\n                RequestErrorHandlerFunc:  httperr.WriteBadRequest,\n                ResponseErrorHandlerFunc: server.WriteError,\n            },\n        ), shopapigen.ChiServerOptions{\n            BaseRouter:       r,\n            ErrorHandlerFunc: httperr.WriteBadRequest,\n        })\n    })\n}\n","internal\u002Fmodules\u002Fshop\u002Fregister.go",[452,2462,2463,2492,2508,2529,2545,2579,2602,2610,2624,2646,2651,2696,2701,2713,2729,2744,2748,2762,2774,2790,2795,2800],{"__ignoreMap":498},[502,2464,2465,2467,2470,2472,2475,2477,2479,2481,2483,2485,2488,2490],{"class":504,"line":505},[502,2466,954],{"class":512},[502,2468,2469],{"class":969}," RegisterApi",[502,2471,1184],{"class":512},[502,2473,2474],{"class":960},"router",[502,2476,1283],{"class":516},[502,2478,588],{"class":512},[502,2480,1288],{"class":516},[502,2482,1198],{"class":512},[502,2484,2007],{"class":960},[502,2486,2487],{"class":516}," Dependencies",[502,2489,966],{"class":512},[502,2491,576],{"class":512},[502,2493,2494,2497,2499,2502,2504,2506],{"class":504,"line":579},[502,2495,2496],{"class":582},"    apiSvc ",[502,2498,1735],{"class":512},[502,2500,2501],{"class":582}," apiservice",[502,2503,588],{"class":512},[502,2505,1322],{"class":969},[502,2507,1773],{"class":512},[502,2509,2510,2513,2515,2518,2520,2522,2524,2527],{"class":504,"line":594},[502,2511,2512],{"class":582},"    apiHandler ",[502,2514,1735],{"class":512},[502,2516,2517],{"class":582}," apihttp",[502,2519,588],{"class":512},[502,2521,1322],{"class":969},[502,2523,1184],{"class":512},[502,2525,2526],{"class":582},"apiSvc",[502,2528,1709],{"class":512},[502,2530,2531,2534,2536,2539,2541,2543],{"class":504,"line":616},[502,2532,2533],{"class":582},"    apiPolicies ",[502,2535,1735],{"class":512},[502,2537,2538],{"class":582}," apipolicy",[502,2540,588],{"class":512},[502,2542,1322],{"class":969},[502,2544,1773],{"class":512},[502,2546,2547,2550,2552,2554,2556,2558,2561,2563,2565,2567,2569,2571,2573,2575,2577],{"class":504,"line":623},[502,2548,2549],{"class":582},"    router",[502,2551,588],{"class":512},[502,2553,2390],{"class":969},[502,2555,1184],{"class":512},[502,2557,2045],{"class":512},[502,2559,2560],{"class":609},"\u002Fshop",[502,2562,2045],{"class":512},[502,2564,1198],{"class":512},[502,2566,1277],{"class":512},[502,2568,1280],{"class":960},[502,2570,1283],{"class":516},[502,2572,588],{"class":512},[502,2574,1288],{"class":516},[502,2576,966],{"class":512},[502,2578,576],{"class":512},[502,2580,2581,2584,2586,2589,2591,2594,2596,2599],{"class":504,"line":1622},[502,2582,2583],{"class":582},"        shopapigen",[502,2585,588],{"class":512},[502,2587,2588],{"class":969},"HandlerWithOptions",[502,2590,1184],{"class":512},[502,2592,2593],{"class":582},"shopapigen",[502,2595,588],{"class":512},[502,2597,2598],{"class":969},"NewStrictHandlerWithOptions",[502,2600,2601],{"class":512},"(\n",[502,2603,2604,2607],{"class":504,"line":1627},[502,2605,2606],{"class":582},"            apiHandler",[502,2608,2609],{"class":512},",\n",[502,2611,2612,2615,2617,2619,2622],{"class":504,"line":1637},[502,2613,2614],{"class":512},"            []",[502,2616,2593],{"class":516},[502,2618,588],{"class":512},[502,2620,2621],{"class":516},"StrictMiddlewareFunc",[502,2623,1892],{"class":512},[502,2625,2626,2629,2631,2634,2636,2638,2640,2643],{"class":504,"line":1642},[502,2627,2628],{"class":582},"                server",[502,2630,588],{"class":512},[502,2632,2633],{"class":969},"StrictValidator",[502,2635,1746],{"class":512},[502,2637,2593],{"class":516},[502,2639,588],{"class":512},[502,2641,2642],{"class":516},"StrictHandlerFunc",[502,2644,2645],{"class":512},"](nil),\n",[502,2647,2648],{"class":504,"line":1652},[502,2649,2650],{"class":619},"                \u002F\u002F Az utolsó a legkülső: az authorizáció a validáció előtt fut.\n",[502,2652,2653,2656,2658,2661,2663,2665,2667,2669,2672,2675,2677,2680,2682,2685,2687,2689,2691,2694],{"class":504,"line":1662},[502,2654,2655],{"class":582},"                kitpolicy",[502,2657,588],{"class":512},[502,2659,2660],{"class":969},"Enforcer",[502,2662,1746],{"class":512},[502,2664,2593],{"class":516},[502,2666,588],{"class":512},[502,2668,2642],{"class":516},[502,2670,2671],{"class":512},"](",[502,2673,2674],{"class":582},"apiPolicies",[502,2676,1198],{"class":512},[502,2678,2679],{"class":582}," shopapigen",[502,2681,588],{"class":512},[502,2683,2684],{"class":582},"PermissionByOperation",[502,2686,1198],{"class":512},[502,2688,2679],{"class":582},[502,2690,588],{"class":512},[502,2692,2693],{"class":582},"PolicyByOperation",[502,2695,1917],{"class":512},[502,2697,2698],{"class":504,"line":1672},[502,2699,2700],{"class":512},"            },\n",[502,2702,2703,2706,2708,2711],{"class":504,"line":1681},[502,2704,2705],{"class":516},"            shopapigen",[502,2707,588],{"class":512},[502,2709,2710],{"class":516},"StrictHTTPServerOptions",[502,2712,1892],{"class":512},[502,2714,2715,2718,2720,2723,2725,2727],{"class":504,"line":1686},[502,2716,2717],{"class":582},"                RequestErrorHandlerFunc",[502,2719,1901],{"class":512},[502,2721,2722],{"class":582},"  httperr",[502,2724,588],{"class":512},[502,2726,1540],{"class":582},[502,2728,2609],{"class":512},[502,2730,2731,2734,2736,2738,2740,2742],{"class":504,"line":1696},[502,2732,2733],{"class":582},"                ResponseErrorHandlerFunc",[502,2735,1901],{"class":512},[502,2737,1820],{"class":582},[502,2739,588],{"class":512},[502,2741,1537],{"class":582},[502,2743,2609],{"class":512},[502,2745,2746],{"class":504,"line":1706},[502,2747,2700],{"class":512},[502,2749,2750,2753,2755,2757,2760],{"class":504,"line":1712},[502,2751,2752],{"class":512},"        ),",[502,2754,2679],{"class":516},[502,2756,588],{"class":512},[502,2758,2759],{"class":516},"ChiServerOptions",[502,2761,1892],{"class":512},[502,2763,2764,2767,2769,2772],{"class":504,"line":1717},[502,2765,2766],{"class":582},"            BaseRouter",[502,2768,1901],{"class":512},[502,2770,2771],{"class":582},"       r",[502,2773,2609],{"class":512},[502,2775,2776,2779,2781,2784,2786,2788],{"class":504,"line":1729},[502,2777,2778],{"class":582},"            ErrorHandlerFunc",[502,2780,1901],{"class":512},[502,2782,2783],{"class":582}," httperr",[502,2785,588],{"class":512},[502,2787,1540],{"class":582},[502,2789,2609],{"class":512},[502,2791,2792],{"class":504,"line":1758},[502,2793,2794],{"class":512},"        })\n",[502,2796,2797],{"class":504,"line":1776},[502,2798,2799],{"class":512},"    })\n",[502,2801,2802],{"class":504,"line":1807},[502,2803,626],{"class":512},[448,2805,2806],{},"Sorról sorra:",[1107,2808,2809,2815,2833,2878],{},[886,2810,2811,2814],{},[473,2812,2813],{},"Service → handler → policy registry",": explicit felépítés, container nélkül.",[886,2816,2817,2822,2823,2825,2826,2829,2830,1330],{},[473,2818,2819],{},[452,2820,2821],{},"router.Route(\"\u002Fshop\", ...)",": az ",[452,2824,2002],{}," surface a modul gyökerére kerül (",[452,2827,2828],{},"\u002Fapi\u002Fv1\u002Fshop\u002F...","); minden más surface a saját prefixe alá (",[452,2831,2832],{},"\u002Fadmin\u002Fshop",[886,2834,2835,2839,2840,2842,2843,1059,2846,2849,2850,2853,2854,2849,2857,2860,2861,699,2863,699,2866,2869,2870,2873,2874,2877],{},[473,2836,2837],{},[452,2838,2598],{},": a ",[457,2841,526],{"href":234}," strict szerver, plusz a hibahookok: a request-dekódolási hibák (",[452,2844,2845],{},"RequestErrorHandlerFunc",[452,2847,2848],{},"ErrorHandlerFunc",") ",[452,2851,2852],{},"httperr.WriteBadRequest","-en át 400-ként, a handlered hibái (",[452,2855,2856],{},"ResponseErrorHandlerFunc",[452,2858,2859],{},"server.WriteError","-on át renderelődnek, ami az ",[452,2862,82],{},[452,2864,2865],{},"rbac",[452,2867,2868],{},"policy"," sentineleket Problemre képezi, mindent mást pedig a ",[452,2871,2872],{},"httperr.WriteError","-ra delegál, a ",[457,2875,2876],{"href":396},"teljes mapping"," szerint.",[886,2879,2880,2887,2888,2891],{},[473,2881,2882,1306,2884],{},[452,2883,1564],{},[452,2885,2886],{},"kitpolicy.Enforcer",": validáció és ",[457,2889,2890],{"href":99},"policy-érvényesítés"," strict middleware-ként; a lista utolsó eleme fut legkívül, ezért az enforcer megelőzi a validátort.",[875,2893,2895],{"id":2894},"strictvalidator-validáció-a-handler-előtt","StrictValidator: validáció a handler előtt",[493,2897,2899],{"className":495,"code":2898,"language":497,"meta":498,"style":498},"func StrictValidator[H ~func(ctx context.Context, w http.ResponseWriter, r *http.Request, request any) (any, error)](\n    v *validate.Validator,\n) func(f H, operationID string) H\n",[452,2900,2901,2973,2989],{"__ignoreMap":498},[502,2902,2903,2905,2908,2910,2913,2916,2918,2920,2922,2924,2926,2929,2932,2934,2937,2939,2942,2944,2946,2948,2951,2953,2956,2959,2961,2963,2966,2968,2970],{"class":504,"line":505},[502,2904,954],{"class":512},[502,2906,2907],{"class":969}," StrictValidator",[502,2909,1746],{"class":512},[502,2911,2912],{"class":960},"H",[502,2914,2915],{"class":512}," ~func(",[502,2917,1187],{"class":960},[502,2919,1190],{"class":516},[502,2921,588],{"class":512},[502,2923,1195],{"class":516},[502,2925,1198],{"class":512},[502,2927,2928],{"class":960}," w",[502,2930,2931],{"class":516}," http",[502,2933,588],{"class":512},[502,2935,2936],{"class":516},"ResponseWriter",[502,2938,1198],{"class":512},[502,2940,2941],{"class":960}," r",[502,2943,1254],{"class":512},[502,2945,2290],{"class":516},[502,2947,588],{"class":512},[502,2949,2950],{"class":516},"Request",[502,2952,1198],{"class":512},[502,2954,2955],{"class":960}," request",[502,2957,2958],{"class":516}," any",[502,2960,966],{"class":512},[502,2962,957],{"class":512},[502,2964,2965],{"class":516},"any",[502,2967,1198],{"class":512},[502,2969,1854],{"class":976},[502,2971,2972],{"class":512},")](\n",[502,2974,2975,2978,2980,2982,2984,2987],{"class":504,"line":579},[502,2976,2977],{"class":960},"    v",[502,2979,1254],{"class":512},[502,2981,2331],{"class":516},[502,2983,588],{"class":512},[502,2985,2986],{"class":516},"Validator",[502,2988,2609],{"class":512},[502,2990,2991,2993,2995,2998,3001,3003,3006,3009,3011],{"class":504,"line":594},[502,2992,966],{"class":512},[502,2994,1277],{"class":512},[502,2996,2997],{"class":960},"f",[502,2999,3000],{"class":516}," H",[502,3002,1198],{"class":512},[502,3004,3005],{"class":960}," operationID",[502,3007,3008],{"class":976}," string",[502,3010,966],{"class":512},[502,3012,3013],{"class":516}," H\n",[448,3015,3016,3017,3019,3020,3022,3023,3025,3026,3028],{},"A strict szerver ",[452,3018,1560],{},"-rel dekódol, validáció nélkül. A ",[452,3021,2633],{}," ezt a rést zárja: a teljesen bekötött request objektumot (paraméterek + body) validálja a kit validátorával, mielőtt a handlered futna; bukásnál 422 problem a ",[452,3024,2856],{},"-on át. A típusparaméter azért kell, mert az oapi-codegen a ",[452,3027,2642],{},"-ot generált csomagonként definiálja.",[448,3030,3031,3032,3035,3036,3039,3040,3043,3044,3046,3047,3049,3050,3053],{},"A validátor feloldása request-időben, ebben a sorrendben: az explicit ",[452,3033,3034],{},"v"," argumentum → a ",[452,3037,3038],{},"server.WithValidator","-ral beállított (a contextből) → ",[452,3041,3042],{},"validate.New()",". A generált kód ezért ",[452,3045,1318],{},"-t ad át: egyetlen ",[452,3048,1385],{}," opció a ",[452,3051,3052],{},"main.go","-ban az egész alkalmazásra érvényes, a generált fájlokhoz nem kell nyúlni.",[540,3055,3057],{"id":3056},"surface-szintű-middleware","Surface-szintű middleware",[448,3059,3060,3061,3063,3064,3066,3067,3069,3070,3073,3074,3077],{},"Router-szintű middleware-t a ",[452,3062,2255],{}," ad; ami csak egy surface-re vonatkozik (mint a shop admin surface-ének JWT-védelme), azt a surface ",[452,3065,2390],{},"-blokkjában kötöd be a kit ",[452,3068,466],{},"-s auth middleware-párjával, a ",[452,3071,3072],{},"server.AuthMiddleware","-rel és a ",[452,3075,3076],{},"server.RequireRole","-lal:",[493,3079,3081],{"className":495,"code":3080,"filename":2460,"language":497,"meta":498,"style":498},"import (\n    \"github.com\u002Fgp-system\u002Fauth\"\n    \u002F\u002F ...\n)\n\ntype Dependencies struct {\n    DB         *pg.DB\n    Transactor dbx.Transactor\n    Auth       auth.Config \u002F\u002F JWT_SECRET, JWT_ISSUER, ..., a platform-configból\n    \u002F\u002F gpsystem:dependencies\n}\n\nfunc RegisterAdmin(router chi.Router, deps Dependencies) {\n    adminSvc := adminservice.New()\n    adminHandler := adminhttp.New(adminSvc)\n    adminPolicies := adminpolicy.New()\n    router.Route(\"\u002Fadmin\u002Fshop\", func(r chi.Router) {\n        r.Use(server.AuthMiddleware(deps.Auth), server.RequireRole(\"admin\"))\n        shopadmingen.HandlerWithOptions(shopadmingen.NewStrictHandlerWithOptions(\n            adminHandler,\n            []shopadmingen.StrictMiddlewareFunc{\n                server.StrictValidator[shopadmingen.StrictHandlerFunc](nil),\n                kitpolicy.Enforcer[shopadmingen.StrictHandlerFunc](adminPolicies, shopadmingen.PermissionByOperation, shopadmingen.PolicyByOperation),\n            },\n            shopadmingen.StrictHTTPServerOptions{\n                RequestErrorHandlerFunc:  httperr.WriteBadRequest,\n                ResponseErrorHandlerFunc: server.WriteError,\n            },\n        ), shopadmingen.ChiServerOptions{\n            BaseRouter:       r,\n            ErrorHandlerFunc: httperr.WriteBadRequest,\n        })\n    })\n}\n",[452,3082,3083,3089,3098,3102,3106,3110,3120,3134,3146,3160,3165,3169,3173,3200,3216,3237,3253,3285,3335,3355,3362,3374,3392,3432,3436,3447,3461,3475,3479,3491,3501,3515,3519,3523],{"__ignoreMap":498},[502,3084,3085,3087],{"class":504,"line":505},[502,3086,509],{"class":508},[502,3088,1600],{"class":512},[502,3090,3091,3093,3096],{"class":504,"line":579},[502,3092,1605],{"class":512},[502,3094,3095],{"class":516},"github.com\u002Fgp-system\u002Fauth",[502,3097,520],{"class":512},[502,3099,3100],{"class":504,"line":594},[502,3101,620],{"class":619},[502,3103,3104],{"class":504,"line":616},[502,3105,1709],{"class":512},[502,3107,3108],{"class":504,"line":623},[502,3109,949],{"emptyLinePlaceholder":948},[502,3111,3112,3114,3116,3118],{"class":504,"line":1622},[502,3113,567],{"class":512},[502,3115,2487],{"class":516},[502,3117,573],{"class":512},[502,3119,576],{"class":512},[502,3121,3122,3125,3127,3129,3131],{"class":504,"line":1627},[502,3123,3124],{"class":582},"    DB         ",[502,3126,801],{"class":512},[502,3128,1969],{"class":516},[502,3130,588],{"class":512},[502,3132,3133],{"class":516},"DB\n",[502,3135,3136,3139,3141,3143],{"class":504,"line":1637},[502,3137,3138],{"class":582},"    Transactor ",[502,3140,405],{"class":516},[502,3142,588],{"class":512},[502,3144,3145],{"class":516},"Transactor\n",[502,3147,3148,3151,3153,3155,3157],{"class":504,"line":1642},[502,3149,3150],{"class":582},"    Auth       ",[502,3152,82],{"class":516},[502,3154,588],{"class":512},[502,3156,543],{"class":516},[502,3158,3159],{"class":619}," \u002F\u002F JWT_SECRET, JWT_ISSUER, ..., a platform-configból\n",[502,3161,3162],{"class":504,"line":1652},[502,3163,3164],{"class":619},"    \u002F\u002F gpsystem:dependencies\n",[502,3166,3167],{"class":504,"line":1662},[502,3168,626],{"class":512},[502,3170,3171],{"class":504,"line":1672},[502,3172,949],{"emptyLinePlaceholder":948},[502,3174,3175,3177,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198],{"class":504,"line":1681},[502,3176,954],{"class":512},[502,3178,3179],{"class":969}," RegisterAdmin",[502,3181,1184],{"class":512},[502,3183,2474],{"class":960},[502,3185,1283],{"class":516},[502,3187,588],{"class":512},[502,3189,1288],{"class":516},[502,3191,1198],{"class":512},[502,3193,2007],{"class":960},[502,3195,2487],{"class":516},[502,3197,966],{"class":512},[502,3199,576],{"class":512},[502,3201,3202,3205,3207,3210,3212,3214],{"class":504,"line":1686},[502,3203,3204],{"class":582},"    adminSvc ",[502,3206,1735],{"class":512},[502,3208,3209],{"class":582}," adminservice",[502,3211,588],{"class":512},[502,3213,1322],{"class":969},[502,3215,1773],{"class":512},[502,3217,3218,3221,3223,3226,3228,3230,3232,3235],{"class":504,"line":1696},[502,3219,3220],{"class":582},"    adminHandler ",[502,3222,1735],{"class":512},[502,3224,3225],{"class":582}," adminhttp",[502,3227,588],{"class":512},[502,3229,1322],{"class":969},[502,3231,1184],{"class":512},[502,3233,3234],{"class":582},"adminSvc",[502,3236,1709],{"class":512},[502,3238,3239,3242,3244,3247,3249,3251],{"class":504,"line":1706},[502,3240,3241],{"class":582},"    adminPolicies ",[502,3243,1735],{"class":512},[502,3245,3246],{"class":582}," adminpolicy",[502,3248,588],{"class":512},[502,3250,1322],{"class":969},[502,3252,1773],{"class":512},[502,3254,3255,3257,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283],{"class":504,"line":1712},[502,3256,2549],{"class":582},[502,3258,588],{"class":512},[502,3260,2390],{"class":969},[502,3262,1184],{"class":512},[502,3264,2045],{"class":512},[502,3266,2832],{"class":609},[502,3268,2045],{"class":512},[502,3270,1198],{"class":512},[502,3272,1277],{"class":512},[502,3274,1280],{"class":960},[502,3276,1283],{"class":516},[502,3278,588],{"class":512},[502,3280,1288],{"class":516},[502,3282,966],{"class":512},[502,3284,576],{"class":512},[502,3286,3287,3289,3291,3294,3296,3298,3300,3303,3305,3308,3310,3313,3316,3318,3320,3323,3325,3327,3330,3332],{"class":504,"line":1717},[502,3288,2035],{"class":582},[502,3290,588],{"class":512},[502,3292,3293],{"class":969},"Use",[502,3295,1184],{"class":512},[502,3297,454],{"class":582},[502,3299,588],{"class":512},[502,3301,3302],{"class":969},"AuthMiddleware",[502,3304,1184],{"class":512},[502,3306,3307],{"class":582},"deps",[502,3309,588],{"class":512},[502,3311,3312],{"class":582},"Auth",[502,3314,3315],{"class":512},"),",[502,3317,1820],{"class":582},[502,3319,588],{"class":512},[502,3321,3322],{"class":969},"RequireRole",[502,3324,1184],{"class":512},[502,3326,2045],{"class":512},[502,3328,3329],{"class":609},"admin",[502,3331,2045],{"class":512},[502,3333,3334],{"class":512},"))\n",[502,3336,3337,3340,3342,3344,3346,3349,3351,3353],{"class":504,"line":1729},[502,3338,3339],{"class":582},"        shopadmingen",[502,3341,588],{"class":512},[502,3343,2588],{"class":969},[502,3345,1184],{"class":512},[502,3347,3348],{"class":582},"shopadmingen",[502,3350,588],{"class":512},[502,3352,2598],{"class":969},[502,3354,2601],{"class":512},[502,3356,3357,3360],{"class":504,"line":1758},[502,3358,3359],{"class":582},"            adminHandler",[502,3361,2609],{"class":512},[502,3363,3364,3366,3368,3370,3372],{"class":504,"line":1776},[502,3365,2614],{"class":512},[502,3367,3348],{"class":516},[502,3369,588],{"class":512},[502,3371,2621],{"class":516},[502,3373,1892],{"class":512},[502,3375,3376,3378,3380,3382,3384,3386,3388,3390],{"class":504,"line":1807},[502,3377,2628],{"class":582},[502,3379,588],{"class":512},[502,3381,2633],{"class":969},[502,3383,1746],{"class":512},[502,3385,3348],{"class":516},[502,3387,588],{"class":512},[502,3389,2642],{"class":516},[502,3391,2645],{"class":512},[502,3393,3394,3396,3398,3400,3402,3404,3406,3408,3410,3413,3415,3418,3420,3422,3424,3426,3428,3430],{"class":504,"line":1812},[502,3395,2655],{"class":582},[502,3397,588],{"class":512},[502,3399,2660],{"class":969},[502,3401,1746],{"class":512},[502,3403,3348],{"class":516},[502,3405,588],{"class":512},[502,3407,2642],{"class":516},[502,3409,2671],{"class":512},[502,3411,3412],{"class":582},"adminPolicies",[502,3414,1198],{"class":512},[502,3416,3417],{"class":582}," shopadmingen",[502,3419,588],{"class":512},[502,3421,2684],{"class":582},[502,3423,1198],{"class":512},[502,3425,3417],{"class":582},[502,3427,588],{"class":512},[502,3429,2693],{"class":582},[502,3431,1917],{"class":512},[502,3433,3434],{"class":504,"line":1859},[502,3435,2700],{"class":512},[502,3437,3438,3441,3443,3445],{"class":504,"line":1876},[502,3439,3440],{"class":516},"            shopadmingen",[502,3442,588],{"class":512},[502,3444,2710],{"class":516},[502,3446,1892],{"class":512},[502,3448,3449,3451,3453,3455,3457,3459],{"class":504,"line":1895},[502,3450,2717],{"class":582},[502,3452,1901],{"class":512},[502,3454,2722],{"class":582},[502,3456,588],{"class":512},[502,3458,1540],{"class":582},[502,3460,2609],{"class":512},[502,3462,3463,3465,3467,3469,3471,3473],{"class":504,"line":1920},[502,3464,2733],{"class":582},[502,3466,1901],{"class":512},[502,3468,1820],{"class":582},[502,3470,588],{"class":512},[502,3472,1537],{"class":582},[502,3474,2609],{"class":512},[502,3476,3477],{"class":504,"line":1941},[502,3478,2700],{"class":512},[502,3480,3481,3483,3485,3487,3489],{"class":504,"line":1983},[502,3482,2752],{"class":512},[502,3484,3417],{"class":516},[502,3486,588],{"class":512},[502,3488,2759],{"class":516},[502,3490,1892],{"class":512},[502,3492,3493,3495,3497,3499],{"class":504,"line":1989},[502,3494,2766],{"class":582},[502,3496,1901],{"class":512},[502,3498,2771],{"class":582},[502,3500,2609],{"class":512},[502,3502,3503,3505,3507,3509,3511,3513],{"class":504,"line":2012},[502,3504,2778],{"class":582},[502,3506,1901],{"class":512},[502,3508,2783],{"class":582},[502,3510,588],{"class":512},[502,3512,1540],{"class":582},[502,3514,2609],{"class":512},[502,3516,3517],{"class":504,"line":2032},[502,3518,2794],{"class":512},[502,3520,3521],{"class":504,"line":2060},[502,3522,2799],{"class":512},[502,3524,3525],{"class":504,"line":2069},[502,3526,626],{"class":512},[448,3528,450,3529,1528,3533,3536,3537,3540,3541,3546,3547,3550,3551,3553],{},[457,3530,3531],{"href":89},[452,3532,3072],{},[452,3534,3535],{},"Bearer"," tokent parseolja és ",[452,3538,3539],{},"rbac.Identity","-t tesz a contextbe; a ",[457,3542,3543],{"href":94},[452,3544,3545],{},"server.RequireRole(\"admin\")"," e nélkül a szerep nélkül 403-as problemmel rövidre zár. Minden ",[452,3548,3549],{},"\u002Fapi\u002Fv1\u002Fadmin\u002Fshop\u002F..."," route védett. Az ",[452,3552,2002],{}," surface publikus route-jait nem érinti.",[3555,3556,3557,3558,3561,3562,3565,3566,3569,3570,3573,3574,3576,3577,3580,3581,699,3584,3587],"tip",{},"A middleware-szintek ökölszabálya: ",[473,3559,3560],{},"processz-szintű"," (rate limit, request ID) → ",[452,3563,3564],{},"server.WithMiddleware","; ",[473,3567,3568],{},"surface-szintű"," (auth, szerep) → ",[452,3571,3572],{},"r.Use"," a surface ",[452,3575,2390],{},"-blokkjában; ",[473,3578,3579],{},"művelet-szintű"," (permission, tulajdonos-ellenőrzés) → ",[452,3582,3583],{},"@permission",[452,3585,3586],{},"@policy"," a specben, az enforcer érvényesíti.",[540,3589,169],{"id":3590},"tesztelés",[448,3592,450,3593,3595,3596,3599],{},[452,3594,1322],{}," a teljesen bekötött routert adja vissza, amit sima ",[452,3597,3598],{},"net\u002Fhttp\u002Fhttptest","-tel tesztelhetsz:",[493,3601,3603],{"className":495,"code":3602,"language":497,"meta":498,"style":498},"r := server.New(server.Config{}, server.WithoutTelemetry())\nr.Post(\"\u002Fthings\", createThing)\n\nsrv := httptest.NewServer(r)\ndefer srv.Close()\nresp, err := http.Post(srv.URL+\"\u002Fthings\", \"application\u002Fjson\", body)\n",[452,3604,3605,3638,3663,3667,3688,3702],{"__ignoreMap":498},[502,3606,3607,3610,3612,3614,3616,3618,3620,3622,3624,3626,3629,3631,3633,3635],{"class":504,"line":505},[502,3608,3609],{"class":582},"r ",[502,3611,1735],{"class":512},[502,3613,1820],{"class":582},[502,3615,588],{"class":512},[502,3617,1322],{"class":969},[502,3619,1184],{"class":512},[502,3621,454],{"class":516},[502,3623,588],{"class":512},[502,3625,543],{"class":516},[502,3627,3628],{"class":512},"{},",[502,3630,1820],{"class":582},[502,3632,588],{"class":512},[502,3634,2361],{"class":969},[502,3636,3637],{"class":512},"())\n",[502,3639,3640,3642,3644,3647,3649,3651,3654,3656,3658,3661],{"class":504,"line":579},[502,3641,1280],{"class":582},[502,3643,588],{"class":512},[502,3645,3646],{"class":969},"Post",[502,3648,1184],{"class":512},[502,3650,2045],{"class":512},[502,3652,3653],{"class":609},"\u002Fthings",[502,3655,2045],{"class":512},[502,3657,1198],{"class":512},[502,3659,3660],{"class":582}," createThing",[502,3662,1709],{"class":512},[502,3664,3665],{"class":504,"line":594},[502,3666,949],{"emptyLinePlaceholder":948},[502,3668,3669,3672,3674,3677,3679,3682,3684,3686],{"class":504,"line":616},[502,3670,3671],{"class":582},"srv ",[502,3673,1735],{"class":512},[502,3675,3676],{"class":582}," httptest",[502,3678,588],{"class":512},[502,3680,3681],{"class":969},"NewServer",[502,3683,1184],{"class":512},[502,3685,1280],{"class":582},[502,3687,1709],{"class":512},[502,3689,3690,3693,3696,3698,3700],{"class":504,"line":623},[502,3691,3692],{"class":508},"defer",[502,3694,3695],{"class":582}," srv",[502,3697,588],{"class":512},[502,3699,2114],{"class":969},[502,3701,1773],{"class":512},[502,3703,3704,3707,3709,3711,3713,3715,3717,3719,3721,3724,3726,3729,3732,3734,3736,3738,3740,3742,3745,3747,3749,3752],{"class":504,"line":1622},[502,3705,3706],{"class":582},"resp",[502,3708,1198],{"class":512},[502,3710,2138],{"class":582},[502,3712,1735],{"class":512},[502,3714,2931],{"class":582},[502,3716,588],{"class":512},[502,3718,3646],{"class":969},[502,3720,1184],{"class":512},[502,3722,3723],{"class":582},"srv",[502,3725,588],{"class":512},[502,3727,3728],{"class":582},"URL",[502,3730,3731],{"class":512},"+",[502,3733,2045],{"class":512},[502,3735,3653],{"class":609},[502,3737,2045],{"class":512},[502,3739,1198],{"class":512},[502,3741,513],{"class":512},[502,3743,3744],{"class":609},"application\u002Fjson",[502,3746,2045],{"class":512},[502,3748,1198],{"class":512},[502,3750,3751],{"class":582}," body",[502,3753,1709],{"class":512},[448,3755,3756],{},"A panic-recoverer, a 404\u002F405 problem-kezelők és a body limit ilyenkor is aktívak, tehát a teszt pontosan azt a problem+json választ látja, amit a kliens fog.",[540,3758,3760],{"id":3759},"használt-patternek","Használt patternek",[883,3762,3763,3778],{},[886,3764,3765,957,3768,699,3771,3774,3775,588],{},[473,3766,3767],{},"Context-injektált validator",[452,3769,3770],{},"injectValidator",[452,3772,3773],{},"validatorFromContext",", unexported context-kulccsal): ",[457,3776,238],{"href":3777},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#context-injekt%C3%A1lt-f%C3%BCgg%C5%91s%C3%A9g",[886,3779,3780,957,3783,3786,3787,3789,3790,588],{},[473,3781,3782],{},"Generikus middleware-adapter",[452,3784,3785],{},"StrictValidator[H ~func(...)]",", illeszkedik minden generált ",[452,3788,2642],{},"-hoz): ",[457,3791,238],{"href":3792},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#generikus-middleware-adapter",[540,3794,3796],{"id":3795},"kapcsolódó-oldalak","Kapcsolódó oldalak",[883,3798,3799,3811,3816,3821],{},[886,3800,3801,3803,3804,3807,3808,3810],{},[457,3802,253],{"href":254},": a közös ",[452,3805,3806],{},"app.Run"," váz, amire a ",[452,3809,537],{}," épül.",[886,3812,3813,3815],{},[457,3814,395],{"href":396},": a teljes hiba-mapping tábla.",[886,3817,3818,3820],{},[457,3819,400],{"href":401},": saját validációs tagek.",[886,3822,3823,3825],{},[457,3824,98],{"href":99},": a fent használt enforcer.",[3827,3828,3829],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":498,"searchDepth":579,"depth":579,"links":3831},[3832,3838,3839,3842,3845,3848,3849,3850,3851],{"id":542,"depth":579,"text":543,"children":3833},[3834,3835,3836,3837],{"id":877,"depth":594,"text":878},{"id":913,"depth":594,"text":914},{"id":1005,"depth":594,"text":837},{"id":1042,"depth":594,"text":1043},{"id":1081,"depth":579,"text":1082},{"id":1168,"depth":579,"text":1169,"children":3840},[3841],{"id":1516,"depth":594,"text":1517},{"id":1568,"depth":579,"text":1569,"children":3843},[3844],{"id":2187,"depth":594,"text":2188},{"id":2436,"depth":579,"text":2437,"children":3846},[3847],{"id":2894,"depth":594,"text":2895},{"id":3056,"depth":579,"text":3057},{"id":3590,"depth":579,"text":169},{"id":3759,"depth":579,"text":3760},{"id":3795,"depth":579,"text":3796},"A chi-alapú HTTP-chassis: Config (timeoutok, CORS, body limit), a közös életciklus, és hogy mit köt be a server.Run.","md",null,{},{"icon":261},{"title":258,"description":3852},"PEKwvKDWyF-Hg5wBotUzJBzrrUYwJb2oBvQhT6ANHag",[3860,3862],{"title":253,"path":254,"stem":255,"description":3861,"icon":256,"children":-1},"Az app csomag: signal-vezérelt graceful shutdown, amin minden gpsystem bináris ül.",{"title":263,"path":264,"stem":265,"description":3863,"icon":266,"children":-1},"A háttérmunka-chassis, asynq szerver, outbox relay és schedule runner egyetlen binárisban, közös graceful shutdownnal.",1785445886058]