[{"data":1,"prerenderedAt":4923},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fpackages\u002Fmessaging":176,"\u002Fdocs\u002Fpackages\u002Fmessaging-surround":4918},[4,21,86,158],{"title":5,"path":6,"stem":7,"children":8,"status":11,"icon":20},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F1.getting-started\u002F1.index",[9,12,16],{"title":10,"path":6,"stem":7,"status":11},"Introduction",null,{"title":13,"path":14,"stem":15,"status":11},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","1.docs\u002F1.getting-started\u002F2.installation",{"title":17,"path":18,"stem":19,"status":11},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","1.docs\u002F1.getting-started\u002F3.quick-start",false,{"title":22,"path":23,"stem":24,"children":25,"status":11,"icon":20},"Core Concepts","\u002Fdocs\u002Fcore-concepts","1.docs\u002F2.core-concepts\u002F1.index",[26,28,32,36,46,50,54,58,62,66,70,74,78,82],{"title":27,"path":23,"stem":24,"status":11},"Overview",{"title":29,"path":30,"stem":31,"status":11},"Response","\u002Fdocs\u002Fcore-concepts\u002Fresponse","1.docs\u002F2.core-concepts\u002F10.response",{"title":33,"path":34,"stem":35,"status":11},"Testing","\u002Fdocs\u002Fcore-concepts\u002Ftesting","1.docs\u002F2.core-concepts\u002F12.testing",{"title":37,"path":38,"stem":39,"children":40,"status":11,"icon":20,"defaultOpen":20},"Decorators","\u002Fdocs\u002Fcore-concepts\u002Fdecorators","1.docs\u002F2.core-concepts\u002F13.decorators\u002F1.index",[41,42],{"title":27,"path":38,"stem":39,"status":11},{"title":43,"path":44,"stem":45,"status":11},"Custom","\u002Fdocs\u002Fcore-concepts\u002Fdecorators\u002Fcustom","1.docs\u002F2.core-concepts\u002F13.decorators\u002F2.custom",{"title":47,"path":48,"stem":49,"status":11},"Discovery Service","\u002Fdocs\u002Fcore-concepts\u002Fdiscovery","1.docs\u002F2.core-concepts\u002F14.discovery",{"title":51,"path":52,"stem":53,"status":11},"Application Lifecycle","\u002Fdocs\u002Fcore-concepts\u002Fapp-lifecycle","1.docs\u002F2.core-concepts\u002F15.app-lifecycle",{"title":55,"path":56,"stem":57,"status":11},"Controllers","\u002Fdocs\u002Fcore-concepts\u002Fcontrollers","1.docs\u002F2.core-concepts\u002F2.controllers",{"title":59,"path":60,"stem":61,"status":11},"Routing","\u002Fdocs\u002Fcore-concepts\u002Frouting","1.docs\u002F2.core-concepts\u002F3.routing",{"title":63,"path":64,"stem":65,"status":11},"Providers","\u002Fdocs\u002Fcore-concepts\u002Fproviders","1.docs\u002F2.core-concepts\u002F4.providers",{"title":67,"path":68,"stem":69,"status":11},"Modules","\u002Fdocs\u002Fcore-concepts\u002Fmodules","1.docs\u002F2.core-concepts\u002F5.modules",{"title":71,"path":72,"stem":73,"status":11},"Configuration","\u002Fdocs\u002Fcore-concepts\u002Fconfiguration","1.docs\u002F2.core-concepts\u002F6.configuration",{"title":75,"path":76,"stem":77,"status":11},"Middleware","\u002Fdocs\u002Fcore-concepts\u002Fmiddleware","1.docs\u002F2.core-concepts\u002F7.middleware",{"title":79,"path":80,"stem":81,"status":11},"Guards","\u002Fdocs\u002Fcore-concepts\u002Fguards","1.docs\u002F2.core-concepts\u002F8.guards",{"title":83,"path":84,"stem":85,"status":11},"Exceptions","\u002Fdocs\u002Fcore-concepts\u002Fexceptions","1.docs\u002F2.core-concepts\u002F9.exceptions",{"title":87,"path":88,"stem":89,"children":90,"status":11,"icon":20},"Packages","\u002Fdocs\u002Fpackages","1.docs\u002F3.packages\u002F1.index",[91,92,97,108,112,130,134,138,142,146,150,154],{"title":27,"path":88,"stem":89,"status":11},{"title":93,"path":94,"stem":95,"status":96},"CLI","\u002Fdocs\u002Fpackages\u002Fcli","1.docs\u002F3.packages\u002F10.cli","experimental",{"title":98,"path":99,"stem":100,"children":101,"status":11,"icon":20,"defaultOpen":20},"Events","\u002Fdocs\u002Fpackages\u002Fmessaging","1.docs\u002F3.packages\u002F11.messaging\u002F1.index",[102,104],{"title":27,"path":99,"stem":100,"status":103},"beta",{"title":105,"path":106,"stem":107,"status":96},"Redis","\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis","1.docs\u002F3.packages\u002F11.messaging\u002F2.redis",{"title":109,"path":110,"stem":111,"status":103},"Serve Static","\u002Fdocs\u002Fpackages\u002Fserve-static","1.docs\u002F3.packages\u002F12.serve-static",{"title":113,"path":114,"stem":115,"children":116,"status":11,"icon":20,"defaultOpen":20},"Auth","\u002Fdocs\u002Fpackages\u002Fauth","1.docs\u002F3.packages\u002F2.auth\u002F1.index",[117,118,122,126],{"title":27,"path":114,"stem":115,"status":103},{"title":119,"path":120,"stem":121,"status":103},"JWT Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Fjwt","1.docs\u002F3.packages\u002F2.auth\u002F2.jwt",{"title":123,"path":124,"stem":125,"status":103},"Local Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Flocal","1.docs\u002F3.packages\u002F2.auth\u002F3.local",{"title":127,"path":128,"stem":129,"status":96},"OAuth2 Provider","\u002Fdocs\u002Fpackages\u002Fauth\u002Foauth2","1.docs\u002F3.packages\u002F2.auth\u002F4.oauth2",{"title":131,"path":132,"stem":133,"status":103},"JWT","\u002Fdocs\u002Fpackages\u002Fjwt","1.docs\u002F3.packages\u002F3.jwt",{"title":135,"path":136,"stem":137,"status":103},"Drizzle","\u002Fdocs\u002Fpackages\u002Fdrizzle","1.docs\u002F3.packages\u002F4.drizzle",{"title":139,"path":140,"stem":141,"status":103},"Papr","\u002Fdocs\u002Fpackages\u002Fpapr","1.docs\u002F3.packages\u002F5.papr",{"title":143,"path":144,"stem":145,"status":103},"Mongoose","\u002Fdocs\u002Fpackages\u002Fmongoose","1.docs\u002F3.packages\u002F6.mongoose",{"title":147,"path":148,"stem":149,"status":103},"Swagger","\u002Fdocs\u002Fpackages\u002Fswagger","1.docs\u002F3.packages\u002F7.swagger",{"title":151,"path":152,"stem":153,"status":103},"Node Server","\u002Fdocs\u002Fpackages\u002Fnode-server","1.docs\u002F3.packages\u002F8.node-server",{"title":155,"path":156,"stem":157,"status":103},"uWS Server","\u002Fdocs\u002Fpackages\u002Fuws-server","1.docs\u002F3.packages\u002F9.uws-server",{"title":159,"path":160,"stem":161,"children":162,"status":11,"icon":20},"Roadmap","\u002Fdocs\u002Froadmap","1.docs\u002F4.roadmap\u002F1.index",[163,164,168,172],{"title":27,"path":160,"stem":161,"status":11},{"title":165,"path":166,"stem":167,"status":11},"Short term (0-3 months)","\u002Fdocs\u002Froadmap\u002Fshort-term","1.docs\u002F4.roadmap\u002F2.short-term",{"title":169,"path":170,"stem":171,"status":11},"Mid term (3-9 months)","\u002Fdocs\u002Froadmap\u002Fmid-term","1.docs\u002F4.roadmap\u002F3.mid-term",{"title":173,"path":174,"stem":175,"status":11},"Long term (9-12+ months)","\u002Fdocs\u002Froadmap\u002Flong-term","1.docs\u002F4.roadmap\u002F4.long-term",{"id":177,"title":27,"body":178,"description":4913,"extension":4914,"meta":4915,"navigation":393,"path":99,"seo":4916,"status":103,"stem":100,"__hash__":4917},"docs\u002F1.docs\u002F3.packages\u002F11.messaging\u002F1.index.md",{"type":179,"value":180,"toc":4886},"minimark",[181,201,224,228,299,302,306,790,808,812,905,1035,1048,1051,1069,1074,1077,1209,1215,1219,1222,1230,1233,1240,1245,1300,1307,1314,1320,1422,1435,1442,1456,1459,1473,1498,1547,1560,1564,1567,1600,1773,1786,1803,1807,1825,1840,1854,1857,1979,2077,2080,2084,2106,2314,2317,2397,2407,2411,2425,2460,2463,2479,2483,2499,2686,2704,2811,2816,2898,2912,2964,2985,2997,3001,3015,3334,3337,3461,3470,3666,3694,3713,3733,3736,3759,3762,3797,3804,3952,4041,4072,4076,4135,4218,4228,4231,4241,4561,4567,4571,4882],[182,183,184,188,189,192,193,196,197,200],"p",{},[185,186,187],"code",{},"@miiajs\u002Fmessaging"," is a decorator-driven event bus for MiiaJS. Mark any method on any provider or controller with ",[185,190,191],{},"@On('topic')",", inject ",[185,194,195],{},"MessageBus"," somewhere else, and call ",[185,198,199],{},"bus.publish(...)"," - handlers are wired automatically at startup. No central registry, no manual subscription list.",[182,202,203,204,208,209,212,213,223],{},"The package ships with an in-memory transport for development and tests. For production, swap in ",[205,206,207],"a",{"href":106},"Redis Streams"," - same API, just one line in ",[185,210,211],{},"MessagingModule.configure",". The discovery side is built on top of ",[205,214,215,218,219,222],{"href":48},[185,216,217],{},"DiscoveryService"," and the ",[185,220,221],{},"onReady"," lifecycle hook",", so the wiring story is the same as any other ambient-discovery package.",[225,226,13],"h2",{"id":227},"installation",[229,230,231,256,271,285],"code-group",{},[232,233,239],"pre",{"className":234,"code":235,"filename":236,"language":237,"meta":238,"style":238},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","bun add @miiajs\u002Fmessaging\n","bun","bash","",[185,240,241],{"__ignoreMap":238},[242,243,246,249,253],"span",{"class":244,"line":245},"line",1,[242,247,236],{"class":248},"sBMFI",[242,250,252],{"class":251},"sfazB"," add",[242,254,255],{"class":251}," @miiajs\u002Fmessaging\n",[232,257,260],{"className":234,"code":258,"filename":259,"language":237,"meta":238,"style":238},"npm install @miiajs\u002Fmessaging\n","npm",[185,261,262],{"__ignoreMap":238},[242,263,264,266,269],{"class":244,"line":245},[242,265,259],{"class":248},[242,267,268],{"class":251}," install",[242,270,255],{"class":251},[232,272,275],{"className":234,"code":273,"filename":274,"language":237,"meta":238,"style":238},"pnpm add @miiajs\u002Fmessaging\n","pnpm",[185,276,277],{"__ignoreMap":238},[242,278,279,281,283],{"class":244,"line":245},[242,280,274],{"class":248},[242,282,252],{"class":251},[242,284,255],{"class":251},[232,286,289],{"className":234,"code":287,"filename":288,"language":237,"meta":238,"style":238},"yarn add @miiajs\u002Fmessaging\n","yarn",[185,290,291],{"__ignoreMap":238},[242,292,293,295,297],{"class":244,"line":245},[242,294,288],{"class":248},[242,296,252],{"class":251},[242,298,255],{"class":251},[182,300,301],{},"No peer dependencies for the in-memory transport.",[225,303,305],{"id":304},"setup","Setup",[232,307,311],{"className":308,"code":309,"language":310,"meta":238,"style":238},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Module, Injectable, inject } from '@miiajs\u002Fcore'\nimport { MessagingModule, MessageBus, On, inMemoryTransport } from '@miiajs\u002Fmessaging'\n\n@Injectable()\nclass EmailService {\n  @On('user.created')\n  async sendWelcome(user: { id: string; email: string }) {\n    console.log(`welcome → ${user.email}`)\n  }\n}\n\n@Injectable()\nclass SignupController {\n  private bus = inject(MessageBus)\n\n  async createUser(input: { email: string }) {\n    const user = { id: crypto.randomUUID(), ...input }\n    await this.bus.publish('user.created', user)\n    return user\n  }\n}\n\n@Module({\n  imports: [MessagingModule.configure({ transport: inMemoryTransport() })],\n  providers: [EmailService, SignupController],\n})\nclass AppModule {}\n","typescript",[185,312,313,353,388,395,408,421,444,488,523,529,535,540,549,559,576,581,608,646,677,686,691,696,701,714,754,772,779],{"__ignoreMap":238},[242,314,315,319,323,327,330,333,335,338,341,344,347,350],{"class":244,"line":245},[242,316,318],{"class":317},"s7zQu","import",[242,320,322],{"class":321},"sMK4o"," {",[242,324,326],{"class":325},"sTEyZ"," Module",[242,328,329],{"class":321},",",[242,331,332],{"class":325}," Injectable",[242,334,329],{"class":321},[242,336,337],{"class":325}," inject",[242,339,340],{"class":321}," }",[242,342,343],{"class":317}," from",[242,345,346],{"class":321}," '",[242,348,349],{"class":251},"@miiajs\u002Fcore",[242,351,352],{"class":321},"'\n",[242,354,356,358,360,363,365,368,370,373,375,378,380,382,384,386],{"class":244,"line":355},2,[242,357,318],{"class":317},[242,359,322],{"class":321},[242,361,362],{"class":325}," MessagingModule",[242,364,329],{"class":321},[242,366,367],{"class":325}," MessageBus",[242,369,329],{"class":321},[242,371,372],{"class":325}," On",[242,374,329],{"class":321},[242,376,377],{"class":325}," inMemoryTransport",[242,379,340],{"class":321},[242,381,343],{"class":317},[242,383,346],{"class":321},[242,385,187],{"class":251},[242,387,352],{"class":321},[242,389,391],{"class":244,"line":390},3,[242,392,394],{"emptyLinePlaceholder":393},true,"\n",[242,396,398,401,405],{"class":244,"line":397},4,[242,399,400],{"class":321},"@",[242,402,404],{"class":403},"s2Zo4","Injectable",[242,406,407],{"class":325},"()\n",[242,409,411,415,418],{"class":244,"line":410},5,[242,412,414],{"class":413},"spNyl","class",[242,416,417],{"class":248}," EmailService",[242,419,420],{"class":321}," {\n",[242,422,424,427,430,433,436,439,441],{"class":244,"line":423},6,[242,425,426],{"class":321},"  @",[242,428,429],{"class":403},"On",[242,431,432],{"class":325},"(",[242,434,435],{"class":321},"'",[242,437,438],{"class":251},"user.created",[242,440,435],{"class":321},[242,442,443],{"class":325},")\n",[242,445,447,450,454,456,460,463,465,468,470,473,476,479,481,483,486],{"class":244,"line":446},7,[242,448,449],{"class":413},"  async",[242,451,453],{"class":452},"swJcz"," sendWelcome",[242,455,432],{"class":321},[242,457,459],{"class":458},"sHdIc","user",[242,461,462],{"class":321},":",[242,464,322],{"class":321},[242,466,467],{"class":452}," id",[242,469,462],{"class":321},[242,471,472],{"class":248}," string",[242,474,475],{"class":321},";",[242,477,478],{"class":452}," email",[242,480,462],{"class":321},[242,482,472],{"class":248},[242,484,485],{"class":321}," })",[242,487,420],{"class":321},[242,489,491,494,497,500,502,505,508,511,513,515,518,521],{"class":244,"line":490},8,[242,492,493],{"class":325},"    console",[242,495,496],{"class":321},".",[242,498,499],{"class":403},"log",[242,501,432],{"class":452},[242,503,504],{"class":321},"`",[242,506,507],{"class":251},"welcome → ",[242,509,510],{"class":321},"${",[242,512,459],{"class":325},[242,514,496],{"class":321},[242,516,517],{"class":325},"email",[242,519,520],{"class":321},"}`",[242,522,443],{"class":452},[242,524,526],{"class":244,"line":525},9,[242,527,528],{"class":321},"  }\n",[242,530,532],{"class":244,"line":531},10,[242,533,534],{"class":321},"}\n",[242,536,538],{"class":244,"line":537},11,[242,539,394],{"emptyLinePlaceholder":393},[242,541,543,545,547],{"class":244,"line":542},12,[242,544,400],{"class":321},[242,546,404],{"class":403},[242,548,407],{"class":325},[242,550,552,554,557],{"class":244,"line":551},13,[242,553,414],{"class":413},[242,555,556],{"class":248}," SignupController",[242,558,420],{"class":321},[242,560,562,565,568,571,573],{"class":244,"line":561},14,[242,563,564],{"class":413},"  private",[242,566,567],{"class":452}," bus",[242,569,570],{"class":321}," =",[242,572,337],{"class":452},[242,574,575],{"class":325},"(MessageBus)\n",[242,577,579],{"class":244,"line":578},15,[242,580,394],{"emptyLinePlaceholder":393},[242,582,584,586,589,591,594,596,598,600,602,604,606],{"class":244,"line":583},16,[242,585,449],{"class":413},[242,587,588],{"class":452}," createUser",[242,590,432],{"class":321},[242,592,593],{"class":458},"input",[242,595,462],{"class":321},[242,597,322],{"class":321},[242,599,478],{"class":452},[242,601,462],{"class":321},[242,603,472],{"class":248},[242,605,485],{"class":321},[242,607,420],{"class":321},[242,609,611,614,617,619,621,623,625,628,630,633,636,638,641,643],{"class":244,"line":610},17,[242,612,613],{"class":413},"    const",[242,615,616],{"class":325}," user",[242,618,570],{"class":321},[242,620,322],{"class":321},[242,622,467],{"class":452},[242,624,462],{"class":321},[242,626,627],{"class":325}," crypto",[242,629,496],{"class":321},[242,631,632],{"class":403},"randomUUID",[242,634,635],{"class":452},"()",[242,637,329],{"class":321},[242,639,640],{"class":321}," ...",[242,642,593],{"class":325},[242,644,645],{"class":321}," }\n",[242,647,649,652,655,658,660,663,665,667,669,671,673,675],{"class":244,"line":648},18,[242,650,651],{"class":317},"    await",[242,653,654],{"class":321}," this.",[242,656,657],{"class":325},"bus",[242,659,496],{"class":321},[242,661,662],{"class":403},"publish",[242,664,432],{"class":452},[242,666,435],{"class":321},[242,668,438],{"class":251},[242,670,435],{"class":321},[242,672,329],{"class":321},[242,674,616],{"class":325},[242,676,443],{"class":452},[242,678,680,683],{"class":244,"line":679},19,[242,681,682],{"class":317},"    return",[242,684,685],{"class":325}," user\n",[242,687,689],{"class":244,"line":688},20,[242,690,528],{"class":321},[242,692,694],{"class":244,"line":693},21,[242,695,534],{"class":321},[242,697,699],{"class":244,"line":698},22,[242,700,394],{"emptyLinePlaceholder":393},[242,702,704,706,709,711],{"class":244,"line":703},23,[242,705,400],{"class":321},[242,707,708],{"class":403},"Module",[242,710,432],{"class":325},[242,712,713],{"class":321},"{\n",[242,715,717,720,722,725,727,730,732,735,738,740,742,745,748,751],{"class":244,"line":716},24,[242,718,719],{"class":452},"  imports",[242,721,462],{"class":321},[242,723,724],{"class":325}," [MessagingModule",[242,726,496],{"class":321},[242,728,729],{"class":403},"configure",[242,731,432],{"class":325},[242,733,734],{"class":321},"{",[242,736,737],{"class":452}," transport",[242,739,462],{"class":321},[242,741,377],{"class":403},[242,743,744],{"class":325},"() ",[242,746,747],{"class":321},"}",[242,749,750],{"class":325},")]",[242,752,753],{"class":321},",\n",[242,755,757,760,762,765,767,770],{"class":244,"line":756},25,[242,758,759],{"class":452},"  providers",[242,761,462],{"class":321},[242,763,764],{"class":325}," [EmailService",[242,766,329],{"class":321},[242,768,769],{"class":325}," SignupController]",[242,771,753],{"class":321},[242,773,775,777],{"class":244,"line":774},26,[242,776,747],{"class":321},[242,778,443],{"class":325},[242,780,782,784,787],{"class":244,"line":781},27,[242,783,414],{"class":413},[242,785,786],{"class":248}," AppModule",[242,788,789],{"class":321}," {}\n",[182,791,792,795,796,800,801,803,804,807],{},[185,793,794],{},"@On"," works on providers ",[797,798,799],"strong",{},"and"," controllers - ",[185,802,217],{}," finds both, so a controller method can react to an event the same way a service can. Handler signature is ",[185,805,806],{},"(payload, meta?) => void | Promise\u003Cvoid>","; throwing nacks the message.",[225,809,811],{"id":810},"the-on-decorator","The @On decorator",[232,813,815],{"className":308,"code":814,"language":310,"meta":238,"style":238},"@On(topic: string, options?: {\n  group?: string\n  concurrency?: number\n  mode?: 'batch' | 'sliding'\n  bus?: string\n  broadcast?: boolean\n})\n",[185,816,817,836,846,856,880,889,899],{"__ignoreMap":238},[242,818,819,821,823,826,828,831,834],{"class":244,"line":245},[242,820,400],{"class":321},[242,822,429],{"class":403},[242,824,825],{"class":325},"(topic: string",[242,827,329],{"class":321},[242,829,830],{"class":325}," options",[242,832,833],{"class":321},"?:",[242,835,420],{"class":321},[242,837,838,841,843],{"class":244,"line":355},[242,839,840],{"class":325},"  group?",[242,842,462],{"class":321},[242,844,845],{"class":325}," string\n",[242,847,848,851,853],{"class":244,"line":390},[242,849,850],{"class":325},"  concurrency",[242,852,833],{"class":321},[242,854,855],{"class":325}," number\n",[242,857,858,861,863,865,868,870,873,875,878],{"class":244,"line":397},[242,859,860],{"class":325},"  mode",[242,862,833],{"class":321},[242,864,346],{"class":321},[242,866,867],{"class":251},"batch",[242,869,435],{"class":321},[242,871,872],{"class":321}," |",[242,874,346],{"class":321},[242,876,877],{"class":251},"sliding",[242,879,352],{"class":321},[242,881,882,885,887],{"class":244,"line":410},[242,883,884],{"class":325},"  bus",[242,886,833],{"class":321},[242,888,845],{"class":325},[242,890,891,894,896],{"class":244,"line":423},[242,892,893],{"class":325},"  broadcast",[242,895,833],{"class":321},[242,897,898],{"class":325}," boolean\n",[242,900,901,903],{"class":244,"line":446},[242,902,747],{"class":321},[242,904,443],{"class":325},[906,907,908,924],"table",{},[909,910,911],"thead",{},[912,913,914,918,921],"tr",{},[915,916,917],"th",{},"Option",[915,919,920],{},"Type",[915,922,923],{},"Description",[925,926,927,951,978,997,1015],"tbody",{},[912,928,929,935,940],{},[930,931,932],"td",{},[185,933,934],{},"group",[930,936,937],{},[185,938,939],{},"string",[930,941,942,943,946,947,496],{},"Explicit broker group for a competing-consumers worker pool. Without it, an auto-derived per-handler group ",[185,944,945],{},"${topic}__${Class}_${method}"," is used. See ",[205,948,950],{"href":949},"#subscriptions-and-fan-out","Subscriptions and fan-out",[912,952,953,958,963],{},[930,954,955],{},[185,956,957],{},"concurrency",[930,959,960],{},[185,961,962],{},"number",[930,964,965,966,969,970,973,974,977],{},"Per-handler subscription concurrency. In ",[185,967,968],{},"'batch'"," mode this is the ",[185,971,972],{},"XREADGROUP COUNT"," prefetch; in ",[185,975,976],{},"'sliding'"," mode it is the number of parallel lanes. Ignored by the in-memory transport.",[912,979,980,985,990],{},[930,981,982],{},[185,983,984],{},"mode",[930,986,987],{},[185,988,989],{},"'batch' | 'sliding'",[930,991,992,993,496],{},"Per-handler override of the dispatch mode. Defaults to the bus default, which defaults to the transport default. See ",[205,994,996],{"href":995},"#dispatch-modes","Dispatch modes",[912,998,999,1003,1007],{},[930,1000,1001],{},[185,1002,657],{},[930,1004,1005],{},[185,1006,939],{},[930,1008,1009,1010,1014],{},"Target bus name for ",[205,1011,1013],{"href":1012},"#multiple-buses","multi-bus setups",". Omit to target the default bus.",[912,1016,1017,1022,1027],{},[930,1018,1019],{},[185,1020,1021],{},"broadcast",[930,1023,1024],{},[185,1025,1026],{},"boolean",[930,1028,1029,1030,1032,1033,496],{},"Cluster-wide fan-out (every replica gets a copy). Mutually exclusive with ",[185,1031,934],{},". See ",[205,1034,950],{"href":949},[182,1036,1037,1038,1041,1042,1044,1045,1047],{},"Discovery happens in the ",[185,1039,1040],{},"MessageBus.onReady()"," hook - see ",[205,1043,47],{"href":48}," for how that scan works under the hood. You don't need to know the internals to use ",[185,1046,794],{},", but it's the same pattern you'd write for your own custom decorators.",[225,1049,950],{"id":1050},"subscriptions-and-fan-out",[182,1052,1053,1054,1056,1057,1060,1061,1064,1065,1068],{},"Each ",[185,1055,794],{}," becomes its own broker subscription with an auto-derived consumer group ",[185,1058,1059],{},"${topic}__${ClassName}_${methodName}"," (or ",[185,1062,1063],{},"${appName}:${topic}__..."," when ",[185,1066,1067],{},"MessagingModule.configure({ appName })"," is set). Three layered behaviors result:",[1070,1071,1073],"h3",{"id":1072},"within-one-process-fan-out-across-handlers-automatic","Within one process: fan-out across handlers (automatic)",[182,1075,1076],{},"Two handlers on the same topic = two subscriptions = each gets its own copy:",[232,1078,1080],{"className":308,"code":1079,"language":310,"meta":238,"style":238},"@Injectable()\nclass EmailService {\n  @On('user.created')\n  async sendWelcome(user: User) { \u002F* always runs *\u002F }\n}\n\n@Injectable()\nclass AnalyticsService {\n  @On('user.created')\n  async track(user: User) { \u002F* always runs - independent group *\u002F }\n}\n",[185,1081,1082,1090,1098,1114,1140,1144,1148,1156,1165,1181,1205],{"__ignoreMap":238},[242,1083,1084,1086,1088],{"class":244,"line":245},[242,1085,400],{"class":321},[242,1087,404],{"class":403},[242,1089,407],{"class":325},[242,1091,1092,1094,1096],{"class":244,"line":355},[242,1093,414],{"class":413},[242,1095,417],{"class":248},[242,1097,420],{"class":321},[242,1099,1100,1102,1104,1106,1108,1110,1112],{"class":244,"line":390},[242,1101,426],{"class":321},[242,1103,429],{"class":403},[242,1105,432],{"class":325},[242,1107,435],{"class":321},[242,1109,438],{"class":251},[242,1111,435],{"class":321},[242,1113,443],{"class":325},[242,1115,1116,1118,1120,1122,1124,1126,1129,1132,1134,1138],{"class":244,"line":397},[242,1117,449],{"class":413},[242,1119,453],{"class":452},[242,1121,432],{"class":321},[242,1123,459],{"class":458},[242,1125,462],{"class":321},[242,1127,1128],{"class":248}," User",[242,1130,1131],{"class":321},")",[242,1133,322],{"class":321},[242,1135,1137],{"class":1136},"sHwdD"," \u002F* always runs *\u002F",[242,1139,645],{"class":321},[242,1141,1142],{"class":244,"line":410},[242,1143,534],{"class":321},[242,1145,1146],{"class":244,"line":423},[242,1147,394],{"emptyLinePlaceholder":393},[242,1149,1150,1152,1154],{"class":244,"line":446},[242,1151,400],{"class":321},[242,1153,404],{"class":403},[242,1155,407],{"class":325},[242,1157,1158,1160,1163],{"class":244,"line":490},[242,1159,414],{"class":413},[242,1161,1162],{"class":248}," AnalyticsService",[242,1164,420],{"class":321},[242,1166,1167,1169,1171,1173,1175,1177,1179],{"class":244,"line":525},[242,1168,426],{"class":321},[242,1170,429],{"class":403},[242,1172,432],{"class":325},[242,1174,435],{"class":321},[242,1176,438],{"class":251},[242,1178,435],{"class":321},[242,1180,443],{"class":325},[242,1182,1183,1185,1188,1190,1192,1194,1196,1198,1200,1203],{"class":244,"line":531},[242,1184,449],{"class":413},[242,1186,1187],{"class":452}," track",[242,1189,432],{"class":321},[242,1191,459],{"class":458},[242,1193,462],{"class":321},[242,1195,1128],{"class":248},[242,1197,1131],{"class":321},[242,1199,322],{"class":321},[242,1201,1202],{"class":1136}," \u002F* always runs - independent group *\u002F",[242,1204,645],{"class":321},[242,1206,1207],{"class":244,"line":537},[242,1208,534],{"class":321},[182,1210,1211,1212,496],{},"Each handler has its own retry\u002Fack lifecycle - one throwing does not affect the other. To deduplicate side effects on retry, pair with ",[185,1213,1214],{},"@Idempotent",[1070,1216,1218],{"id":1217},"across-replicas-load-balance-per-handler-automatic","Across replicas: load balance per handler (automatic)",[182,1220,1221],{},"When N replicas of the same code run, they share the auto-derived group:",[232,1223,1228],{"className":1224,"code":1226,"language":1227},[1225],"language-text","publish('user.created', payload)\n   ↓\ngroup \"user.created__EmailService_sendWelcome\"  (5 consumers, one per replica)\n   broker round-robin → ONE replica handles email exactly once cluster-wide\ngroup \"user.created__AnalyticsService_track\"    (5 consumers, one per replica)\n   broker round-robin → ONE replica handles analytics exactly once\n","text",[185,1229,1226],{"__ignoreMap":238},[182,1231,1232],{},"Add replicas → throughput scales linearly per handler. No coordination needed.",[1070,1234,1236,1237,1131],{"id":1235},"cluster-wide-fan-out-broadcast-true","Cluster-wide fan-out (",[185,1238,1239],{},"broadcast: true",[182,1241,1242,1243,462],{},"Sometimes every replica must run the handler (cache invalidation, websocket broadcast). Set ",[185,1244,1239],{},[232,1246,1248],{"className":308,"code":1247,"language":310,"meta":238,"style":238},"@On('cache.invalidate', { broadcast: true })\nasync refreshCache(key: string) { \u002F* runs on every replica *\u002F }\n",[185,1249,1250,1282],{"__ignoreMap":238},[242,1251,1252,1254,1256,1258,1260,1263,1265,1267,1269,1272,1274,1278,1280],{"class":244,"line":245},[242,1253,400],{"class":321},[242,1255,429],{"class":403},[242,1257,432],{"class":325},[242,1259,435],{"class":321},[242,1261,1262],{"class":251},"cache.invalidate",[242,1264,435],{"class":321},[242,1266,329],{"class":321},[242,1268,322],{"class":321},[242,1270,1271],{"class":452}," broadcast",[242,1273,462],{"class":321},[242,1275,1277],{"class":1276},"sfNiH"," true",[242,1279,340],{"class":321},[242,1281,443],{"class":325},[242,1283,1284,1287,1290,1293,1295,1298],{"class":244,"line":355},[242,1285,1286],{"class":325},"async ",[242,1288,1289],{"class":403},"refreshCache",[242,1291,1292],{"class":325},"(key: string) ",[242,1294,734],{"class":321},[242,1296,1297],{"class":1136}," \u002F* runs on every replica *\u002F",[242,1299,645],{"class":321},[182,1301,1302,1303,1306],{},"The auto-derived group is suffixed with ",[185,1304,1305],{},"__\u003Chostname>_\u003Cpid>",", so each process gets a unique broker group and the broker delivers a copy to every replica's subscription.",[1070,1308,1310,1311,1313],{"id":1309},"worker-pool-explicit-group-competing-consumers","Worker pool: explicit ",[185,1312,934],{}," (competing consumers)",[182,1315,1316,1317,462],{},"For competing-consumers semantics across multiple handler classes, pass ",[185,1318,1319],{},"group: 'pool-name'",[232,1321,1323],{"className":308,"code":1322,"language":310,"meta":238,"style":238},"@On('jobs', { group: 'job-pool' })\nclass FastWorker { ... }\n\n@On('jobs', { group: 'job-pool' })\nclass SlowWorker { ... }\n",[185,1324,1325,1360,1373,1377,1409],{"__ignoreMap":238},[242,1326,1327,1329,1331,1333,1335,1338,1340,1342,1344,1347,1349,1351,1354,1356,1358],{"class":244,"line":245},[242,1328,400],{"class":321},[242,1330,429],{"class":403},[242,1332,432],{"class":325},[242,1334,435],{"class":321},[242,1336,1337],{"class":251},"jobs",[242,1339,435],{"class":321},[242,1341,329],{"class":321},[242,1343,322],{"class":321},[242,1345,1346],{"class":452}," group",[242,1348,462],{"class":321},[242,1350,346],{"class":321},[242,1352,1353],{"class":251},"job-pool",[242,1355,435],{"class":321},[242,1357,340],{"class":321},[242,1359,443],{"class":325},[242,1361,1362,1364,1367,1369,1371],{"class":244,"line":355},[242,1363,414],{"class":413},[242,1365,1366],{"class":248}," FastWorker",[242,1368,322],{"class":321},[242,1370,640],{"class":321},[242,1372,645],{"class":321},[242,1374,1375],{"class":244,"line":390},[242,1376,394],{"emptyLinePlaceholder":393},[242,1378,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1407],{"class":244,"line":397},[242,1380,400],{"class":321},[242,1382,429],{"class":403},[242,1384,432],{"class":325},[242,1386,435],{"class":321},[242,1388,1337],{"class":251},[242,1390,435],{"class":321},[242,1392,329],{"class":321},[242,1394,322],{"class":321},[242,1396,1346],{"class":452},[242,1398,462],{"class":321},[242,1400,346],{"class":321},[242,1402,1353],{"class":251},[242,1404,435],{"class":321},[242,1406,340],{"class":321},[242,1408,443],{"class":325},[242,1410,1411,1413,1416,1418,1420],{"class":244,"line":410},[242,1412,414],{"class":413},[242,1414,1415],{"class":248}," SlowWorker",[242,1417,322],{"class":321},[242,1419,640],{"class":321},[242,1421,645],{"class":321},[182,1423,1424,1425,1427,1428,1431,1432,1434],{},"All handlers in ",[185,1426,1353],{}," join the same broker group; the broker round-robins each message to exactly one of them. Requires a transport with ",[185,1429,1430],{},"supportsCompetingConsumers: true"," (Redis Streams, Kafka, RabbitMQ, NATS). The in-memory transport rejects explicit ",[185,1433,934],{}," at startup.",[1070,1436,1438,1439,1131],{"id":1437},"multi-service-deployments-appname","Multi-service deployments (",[185,1440,1441],{},"appName",[182,1443,1444,1445,1448,1449,1452,1453,1455],{},"When several services share a broker, pass ",[185,1446,1447],{},"MessagingModule.configure({ appName: 'my-service' })",". Auto-derived groups become ",[185,1450,1451],{},"my-service:topic__Class_method",", so two services with overlapping handler class names do not collide. Topics and explicit ",[185,1454,934],{}," values are NOT prefixed - they remain shared cross-service contracts.",[225,1457,996],{"id":1458},"dispatch-modes",[182,1460,1461,1462,1464,1465,1468,1469,1472],{},"Where ",[185,1463,934],{}," controls fan-out ",[797,1466,1467],{},"between"," replicas, ",[797,1470,1471],{},"dispatch mode"," controls how a single subscription pulls messages off the broker:",[1474,1475,1476,1491],"ul",{},[1477,1478,1479,1483,1484,1486,1487,1490],"li",{},[797,1480,1481],{},[185,1482,968],{}," - the consumer reads up to ",[185,1485,957],{}," messages, runs them through ",[185,1488,1489],{},"Promise.allSettled",", then reads again. The slowest handler in a batch holds back the next read (head-of-line blocking). Best for high-throughput uniform workloads where per-message variance is small.",[1477,1492,1493,1497],{},[797,1494,1495],{},[185,1496,976],{}," - each in-flight message progresses independently; the subscription pulls the next message as soon as a slot frees, without waiting for the rest of the batch. Best when handler runtimes vary - one slow message no longer blocks the others.",[906,1499,1500,1513],{},[909,1501,1502],{},[912,1503,1504,1507,1510],{},[915,1505,1506],{},"Transport",[915,1508,1509],{},"Supported modes",[915,1511,1512],{},"Default",[925,1514,1515,1531],{},[912,1516,1517,1522,1527],{},[930,1518,1519],{},[185,1520,1521],{},"InMemoryTransport",[930,1523,1524],{},[185,1525,1526],{},"['sliding']",[930,1528,1529],{},[185,1530,976],{},[912,1532,1533,1538,1543],{},[930,1534,1535],{},[185,1536,1537],{},"RedisStreamsTransport",[930,1539,1540],{},[185,1541,1542],{},"['batch', 'sliding']",[930,1544,1545],{},[185,1546,968],{},[182,1548,1549,1550,1552,1553,1556,1557,496],{},"In-memory has no broker prefetch primitive and concurrency is meaningless within a single process, so emulating batch would just add an artificial barrier with no value. Redis Streams supports both - sliding spawns ",[185,1551,957],{}," parallel ",[185,1554,1555],{},"XREADGROUP COUNT 1"," lanes on dedicated connections (BullMQ-style); batch is the single-loop path with ",[185,1558,1559],{},"COUNT=concurrency",[1070,1561,1563],{"id":1562},"resolution","Resolution",[182,1565,1566],{},"Mode and concurrency resolve through three levels - more specific wins:",[1568,1569,1570,1579,1587],"ol",{},[1477,1571,1572,1575,1576,496],{},[797,1573,1574],{},"Per-handler"," - ",[185,1577,1578],{},"@On('topic', { mode, concurrency })",[1477,1580,1581,1575,1584,496],{},[797,1582,1583],{},"Per-bus",[185,1585,1586],{},"MessagingModule.configure({ dispatch: { mode, concurrency } })",[1477,1588,1589,1592,1593,1596,1597,496],{},[797,1590,1591],{},"Transport default"," - whatever ",[185,1594,1595],{},"transport.defaultMode"," says, with concurrency falling back to ",[185,1598,1599],{},"1",[232,1601,1603],{"className":308,"code":1602,"language":310,"meta":238,"style":238},"MessagingModule.configure({\n  transport: redisStreamsTransport({ url: process.env.REDIS_URL! }),\n  dispatch: { mode: 'sliding', concurrency: 4 }, \u002F\u002F default for handlers on this bus\n})\n\n@On('order.placed')                                  \u002F\u002F uses bus default: sliding\u002F4\n@On('audit.log', { mode: 'batch', concurrency: 32 }) \u002F\u002F override: batch\u002F32\n",[185,1604,1605,1618,1659,1696,1702,1706,1727],{"__ignoreMap":238},[242,1606,1607,1610,1612,1614,1616],{"class":244,"line":245},[242,1608,1609],{"class":325},"MessagingModule",[242,1611,496],{"class":321},[242,1613,729],{"class":403},[242,1615,432],{"class":325},[242,1617,713],{"class":321},[242,1619,1620,1623,1625,1628,1630,1632,1635,1637,1640,1642,1645,1647,1650,1653,1655,1657],{"class":244,"line":355},[242,1621,1622],{"class":452},"  transport",[242,1624,462],{"class":321},[242,1626,1627],{"class":403}," redisStreamsTransport",[242,1629,432],{"class":325},[242,1631,734],{"class":321},[242,1633,1634],{"class":452}," url",[242,1636,462],{"class":321},[242,1638,1639],{"class":325}," process",[242,1641,496],{"class":321},[242,1643,1644],{"class":325},"env",[242,1646,496],{"class":321},[242,1648,1649],{"class":325},"REDIS_URL",[242,1651,1652],{"class":321},"!",[242,1654,340],{"class":321},[242,1656,1131],{"class":325},[242,1658,753],{"class":321},[242,1660,1661,1664,1666,1668,1671,1673,1675,1677,1679,1681,1684,1686,1690,1693],{"class":244,"line":390},[242,1662,1663],{"class":452},"  dispatch",[242,1665,462],{"class":321},[242,1667,322],{"class":321},[242,1669,1670],{"class":452}," mode",[242,1672,462],{"class":321},[242,1674,346],{"class":321},[242,1676,877],{"class":251},[242,1678,435],{"class":321},[242,1680,329],{"class":321},[242,1682,1683],{"class":452}," concurrency",[242,1685,462],{"class":321},[242,1687,1689],{"class":1688},"sbssI"," 4",[242,1691,1692],{"class":321}," },",[242,1694,1695],{"class":1136}," \u002F\u002F default for handlers on this bus\n",[242,1697,1698,1700],{"class":244,"line":397},[242,1699,747],{"class":321},[242,1701,443],{"class":325},[242,1703,1704],{"class":244,"line":410},[242,1705,394],{"emptyLinePlaceholder":393},[242,1707,1708,1710,1712,1714,1716,1719,1721,1724],{"class":244,"line":423},[242,1709,400],{"class":321},[242,1711,429],{"class":403},[242,1713,432],{"class":325},[242,1715,435],{"class":321},[242,1717,1718],{"class":251},"order.placed",[242,1720,435],{"class":321},[242,1722,1723],{"class":325},")                                  ",[242,1725,1726],{"class":1136},"\u002F\u002F uses bus default: sliding\u002F4\n",[242,1728,1729,1731,1733,1735,1737,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1765,1767,1770],{"class":244,"line":446},[242,1730,400],{"class":321},[242,1732,429],{"class":403},[242,1734,432],{"class":325},[242,1736,435],{"class":321},[242,1738,1739],{"class":251},"audit.log",[242,1741,435],{"class":321},[242,1743,329],{"class":321},[242,1745,322],{"class":321},[242,1747,1670],{"class":452},[242,1749,462],{"class":321},[242,1751,346],{"class":321},[242,1753,867],{"class":251},[242,1755,435],{"class":321},[242,1757,329],{"class":321},[242,1759,1683],{"class":452},[242,1761,462],{"class":321},[242,1763,1764],{"class":1688}," 32",[242,1766,340],{"class":321},[242,1768,1769],{"class":325},") ",[242,1771,1772],{"class":1136},"\u002F\u002F override: batch\u002F32\n",[182,1774,1053,1775,1777,1778,1781,1782,1785],{},[185,1776,794],{}," is its own subscription with its own mode\u002Fconcurrency - validation runs per handler at startup (unsupported mode against ",[185,1779,1780],{},"transport.supportedModes",", ",[185,1783,1784],{},"concurrency \u003C= 0","). Different handlers on the same topic can have different mode\u002Fconcurrency without conflict.",[1787,1788,1789],"tip",{},[182,1790,1791,1792,1794,1795,1797,1798,1802],{},"Sliding mode opens one Redis connection per lane (",[185,1793,957],{}," connections per handler). Batch mode opens one connection per handler regardless of ",[185,1796,957],{},". Pick sliding when handler runtimes vary; pick batch when uniform throughput matters more than per-message latency. See the ",[205,1799,1801],{"href":1800},"\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis#dispatch-modes","Redis transport page"," for details.",[225,1804,1806],{"id":1805},"retry-and-dlq","Retry and DLQ",[182,1808,1809,1810,1813,1814,1817,1818,1821,1822,496],{},"When a handler throws (or returns ",[185,1811,1812],{},"{ status: 'nack' }"," from a low-level transport-level call), the transport retries with exponential backoff. After ",[185,1815,1816],{},"maxAttempts"," failures, the message is republished to ",[185,1819,1820],{},"\u003Ctopic>.dlq"," with the last error captured in ",[185,1823,1824],{},"meta.lastError",[182,1826,1827,1828,1831,1832,1835,1836,1839],{},"Retries are scoped to the ",[797,1829,1830],{},"single handler"," that nacked. Sibling handlers on the same topic (each their own subscription) are unaffected - if ",[185,1833,1834],{},"EmailService.send"," throws while ",[185,1837,1838],{},"AnalyticsService.track"," succeeded, only the email handler retries; analytics is not re-run.",[182,1841,1842,1843,1846,1847,1781,1850,1853],{},"Retry delay between attempt N and N+1: ",[185,1844,1845],{},"backoffMs * backoffMultiplier^(attempt - 1)",". With the defaults (",[185,1848,1849],{},"backoffMs: 1000",[185,1851,1852],{},"multiplier: 2",") attempts fire at 1s, 2s, 4s, 8s, 16s.",[182,1855,1856],{},"Subscribing to a DLQ is no different from any other topic - there's no special API:",[232,1858,1860],{"className":308,"code":1859,"language":310,"meta":238,"style":238},"@Injectable()\nclass DlqAlerts {\n  @On('user.created.dlq')\n  async onPoisonPill(payload: unknown, meta: { lastError?: string; attempt: number }) {\n    await alertOps(`user.created exhausted: ${meta.lastError}`)\n  }\n}\n",[185,1861,1862,1870,1879,1896,1943,1971,1975],{"__ignoreMap":238},[242,1863,1864,1866,1868],{"class":244,"line":245},[242,1865,400],{"class":321},[242,1867,404],{"class":403},[242,1869,407],{"class":325},[242,1871,1872,1874,1877],{"class":244,"line":355},[242,1873,414],{"class":413},[242,1875,1876],{"class":248}," DlqAlerts",[242,1878,420],{"class":321},[242,1880,1881,1883,1885,1887,1889,1892,1894],{"class":244,"line":390},[242,1882,426],{"class":321},[242,1884,429],{"class":403},[242,1886,432],{"class":325},[242,1888,435],{"class":321},[242,1890,1891],{"class":251},"user.created.dlq",[242,1893,435],{"class":321},[242,1895,443],{"class":325},[242,1897,1898,1900,1903,1905,1908,1910,1913,1915,1918,1920,1922,1925,1927,1929,1931,1934,1936,1939,1941],{"class":244,"line":397},[242,1899,449],{"class":413},[242,1901,1902],{"class":452}," onPoisonPill",[242,1904,432],{"class":321},[242,1906,1907],{"class":458},"payload",[242,1909,462],{"class":321},[242,1911,1912],{"class":248}," unknown",[242,1914,329],{"class":321},[242,1916,1917],{"class":458}," meta",[242,1919,462],{"class":321},[242,1921,322],{"class":321},[242,1923,1924],{"class":452}," lastError",[242,1926,833],{"class":321},[242,1928,472],{"class":248},[242,1930,475],{"class":321},[242,1932,1933],{"class":452}," attempt",[242,1935,462],{"class":321},[242,1937,1938],{"class":248}," number",[242,1940,485],{"class":321},[242,1942,420],{"class":321},[242,1944,1945,1947,1950,1952,1954,1957,1959,1962,1964,1967,1969],{"class":244,"line":410},[242,1946,651],{"class":317},[242,1948,1949],{"class":403}," alertOps",[242,1951,432],{"class":452},[242,1953,504],{"class":321},[242,1955,1956],{"class":251},"user.created exhausted: ",[242,1958,510],{"class":321},[242,1960,1961],{"class":325},"meta",[242,1963,496],{"class":321},[242,1965,1966],{"class":325},"lastError",[242,1968,520],{"class":321},[242,1970,443],{"class":452},[242,1972,1973],{"class":244,"line":423},[242,1974,528],{"class":321},[242,1976,1977],{"class":244,"line":446},[242,1978,534],{"class":321},[906,1980,1981,1994],{},[909,1982,1983],{},[912,1984,1985,1988,1990,1992],{},[915,1986,1987],{},"Field",[915,1989,920],{},[915,1991,1512],{},[915,1993,923],{},[925,1995,1996,2014,2033,2052],{},[912,1997,1998,2002,2006,2011],{},[930,1999,2000],{},[185,2001,1816],{},[930,2003,2004],{},[185,2005,962],{},[930,2007,2008],{},[185,2009,2010],{},"5",[930,2012,2013],{},"Total delivery attempts before a message is moved to the DLQ.",[912,2015,2016,2021,2025,2030],{},[930,2017,2018],{},[185,2019,2020],{},"backoffMs",[930,2022,2023],{},[185,2024,962],{},[930,2026,2027],{},[185,2028,2029],{},"1000",[930,2031,2032],{},"Base delay (ms) for the first retry.",[912,2034,2035,2040,2044,2049],{},[930,2036,2037],{},[185,2038,2039],{},"backoffMultiplier",[930,2041,2042],{},[185,2043,962],{},[930,2045,2046],{},[185,2047,2048],{},"2",[930,2050,2051],{},"Exponential multiplier applied per attempt.",[912,2053,2054,2059,2063,2068],{},[930,2055,2056],{},[185,2057,2058],{},"dlq",[930,2060,2061],{},[185,2062,1026],{},[930,2064,2065],{},[185,2066,2067],{},"true",[930,2069,2070,2071,2074,2075,496],{},"When ",[185,2072,2073],{},"false",", exhausted messages are dropped with an error log instead of routed to ",[185,2076,1820],{},[182,2078,2079],{},"The default is max-attempts + DLQ, not infinite retry, because infinite retry creates \"poison pill\" queues that silently block live traffic behind a single broken message - same reason Kafka, RabbitMQ, and NATS JetStream all standardise on bounded retry plus a dead-letter destination.",[225,2081,2083],{"id":2082},"distributed-tracing","Distributed tracing",[182,2085,2086,2087,2090,2091,2094,2095,2098,2099,2105],{},"Every ",[185,2088,2089],{},"MessageEnvelope"," carries optional ",[185,2092,2093],{},"meta.traceparent"," and ",[185,2096,2097],{},"meta.tracestate"," fields that follow the ",[205,2100,2104],{"href":2101,"rel":2102},"https:\u002F\u002Fwww.w3.org\u002FTR\u002Ftrace-context\u002F",[2103],"nofollow","W3C Trace Context spec",". They are pure data - the bus does not auto-inject anything from your tracing library, but the fields are preserved across publish, retry, and DLQ so a span context populated at the producer survives the network hop to any consumer (Node.js, Go, Python - JSON envelopes work cross-language).",[232,2107,2109],{"className":308,"code":2108,"language":310,"meta":238,"style":238},"import { trace } from '@opentelemetry\u002Fapi'\n\nconst span = trace.getActiveSpan()\nconst ctx = span?.spanContext()\n\nawait bus.publish('order.placed', order, {\n  traceparent: ctx\n    ? `00-${ctx.traceId}-${ctx.spanId}-${ctx.traceFlags.toString(16).padStart(2, '0')}`\n    : undefined,\n})\n",[185,2110,2111,2131,2135,2155,2175,2179,2207,2217,2300,2308],{"__ignoreMap":238},[242,2112,2113,2115,2117,2120,2122,2124,2126,2129],{"class":244,"line":245},[242,2114,318],{"class":317},[242,2116,322],{"class":321},[242,2118,2119],{"class":325}," trace",[242,2121,340],{"class":321},[242,2123,343],{"class":317},[242,2125,346],{"class":321},[242,2127,2128],{"class":251},"@opentelemetry\u002Fapi",[242,2130,352],{"class":321},[242,2132,2133],{"class":244,"line":355},[242,2134,394],{"emptyLinePlaceholder":393},[242,2136,2137,2140,2143,2146,2148,2150,2153],{"class":244,"line":390},[242,2138,2139],{"class":413},"const",[242,2141,2142],{"class":325}," span ",[242,2144,2145],{"class":321},"=",[242,2147,2119],{"class":325},[242,2149,496],{"class":321},[242,2151,2152],{"class":403},"getActiveSpan",[242,2154,407],{"class":325},[242,2156,2157,2159,2162,2164,2167,2170,2173],{"class":244,"line":397},[242,2158,2139],{"class":413},[242,2160,2161],{"class":325}," ctx ",[242,2163,2145],{"class":321},[242,2165,2166],{"class":325}," span",[242,2168,2169],{"class":321},"?.",[242,2171,2172],{"class":403},"spanContext",[242,2174,407],{"class":325},[242,2176,2177],{"class":244,"line":410},[242,2178,394],{"emptyLinePlaceholder":393},[242,2180,2181,2184,2186,2188,2190,2192,2194,2196,2198,2200,2203,2205],{"class":244,"line":423},[242,2182,2183],{"class":317},"await",[242,2185,567],{"class":325},[242,2187,496],{"class":321},[242,2189,662],{"class":403},[242,2191,432],{"class":325},[242,2193,435],{"class":321},[242,2195,1718],{"class":251},[242,2197,435],{"class":321},[242,2199,329],{"class":321},[242,2201,2202],{"class":325}," order",[242,2204,329],{"class":321},[242,2206,420],{"class":321},[242,2208,2209,2212,2214],{"class":244,"line":446},[242,2210,2211],{"class":452},"  traceparent",[242,2213,462],{"class":321},[242,2215,2216],{"class":325}," ctx\n",[242,2218,2219,2222,2225,2228,2230,2233,2235,2238,2240,2243,2245,2247,2249,2252,2254,2256,2258,2260,2262,2265,2267,2270,2272,2275,2277,2279,2282,2284,2286,2288,2290,2293,2295,2297],{"class":244,"line":490},[242,2220,2221],{"class":321},"    ?",[242,2223,2224],{"class":321}," `",[242,2226,2227],{"class":251},"00-",[242,2229,510],{"class":321},[242,2231,2232],{"class":325},"ctx",[242,2234,496],{"class":321},[242,2236,2237],{"class":325},"traceId",[242,2239,747],{"class":321},[242,2241,2242],{"class":251},"-",[242,2244,510],{"class":321},[242,2246,2232],{"class":325},[242,2248,496],{"class":321},[242,2250,2251],{"class":325},"spanId",[242,2253,747],{"class":321},[242,2255,2242],{"class":251},[242,2257,510],{"class":321},[242,2259,2232],{"class":325},[242,2261,496],{"class":321},[242,2263,2264],{"class":325},"traceFlags",[242,2266,496],{"class":321},[242,2268,2269],{"class":403},"toString",[242,2271,432],{"class":325},[242,2273,2274],{"class":1688},"16",[242,2276,1131],{"class":325},[242,2278,496],{"class":321},[242,2280,2281],{"class":403},"padStart",[242,2283,432],{"class":325},[242,2285,2048],{"class":1688},[242,2287,329],{"class":321},[242,2289,346],{"class":321},[242,2291,2292],{"class":251},"0",[242,2294,435],{"class":321},[242,2296,1131],{"class":325},[242,2298,2299],{"class":321},"}`\n",[242,2301,2302,2305],{"class":244,"line":525},[242,2303,2304],{"class":321},"    :",[242,2306,2307],{"class":321}," undefined,\n",[242,2309,2310,2312],{"class":244,"line":531},[242,2311,747],{"class":321},[242,2313,443],{"class":325},[182,2315,2316],{},"In a consumer, restore the span context with whatever tracing library you use:",[232,2318,2320],{"className":308,"code":2319,"language":310,"meta":238,"style":238},"@On('order.placed')\nasync onOrderPlaced(payload: Order, meta: MessageMeta) {\n  if (meta.traceparent) {\n    \u002F\u002F restore span context via OpenTelemetry \u002F Datadog \u002F Sentry SDK\n    \u002F\u002F continue the distributed trace inside this handler\n  }\n  \u002F\u002F business logic\n}\n",[185,2321,2322,2338,2355,2374,2379,2384,2388,2393],{"__ignoreMap":238},[242,2323,2324,2326,2328,2330,2332,2334,2336],{"class":244,"line":245},[242,2325,400],{"class":321},[242,2327,429],{"class":403},[242,2329,432],{"class":325},[242,2331,435],{"class":321},[242,2333,1718],{"class":251},[242,2335,435],{"class":321},[242,2337,443],{"class":325},[242,2339,2340,2342,2345,2348,2350,2353],{"class":244,"line":355},[242,2341,1286],{"class":325},[242,2343,2344],{"class":403},"onOrderPlaced",[242,2346,2347],{"class":325},"(payload: Order",[242,2349,329],{"class":321},[242,2351,2352],{"class":325}," meta: MessageMeta) ",[242,2354,713],{"class":321},[242,2356,2357,2360,2363,2365,2367,2370,2372],{"class":244,"line":390},[242,2358,2359],{"class":317},"  if",[242,2361,2362],{"class":452}," (",[242,2364,1961],{"class":325},[242,2366,496],{"class":321},[242,2368,2369],{"class":325},"traceparent",[242,2371,1769],{"class":452},[242,2373,713],{"class":321},[242,2375,2376],{"class":244,"line":397},[242,2377,2378],{"class":1136},"    \u002F\u002F restore span context via OpenTelemetry \u002F Datadog \u002F Sentry SDK\n",[242,2380,2381],{"class":244,"line":410},[242,2382,2383],{"class":1136},"    \u002F\u002F continue the distributed trace inside this handler\n",[242,2385,2386],{"class":244,"line":423},[242,2387,528],{"class":321},[242,2389,2390],{"class":244,"line":446},[242,2391,2392],{"class":1136},"  \u002F\u002F business logic\n",[242,2394,2395],{"class":244,"line":490},[242,2396,534],{"class":321},[2398,2399,2400],"note",{},[182,2401,2402,2403,2406],{},"Pass ",[185,2404,2405],{},"undefined"," to skip - do not pass an empty string. Empty strings serialize to a truthy-looking invalid value on the consumer side.",[225,2408,2410],{"id":2409},"graceful-drain","Graceful drain",[182,2412,2070,2413,2416,2417,2420,2421,2424],{},[185,2414,2415],{},"app.destroy()"," runs (SIGTERM, deploy, restart), each transport waits up to ",[185,2418,2419],{},"drainTimeoutMs"," (default ",[185,2422,2423],{},"5000",") for in-flight handlers to finish before tearing down state. Without drain, a handler interrupted mid-execution leaves the message un-acked - the broker reclaims it and a duplicate fires after restart.",[232,2426,2428],{"className":308,"code":2427,"language":310,"meta":238,"style":238},"inMemoryTransport({\n  drainTimeoutMs: 5000, \u002F\u002F default; set 0 to skip drain\n})\n",[185,2429,2430,2439,2454],{"__ignoreMap":238},[242,2431,2432,2435,2437],{"class":244,"line":245},[242,2433,2434],{"class":403},"inMemoryTransport",[242,2436,432],{"class":325},[242,2438,713],{"class":321},[242,2440,2441,2444,2446,2449,2451],{"class":244,"line":355},[242,2442,2443],{"class":452},"  drainTimeoutMs",[242,2445,462],{"class":321},[242,2447,2448],{"class":1688}," 5000",[242,2450,329],{"class":321},[242,2452,2453],{"class":1136}," \u002F\u002F default; set 0 to skip drain\n",[242,2455,2456,2458],{"class":244,"line":390},[242,2457,747],{"class":321},[242,2459,443],{"class":325},[182,2461,2462],{},"The drain phase blocks new deliveries (including scheduled retries) and awaits all currently-running handlers. When the timeout is reached the transport logs a warning and continues with cleanup; pending handlers will keep running but their results are discarded.",[1787,2464,2465],{},[182,2466,2467,2468,2471,2472,2474,2475,496],{},"Default 5 seconds is sized for typical handlers under Kubernetes' ",[185,2469,2470],{},"terminationGracePeriodSeconds"," (30s by default). If your handlers do longer work, raise ",[185,2473,2419],{}," accordingly. For the Redis transport see the ",[205,2476,2478],{"href":2477},"\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis#graceful-drain","drain note on the Redis page",[225,2480,2482],{"id":2481},"idempotency","Idempotency",[182,2484,2485,2487,2488,2491,2492,2495,2496,2498],{},[185,2486,187],{}," delivers messages ",[797,2489,2490],{},"at least once",", so duplicates are inevitable - consumer crash before XACK, network blip, broker reclaim. Most handlers should be idempotent by design (",[185,2493,2494],{},"UPDATE WHERE id = ?",", cache invalidations, state syncs). For handlers with non-idempotent side effects - charging cards, sending emails, calling rate-limited external APIs - use ",[185,2497,1214],{}," to skip duplicate executions:",[232,2500,2502],{"className":308,"code":2501,"language":310,"meta":238,"style":238},"import { Injectable } from '@miiajs\u002Fcore'\nimport { On, Idempotent } from '@miiajs\u002Fmessaging'\n\n@Injectable()\nclass PaymentService {\n  @On('order.placed')\n  @Idempotent({ ttl: 24 * 60 * 60 * 1000 }) \u002F\u002F dedupe within 24h\n  async chargeCard(order: Order) {\n    await this.payments.charge(order.cardId, order.total)\n  }\n}\n",[185,2503,2504,2522,2545,2549,2557,2566,2582,2623,2644,2678,2682],{"__ignoreMap":238},[242,2505,2506,2508,2510,2512,2514,2516,2518,2520],{"class":244,"line":245},[242,2507,318],{"class":317},[242,2509,322],{"class":321},[242,2511,332],{"class":325},[242,2513,340],{"class":321},[242,2515,343],{"class":317},[242,2517,346],{"class":321},[242,2519,349],{"class":251},[242,2521,352],{"class":321},[242,2523,2524,2526,2528,2530,2532,2535,2537,2539,2541,2543],{"class":244,"line":355},[242,2525,318],{"class":317},[242,2527,322],{"class":321},[242,2529,372],{"class":325},[242,2531,329],{"class":321},[242,2533,2534],{"class":325}," Idempotent",[242,2536,340],{"class":321},[242,2538,343],{"class":317},[242,2540,346],{"class":321},[242,2542,187],{"class":251},[242,2544,352],{"class":321},[242,2546,2547],{"class":244,"line":390},[242,2548,394],{"emptyLinePlaceholder":393},[242,2550,2551,2553,2555],{"class":244,"line":397},[242,2552,400],{"class":321},[242,2554,404],{"class":403},[242,2556,407],{"class":325},[242,2558,2559,2561,2564],{"class":244,"line":410},[242,2560,414],{"class":413},[242,2562,2563],{"class":248}," PaymentService",[242,2565,420],{"class":321},[242,2567,2568,2570,2572,2574,2576,2578,2580],{"class":244,"line":423},[242,2569,426],{"class":321},[242,2571,429],{"class":403},[242,2573,432],{"class":325},[242,2575,435],{"class":321},[242,2577,1718],{"class":251},[242,2579,435],{"class":321},[242,2581,443],{"class":325},[242,2583,2584,2586,2589,2591,2593,2596,2598,2601,2604,2607,2609,2611,2613,2616,2618,2620],{"class":244,"line":446},[242,2585,426],{"class":321},[242,2587,2588],{"class":403},"Idempotent",[242,2590,432],{"class":325},[242,2592,734],{"class":321},[242,2594,2595],{"class":452}," ttl",[242,2597,462],{"class":321},[242,2599,2600],{"class":1688}," 24",[242,2602,2603],{"class":321}," *",[242,2605,2606],{"class":1688}," 60",[242,2608,2603],{"class":321},[242,2610,2606],{"class":1688},[242,2612,2603],{"class":321},[242,2614,2615],{"class":1688}," 1000",[242,2617,340],{"class":321},[242,2619,1769],{"class":325},[242,2621,2622],{"class":1136},"\u002F\u002F dedupe within 24h\n",[242,2624,2625,2627,2630,2632,2635,2637,2640,2642],{"class":244,"line":490},[242,2626,449],{"class":413},[242,2628,2629],{"class":452}," chargeCard",[242,2631,432],{"class":321},[242,2633,2634],{"class":458},"order",[242,2636,462],{"class":321},[242,2638,2639],{"class":248}," Order",[242,2641,1131],{"class":321},[242,2643,420],{"class":321},[242,2645,2646,2648,2650,2653,2655,2658,2660,2662,2664,2667,2669,2671,2673,2676],{"class":244,"line":525},[242,2647,651],{"class":317},[242,2649,654],{"class":321},[242,2651,2652],{"class":325},"payments",[242,2654,496],{"class":321},[242,2656,2657],{"class":403},"charge",[242,2659,432],{"class":452},[242,2661,2634],{"class":325},[242,2663,496],{"class":321},[242,2665,2666],{"class":325},"cardId",[242,2668,329],{"class":321},[242,2670,2202],{"class":325},[242,2672,496],{"class":321},[242,2674,2675],{"class":325},"total",[242,2677,443],{"class":452},[242,2679,2680],{"class":244,"line":531},[242,2681,528],{"class":321},[242,2683,2684],{"class":244,"line":537},[242,2685,534],{"class":321},[182,2687,2688,2689,2692,2693,2695,2696,2699,2700,2703],{},"Default key is ",[185,2690,2691],{},"${envelope.id}:${ClassName}.${methodName}"," - per-handler scope, so two ",[185,2694,1214],{}," handlers on the same topic do ",[797,2697,2698],{},"not"," conflict. Override ",[185,2701,2702],{},"key"," to widen scope or to dedupe on a business identifier from the payload:",[232,2705,2707],{"className":308,"code":2706,"language":310,"meta":238,"style":238},"@On('payment.received')\n@Idempotent({ ttl: 24 * 60 * 60 * 1000, key: (p: Payment) => `payment:${p.transactionId}` })\nasync onPayment(payment: Payment) { ... }\n",[185,2708,2709,2726,2795],{"__ignoreMap":238},[242,2710,2711,2713,2715,2717,2719,2722,2724],{"class":244,"line":245},[242,2712,400],{"class":321},[242,2714,429],{"class":403},[242,2716,432],{"class":325},[242,2718,435],{"class":321},[242,2720,2721],{"class":251},"payment.received",[242,2723,435],{"class":321},[242,2725,443],{"class":325},[242,2727,2728,2730,2732,2734,2736,2738,2740,2742,2744,2746,2748,2750,2752,2754,2756,2759,2761,2763,2765,2767,2770,2772,2775,2777,2780,2782,2784,2786,2789,2791,2793],{"class":244,"line":355},[242,2729,400],{"class":321},[242,2731,2588],{"class":403},[242,2733,432],{"class":325},[242,2735,734],{"class":321},[242,2737,2595],{"class":452},[242,2739,462],{"class":321},[242,2741,2600],{"class":1688},[242,2743,2603],{"class":321},[242,2745,2606],{"class":1688},[242,2747,2603],{"class":321},[242,2749,2606],{"class":1688},[242,2751,2603],{"class":321},[242,2753,2615],{"class":1688},[242,2755,329],{"class":321},[242,2757,2758],{"class":403}," key",[242,2760,462],{"class":321},[242,2762,2362],{"class":321},[242,2764,182],{"class":458},[242,2766,462],{"class":321},[242,2768,2769],{"class":248}," Payment",[242,2771,1131],{"class":321},[242,2773,2774],{"class":413}," =>",[242,2776,2224],{"class":321},[242,2778,2779],{"class":251},"payment:",[242,2781,510],{"class":321},[242,2783,182],{"class":325},[242,2785,496],{"class":321},[242,2787,2788],{"class":325},"transactionId",[242,2790,520],{"class":321},[242,2792,340],{"class":321},[242,2794,443],{"class":325},[242,2796,2797,2799,2802,2805,2807,2809],{"class":244,"line":390},[242,2798,1286],{"class":325},[242,2800,2801],{"class":403},"onPayment",[242,2803,2804],{"class":325},"(payment: Payment) ",[242,2806,734],{"class":321},[242,2808,640],{"class":321},[242,2810,645],{"class":321},[182,2812,2813,2814,462],{},"Configure the store in ",[185,2815,211],{},[232,2817,2819],{"className":308,"code":2818,"language":310,"meta":238,"style":238},"import { MessagingModule, inMemoryTransport, memoryIdempotencyStore } from '@miiajs\u002Fmessaging'\n\nMessagingModule.configure({\n  transport: inMemoryTransport(),\n  idempotency: memoryIdempotencyStore(), \u002F\u002F dev \u002F single-process\n})\n",[185,2820,2821,2848,2852,2864,2876,2892],{"__ignoreMap":238},[242,2822,2823,2825,2827,2829,2831,2833,2835,2838,2840,2842,2844,2846],{"class":244,"line":245},[242,2824,318],{"class":317},[242,2826,322],{"class":321},[242,2828,362],{"class":325},[242,2830,329],{"class":321},[242,2832,377],{"class":325},[242,2834,329],{"class":321},[242,2836,2837],{"class":325}," memoryIdempotencyStore",[242,2839,340],{"class":321},[242,2841,343],{"class":317},[242,2843,346],{"class":321},[242,2845,187],{"class":251},[242,2847,352],{"class":321},[242,2849,2850],{"class":244,"line":355},[242,2851,394],{"emptyLinePlaceholder":393},[242,2853,2854,2856,2858,2860,2862],{"class":244,"line":390},[242,2855,1609],{"class":325},[242,2857,496],{"class":321},[242,2859,729],{"class":403},[242,2861,432],{"class":325},[242,2863,713],{"class":321},[242,2865,2866,2868,2870,2872,2874],{"class":244,"line":397},[242,2867,1622],{"class":452},[242,2869,462],{"class":321},[242,2871,377],{"class":403},[242,2873,635],{"class":325},[242,2875,753],{"class":321},[242,2877,2878,2881,2883,2885,2887,2889],{"class":244,"line":410},[242,2879,2880],{"class":452},"  idempotency",[242,2882,462],{"class":321},[242,2884,2837],{"class":403},[242,2886,635],{"class":325},[242,2888,329],{"class":321},[242,2890,2891],{"class":1136}," \u002F\u002F dev \u002F single-process\n",[242,2893,2894,2896],{"class":244,"line":423},[242,2895,747],{"class":321},[242,2897,443],{"class":325},[182,2899,2900,2901,2907,2908,2911],{},"For production with multiple replicas, use ",[205,2902,2904],{"href":2903},"\u002Fdocs\u002Fpackages\u002Fmessaging\u002Fredis#redisidempotencystore",[185,2905,2906],{},"redisIdempotencyStore"," - claims must be visible across processes, which an in-memory ",[185,2909,2910],{},"Map"," cannot provide.",[906,2913,2914,2927],{},[909,2915,2916],{},[912,2917,2918,2921,2923,2925],{},[915,2919,2920],{},"Decorator option",[915,2922,920],{},[915,2924,1512],{},[915,2926,923],{},[925,2928,2929,2946],{},[912,2930,2931,2936,2940,2943],{},[930,2932,2933],{},[185,2934,2935],{},"ttl",[930,2937,2938],{},[185,2939,962],{},[930,2941,2942],{},"required",[930,2944,2945],{},"Claim lifetime in milliseconds. After expiry, the same key can be claimed and processed again.",[912,2947,2948,2952,2957,2961],{},[930,2949,2950],{},[185,2951,2702],{},[930,2953,2954],{},[185,2955,2956],{},"(payload, meta) => string",[930,2958,2959],{},[185,2960,2691],{},[930,2962,2963],{},"Custom claim key. Useful when the upstream may republish the same business event with different envelope IDs, or when handlers should share a claim.",[2965,2966,2967],"warning",{},[182,2968,2969,2974,2975,2978,2979,2981,2982,2984],{},[797,2970,2971,2973],{},[185,2972,1214],{}," is not \"exactly-once\"."," If the consumer crashes after ",[185,2976,2977],{},"claim()"," but before the message is acked back to the broker, the claim stays in the store while the broker still considers the message un-acked. After redelivery, the next consumer sees a stale claim and skips the handler, effectively losing the message. For business-critical workflows pair ",[185,2980,1214],{}," with a transactional outbox or use idempotent-by-design handlers (",[185,2983,2494],{},").",[182,2986,2987,2988,2990,2991,2993,2994,2996],{},"If any handler is annotated with ",[185,2989,1214],{}," but no ",[185,2992,2481],{}," store is configured, ",[185,2995,195],{}," throws at startup so the misconfiguration cannot reach production silently.",[225,2998,3000],{"id":2999},"multiple-buses","Multiple buses",[182,3002,3003,3004,3007,3008,3011,3012,3014],{},"For apps that need more than one transport - Kafka for legacy reads + Redis Streams for new writes, an internal in-memory bus + an external Redis bus, separate buses per tenant - call ",[185,3005,3006],{},"MessagingModule.configure(opts, name)"," once per bus. The same ",[185,3009,3010],{},"name"," namespace differentiates DI tokens, so each bus gets its own transport, idempotency store, and ",[185,3013,195],{}," instance.",[232,3016,3018],{"className":308,"code":3017,"language":310,"meta":238,"style":238},"import { Module } from '@miiajs\u002Fcore'\nimport { MessagingModule, getMessageBusToken, inMemoryTransport } from '@miiajs\u002Fmessaging'\nimport { redisStreamsTransport, redisIdempotencyStore } from '@miiajs\u002Fmessaging-redis'\n\n@Module({\n  imports: [\n    \u002F\u002F Default bus - used when @On has no `bus` option\n    MessagingModule.configure({\n      transport: redisStreamsTransport({ url: process.env.REDIS_URL! }),\n      idempotency: redisIdempotencyStore({ keyPrefix: 'primary:idem:' }),\n    }),\n\n    \u002F\u002F Named bus for legacy Kafka reads\n    MessagingModule.configure(\n      { transport: kafkaTransport({ \u002F* ... *\u002F }) },\n      'kafka',\n    ),\n\n    \u002F\u002F Internal in-memory bus for domain events between services in the monolith\n    MessagingModule.configure({ transport: inMemoryTransport() }, 'internal'),\n  ],\n})\nclass AppModule {}\n",[185,3019,3020,3038,3065,3089,3093,3103,3112,3117,3130,3165,3196,3205,3209,3214,3225,3251,3263,3270,3274,3279,3313,3320,3326],{"__ignoreMap":238},[242,3021,3022,3024,3026,3028,3030,3032,3034,3036],{"class":244,"line":245},[242,3023,318],{"class":317},[242,3025,322],{"class":321},[242,3027,326],{"class":325},[242,3029,340],{"class":321},[242,3031,343],{"class":317},[242,3033,346],{"class":321},[242,3035,349],{"class":251},[242,3037,352],{"class":321},[242,3039,3040,3042,3044,3046,3048,3051,3053,3055,3057,3059,3061,3063],{"class":244,"line":355},[242,3041,318],{"class":317},[242,3043,322],{"class":321},[242,3045,362],{"class":325},[242,3047,329],{"class":321},[242,3049,3050],{"class":325}," getMessageBusToken",[242,3052,329],{"class":321},[242,3054,377],{"class":325},[242,3056,340],{"class":321},[242,3058,343],{"class":317},[242,3060,346],{"class":321},[242,3062,187],{"class":251},[242,3064,352],{"class":321},[242,3066,3067,3069,3071,3073,3075,3078,3080,3082,3084,3087],{"class":244,"line":390},[242,3068,318],{"class":317},[242,3070,322],{"class":321},[242,3072,1627],{"class":325},[242,3074,329],{"class":321},[242,3076,3077],{"class":325}," redisIdempotencyStore",[242,3079,340],{"class":321},[242,3081,343],{"class":317},[242,3083,346],{"class":321},[242,3085,3086],{"class":251},"@miiajs\u002Fmessaging-redis",[242,3088,352],{"class":321},[242,3090,3091],{"class":244,"line":397},[242,3092,394],{"emptyLinePlaceholder":393},[242,3094,3095,3097,3099,3101],{"class":244,"line":410},[242,3096,400],{"class":321},[242,3098,708],{"class":403},[242,3100,432],{"class":325},[242,3102,713],{"class":321},[242,3104,3105,3107,3109],{"class":244,"line":423},[242,3106,719],{"class":452},[242,3108,462],{"class":321},[242,3110,3111],{"class":325}," [\n",[242,3113,3114],{"class":244,"line":446},[242,3115,3116],{"class":1136},"    \u002F\u002F Default bus - used when @On has no `bus` option\n",[242,3118,3119,3122,3124,3126,3128],{"class":244,"line":490},[242,3120,3121],{"class":325},"    MessagingModule",[242,3123,496],{"class":321},[242,3125,729],{"class":403},[242,3127,432],{"class":325},[242,3129,713],{"class":321},[242,3131,3132,3135,3137,3139,3141,3143,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163],{"class":244,"line":525},[242,3133,3134],{"class":452},"      transport",[242,3136,462],{"class":321},[242,3138,1627],{"class":403},[242,3140,432],{"class":325},[242,3142,734],{"class":321},[242,3144,1634],{"class":452},[242,3146,462],{"class":321},[242,3148,1639],{"class":325},[242,3150,496],{"class":321},[242,3152,1644],{"class":325},[242,3154,496],{"class":321},[242,3156,1649],{"class":325},[242,3158,1652],{"class":321},[242,3160,340],{"class":321},[242,3162,1131],{"class":325},[242,3164,753],{"class":321},[242,3166,3167,3170,3172,3174,3176,3178,3181,3183,3185,3188,3190,3192,3194],{"class":244,"line":531},[242,3168,3169],{"class":452},"      idempotency",[242,3171,462],{"class":321},[242,3173,3077],{"class":403},[242,3175,432],{"class":325},[242,3177,734],{"class":321},[242,3179,3180],{"class":452}," keyPrefix",[242,3182,462],{"class":321},[242,3184,346],{"class":321},[242,3186,3187],{"class":251},"primary:idem:",[242,3189,435],{"class":321},[242,3191,340],{"class":321},[242,3193,1131],{"class":325},[242,3195,753],{"class":321},[242,3197,3198,3201,3203],{"class":244,"line":537},[242,3199,3200],{"class":321},"    }",[242,3202,1131],{"class":325},[242,3204,753],{"class":321},[242,3206,3207],{"class":244,"line":542},[242,3208,394],{"emptyLinePlaceholder":393},[242,3210,3211],{"class":244,"line":551},[242,3212,3213],{"class":1136},"    \u002F\u002F Named bus for legacy Kafka reads\n",[242,3215,3216,3218,3220,3222],{"class":244,"line":561},[242,3217,3121],{"class":325},[242,3219,496],{"class":321},[242,3221,729],{"class":403},[242,3223,3224],{"class":325},"(\n",[242,3226,3227,3230,3232,3234,3237,3239,3241,3244,3246,3248],{"class":244,"line":578},[242,3228,3229],{"class":321},"      {",[242,3231,737],{"class":452},[242,3233,462],{"class":321},[242,3235,3236],{"class":403}," kafkaTransport",[242,3238,432],{"class":325},[242,3240,734],{"class":321},[242,3242,3243],{"class":1136}," \u002F* ... *\u002F",[242,3245,340],{"class":321},[242,3247,1769],{"class":325},[242,3249,3250],{"class":321},"},\n",[242,3252,3253,3256,3259,3261],{"class":244,"line":583},[242,3254,3255],{"class":321},"      '",[242,3257,3258],{"class":251},"kafka",[242,3260,435],{"class":321},[242,3262,753],{"class":321},[242,3264,3265,3268],{"class":244,"line":610},[242,3266,3267],{"class":325},"    )",[242,3269,753],{"class":321},[242,3271,3272],{"class":244,"line":648},[242,3273,394],{"emptyLinePlaceholder":393},[242,3275,3276],{"class":244,"line":679},[242,3277,3278],{"class":1136},"    \u002F\u002F Internal in-memory bus for domain events between services in the monolith\n",[242,3280,3281,3283,3285,3287,3289,3291,3293,3295,3297,3299,3302,3304,3307,3309,3311],{"class":244,"line":688},[242,3282,3121],{"class":325},[242,3284,496],{"class":321},[242,3286,729],{"class":403},[242,3288,432],{"class":325},[242,3290,734],{"class":321},[242,3292,737],{"class":452},[242,3294,462],{"class":321},[242,3296,377],{"class":403},[242,3298,744],{"class":325},[242,3300,3301],{"class":321},"},",[242,3303,346],{"class":321},[242,3305,3306],{"class":251},"internal",[242,3308,435],{"class":321},[242,3310,1131],{"class":325},[242,3312,753],{"class":321},[242,3314,3315,3318],{"class":244,"line":693},[242,3316,3317],{"class":325},"  ]",[242,3319,753],{"class":321},[242,3321,3322,3324],{"class":244,"line":698},[242,3323,747],{"class":321},[242,3325,443],{"class":325},[242,3327,3328,3330,3332],{"class":244,"line":703},[242,3329,414],{"class":413},[242,3331,786],{"class":248},[242,3333,789],{"class":321},[182,3335,3336],{},"Inject the bus you need:",[232,3338,3340],{"className":308,"code":3339,"language":310,"meta":238,"style":238},"@Injectable()\nclass OrderService {\n  private primary = inject(MessageBus)                                    \u002F\u002F default\n  private kafka = inject\u003CMessageBus>(getMessageBusToken('kafka') as string) \u002F\u002F named\n  private internal = inject\u003CMessageBus>(getMessageBusToken('internal') as string)\n}\n",[185,3341,3342,3350,3359,3376,3420,3457],{"__ignoreMap":238},[242,3343,3344,3346,3348],{"class":244,"line":245},[242,3345,400],{"class":321},[242,3347,404],{"class":403},[242,3349,407],{"class":325},[242,3351,3352,3354,3357],{"class":244,"line":355},[242,3353,414],{"class":413},[242,3355,3356],{"class":248}," OrderService",[242,3358,420],{"class":321},[242,3360,3361,3363,3366,3368,3370,3373],{"class":244,"line":390},[242,3362,564],{"class":413},[242,3364,3365],{"class":452}," primary",[242,3367,570],{"class":321},[242,3369,337],{"class":452},[242,3371,3372],{"class":325},"(MessageBus)                                    ",[242,3374,3375],{"class":1136},"\u002F\u002F default\n",[242,3377,3378,3380,3383,3385,3387,3390,3392,3395,3397,3400,3402,3404,3406,3408,3410,3413,3415,3417],{"class":244,"line":397},[242,3379,564],{"class":413},[242,3381,3382],{"class":452}," kafka",[242,3384,570],{"class":321},[242,3386,337],{"class":452},[242,3388,3389],{"class":321},"\u003C",[242,3391,195],{"class":248},[242,3393,3394],{"class":321},">",[242,3396,432],{"class":325},[242,3398,3399],{"class":452},"getMessageBusToken",[242,3401,432],{"class":325},[242,3403,435],{"class":321},[242,3405,3258],{"class":251},[242,3407,435],{"class":321},[242,3409,1769],{"class":325},[242,3411,3412],{"class":317},"as",[242,3414,472],{"class":248},[242,3416,1769],{"class":325},[242,3418,3419],{"class":1136},"\u002F\u002F named\n",[242,3421,3422,3424,3427,3429,3431,3433,3435,3437,3439,3441,3443,3445,3447,3449,3451,3453,3455],{"class":244,"line":410},[242,3423,564],{"class":413},[242,3425,3426],{"class":452}," internal",[242,3428,570],{"class":321},[242,3430,337],{"class":452},[242,3432,3389],{"class":321},[242,3434,195],{"class":248},[242,3436,3394],{"class":321},[242,3438,432],{"class":325},[242,3440,3399],{"class":452},[242,3442,432],{"class":325},[242,3444,435],{"class":321},[242,3446,3306],{"class":251},[242,3448,435],{"class":321},[242,3450,1769],{"class":325},[242,3452,3412],{"class":317},[242,3454,472],{"class":248},[242,3456,443],{"class":325},[242,3458,3459],{"class":244,"line":423},[242,3460,534],{"class":321},[182,3462,3463,3464,3466,3467,3469],{},"Target a specific bus from ",[185,3465,794],{}," via the ",[185,3468,657],{}," option:",[232,3471,3473],{"className":308,"code":3472,"language":310,"meta":238,"style":238},"@Injectable()\nclass Handlers {\n  @On('order.placed')                          \u002F\u002F default bus\n  async onOrder(o: Order) { ... }\n\n  @On('legacy.user.created', { bus: 'kafka' }) \u002F\u002F kafka bus\n  async onLegacyUser(u: User) { ... }\n\n  @On('domain.cart.updated', { bus: 'internal' })\n  async onCart(c: Cart) { ... }\n}\n",[185,3474,3475,3483,3492,3512,3536,3540,3576,3600,3604,3637,3662],{"__ignoreMap":238},[242,3476,3477,3479,3481],{"class":244,"line":245},[242,3478,400],{"class":321},[242,3480,404],{"class":403},[242,3482,407],{"class":325},[242,3484,3485,3487,3490],{"class":244,"line":355},[242,3486,414],{"class":413},[242,3488,3489],{"class":248}," Handlers",[242,3491,420],{"class":321},[242,3493,3494,3496,3498,3500,3502,3504,3506,3509],{"class":244,"line":390},[242,3495,426],{"class":321},[242,3497,429],{"class":403},[242,3499,432],{"class":325},[242,3501,435],{"class":321},[242,3503,1718],{"class":251},[242,3505,435],{"class":321},[242,3507,3508],{"class":325},")                          ",[242,3510,3511],{"class":1136},"\u002F\u002F default bus\n",[242,3513,3514,3516,3519,3521,3524,3526,3528,3530,3532,3534],{"class":244,"line":397},[242,3515,449],{"class":413},[242,3517,3518],{"class":452}," onOrder",[242,3520,432],{"class":321},[242,3522,3523],{"class":458},"o",[242,3525,462],{"class":321},[242,3527,2639],{"class":248},[242,3529,1131],{"class":321},[242,3531,322],{"class":321},[242,3533,640],{"class":321},[242,3535,645],{"class":321},[242,3537,3538],{"class":244,"line":410},[242,3539,394],{"emptyLinePlaceholder":393},[242,3541,3542,3544,3546,3548,3550,3553,3555,3557,3559,3561,3563,3565,3567,3569,3571,3573],{"class":244,"line":423},[242,3543,426],{"class":321},[242,3545,429],{"class":403},[242,3547,432],{"class":325},[242,3549,435],{"class":321},[242,3551,3552],{"class":251},"legacy.user.created",[242,3554,435],{"class":321},[242,3556,329],{"class":321},[242,3558,322],{"class":321},[242,3560,567],{"class":452},[242,3562,462],{"class":321},[242,3564,346],{"class":321},[242,3566,3258],{"class":251},[242,3568,435],{"class":321},[242,3570,340],{"class":321},[242,3572,1769],{"class":325},[242,3574,3575],{"class":1136},"\u002F\u002F kafka bus\n",[242,3577,3578,3580,3583,3585,3588,3590,3592,3594,3596,3598],{"class":244,"line":446},[242,3579,449],{"class":413},[242,3581,3582],{"class":452}," onLegacyUser",[242,3584,432],{"class":321},[242,3586,3587],{"class":458},"u",[242,3589,462],{"class":321},[242,3591,1128],{"class":248},[242,3593,1131],{"class":321},[242,3595,322],{"class":321},[242,3597,640],{"class":321},[242,3599,645],{"class":321},[242,3601,3602],{"class":244,"line":490},[242,3603,394],{"emptyLinePlaceholder":393},[242,3605,3606,3608,3610,3612,3614,3617,3619,3621,3623,3625,3627,3629,3631,3633,3635],{"class":244,"line":525},[242,3607,426],{"class":321},[242,3609,429],{"class":403},[242,3611,432],{"class":325},[242,3613,435],{"class":321},[242,3615,3616],{"class":251},"domain.cart.updated",[242,3618,435],{"class":321},[242,3620,329],{"class":321},[242,3622,322],{"class":321},[242,3624,567],{"class":452},[242,3626,462],{"class":321},[242,3628,346],{"class":321},[242,3630,3306],{"class":251},[242,3632,435],{"class":321},[242,3634,340],{"class":321},[242,3636,443],{"class":325},[242,3638,3639,3641,3644,3646,3649,3651,3654,3656,3658,3660],{"class":244,"line":531},[242,3640,449],{"class":413},[242,3642,3643],{"class":452}," onCart",[242,3645,432],{"class":321},[242,3647,3648],{"class":458},"c",[242,3650,462],{"class":321},[242,3652,3653],{"class":248}," Cart",[242,3655,1131],{"class":321},[242,3657,322],{"class":321},[242,3659,640],{"class":321},[242,3661,645],{"class":321},[242,3663,3664],{"class":244,"line":537},[242,3665,534],{"class":321},[2965,3667,3668],{},[182,3669,3670,3676,3677,3680,3681,3683,3684,3686,3687,3689,3690,3693],{},[797,3671,3672,3675],{},[185,3673,3674],{},"@On('topic', { bus: 'unknown' })"," throws at startup"," if no ",[185,3678,3679],{},"MessagingModule.configure(opts, 'unknown')"," was registered. Same for ",[185,3682,191],{}," (no ",[185,3685,657],{},") when only named buses are configured (default bus must exist for handlers without ",[185,3688,657],{},"). Fail-fast prevents silent typos like ",[185,3691,3692],{},"bus: 'kafa'"," from masking dead handlers.",[1787,3695,3696],{},[182,3697,3698,3701,3702,3705,3706,3709,3710,3712],{},[797,3699,3700],{},"Topic naming with shared brokers."," If two buses target the same Redis instance, give topics non-overlapping names (",[185,3703,3704],{},"'primary.user.created'"," vs ",[185,3707,3708],{},"'kafka.user.created'","). Otherwise the buses' DLQ topics (",[185,3711,1820],{},") collide and DLQ-listeners on one bus pick up dead messages from the other. Easier alternative - use separate Redis instances per bus.",[2398,3714,3715],{},[182,3716,3717,3720,3721,3724,3725,3728,3729,3732],{},[797,3718,3719],{},"Sharing an idempotency store between buses."," Pass the same ",[185,3722,3723],{},"IdempotencyStore"," instance to multiple ",[185,3726,3727],{},"configure()"," calls if you want claims to be shared across buses (rare but legitimate). The store's ",[185,3730,3731],{},"onDestroy()"," will be called once per bus during shutdown - the built-in stores tolerate this, but custom implementations should be idempotent.",[225,3734,211],{"id":3735},"messagingmoduleconfigure",[182,3737,3738,3741,3742,3745,3746,3748,3749,2094,3754,496],{},[185,3739,3740],{},"MessagingModule.configure()"," returns a ",[185,3743,3744],{},"ConfiguredModule"," with the transport and ",[185,3747,195],{}," registered as singletons. Two forms - same shape as ",[205,3750,3751],{"href":132},[185,3752,3753],{},"JwtModule.configure",[205,3755,3756],{"href":136},[185,3757,3758],{},"DrizzleModule.configure",[182,3760,3761],{},"Static options:",[232,3763,3765],{"className":308,"code":3764,"language":310,"meta":238,"style":238},"MessagingModule.configure({\n  transport: inMemoryTransport(),\n})\n",[185,3766,3767,3779,3791],{"__ignoreMap":238},[242,3768,3769,3771,3773,3775,3777],{"class":244,"line":245},[242,3770,1609],{"class":325},[242,3772,496],{"class":321},[242,3774,729],{"class":403},[242,3776,432],{"class":325},[242,3778,713],{"class":321},[242,3780,3781,3783,3785,3787,3789],{"class":244,"line":355},[242,3782,1622],{"class":452},[242,3784,462],{"class":321},[242,3786,377],{"class":403},[242,3788,635],{"class":325},[242,3790,753],{"class":321},[242,3792,3793,3795],{"class":244,"line":390},[242,3794,747],{"class":321},[242,3796,443],{"class":325},[182,3798,3799,3800,3803],{},"Factory with DI access (use this when the transport depends on ",[185,3801,3802],{},"ConfigService"," or another provider):",[232,3805,3807],{"className":308,"code":3806,"language":310,"meta":238,"style":238},"import { ConfigService } from '@miiajs\u002Fconfig'\nimport { redisStreamsTransport } from '@miiajs\u002Fmessaging-redis'\n\nMessagingModule.configure((resolve) => ({\n  transport: redisStreamsTransport({\n    url: resolve(ConfigService).getOrThrow('REDIS_URL'),\n    retry: { maxAttempts: 10 },\n  }),\n}))\n",[185,3808,3809,3829,3847,3851,3874,3886,3916,3936,3945],{"__ignoreMap":238},[242,3810,3811,3813,3815,3818,3820,3822,3824,3827],{"class":244,"line":245},[242,3812,318],{"class":317},[242,3814,322],{"class":321},[242,3816,3817],{"class":325}," ConfigService",[242,3819,340],{"class":321},[242,3821,343],{"class":317},[242,3823,346],{"class":321},[242,3825,3826],{"class":251},"@miiajs\u002Fconfig",[242,3828,352],{"class":321},[242,3830,3831,3833,3835,3837,3839,3841,3843,3845],{"class":244,"line":355},[242,3832,318],{"class":317},[242,3834,322],{"class":321},[242,3836,1627],{"class":325},[242,3838,340],{"class":321},[242,3840,343],{"class":317},[242,3842,346],{"class":321},[242,3844,3086],{"class":251},[242,3846,352],{"class":321},[242,3848,3849],{"class":244,"line":390},[242,3850,394],{"emptyLinePlaceholder":393},[242,3852,3853,3855,3857,3859,3861,3863,3866,3868,3870,3872],{"class":244,"line":397},[242,3854,1609],{"class":325},[242,3856,496],{"class":321},[242,3858,729],{"class":403},[242,3860,432],{"class":325},[242,3862,432],{"class":321},[242,3864,3865],{"class":458},"resolve",[242,3867,1131],{"class":321},[242,3869,2774],{"class":413},[242,3871,2362],{"class":325},[242,3873,713],{"class":321},[242,3875,3876,3878,3880,3882,3884],{"class":244,"line":410},[242,3877,1622],{"class":452},[242,3879,462],{"class":321},[242,3881,1627],{"class":403},[242,3883,432],{"class":325},[242,3885,713],{"class":321},[242,3887,3888,3891,3893,3896,3899,3901,3904,3906,3908,3910,3912,3914],{"class":244,"line":423},[242,3889,3890],{"class":452},"    url",[242,3892,462],{"class":321},[242,3894,3895],{"class":403}," resolve",[242,3897,3898],{"class":325},"(ConfigService)",[242,3900,496],{"class":321},[242,3902,3903],{"class":403},"getOrThrow",[242,3905,432],{"class":325},[242,3907,435],{"class":321},[242,3909,1649],{"class":251},[242,3911,435],{"class":321},[242,3913,1131],{"class":325},[242,3915,753],{"class":321},[242,3917,3918,3921,3923,3925,3928,3930,3933],{"class":244,"line":446},[242,3919,3920],{"class":452},"    retry",[242,3922,462],{"class":321},[242,3924,322],{"class":321},[242,3926,3927],{"class":452}," maxAttempts",[242,3929,462],{"class":321},[242,3931,3932],{"class":1688}," 10",[242,3934,3935],{"class":321}," },\n",[242,3937,3938,3941,3943],{"class":244,"line":490},[242,3939,3940],{"class":321},"  }",[242,3942,1131],{"class":325},[242,3944,753],{"class":321},[242,3946,3947,3949],{"class":244,"line":525},[242,3948,747],{"class":321},[242,3950,3951],{"class":325},"))\n",[906,3953,3954,3964],{},[909,3955,3956],{},[912,3957,3958,3960,3962],{},[915,3959,1987],{},[915,3961,920],{},[915,3963,923],{},[925,3965,3966,3981,4000,4020],{},[912,3967,3968,3973,3978],{},[930,3969,3970],{},[185,3971,3972],{},"transport",[930,3974,3975],{},[185,3976,3977],{},"MessageTransport",[930,3979,3980],{},"Required. The transport instance the bus publishes through and subscribes against.",[912,3982,3983,3987,3991],{},[930,3984,3985],{},[185,3986,2481],{},[930,3988,3989],{},[185,3990,3723],{},[930,3992,3993,3994,3996,3997,496],{},"Optional. Required when any handler uses ",[185,3995,1214],{}," - the bus throws at startup otherwise. See ",[205,3998,2482],{"href":3999},"#idempotency",[912,4001,4002,4007,4012],{},[930,4003,4004],{},[185,4005,4006],{},"dispatch",[930,4008,4009],{},[185,4010,4011],{},"{ mode?: DispatchMode; concurrency?: number }",[930,4013,4014,4015,1032,4018,496],{},"Optional. Bus-wide dispatch defaults applied to every subscription on this bus. Overridden per-handler via ",[185,4016,4017],{},"@On({ mode, concurrency })",[205,4019,996],{"href":995},[912,4021,4022,4026,4030],{},[930,4023,4024],{},[185,4025,1441],{},[930,4027,4028],{},[185,4029,939],{},[930,4031,4032,4033,4036,4037,496],{},"Optional namespace prefix for auto-derived consumer groups. Use to avoid collisions when multiple services share a broker. Does NOT affect topic names or explicit ",[185,4034,4035],{},"@On({ group })"," values. See ",[205,4038,4040],{"href":4039},"#multi-service-deployments-appname","Multi-service deployments",[182,4042,4043,4045,4046,4049,4050,4052,4053,4055,4056,1781,4059,1781,4062,4064,4065,4067,4068,4071],{},[185,4044,3740],{}," accepts an optional second argument ",[185,4047,4048],{},"name?: string"," for ",[205,4051,1013],{"href":1012},". Without ",[185,4054,3010],{}," - registers the default bus (",[185,4057,4058],{},"MESSAGE_TRANSPORT",[185,4060,4061],{},"IDEMPOTENCY_STORE",[185,4063,195],{}," class tokens). With ",[185,4066,3010],{}," - registers under namespaced tokens accessible via ",[185,4069,4070],{},"getMessageBusToken(name)"," etc.",[225,4073,4075],{"id":4074},"inmemorytransport-options","InMemoryTransport options",[232,4077,4079],{"className":308,"code":4078,"language":310,"meta":238,"style":238},"inMemoryTransport({\n  retry: { backoffMs: 100, maxAttempts: 3 },\n  cloneOnPublish: false,\n})\n",[185,4080,4081,4089,4117,4129],{"__ignoreMap":238},[242,4082,4083,4085,4087],{"class":244,"line":245},[242,4084,2434],{"class":403},[242,4086,432],{"class":325},[242,4088,713],{"class":321},[242,4090,4091,4094,4096,4098,4101,4103,4106,4108,4110,4112,4115],{"class":244,"line":355},[242,4092,4093],{"class":452},"  retry",[242,4095,462],{"class":321},[242,4097,322],{"class":321},[242,4099,4100],{"class":452}," backoffMs",[242,4102,462],{"class":321},[242,4104,4105],{"class":1688}," 100",[242,4107,329],{"class":321},[242,4109,3927],{"class":452},[242,4111,462],{"class":321},[242,4113,4114],{"class":1688}," 3",[242,4116,3935],{"class":321},[242,4118,4119,4122,4124,4127],{"class":244,"line":390},[242,4120,4121],{"class":452},"  cloneOnPublish",[242,4123,462],{"class":321},[242,4125,4126],{"class":1276}," false",[242,4128,753],{"class":321},[242,4130,4131,4133],{"class":244,"line":397},[242,4132,747],{"class":321},[242,4134,443],{"class":325},[906,4136,4137,4149],{},[909,4138,4139],{},[912,4140,4141,4143,4145,4147],{},[915,4142,917],{},[915,4144,920],{},[915,4146,1512],{},[915,4148,923],{},[925,4150,4151,4171,4195],{},[912,4152,4153,4158,4163,4168],{},[930,4154,4155],{},[185,4156,4157],{},"retry",[930,4159,4160],{},[185,4161,4162],{},"Partial\u003CRetryConfig>",[930,4164,4165],{},[185,4166,4167],{},"DEFAULT_RETRY",[930,4169,4170],{},"Override individual retry fields.",[912,4172,4173,4178,4182,4186],{},[930,4174,4175],{},[185,4176,4177],{},"cloneOnPublish",[930,4179,4180],{},[185,4181,1026],{},[930,4183,4184],{},[185,4185,2073],{},[930,4187,2070,4188,4190,4191,4194],{},[185,4189,2067],{},", payload is ",[185,4192,4193],{},"structuredClone","d before each handler sees it - prevents accidental cross-handler mutation at the cost of one clone per delivery.",[912,4196,4197,4201,4205,4209],{},[930,4198,4199],{},[185,4200,2419],{},[930,4202,4203],{},[185,4204,962],{},[930,4206,4207],{},[185,4208,2423],{},[930,4210,4211,4212,4214,4215,496],{},"Max time ",[185,4213,3731],{}," waits for in-flight handlers before forcing cleanup. Set 0 to skip drain. See ",[205,4216,2410],{"href":4217},"#graceful-drain",[182,4219,4220,4221,4224,4225,496],{},"The in-memory transport is ",[797,4222,4223],{},"not persistent",". Messages live in memory only; a process crash mid-retry loses any in-flight or scheduled retries. It's ideal for tests, local dev, and single-process apps where event loss on crash is acceptable. For production reach for the ",[205,4226,4227],{"href":106},"Redis transport",[225,4229,33],{"id":4230},"testing",[182,4232,4233,4234,4237,4238,4240],{},"Use ",[185,4235,4236],{},"TestApp"," to register the events module and resolve ",[185,4239,195],{}," directly:",[232,4242,4244],{"className":308,"code":4243,"language":310,"meta":238,"style":238},"import { TestApp } from '@miiajs\u002Fcore\u002Ftesting'\nimport { MessageBus, MessagingModule, inMemoryTransport } from '@miiajs\u002Fmessaging'\n\nconst app = await TestApp.create(AppModule)\n  .provide({\n    token: MessagingModule,\n    factory: () => MessagingModule.configure({ transport: inMemoryTransport({ retry: { backoffMs: 5 } }) }),\n  })\n  .compile()\n\nconst bus = app.resolve(MessageBus)\nawait bus.publish('user.created', { id: '1' })\n\n\u002F\u002F In-memory delivery is asynchronous - handlers run via queueMicrotask.\n\u002F\u002F Wait a tick before asserting on the result.\nawait new Promise((r) => setTimeout(r, 10))\n\nexpect(handler.received).toEqual([{ id: '1' }])\n",[185,4245,4246,4266,4292,4296,4318,4330,4341,4399,4405,4414,4418,4436,4472,4476,4481,4486,4519,4523],{"__ignoreMap":238},[242,4247,4248,4250,4252,4255,4257,4259,4261,4264],{"class":244,"line":245},[242,4249,318],{"class":317},[242,4251,322],{"class":321},[242,4253,4254],{"class":325}," TestApp",[242,4256,340],{"class":321},[242,4258,343],{"class":317},[242,4260,346],{"class":321},[242,4262,4263],{"class":251},"@miiajs\u002Fcore\u002Ftesting",[242,4265,352],{"class":321},[242,4267,4268,4270,4272,4274,4276,4278,4280,4282,4284,4286,4288,4290],{"class":244,"line":355},[242,4269,318],{"class":317},[242,4271,322],{"class":321},[242,4273,367],{"class":325},[242,4275,329],{"class":321},[242,4277,362],{"class":325},[242,4279,329],{"class":321},[242,4281,377],{"class":325},[242,4283,340],{"class":321},[242,4285,343],{"class":317},[242,4287,346],{"class":321},[242,4289,187],{"class":251},[242,4291,352],{"class":321},[242,4293,4294],{"class":244,"line":390},[242,4295,394],{"emptyLinePlaceholder":393},[242,4297,4298,4300,4303,4305,4308,4310,4312,4315],{"class":244,"line":397},[242,4299,2139],{"class":413},[242,4301,4302],{"class":325}," app ",[242,4304,2145],{"class":321},[242,4306,4307],{"class":317}," await",[242,4309,4254],{"class":325},[242,4311,496],{"class":321},[242,4313,4314],{"class":403},"create",[242,4316,4317],{"class":325},"(AppModule)\n",[242,4319,4320,4323,4326,4328],{"class":244,"line":410},[242,4321,4322],{"class":321},"  .",[242,4324,4325],{"class":403},"provide",[242,4327,432],{"class":325},[242,4329,713],{"class":321},[242,4331,4332,4335,4337,4339],{"class":244,"line":423},[242,4333,4334],{"class":452},"    token",[242,4336,462],{"class":321},[242,4338,362],{"class":325},[242,4340,753],{"class":321},[242,4342,4343,4346,4348,4351,4353,4355,4357,4359,4361,4363,4365,4367,4369,4371,4373,4376,4378,4380,4382,4384,4387,4389,4391,4393,4395,4397],{"class":244,"line":446},[242,4344,4345],{"class":403},"    factory",[242,4347,462],{"class":321},[242,4349,4350],{"class":321}," ()",[242,4352,2774],{"class":413},[242,4354,362],{"class":325},[242,4356,496],{"class":321},[242,4358,729],{"class":403},[242,4360,432],{"class":325},[242,4362,734],{"class":321},[242,4364,737],{"class":452},[242,4366,462],{"class":321},[242,4368,377],{"class":403},[242,4370,432],{"class":325},[242,4372,734],{"class":321},[242,4374,4375],{"class":452}," retry",[242,4377,462],{"class":321},[242,4379,322],{"class":321},[242,4381,4100],{"class":452},[242,4383,462],{"class":321},[242,4385,4386],{"class":1688}," 5",[242,4388,340],{"class":321},[242,4390,340],{"class":321},[242,4392,1769],{"class":325},[242,4394,747],{"class":321},[242,4396,1131],{"class":325},[242,4398,753],{"class":321},[242,4400,4401,4403],{"class":244,"line":490},[242,4402,3940],{"class":321},[242,4404,443],{"class":325},[242,4406,4407,4409,4412],{"class":244,"line":525},[242,4408,4322],{"class":321},[242,4410,4411],{"class":403},"compile",[242,4413,407],{"class":325},[242,4415,4416],{"class":244,"line":531},[242,4417,394],{"emptyLinePlaceholder":393},[242,4419,4420,4422,4425,4427,4430,4432,4434],{"class":244,"line":537},[242,4421,2139],{"class":413},[242,4423,4424],{"class":325}," bus ",[242,4426,2145],{"class":321},[242,4428,4429],{"class":325}," app",[242,4431,496],{"class":321},[242,4433,3865],{"class":403},[242,4435,575],{"class":325},[242,4437,4438,4440,4442,4444,4446,4448,4450,4452,4454,4456,4458,4460,4462,4464,4466,4468,4470],{"class":244,"line":542},[242,4439,2183],{"class":317},[242,4441,567],{"class":325},[242,4443,496],{"class":321},[242,4445,662],{"class":403},[242,4447,432],{"class":325},[242,4449,435],{"class":321},[242,4451,438],{"class":251},[242,4453,435],{"class":321},[242,4455,329],{"class":321},[242,4457,322],{"class":321},[242,4459,467],{"class":452},[242,4461,462],{"class":321},[242,4463,346],{"class":321},[242,4465,1599],{"class":251},[242,4467,435],{"class":321},[242,4469,340],{"class":321},[242,4471,443],{"class":325},[242,4473,4474],{"class":244,"line":551},[242,4475,394],{"emptyLinePlaceholder":393},[242,4477,4478],{"class":244,"line":561},[242,4479,4480],{"class":1136},"\u002F\u002F In-memory delivery is asynchronous - handlers run via queueMicrotask.\n",[242,4482,4483],{"class":244,"line":578},[242,4484,4485],{"class":1136},"\u002F\u002F Wait a tick before asserting on the result.\n",[242,4487,4488,4490,4493,4496,4498,4500,4503,4505,4507,4510,4513,4515,4517],{"class":244,"line":583},[242,4489,2183],{"class":317},[242,4491,4492],{"class":321}," new",[242,4494,4495],{"class":248}," Promise",[242,4497,432],{"class":325},[242,4499,432],{"class":321},[242,4501,4502],{"class":458},"r",[242,4504,1131],{"class":321},[242,4506,2774],{"class":413},[242,4508,4509],{"class":403}," setTimeout",[242,4511,4512],{"class":325},"(r",[242,4514,329],{"class":321},[242,4516,3932],{"class":1688},[242,4518,3951],{"class":325},[242,4520,4521],{"class":244,"line":610},[242,4522,394],{"emptyLinePlaceholder":393},[242,4524,4525,4528,4531,4533,4536,4538,4541,4544,4546,4548,4550,4552,4554,4556,4558],{"class":244,"line":648},[242,4526,4527],{"class":403},"expect",[242,4529,4530],{"class":325},"(handler",[242,4532,496],{"class":321},[242,4534,4535],{"class":325},"received)",[242,4537,496],{"class":321},[242,4539,4540],{"class":403},"toEqual",[242,4542,4543],{"class":325},"([",[242,4545,734],{"class":321},[242,4547,467],{"class":452},[242,4549,462],{"class":321},[242,4551,346],{"class":321},[242,4553,1599],{"class":251},[242,4555,435],{"class":321},[242,4557,340],{"class":321},[242,4559,4560],{"class":325},"])\n",[182,4562,4563,4564,4566],{},"Lower ",[185,4565,2020],{}," to single-digit milliseconds in tests so retry paths complete inside the test timeout.",[225,4568,4570],{"id":4569},"exports","Exports",[232,4572,4574],{"className":308,"code":4573,"language":310,"meta":238,"style":238},"import {\n  MessageBus,\n  MessagingModule,\n  Idempotent,\n  IDEMPOTENT,\n  IDEMPOTENCY_STORE,\n  InMemoryTransport,\n  inMemoryTransport,\n  MemoryIdempotencyStore,\n  memoryIdempotencyStore,\n  On,\n  ON,\n  MESSAGE_TRANSPORT,\n  DEFAULT_RETRY,\n  dlqTopic,\n  getMessageBusToken,\n  getMessageTransportToken,\n  getIdempotencyStoreToken,\n  nextBackoffMs,\n  deriveGroupName,\n  type DeriveGroupNameInput,\n  type DispatchDefaults,\n  type DispatchMode,\n  type MessageEnvelope,\n  type MessageMeta,\n  type MessageTransport,\n  type MessagingModuleOptions,\n  type HandlerResult,\n  type IdempotencyStore,\n  type IdempotentMeta,\n  type InMemoryTransportOptions,\n  type MemoryIdempotencyStoreOptions,\n  type OnMeta,\n  type RetryConfig,\n  type SubscribeOptions,\n  type Subscription,\n} from '@miiajs\u002Fmessaging'\n",[185,4575,4576,4582,4589,4596,4603,4610,4617,4624,4631,4638,4645,4652,4659,4666,4673,4680,4687,4694,4701,4708,4715,4725,4734,4743,4752,4761,4770,4779,4789,4799,4809,4819,4829,4839,4849,4859,4869],{"__ignoreMap":238},[242,4577,4578,4580],{"class":244,"line":245},[242,4579,318],{"class":317},[242,4581,420],{"class":321},[242,4583,4584,4587],{"class":244,"line":355},[242,4585,4586],{"class":325},"  MessageBus",[242,4588,753],{"class":321},[242,4590,4591,4594],{"class":244,"line":390},[242,4592,4593],{"class":325},"  MessagingModule",[242,4595,753],{"class":321},[242,4597,4598,4601],{"class":244,"line":397},[242,4599,4600],{"class":325},"  Idempotent",[242,4602,753],{"class":321},[242,4604,4605,4608],{"class":244,"line":410},[242,4606,4607],{"class":325},"  IDEMPOTENT",[242,4609,753],{"class":321},[242,4611,4612,4615],{"class":244,"line":423},[242,4613,4614],{"class":325},"  IDEMPOTENCY_STORE",[242,4616,753],{"class":321},[242,4618,4619,4622],{"class":244,"line":446},[242,4620,4621],{"class":325},"  InMemoryTransport",[242,4623,753],{"class":321},[242,4625,4626,4629],{"class":244,"line":490},[242,4627,4628],{"class":325},"  inMemoryTransport",[242,4630,753],{"class":321},[242,4632,4633,4636],{"class":244,"line":525},[242,4634,4635],{"class":325},"  MemoryIdempotencyStore",[242,4637,753],{"class":321},[242,4639,4640,4643],{"class":244,"line":531},[242,4641,4642],{"class":325},"  memoryIdempotencyStore",[242,4644,753],{"class":321},[242,4646,4647,4650],{"class":244,"line":537},[242,4648,4649],{"class":325},"  On",[242,4651,753],{"class":321},[242,4653,4654,4657],{"class":244,"line":542},[242,4655,4656],{"class":325},"  ON",[242,4658,753],{"class":321},[242,4660,4661,4664],{"class":244,"line":551},[242,4662,4663],{"class":325},"  MESSAGE_TRANSPORT",[242,4665,753],{"class":321},[242,4667,4668,4671],{"class":244,"line":561},[242,4669,4670],{"class":325},"  DEFAULT_RETRY",[242,4672,753],{"class":321},[242,4674,4675,4678],{"class":244,"line":578},[242,4676,4677],{"class":325},"  dlqTopic",[242,4679,753],{"class":321},[242,4681,4682,4685],{"class":244,"line":583},[242,4683,4684],{"class":325},"  getMessageBusToken",[242,4686,753],{"class":321},[242,4688,4689,4692],{"class":244,"line":610},[242,4690,4691],{"class":325},"  getMessageTransportToken",[242,4693,753],{"class":321},[242,4695,4696,4699],{"class":244,"line":648},[242,4697,4698],{"class":325},"  getIdempotencyStoreToken",[242,4700,753],{"class":321},[242,4702,4703,4706],{"class":244,"line":679},[242,4704,4705],{"class":325},"  nextBackoffMs",[242,4707,753],{"class":321},[242,4709,4710,4713],{"class":244,"line":688},[242,4711,4712],{"class":325},"  deriveGroupName",[242,4714,753],{"class":321},[242,4716,4717,4720,4723],{"class":244,"line":693},[242,4718,4719],{"class":317},"  type",[242,4721,4722],{"class":325}," DeriveGroupNameInput",[242,4724,753],{"class":321},[242,4726,4727,4729,4732],{"class":244,"line":698},[242,4728,4719],{"class":317},[242,4730,4731],{"class":325}," DispatchDefaults",[242,4733,753],{"class":321},[242,4735,4736,4738,4741],{"class":244,"line":703},[242,4737,4719],{"class":317},[242,4739,4740],{"class":325}," DispatchMode",[242,4742,753],{"class":321},[242,4744,4745,4747,4750],{"class":244,"line":716},[242,4746,4719],{"class":317},[242,4748,4749],{"class":325}," MessageEnvelope",[242,4751,753],{"class":321},[242,4753,4754,4756,4759],{"class":244,"line":756},[242,4755,4719],{"class":317},[242,4757,4758],{"class":325}," MessageMeta",[242,4760,753],{"class":321},[242,4762,4763,4765,4768],{"class":244,"line":774},[242,4764,4719],{"class":317},[242,4766,4767],{"class":325}," MessageTransport",[242,4769,753],{"class":321},[242,4771,4772,4774,4777],{"class":244,"line":781},[242,4773,4719],{"class":317},[242,4775,4776],{"class":325}," MessagingModuleOptions",[242,4778,753],{"class":321},[242,4780,4782,4784,4787],{"class":244,"line":4781},28,[242,4783,4719],{"class":317},[242,4785,4786],{"class":325}," HandlerResult",[242,4788,753],{"class":321},[242,4790,4792,4794,4797],{"class":244,"line":4791},29,[242,4793,4719],{"class":317},[242,4795,4796],{"class":325}," IdempotencyStore",[242,4798,753],{"class":321},[242,4800,4802,4804,4807],{"class":244,"line":4801},30,[242,4803,4719],{"class":317},[242,4805,4806],{"class":325}," IdempotentMeta",[242,4808,753],{"class":321},[242,4810,4812,4814,4817],{"class":244,"line":4811},31,[242,4813,4719],{"class":317},[242,4815,4816],{"class":325}," InMemoryTransportOptions",[242,4818,753],{"class":321},[242,4820,4822,4824,4827],{"class":244,"line":4821},32,[242,4823,4719],{"class":317},[242,4825,4826],{"class":325}," MemoryIdempotencyStoreOptions",[242,4828,753],{"class":321},[242,4830,4832,4834,4837],{"class":244,"line":4831},33,[242,4833,4719],{"class":317},[242,4835,4836],{"class":325}," OnMeta",[242,4838,753],{"class":321},[242,4840,4842,4844,4847],{"class":244,"line":4841},34,[242,4843,4719],{"class":317},[242,4845,4846],{"class":325}," RetryConfig",[242,4848,753],{"class":321},[242,4850,4852,4854,4857],{"class":244,"line":4851},35,[242,4853,4719],{"class":317},[242,4855,4856],{"class":325}," SubscribeOptions",[242,4858,753],{"class":321},[242,4860,4862,4864,4867],{"class":244,"line":4861},36,[242,4863,4719],{"class":317},[242,4865,4866],{"class":325}," Subscription",[242,4868,753],{"class":321},[242,4870,4872,4874,4876,4878,4880],{"class":244,"line":4871},37,[242,4873,747],{"class":321},[242,4875,343],{"class":317},[242,4877,346],{"class":321},[242,4879,187],{"class":251},[242,4881,352],{"class":321},[4883,4884,4885],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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 pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":238,"searchDepth":355,"depth":355,"links":4887},[4888,4889,4890,4891,4901,4904,4905,4906,4907,4908,4909,4910,4911,4912],{"id":227,"depth":355,"text":13},{"id":304,"depth":355,"text":305},{"id":810,"depth":355,"text":811},{"id":1050,"depth":355,"text":950,"children":4892},[4893,4894,4895,4897,4899],{"id":1072,"depth":390,"text":1073},{"id":1217,"depth":390,"text":1218},{"id":1235,"depth":390,"text":4896},"Cluster-wide fan-out (broadcast: true)",{"id":1309,"depth":390,"text":4898},"Worker pool: explicit group (competing consumers)",{"id":1437,"depth":390,"text":4900},"Multi-service deployments (appName)",{"id":1458,"depth":355,"text":996,"children":4902},[4903],{"id":1562,"depth":390,"text":1563},{"id":1805,"depth":355,"text":1806},{"id":2082,"depth":355,"text":2083},{"id":2409,"depth":355,"text":2410},{"id":2481,"depth":355,"text":2482},{"id":2999,"depth":355,"text":3000},{"id":3735,"depth":355,"text":211},{"id":4074,"depth":355,"text":4075},{"id":4230,"depth":355,"text":33},{"id":4569,"depth":355,"text":4570},"Decorator-driven event bus with exponential backoff retry, auto-DLQ, and pluggable transports.","md",{},{"title":27,"description":4913},"DOwVc0Nvbdo5EF5_5IaTuK2L8Qzl9G7kEf_RRZNEuIk",[4919,4921],{"title":93,"path":94,"stem":95,"description":4920,"children":-1},"Dev server, build, code generation, project scaffolding, and more.",{"title":105,"path":106,"stem":107,"description":4922,"children":-1},"Redis Streams transport for @miiajs\u002Fmessaging - consumer groups, ZSET-backed retry, auto-DLQ.",1778575276412]