[{"data":1,"prerenderedAt":1541},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-kit-realtime":442,"-hu-kit-realtime-surround":1536},[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":268,"body":444,"description":1529,"extension":1530,"links":1531,"meta":1532,"navigation":1533,"path":269,"seo":1534,"stem":270,"__hash__":1535},"docs_hu\u002Fhu\u002F3.kit\u002F5.realtime.md",{"type":445,"value":446,"toc":1520},"minimark",[447,462,467,488,501,505,694,708,712,733,750,940,946,955,1072,1081,1085,1088,1136,1140,1274,1300,1304,1460,1474,1478,1516],[448,449,450,451,456,457,461],"p",{},"A ",[452,453,455],"a",{"href":454},"\u002Fhu\u002Fnotify\u002Fbroadcast#broadcast","broadcast csatorna"," egy notificationt a recipiens élő kapcsolatára kézbesít, abban a pillanatban, amikor történik: egy \"poke\" a durable ",[452,458,460],{"href":459},"\u002Fhu\u002Fnotify\u002Fdatabase#database","database csatorna"," tetején, nem annak helyettesítője. Ez az oldal a kapcsolatokat tartó gatewayről szól.",[463,464,466],"h2",{"id":465},"miért-külön-gateway","Miért külön gateway",[448,468,469,470,474,475,478,479,482,483,487],{},"A notificationök küldése bármely processből történhet, gyakran a workerből, egy listenerből. A kliens-kapcsolatok tartása más feladat, más skálázási alakkal: sok, hosszú élettartamú stream, egy csatlakozott userenként, aminek túl kell élnie a példányok szabad jövés-menését. A kit ezeket szétválasztja: a ",[471,472,473],"code",{},"notify\u002Fbroadcast"," egy pici publisher, amit bármely process importálhat (szerver nélkül, állapot nélkül); a ",[471,476,477],{},"realtime"," egy dedikált binary (",[471,480,481],{},"cmd\u002Frealtime",", az ",[452,484,485],{"href":311},[471,486,310],{}," scaffoldolja), ami csak kapcsolatokat tart és relay-eli, amit publikálnak.",[448,489,490,491,493,494,496,497,500],{},"A driver-seam szándékos: a ",[471,492,473],{},"-on és a ",[471,495,477],{},"-on kívül semmi nem importálja közvetlenül a ",[471,498,499],{},"centrifuge","-ot, így egy másik transport később lecserélheti anélkül, hogy az alkalmazáskódhoz nyúlna.",[463,502,504],{"id":503},"publikálás","Publikálás",[506,507,512],"pre",{"className":508,"code":509,"language":510,"meta":511,"style":511},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fnotify\u002Fbroadcast\"\n\npub := broadcast.MustNewPublisher(ctx, cfg.Realtime.BroadcastValkey(), cfg.Realtime.Broadcast)\nnotifier := notify.NewHub(\n    notify.NewMailChannel(mailer),\n    notifydatabase.NewChannel(store),\n    notify.NewBroadcastChannel(pub, cfg.Realtime.Broadcast.ChannelPrefix),\n)\n","go","",[471,513,514,534,541,599,618,637,655,689],{"__ignoreMap":511},[515,516,519,523,527,531],"span",{"class":517,"line":518},"line",1,[515,520,522],{"class":521},"s7zQu","import",[515,524,526],{"class":525},"sMK4o"," \"",[515,528,530],{"class":529},"sBMFI","github.com\u002Fgp-system\u002Fnotify\u002Fbroadcast",[515,532,533],{"class":525},"\"\n",[515,535,537],{"class":517,"line":536},2,[515,538,540],{"emptyLinePlaceholder":539},true,"\n",[515,542,544,548,551,554,557,561,564,567,570,573,575,577,579,582,585,587,589,591,593,596],{"class":517,"line":543},3,[515,545,547],{"class":546},"sTEyZ","pub ",[515,549,550],{"class":525},":=",[515,552,553],{"class":546}," broadcast",[515,555,556],{"class":525},".",[515,558,560],{"class":559},"s2Zo4","MustNewPublisher",[515,562,563],{"class":525},"(",[515,565,566],{"class":546},"ctx",[515,568,569],{"class":525},",",[515,571,572],{"class":546}," cfg",[515,574,556],{"class":525},[515,576,268],{"class":546},[515,578,556],{"class":525},[515,580,581],{"class":559},"BroadcastValkey",[515,583,584],{"class":525},"(),",[515,586,572],{"class":546},[515,588,556],{"class":525},[515,590,268],{"class":546},[515,592,556],{"class":525},[515,594,595],{"class":546},"Broadcast",[515,597,598],{"class":525},")\n",[515,600,602,605,607,610,612,615],{"class":517,"line":601},4,[515,603,604],{"class":546},"notifier ",[515,606,550],{"class":525},[515,608,609],{"class":546}," notify",[515,611,556],{"class":525},[515,613,614],{"class":559},"NewHub",[515,616,617],{"class":525},"(\n",[515,619,621,624,626,629,631,634],{"class":517,"line":620},5,[515,622,623],{"class":546},"    notify",[515,625,556],{"class":525},[515,627,628],{"class":559},"NewMailChannel",[515,630,563],{"class":525},[515,632,633],{"class":546},"mailer",[515,635,636],{"class":525},"),\n",[515,638,640,643,645,648,650,653],{"class":517,"line":639},6,[515,641,642],{"class":546},"    notifydatabase",[515,644,556],{"class":525},[515,646,647],{"class":559},"NewChannel",[515,649,563],{"class":525},[515,651,652],{"class":546},"store",[515,654,636],{"class":525},[515,656,658,660,662,665,667,670,672,674,676,678,680,682,684,687],{"class":517,"line":657},7,[515,659,623],{"class":546},[515,661,556],{"class":525},[515,663,664],{"class":559},"NewBroadcastChannel",[515,666,563],{"class":525},[515,668,669],{"class":546},"pub",[515,671,569],{"class":525},[515,673,572],{"class":546},[515,675,556],{"class":525},[515,677,268],{"class":546},[515,679,556],{"class":525},[515,681,595],{"class":546},[515,683,556],{"class":525},[515,685,686],{"class":546},"ChannelPrefix",[515,688,636],{"class":525},[515,690,692],{"class":517,"line":691},8,[515,693,598],{"class":525},[448,695,450,696,699,700,703,704,707],{},[471,697,698],{},"Publisher"," egy publish-only ",[471,701,702],{},"centrifuge.Node",", ami osztozik a projekt Valkey brokerén; sosem fogad kapcsolatot, így egy worker-process semmi mástól nem függ, csak egy hálózati klienstől. A publikálás fire-and-forget: egy sikertelen publish visszaadódik a hívónak, nincs újrapróbálva: a durability a database csatornából jön, egy kliens, aki lemarad egy élő push-ról, reconnectkor onnan backfillel. Az insert-majd-publish kontraktust maga a ",[471,705,706],{},"notify.Hub.Send"," már kikényszeríti (database csatorna a broadcast előtt, ugyanaz a delivery ID mindkettőben).",[463,709,711],{"id":710},"a-gateway","A gateway",[448,713,450,714,716,717,720,721,724,725,728,729,732],{},[471,715,481],{}," nem hordoz üzleti függőséget (nincs adatbázis-pool, nincs outbox), pont ezért skálázódik szabadon. WebSocketet exponál egy HTTP-streaming\u002FSSE fallbackkal (mindkettő a ",[471,718,719],{},"centrifugal\u002Fcentrifuge","-on keresztül, ami a Centrifugo és a Grafana Live mögötti library) a ",[471,722,723],{},"\u002Frealtime\u002F*"," alatt, minden kapcsolat JWT-jét a connect frame-ben authentikálja (nincs külön ",[471,726,727],{},"\u002Fbroadcasting\u002Fauth"," endpoint; v1-ben az egyetlen privát csatorna egy kapcsolat saját subjectje, így elég egyszer, connectkor authentikálni), és minden kapcsolatot server-side feliratkoztat a saját ",[471,730,731],{},"user:\u003Csubject>"," csatornájára. A gyakori esetben nincs szükség kliens-oldali subscribe-logikára.",[448,734,735,736,741,742,745,746,749],{},"A megosztott topic-csatornák opt-in és explicit módon authorizáltak: minden kapcsolat JWT-je egy ",[452,737,738],{"href":94},[471,739,740],{},"rbac.Identity","-ra oldódik fel, és egy topic csak akkor iratkoztatható fel, ha valamelyik ",[471,743,744],{},"Allow","\u002F",[471,747,748],{},"AllowPrefix"," callback jótáll érte.",[506,751,754],{"className":508,"code":752,"filename":753,"language":510,"meta":511,"style":511},"err := realtime.Run(ctx, cfg.Realtime, func(topics *realtime.TopicAuth) error {\n    topics.Allow(\"announcements\", func(id *rbac.Identity) bool { return true })\n    topics.Allow(\"admin-alerts\", func(id *rbac.Identity) bool { return id.HasRole(\"admin\") })\n    return nil\n})\n","cmd\u002Frealtime\u002Fmain.go",[471,755,756,812,867,927,935],{"__ignoreMap":511},[515,757,758,761,763,766,768,771,773,775,777,779,781,783,785,788,792,795,797,799,802,805,809],{"class":517,"line":518},[515,759,760],{"class":546},"err ",[515,762,550],{"class":525},[515,764,765],{"class":546}," realtime",[515,767,556],{"class":525},[515,769,770],{"class":559},"Run",[515,772,563],{"class":525},[515,774,566],{"class":546},[515,776,569],{"class":525},[515,778,572],{"class":546},[515,780,556],{"class":525},[515,782,268],{"class":546},[515,784,569],{"class":525},[515,786,787],{"class":525}," func(",[515,789,791],{"class":790},"sHdIc","topics",[515,793,794],{"class":525}," *",[515,796,477],{"class":529},[515,798,556],{"class":525},[515,800,801],{"class":529},"TopicAuth",[515,803,804],{"class":525},")",[515,806,808],{"class":807},"spNyl"," error",[515,810,811],{"class":525}," {\n",[515,813,814,817,819,821,823,826,830,832,834,836,839,841,844,846,849,851,854,857,860,864],{"class":517,"line":536},[515,815,816],{"class":546},"    topics",[515,818,556],{"class":525},[515,820,744],{"class":559},[515,822,563],{"class":525},[515,824,825],{"class":525},"\"",[515,827,829],{"class":828},"sfazB","announcements",[515,831,825],{"class":525},[515,833,569],{"class":525},[515,835,787],{"class":525},[515,837,838],{"class":790},"id",[515,840,794],{"class":525},[515,842,843],{"class":529},"rbac",[515,845,556],{"class":525},[515,847,848],{"class":529},"Identity",[515,850,804],{"class":525},[515,852,853],{"class":807}," bool",[515,855,856],{"class":525}," {",[515,858,859],{"class":521}," return",[515,861,863],{"class":862},"sfNiH"," true",[515,865,866],{"class":525}," })\n",[515,868,869,871,873,875,877,879,882,884,886,888,890,892,894,896,898,900,902,904,906,909,911,914,916,918,921,923,925],{"class":517,"line":543},[515,870,816],{"class":546},[515,872,556],{"class":525},[515,874,744],{"class":559},[515,876,563],{"class":525},[515,878,825],{"class":525},[515,880,881],{"class":828},"admin-alerts",[515,883,825],{"class":525},[515,885,569],{"class":525},[515,887,787],{"class":525},[515,889,838],{"class":790},[515,891,794],{"class":525},[515,893,843],{"class":529},[515,895,556],{"class":525},[515,897,848],{"class":529},[515,899,804],{"class":525},[515,901,853],{"class":807},[515,903,856],{"class":525},[515,905,859],{"class":521},[515,907,908],{"class":546}," id",[515,910,556],{"class":525},[515,912,913],{"class":559},"HasRole",[515,915,563],{"class":525},[515,917,825],{"class":525},[515,919,920],{"class":828},"admin",[515,922,825],{"class":525},[515,924,804],{"class":525},[515,926,866],{"class":525},[515,928,929,932],{"class":517,"line":601},[515,930,931],{"class":521},"    return",[515,933,934],{"class":525}," nil\n",[515,936,937],{"class":517,"line":620},[515,938,939],{"class":525},"})\n",[448,941,942,943,945],{},"Egy topic, aminek nincs regisztrált ",[471,944,744],{}," callbackje, sosem iratkoztatható fel.",[448,947,948,949,951,952,954],{},"Ha egy csatorna-család teljes neve csak futásidőben ismert (egy dinamikus\nerőforrás soronként: egy tenant, egy projekt, egy repository), az ",[471,950,744],{},"-val\negyenként, induláskor való elnevezés nem lehetséges: helyette ",[471,953,748],{},"\nhasználandó, aminek a callbackje megkapja a teljes topic stringet, hogy meg\ntudja állapítani, épp melyik konkrét instance-t kérik.",[506,956,958],{"className":508,"code":957,"language":510,"meta":511,"style":511},"topics.AllowPrefix(\"project:\", func(id *rbac.Identity, topic string) bool {\n    projectID, _ := strings.CutPrefix(topic, \"project:\")\n    return projectAccess.CanView(id.Subject, projectID)\n})\n",[471,959,960,1005,1040,1068],{"__ignoreMap":511},[515,961,962,964,966,968,970,972,975,977,979,981,983,985,987,989,991,993,996,999,1001,1003],{"class":517,"line":518},[515,963,791],{"class":546},[515,965,556],{"class":525},[515,967,748],{"class":559},[515,969,563],{"class":525},[515,971,825],{"class":525},[515,973,974],{"class":828},"project:",[515,976,825],{"class":525},[515,978,569],{"class":525},[515,980,787],{"class":525},[515,982,838],{"class":790},[515,984,794],{"class":525},[515,986,843],{"class":529},[515,988,556],{"class":525},[515,990,848],{"class":529},[515,992,569],{"class":525},[515,994,995],{"class":790}," topic",[515,997,998],{"class":807}," string",[515,1000,804],{"class":525},[515,1002,853],{"class":807},[515,1004,811],{"class":525},[515,1006,1007,1010,1012,1015,1017,1020,1022,1025,1027,1030,1032,1034,1036,1038],{"class":517,"line":536},[515,1008,1009],{"class":546},"    projectID",[515,1011,569],{"class":525},[515,1013,1014],{"class":546}," _ ",[515,1016,550],{"class":525},[515,1018,1019],{"class":546}," strings",[515,1021,556],{"class":525},[515,1023,1024],{"class":559},"CutPrefix",[515,1026,563],{"class":525},[515,1028,1029],{"class":546},"topic",[515,1031,569],{"class":525},[515,1033,526],{"class":525},[515,1035,974],{"class":828},[515,1037,825],{"class":525},[515,1039,598],{"class":525},[515,1041,1042,1044,1047,1049,1052,1054,1056,1058,1061,1063,1066],{"class":517,"line":543},[515,1043,931],{"class":521},[515,1045,1046],{"class":546}," projectAccess",[515,1048,556],{"class":525},[515,1050,1051],{"class":559},"CanView",[515,1053,563],{"class":525},[515,1055,838],{"class":546},[515,1057,556],{"class":525},[515,1059,1060],{"class":546},"Subject",[515,1062,569],{"class":525},[515,1064,1065],{"class":546}," projectID",[515,1067,598],{"class":525},[515,1069,1070],{"class":517,"line":601},[515,1071,939],{"class":525},[448,1073,1074,1075,1077,1078,1080],{},"Egy pontos ",[471,1076,744],{},"-egyezés mindig elsőbbséget élvez egy illeszkedő\n",[471,1079,748],{},"-szel szemben; a prefixek közül az elsőként regisztrált,\nilleszkedő nyer.",[463,1082,1084],{"id":1083},"skálázás-a-példányok-szabadon-jönnek-mennek","Skálázás: a példányok szabadon jönnek-mennek",[448,1086,1087],{},"Minden gateway-példány stateless: csak azokat a csatornákat tartja, amikre a saját kapcsolatainak szükségük van, és a közös Valkey broker minden érintett példányhoz eljuttat egy publish-t, bármely processből, sticky session-igény nélkül.",[1089,1090,1091,1103,1121,1127],"ul",{},[1092,1093,1094,1098,1099,1102],"li",{},[1095,1096,1097],"strong",{},"Felskálázás",": ",[471,1100,1101],{},"docker compose up -d --scale realtime=N","; egy új példány nulla állapottal indul, és csak akkor gyűlnek a szubszkripciói, amikor kliensek landolnak rajta.",[1092,1104,1105,1108,1109,1112,1113,1116,1117,1120],{},[1095,1106,1107],{},"Leskálázás \u002F rolling restart",": a ",[471,1110,1111],{},"SIGTERM"," bekapcsol egy draining flaget (a ",[471,1114,1115],{},"\u002Frealtime\u002Fhealthz"," és az új connect-kísérletek 503-at adnak, így a load balancer health checkje kiejti a példányt), a ",[471,1118,1119],{},"node.Shutdown"," minden tartott kapcsolatot reconnect-jogosult kóddal zár, a closerek lefutnak, a telemetria flush-öl. A kliens saját reconnect-logikája (backoff, beépítve a JS kliensbe) egy túlélő példányra viszi, ami frissen feliratkoztatja; ami a rés alatt publikálódott, azt a database csatornából állítja helyre, nem a gateway replay-eli.",[1092,1122,1123,1126],{},[1095,1124,1125],{},"Crash",": a kliens oldala ugyanaz, mint egy graceful restartnál, csak a drain lépés nélkül.",[1092,1128,1129,1132,1133,1135],{},[1095,1130,1131],{},"Valkey restart",": a reconnect és az újra-subscribe a ",[471,1134,499],{}," dolga; a publikálás a kiesés alatt logolva és eldobva (ugyanaz a fire-and-forget kontraktus), ugyanúgy helyreállítva, mint egy kliens saját reconnectje alatt lemaradt publish.",[463,1137,1139],{"id":1138},"config","Config",[1141,1142,1143,1159],"table",{},[1144,1145,1146],"thead",{},[1147,1148,1149,1153,1156],"tr",{},[1150,1151,1152],"th",{},"Változó",[1150,1154,1155],{},"Alapérték",[1150,1157,1158],{},"Jelentés",[1160,1161,1162,1178,1193,1208,1225,1241,1258],"tbody",{},[1147,1163,1164,1170,1175],{},[1165,1166,1167],"td",{},[471,1168,1169],{},"REALTIME_LISTEN_ADDR",[1165,1171,1172],{},[471,1173,1174],{},":3000",[1165,1176,1177],{},"konténer-belső listen address",[1147,1179,1180,1185,1190],{},[1165,1181,1182],{},[471,1183,1184],{},"REALTIME_DRAIN_TIMEOUT",[1165,1186,1187],{},[471,1188,1189],{},"20s",[1165,1191,1192],{},"graceful-shutdown budget; tartsd a deployment stop-grace-periódusa alatt",[1147,1194,1195,1200,1205],{},[1165,1196,1197],{},[471,1198,1199],{},"REALTIME_READ_HEADER_TIMEOUT",[1165,1201,1202],{},[471,1203,1204],{},"5s",[1165,1206,1207],{},"Slowloris-védelem a connect handshake-en",[1147,1209,1210,1215,1218],{},[1165,1211,1212],{},[471,1213,1214],{},"REALTIME_CHANNEL_PREFIX",[1165,1216,1217],{},"a projekt neve",[1165,1219,1220,1221,1224],{},"Valkey csatorna-névtér, közös minden ",[471,1222,1223],{},"notify\u002Fbroadcast.Publisher","-rel",[1147,1226,1227,1232,1238],{},[1165,1228,1229],{},[471,1230,1231],{},"REALTIME_MAX_CONNECTIONS",[1165,1233,1234,1237],{},[471,1235,1236],{},"0"," (korlátlan)",[1165,1239,1240],{},"példányonkénti stream-plafon; felette a connect-kísérletek 503-at kapnak",[1147,1242,1243,1248,1251],{},[1165,1244,1245],{},[471,1246,1247],{},"VALKEY_*",[1165,1249,1250],{},"örökölt",[1165,1252,1253,1254,1257],{},"újrahasznosítva a ",[471,1255,1256],{},"queue.Config","-ból: a gateway brokere ugyanaz a Valkey, amit a queue használ",[1147,1259,1260,1265,1267],{},[1165,1261,1262],{},[471,1263,1264],{},"JWT_*",[1165,1266,1250],{},[1165,1268,1269,1270,1273],{},"újrahasznosítva az ",[471,1271,1272],{},"auth.Config","-ból: ugyanaz a token-issuer, amiben minden modul megbízik",[448,1275,1276,1277,1282,1283,1286,1287,1290,1291,1295,1296,1299],{},"Lásd az ",[452,1278,1279,1281],{"href":311},[471,1280,310],{}," referenciát"," a scaffoldolt elemekért (a binary, a ",[471,1284,1285],{},"compose.yml"," Traefik-routolt service-e, a ",[471,1288,1289],{},".env.example","), és az ",[452,1292,1293],{"href":306},[471,1294,305],{}," oldalt a broadcast csatorna egy notification ",[471,1297,1298],{},"Via","-jába drótozásához.",[463,1301,1303],{"id":1302},"kliens","Kliens",[506,1305,1309],{"className":1306,"code":1307,"language":1308,"meta":511,"style":511},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Centrifuge } from 'centrifuge'\n\nconst client = new Centrifuge('wss:\u002F\u002Fyour-app.example\u002Frealtime\u002Fconnection\u002Fwebsocket', {\n    getToken: async () => fetchAccessToken(), \u002F\u002F ugyanaz a JWT, amit az API használ\n})\nclient.on('publication', (ctx) => {\n    \u002F\u002F ctx.data: { id, name, payload, at }, az id visszaköti a database csatorna sorához\n})\nclient.connect()\n","js",[471,1310,1311,1334,1338,1368,1397,1404,1436,1441,1447],{"__ignoreMap":511},[515,1312,1313,1315,1317,1320,1323,1326,1329,1331],{"class":517,"line":518},[515,1314,522],{"class":521},[515,1316,856],{"class":525},[515,1318,1319],{"class":546}," Centrifuge",[515,1321,1322],{"class":525}," }",[515,1324,1325],{"class":521}," from",[515,1327,1328],{"class":525}," '",[515,1330,499],{"class":828},[515,1332,1333],{"class":525},"'\n",[515,1335,1336],{"class":517,"line":536},[515,1337,540],{"emptyLinePlaceholder":539},[515,1339,1340,1343,1346,1349,1352,1354,1356,1359,1362,1364,1366],{"class":517,"line":543},[515,1341,1342],{"class":807},"const",[515,1344,1345],{"class":546}," client ",[515,1347,1348],{"class":525},"=",[515,1350,1351],{"class":525}," new",[515,1353,1319],{"class":559},[515,1355,563],{"class":546},[515,1357,1358],{"class":525},"'",[515,1360,1361],{"class":828},"wss:\u002F\u002Fyour-app.example\u002Frealtime\u002Fconnection\u002Fwebsocket",[515,1363,1358],{"class":525},[515,1365,569],{"class":525},[515,1367,811],{"class":525},[515,1369,1370,1373,1376,1379,1382,1385,1388,1391,1393],{"class":517,"line":601},[515,1371,1372],{"class":559},"    getToken",[515,1374,1375],{"class":525},":",[515,1377,1378],{"class":807}," async",[515,1380,1381],{"class":525}," ()",[515,1383,1384],{"class":807}," =>",[515,1386,1387],{"class":559}," fetchAccessToken",[515,1389,1390],{"class":546},"()",[515,1392,569],{"class":525},[515,1394,1396],{"class":1395},"sHwdD"," \u002F\u002F ugyanaz a JWT, amit az API használ\n",[515,1398,1399,1402],{"class":517,"line":620},[515,1400,1401],{"class":525},"}",[515,1403,598],{"class":546},[515,1405,1406,1409,1411,1414,1416,1418,1421,1423,1425,1428,1430,1432,1434],{"class":517,"line":639},[515,1407,1408],{"class":546},"client",[515,1410,556],{"class":525},[515,1412,1413],{"class":559},"on",[515,1415,563],{"class":546},[515,1417,1358],{"class":525},[515,1419,1420],{"class":828},"publication",[515,1422,1358],{"class":525},[515,1424,569],{"class":525},[515,1426,1427],{"class":525}," (",[515,1429,566],{"class":790},[515,1431,804],{"class":525},[515,1433,1384],{"class":807},[515,1435,811],{"class":525},[515,1437,1438],{"class":517,"line":657},[515,1439,1440],{"class":1395},"    \u002F\u002F ctx.data: { id, name, payload, at }, az id visszaköti a database csatorna sorához\n",[515,1442,1443,1445],{"class":517,"line":691},[515,1444,1401],{"class":525},[515,1446,598],{"class":546},[515,1448,1450,1452,1454,1457],{"class":517,"line":1449},9,[515,1451,1408],{"class":546},[515,1453,556],{"class":525},[515,1455,1456],{"class":559},"connect",[515,1458,1459],{"class":546},"()\n",[448,1461,450,1462,1465,1466,1469,1470,1473],{},[471,1463,1464],{},"centrifuge-js"," kezeli a reconnect-backoffot és a token-refresht; a server-side subscription a recipiens saját csatornájára azt jelenti, hogy a kliensnek nincs szüksége explicit ",[471,1467,1468],{},"subscribe"," hívásra a neki szóló notificationökhöz. Reconnectkor kérd le az olvasatlan notificationöket a saját modulod inbox-endpointjából (a ",[452,1471,1472],{"href":459},"database csatornára"," építve), hogy backfilleld, ami a kapcsolat megszakadása alatt lemaradt. A socket egy élő poke, a database az igazságforrás.",[463,1475,1477],{"id":1476},"kapcsolódó-oldalak","Kapcsolódó oldalak",[1089,1479,1480,1487,1503],{},[1092,1481,1482,1486],{},[452,1483,1484],{"href":144},[471,1485,473],{},": a publish-only oldal, amit bármely process importálhat.",[1092,1488,1489,1494,1495,1497,1498,745,1500,1502],{},[452,1490,1491],{"href":94},[471,1492,1493],{},"auth\u002Frbac",": az ",[471,1496,848],{},", amire egy kapcsolat JWT-je feloldódik, és amit az ",[471,1499,744],{},[471,1501,748],{}," ellenőriz.",[1092,1504,1505,1507,1508,1511,1512,1515],{},[452,1506,253],{"href":254},": a közös ",[471,1509,1510],{},"app.Run"," váz, amire a ",[471,1513,1514],{},"realtime.Run"," épül.",[1517,1518,1519],"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 pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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}",{"title":511,"searchDepth":536,"depth":536,"links":1521},[1522,1523,1524,1525,1526,1527,1528],{"id":465,"depth":536,"text":466},{"id":503,"depth":536,"text":504},{"id":710,"depth":536,"text":711},{"id":1083,"depth":536,"text":1084},{"id":1138,"depth":536,"text":1139},{"id":1302,"depth":536,"text":1303},{"id":1476,"depth":536,"text":1477},"Dedikált, horizontálisan skálázható gateway, ami élőben pusholja a notificationöket a csatlakozott klienseknek: csak szerver→kliens, centrifuge-ra épülve.","md",null,{},{"icon":70},{"title":268,"description":1529},"ffwoJwa-OuK--JVLtHg8hNtkM3gz2baho7nKtEBhGZc",[1537,1539],{"title":263,"path":264,"stem":265,"description":1538,"icon":266,"children":-1},"A háttérmunka-chassis, asynq szerver, outbox relay és schedule runner egyetlen binárisban, közös graceful shutdownnal.",{"title":272,"path":273,"stem":274,"description":1540,"icon":275,"children":-1},"Időbélyeg-prefixes SQL-fájlok a binárisba ágyazva, saját cmd\u002Fmigrate futtatóval, külső tool nélkül.",1785445885724]