[{"data":1,"prerenderedAt":2258},["ShallowReactive",2],{"navigation":3,"docs-path-index":268,"-docs-modules-queue-overview":348,"-docs-modules-queue-overview-surround":2253},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":56},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,57,229,250],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":56},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48,52],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",{"title":53,"path":54,"stem":55},"Introspection","\u002Fdocs\u002Fcore-features\u002Fintrospection","docs\u002F2.core-features\u002F5.introspection",false,{"title":58,"icon":59,"defaultOpen":60,"path":61,"stem":62,"children":63,"page":56},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[64,81,92,108,127,142,150,165,176,191,210,218],{"title":65,"icon":56,"defaultOpen":56,"path":66,"stem":67,"children":68,"page":56},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[69,73,77],{"title":70,"path":71,"stem":72},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":74,"path":75,"stem":76},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":78,"path":79,"stem":80},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":82,"icon":56,"defaultOpen":56,"path":83,"stem":84,"children":85,"page":56},"Devtools","\u002Fdocs\u002Fmodules\u002Fdevtools","docs\u002F3.modules\u002F10.devtools",[86,89],{"title":70,"path":87,"stem":88},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Foverview","docs\u002F3.modules\u002F10.devtools\u002F0.overview",{"title":33,"path":90,"stem":91},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Fconfiguration","docs\u002F3.modules\u002F10.devtools\u002F1.configuration",{"title":93,"path":94,"stem":95,"children":96,"page":56},"Telemetry","\u002Fdocs\u002Fmodules\u002Ftelemetry","docs\u002F3.modules\u002F11.telemetry",[97,100,104],{"title":70,"path":98,"stem":99},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Foverview","docs\u002F3.modules\u002F11.telemetry\u002F0.overview",{"title":101,"path":102,"stem":103},"API","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Fapi","docs\u002F3.modules\u002F11.telemetry\u002F1.api",{"title":105,"path":106,"stem":107},"Instrumentation","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Finstrumentation","docs\u002F3.modules\u002F11.telemetry\u002F2.instrumentation",{"title":109,"path":110,"stem":111,"children":112,"page":56},"Queue","\u002Fdocs\u002Fmodules\u002Fqueue","docs\u002F3.modules\u002F12.queue",[113,116,120,124],{"title":70,"path":114,"stem":115},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Foverview","docs\u002F3.modules\u002F12.queue\u002F0.overview",{"title":117,"path":118,"stem":119},"Consumers","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fconsumers","docs\u002F3.modules\u002F12.queue\u002F1.consumers",{"title":121,"path":122,"stem":123},"Strategies","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fstrategies","docs\u002F3.modules\u002F12.queue\u002F2.strategies",{"title":101,"path":125,"stem":126},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Fapi","docs\u002F3.modules\u002F12.queue\u002F3.api",{"title":128,"icon":56,"defaultOpen":56,"path":129,"stem":130,"children":131,"page":56},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[132,135,139],{"title":70,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":136,"path":137,"stem":138},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":101,"path":140,"stem":141},"\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":143,"icon":56,"defaultOpen":56,"path":144,"stem":145,"children":146,"page":56},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[147],{"title":70,"path":148,"stem":149},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":151,"icon":56,"defaultOpen":56,"path":152,"stem":153,"children":154,"page":56},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[155,158,162],{"title":70,"path":156,"stem":157},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":159,"path":160,"stem":161},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":101,"path":163,"stem":164},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":166,"icon":56,"defaultOpen":56,"path":167,"stem":168,"children":169,"page":56},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[170,173],{"title":70,"path":171,"stem":172},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":101,"path":174,"stem":175},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":177,"icon":56,"defaultOpen":56,"path":178,"stem":179,"children":180,"page":56},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[181,184,187],{"title":70,"path":182,"stem":183},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":74,"path":185,"stem":186},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":188,"path":189,"stem":190},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":192,"icon":56,"defaultOpen":56,"path":193,"stem":194,"children":195,"page":56},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[196,199,202,206],{"title":70,"path":197,"stem":198},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":151,"path":200,"stem":201},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":203,"path":204,"stem":205},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":207,"path":208,"stem":209},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":211,"icon":56,"defaultOpen":56,"path":212,"stem":213,"children":214,"page":56},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[215],{"title":70,"path":216,"stem":217},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":219,"icon":56,"defaultOpen":56,"path":220,"stem":221,"children":222,"page":56},"Cache","\u002Fdocs\u002Fmodules\u002Fcache","docs\u002F3.modules\u002F9.cache",[223,226],{"title":70,"path":224,"stem":225},"\u002Fdocs\u002Fmodules\u002Fcache\u002Foverview","docs\u002F3.modules\u002F9.cache\u002F0.overview",{"title":101,"path":227,"stem":228},"\u002Fdocs\u002Fmodules\u002Fcache\u002Fapi","docs\u002F3.modules\u002F9.cache\u002F1.api",{"title":230,"icon":231,"path":232,"stem":233,"children":234,"page":56},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[235,238,242,246],{"title":70,"path":236,"stem":237},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":239,"path":240,"stem":241},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":243,"path":244,"stem":245},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":247,"path":248,"stem":249},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":251,"icon":252,"path":253,"stem":254,"children":255,"page":56},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[256,260,264],{"title":257,"path":258,"stem":259},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":261,"path":262,"stem":263},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":265,"path":266,"stem":267},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",[269,271,273,274,275,276,278,279,280,281,282,283,284,286,288,289,290,291,293,294,295,296,297,298,299,300,301,302,304,305,306,307,309,310,312,313,314,315,317,318,319,321,322,323,324,326,327,328,329,330,332,333,335,336,337,339,340,341,342,343,345,346,347],{"path":270},"\u002Fdocs\u002F.navigation",{"path":272},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":277},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":54},{"path":285},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":287},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":71},{"path":75},{"path":79},{"path":292},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002F.navigation",{"path":87},{"path":90},{"path":98},{"path":102},{"path":106},{"path":114},{"path":118},{"path":122},{"path":125},{"path":303},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":133},{"path":137},{"path":140},{"path":308},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":148},{"path":311},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":156},{"path":160},{"path":163},{"path":316},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":171},{"path":174},{"path":320},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":182},{"path":185},{"path":189},{"path":325},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":197},{"path":200},{"path":204},{"path":208},{"path":331},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":216},{"path":334},"\u002Fdocs\u002Fmodules\u002Fcache\u002F.navigation",{"path":224},{"path":227},{"path":338},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":236},{"path":240},{"path":244},{"path":248},{"path":344},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":258},{"path":262},{"path":266},{"id":349,"title":70,"body":350,"description":2247,"extension":2248,"links":2249,"meta":2250,"navigation":60,"path":114,"seo":2251,"stem":115,"__hash__":2252},"docs\u002Fdocs\u002F3.modules\u002F12.queue\u002F0.overview.md",{"type":351,"value":352,"toc":2237},"minimark",[353,357,360,436,440,507,510,563,568,572,1573,1576,1580,1599,1605,1609,1612,1717,1738,1744,1748,1754,1882,2029,2033,2039,2042,2078,2103,2110,2114,2117,2204,2208,2233],[354,355,356],"p",{},"The Queue module runs work outside the request that asked for it. You publish a job with one call, handle it with one decorator, and the module takes care of everything that should not depend on your broker: routing a job to its handler, validating its payload, retrying it, timing it out and reporting what happened.",[354,358,359],{},"Four transports ship with it, and they can be mounted side by side:",[361,362,363,379],"table",{},[364,365,366],"thead",{},[367,368,369,373,376],"tr",{},[370,371,372],"th",{},"Strategy",[370,374,375],{},"Backed by",[370,377,378],{},"Use it for",[380,381,382,397,410,423],"tbody",{},[367,383,384,391,394],{},[385,386,387],"td",{},[388,389,390],"code",{},"MemoryStrategy",[385,392,393],{},"the running process",[385,395,396],{},"tests, examples, work that may be lost on restart",[367,398,399,404,407],{},[385,400,401],{},[388,402,403],{},"BullMQStrategy",[385,405,406],{},"Redis, through BullMQ",[385,408,409],{},"job queues with attempts, delays and priorities",[367,411,412,417,420],{},[385,413,414],{},[388,415,416],{},"RabbitMQStrategy",[385,418,419],{},"RabbitMQ, through amqplib",[385,421,422],{},"durable work distribution and dead lettering",[367,424,425,430,433],{},[385,426,427],{},[388,428,429],{},"KafkaStrategy",[385,431,432],{},"Kafka, through kafkajs",[385,434,435],{},"event streams, ordered per partition",[437,438,18],"h2",{"id":439},"installation",[441,442,443,472,490],"code-group",{},[444,445,451],"pre",{"className":446,"code":447,"filename":448,"language":449,"meta":450,"style":450},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add @vercube\u002Fqueue\n","pnpm","bash","",[388,452,453],{"__ignoreMap":450},[454,455,458,462,466,469],"span",{"class":456,"line":457},"line",1,[454,459,461],{"class":460},"sBMFI","$",[454,463,465],{"class":464},"sfazB"," pnpm",[454,467,468],{"class":464}," add",[454,470,471],{"class":464}," @vercube\u002Fqueue\n",[444,473,476],{"className":446,"code":474,"filename":475,"language":449,"meta":450,"style":450},"$ npm install @vercube\u002Fqueue\n","npm",[388,477,478],{"__ignoreMap":450},[454,479,480,482,485,488],{"class":456,"line":457},[454,481,461],{"class":460},[454,483,484],{"class":464}," npm",[454,486,487],{"class":464}," install",[454,489,471],{"class":464},[444,491,494],{"className":446,"code":492,"filename":493,"language":449,"meta":450,"style":450},"$ bun install @vercube\u002Fqueue\n","bun",[388,495,496],{"__ignoreMap":450},[454,497,498,500,503,505],{"class":456,"line":457},[454,499,461],{"class":460},[454,501,502],{"class":464}," bun",[454,504,487],{"class":464},[454,506,471],{"class":464},[354,508,509],{},"The transport clients are optional dependencies, so install the one you use:",[441,511,512,529,546],{},[444,513,516],{"className":446,"code":514,"filename":515,"language":449,"meta":450,"style":450},"$ pnpm add bullmq\n","BullMQ",[388,517,518],{"__ignoreMap":450},[454,519,520,522,524,526],{"class":456,"line":457},[454,521,461],{"class":460},[454,523,465],{"class":464},[454,525,468],{"class":464},[454,527,528],{"class":464}," bullmq\n",[444,530,533],{"className":446,"code":531,"filename":532,"language":449,"meta":450,"style":450},"$ pnpm add amqplib\n","RabbitMQ",[388,534,535],{"__ignoreMap":450},[454,536,537,539,541,543],{"class":456,"line":457},[454,538,461],{"class":460},[454,540,465],{"class":464},[454,542,468],{"class":464},[454,544,545],{"class":464}," amqplib\n",[444,547,550],{"className":446,"code":548,"filename":549,"language":449,"meta":450,"style":450},"$ pnpm add kafkajs\n","Kafka",[388,551,552],{"__ignoreMap":450},[454,553,554,556,558,560],{"class":456,"line":457},[454,555,461],{"class":460},[454,557,465],{"class":464},[454,559,468],{"class":464},[454,561,562],{"class":464}," kafkajs\n",[354,564,565,567],{},[388,566,390],{}," needs nothing at all.",[437,569,571],{"id":570},"quick-start","Quick Start",[573,574,575,580,587,853,863,867,877,1144,1148,1151,1256,1260],"steps",{},[576,577,579],"h3",{"id":578},"register-the-plugin","Register the plugin",[354,581,582,583,586],{},"The plugin binds the ",[388,584,585],{},"QueueManager"," and mounts the strategies you give it.",[444,588,593],{"className":589,"code":590,"filename":591,"language":592,"meta":450,"style":450},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { defineConfig } from '@vercube\u002Fcore';\nimport { defineQueueStrategy, QueuePlugin } from '@vercube\u002Fqueue';\nimport { BullMQStrategy } from '@vercube\u002Fqueue\u002Fstrategies\u002FBullMQStrategy';\n\nexport default defineConfig({\n  plugins: [\n    [QueuePlugin, {\n      strategies: [\n        defineQueueStrategy({\n          strategy: BullMQStrategy,\n          initOptions: { connection: { host: '127.0.0.1', port: 6379 } },\n        }),\n      ],\n    }],\n  ],\n});\n","vercube.config.ts","ts",[388,594,595,627,656,679,685,703,716,727,737,747,760,805,816,824,835,843],{"__ignoreMap":450},[454,596,597,601,605,609,612,615,618,621,624],{"class":456,"line":457},[454,598,600],{"class":599},"s7zQu","import",[454,602,604],{"class":603},"sMK4o"," {",[454,606,608],{"class":607},"sTEyZ"," defineConfig",[454,610,611],{"class":603}," }",[454,613,614],{"class":599}," from",[454,616,617],{"class":603}," '",[454,619,620],{"class":464},"@vercube\u002Fcore",[454,622,623],{"class":603},"'",[454,625,626],{"class":603},";\n",[454,628,630,632,634,637,640,643,645,647,649,652,654],{"class":456,"line":629},2,[454,631,600],{"class":599},[454,633,604],{"class":603},[454,635,636],{"class":607}," defineQueueStrategy",[454,638,639],{"class":603},",",[454,641,642],{"class":607}," QueuePlugin",[454,644,611],{"class":603},[454,646,614],{"class":599},[454,648,617],{"class":603},[454,650,651],{"class":464},"@vercube\u002Fqueue",[454,653,623],{"class":603},[454,655,626],{"class":603},[454,657,659,661,663,666,668,670,672,675,677],{"class":456,"line":658},3,[454,660,600],{"class":599},[454,662,604],{"class":603},[454,664,665],{"class":607}," BullMQStrategy",[454,667,611],{"class":603},[454,669,614],{"class":599},[454,671,617],{"class":603},[454,673,674],{"class":464},"@vercube\u002Fqueue\u002Fstrategies\u002FBullMQStrategy",[454,676,623],{"class":603},[454,678,626],{"class":603},[454,680,682],{"class":456,"line":681},4,[454,683,684],{"emptyLinePlaceholder":60},"\n",[454,686,688,691,694,697,700],{"class":456,"line":687},5,[454,689,690],{"class":599},"export",[454,692,693],{"class":599}," default",[454,695,608],{"class":696},"s2Zo4",[454,698,699],{"class":607},"(",[454,701,702],{"class":603},"{\n",[454,704,706,710,713],{"class":456,"line":705},6,[454,707,709],{"class":708},"swJcz","  plugins",[454,711,712],{"class":603},":",[454,714,715],{"class":607}," [\n",[454,717,719,722,724],{"class":456,"line":718},7,[454,720,721],{"class":607},"    [QueuePlugin",[454,723,639],{"class":603},[454,725,726],{"class":603}," {\n",[454,728,730,733,735],{"class":456,"line":729},8,[454,731,732],{"class":708},"      strategies",[454,734,712],{"class":603},[454,736,715],{"class":607},[454,738,740,743,745],{"class":456,"line":739},9,[454,741,742],{"class":696},"        defineQueueStrategy",[454,744,699],{"class":607},[454,746,702],{"class":603},[454,748,750,753,755,757],{"class":456,"line":749},10,[454,751,752],{"class":708},"          strategy",[454,754,712],{"class":603},[454,756,665],{"class":607},[454,758,759],{"class":603},",\n",[454,761,763,766,768,770,773,775,777,780,782,784,787,789,791,794,796,800,802],{"class":456,"line":762},11,[454,764,765],{"class":708},"          initOptions",[454,767,712],{"class":603},[454,769,604],{"class":603},[454,771,772],{"class":708}," connection",[454,774,712],{"class":603},[454,776,604],{"class":603},[454,778,779],{"class":708}," host",[454,781,712],{"class":603},[454,783,617],{"class":603},[454,785,786],{"class":464},"127.0.0.1",[454,788,623],{"class":603},[454,790,639],{"class":603},[454,792,793],{"class":708}," port",[454,795,712],{"class":603},[454,797,799],{"class":798},"sbssI"," 6379",[454,801,611],{"class":603},[454,803,804],{"class":603}," },\n",[454,806,808,811,814],{"class":456,"line":807},12,[454,809,810],{"class":603},"        }",[454,812,813],{"class":607},")",[454,815,759],{"class":603},[454,817,819,822],{"class":456,"line":818},13,[454,820,821],{"class":607},"      ]",[454,823,759],{"class":603},[454,825,827,830,833],{"class":456,"line":826},14,[454,828,829],{"class":603},"    }",[454,831,832],{"class":607},"]",[454,834,759],{"class":603},[454,836,838,841],{"class":456,"line":837},15,[454,839,840],{"class":607},"  ]",[454,842,759],{"class":603},[454,844,846,849,851],{"class":456,"line":845},16,[454,847,848],{"class":603},"}",[454,850,813],{"class":607},[454,852,626],{"class":603},[354,854,855,858,859,862],{},[388,856,857],{},"defineQueueStrategy()"," is what type checks ",[388,860,861],{},"initOptions"," against the strategy next to it. It does nothing at runtime, and a bare object literal works too, just unchecked.",[576,864,866],{"id":865},"write-a-consumer","Write a consumer",[354,868,869,872,873,876],{},[388,870,871],{},"@Consumer()"," says which queue the class reads from, ",[388,874,875],{},"@Job()"," marks the method that handles one kind of job.",[444,878,881],{"className":589,"code":879,"filename":880,"language":592,"meta":450,"style":450},"import { Inject } from '@vercube\u002Fdi';\nimport { Consumer, Job } from '@vercube\u002Fqueue';\nimport { MailerService } from '..\u002Fservices\u002FMailerService';\n\n@Consumer({ queue: 'emails', concurrency: 5 })\nexport class EmailConsumer {\n  @Inject(MailerService)\n  private gMailer!: MailerService;\n\n  @Job('welcome')\n  public async welcome(payload: { userId: string }): Promise\u003Cvoid> {\n    await this.gMailer.sendWelcome(payload.userId);\n  }\n}\n","src\u002Fconsumers\u002FEmailConsumer.ts",[388,882,883,905,931,953,957,997,1010,1021,1036,1040,1058,1104,1134,1139],{"__ignoreMap":450},[454,884,885,887,889,892,894,896,898,901,903],{"class":456,"line":457},[454,886,600],{"class":599},[454,888,604],{"class":603},[454,890,891],{"class":607}," Inject",[454,893,611],{"class":603},[454,895,614],{"class":599},[454,897,617],{"class":603},[454,899,900],{"class":464},"@vercube\u002Fdi",[454,902,623],{"class":603},[454,904,626],{"class":603},[454,906,907,909,911,914,916,919,921,923,925,927,929],{"class":456,"line":629},[454,908,600],{"class":599},[454,910,604],{"class":603},[454,912,913],{"class":607}," Consumer",[454,915,639],{"class":603},[454,917,918],{"class":607}," Job",[454,920,611],{"class":603},[454,922,614],{"class":599},[454,924,617],{"class":603},[454,926,651],{"class":464},[454,928,623],{"class":603},[454,930,626],{"class":603},[454,932,933,935,937,940,942,944,946,949,951],{"class":456,"line":658},[454,934,600],{"class":599},[454,936,604],{"class":603},[454,938,939],{"class":607}," MailerService",[454,941,611],{"class":603},[454,943,614],{"class":599},[454,945,617],{"class":603},[454,947,948],{"class":464},"..\u002Fservices\u002FMailerService",[454,950,623],{"class":603},[454,952,626],{"class":603},[454,954,955],{"class":456,"line":681},[454,956,684],{"emptyLinePlaceholder":60},[454,958,959,962,965,967,970,973,975,977,980,982,984,987,989,992,994],{"class":456,"line":687},[454,960,961],{"class":603},"@",[454,963,964],{"class":696},"Consumer",[454,966,699],{"class":607},[454,968,969],{"class":603},"{",[454,971,972],{"class":708}," queue",[454,974,712],{"class":603},[454,976,617],{"class":603},[454,978,979],{"class":464},"emails",[454,981,623],{"class":603},[454,983,639],{"class":603},[454,985,986],{"class":708}," concurrency",[454,988,712],{"class":603},[454,990,991],{"class":798}," 5",[454,993,611],{"class":603},[454,995,996],{"class":607},")\n",[454,998,999,1001,1005,1008],{"class":456,"line":705},[454,1000,690],{"class":599},[454,1002,1004],{"class":1003},"spNyl"," class",[454,1006,1007],{"class":460}," EmailConsumer",[454,1009,726],{"class":603},[454,1011,1012,1015,1018],{"class":456,"line":718},[454,1013,1014],{"class":603},"  @",[454,1016,1017],{"class":696},"Inject",[454,1019,1020],{"class":607},"(MailerService)\n",[454,1022,1023,1026,1029,1032,1034],{"class":456,"line":729},[454,1024,1025],{"class":1003},"  private",[454,1027,1028],{"class":708}," gMailer",[454,1030,1031],{"class":603},"!:",[454,1033,939],{"class":460},[454,1035,626],{"class":603},[454,1037,1038],{"class":456,"line":739},[454,1039,684],{"emptyLinePlaceholder":60},[454,1041,1042,1044,1047,1049,1051,1054,1056],{"class":456,"line":749},[454,1043,1014],{"class":603},[454,1045,1046],{"class":696},"Job",[454,1048,699],{"class":607},[454,1050,623],{"class":603},[454,1052,1053],{"class":464},"welcome",[454,1055,623],{"class":603},[454,1057,996],{"class":607},[454,1059,1060,1063,1066,1069,1071,1075,1077,1079,1082,1084,1087,1090,1093,1096,1099,1102],{"class":456,"line":762},[454,1061,1062],{"class":1003},"  public",[454,1064,1065],{"class":1003}," async",[454,1067,1068],{"class":708}," welcome",[454,1070,699],{"class":603},[454,1072,1074],{"class":1073},"sHdIc","payload",[454,1076,712],{"class":603},[454,1078,604],{"class":603},[454,1080,1081],{"class":708}," userId",[454,1083,712],{"class":603},[454,1085,1086],{"class":460}," string",[454,1088,1089],{"class":603}," }):",[454,1091,1092],{"class":460}," Promise",[454,1094,1095],{"class":603},"\u003C",[454,1097,1098],{"class":460},"void",[454,1100,1101],{"class":603},">",[454,1103,726],{"class":603},[454,1105,1106,1109,1112,1115,1118,1121,1123,1125,1127,1130,1132],{"class":456,"line":807},[454,1107,1108],{"class":599},"    await",[454,1110,1111],{"class":603}," this.",[454,1113,1114],{"class":607},"gMailer",[454,1116,1117],{"class":603},".",[454,1119,1120],{"class":696},"sendWelcome",[454,1122,699],{"class":708},[454,1124,1074],{"class":607},[454,1126,1117],{"class":603},[454,1128,1129],{"class":607},"userId",[454,1131,813],{"class":708},[454,1133,626],{"class":603},[454,1135,1136],{"class":456,"line":818},[454,1137,1138],{"class":603},"  }\n",[454,1140,1141],{"class":456,"line":826},[454,1142,1143],{"class":603},"}\n",[576,1145,1147],{"id":1146},"bind-the-consumer","Bind the consumer",[354,1149,1150],{},"Consumer classes are ordinary container services. Bind them where you bind your controllers, and their handlers register themselves.",[444,1152,1155],{"className":589,"code":1153,"filename":1154,"language":592,"meta":450,"style":450},"import { EmailConsumer } from '.\u002Fconsumers\u002FEmailConsumer';\nimport type { Container } from '@vercube\u002Fdi';\n\nexport function setupContainer(container: Container): void {\n  container.bind(EmailConsumer);\n}\n","src\u002Fcontainer.ts",[388,1156,1157,1178,1202,1206,1233,1252],{"__ignoreMap":450},[454,1158,1159,1161,1163,1165,1167,1169,1171,1174,1176],{"class":456,"line":457},[454,1160,600],{"class":599},[454,1162,604],{"class":603},[454,1164,1007],{"class":607},[454,1166,611],{"class":603},[454,1168,614],{"class":599},[454,1170,617],{"class":603},[454,1172,1173],{"class":464},".\u002Fconsumers\u002FEmailConsumer",[454,1175,623],{"class":603},[454,1177,626],{"class":603},[454,1179,1180,1182,1185,1187,1190,1192,1194,1196,1198,1200],{"class":456,"line":629},[454,1181,600],{"class":599},[454,1183,1184],{"class":599}," type",[454,1186,604],{"class":603},[454,1188,1189],{"class":607}," Container",[454,1191,611],{"class":603},[454,1193,614],{"class":599},[454,1195,617],{"class":603},[454,1197,900],{"class":464},[454,1199,623],{"class":603},[454,1201,626],{"class":603},[454,1203,1204],{"class":456,"line":658},[454,1205,684],{"emptyLinePlaceholder":60},[454,1207,1208,1210,1213,1216,1218,1221,1223,1225,1228,1231],{"class":456,"line":681},[454,1209,690],{"class":599},[454,1211,1212],{"class":1003}," function",[454,1214,1215],{"class":696}," setupContainer",[454,1217,699],{"class":603},[454,1219,1220],{"class":1073},"container",[454,1222,712],{"class":603},[454,1224,1189],{"class":460},[454,1226,1227],{"class":603},"):",[454,1229,1230],{"class":460}," void",[454,1232,726],{"class":603},[454,1234,1235,1238,1240,1243,1245,1248,1250],{"class":456,"line":687},[454,1236,1237],{"class":607},"  container",[454,1239,1117],{"class":603},[454,1241,1242],{"class":696},"bind",[454,1244,699],{"class":708},[454,1246,1247],{"class":607},"EmailConsumer",[454,1249,813],{"class":708},[454,1251,626],{"class":603},[454,1253,1254],{"class":456,"line":705},[454,1255,1143],{"class":603},[576,1257,1259],{"id":1258},"publish-a-job","Publish a job",[444,1261,1264],{"className":589,"code":1262,"filename":1263,"language":592,"meta":450,"style":450},"import { Controller, Post } from '@vercube\u002Fcore';\nimport { Inject } from '@vercube\u002Fdi';\nimport { QueueManager } from '@vercube\u002Fqueue';\n\n@Controller('\u002Fusers')\nexport class UsersController {\n  @Inject(QueueManager)\n  private gQueue!: QueueManager;\n\n  @Post('\u002F')\n  public async create(): Promise\u003C{ ok: true }> {\n    const user = await this.gUsers.create();\n\n    await this.gQueue.add({ queue: 'emails', job: 'welcome', payload: { userId: user.id } });\n\n    return { ok: true };\n  }\n}\n","src\u002Fcontrollers\u002FUsersController.ts",[388,1265,1266,1292,1312,1333,1337,1355,1366,1375,1388,1392,1410,1440,1469,1473,1542,1546,1563,1568],{"__ignoreMap":450},[454,1267,1268,1270,1272,1275,1277,1280,1282,1284,1286,1288,1290],{"class":456,"line":457},[454,1269,600],{"class":599},[454,1271,604],{"class":603},[454,1273,1274],{"class":607}," Controller",[454,1276,639],{"class":603},[454,1278,1279],{"class":607}," Post",[454,1281,611],{"class":603},[454,1283,614],{"class":599},[454,1285,617],{"class":603},[454,1287,620],{"class":464},[454,1289,623],{"class":603},[454,1291,626],{"class":603},[454,1293,1294,1296,1298,1300,1302,1304,1306,1308,1310],{"class":456,"line":629},[454,1295,600],{"class":599},[454,1297,604],{"class":603},[454,1299,891],{"class":607},[454,1301,611],{"class":603},[454,1303,614],{"class":599},[454,1305,617],{"class":603},[454,1307,900],{"class":464},[454,1309,623],{"class":603},[454,1311,626],{"class":603},[454,1313,1314,1316,1318,1321,1323,1325,1327,1329,1331],{"class":456,"line":658},[454,1315,600],{"class":599},[454,1317,604],{"class":603},[454,1319,1320],{"class":607}," QueueManager",[454,1322,611],{"class":603},[454,1324,614],{"class":599},[454,1326,617],{"class":603},[454,1328,651],{"class":464},[454,1330,623],{"class":603},[454,1332,626],{"class":603},[454,1334,1335],{"class":456,"line":681},[454,1336,684],{"emptyLinePlaceholder":60},[454,1338,1339,1341,1344,1346,1348,1351,1353],{"class":456,"line":687},[454,1340,961],{"class":603},[454,1342,1343],{"class":696},"Controller",[454,1345,699],{"class":607},[454,1347,623],{"class":603},[454,1349,1350],{"class":464},"\u002Fusers",[454,1352,623],{"class":603},[454,1354,996],{"class":607},[454,1356,1357,1359,1361,1364],{"class":456,"line":705},[454,1358,690],{"class":599},[454,1360,1004],{"class":1003},[454,1362,1363],{"class":460}," UsersController",[454,1365,726],{"class":603},[454,1367,1368,1370,1372],{"class":456,"line":718},[454,1369,1014],{"class":603},[454,1371,1017],{"class":696},[454,1373,1374],{"class":607},"(QueueManager)\n",[454,1376,1377,1379,1382,1384,1386],{"class":456,"line":729},[454,1378,1025],{"class":1003},[454,1380,1381],{"class":708}," gQueue",[454,1383,1031],{"class":603},[454,1385,1320],{"class":460},[454,1387,626],{"class":603},[454,1389,1390],{"class":456,"line":739},[454,1391,684],{"emptyLinePlaceholder":60},[454,1393,1394,1396,1399,1401,1403,1406,1408],{"class":456,"line":749},[454,1395,1014],{"class":603},[454,1397,1398],{"class":696},"Post",[454,1400,699],{"class":607},[454,1402,623],{"class":603},[454,1404,1405],{"class":464},"\u002F",[454,1407,623],{"class":603},[454,1409,996],{"class":607},[454,1411,1412,1414,1416,1419,1422,1424,1427,1430,1432,1435,1438],{"class":456,"line":762},[454,1413,1062],{"class":1003},[454,1415,1065],{"class":1003},[454,1417,1418],{"class":708}," create",[454,1420,1421],{"class":603},"():",[454,1423,1092],{"class":460},[454,1425,1426],{"class":603},"\u003C{",[454,1428,1429],{"class":708}," ok",[454,1431,712],{"class":603},[454,1433,1434],{"class":460}," true",[454,1436,1437],{"class":603}," }>",[454,1439,726],{"class":603},[454,1441,1442,1445,1448,1451,1454,1456,1459,1461,1464,1467],{"class":456,"line":807},[454,1443,1444],{"class":1003},"    const",[454,1446,1447],{"class":607}," user",[454,1449,1450],{"class":603}," =",[454,1452,1453],{"class":599}," await",[454,1455,1111],{"class":603},[454,1457,1458],{"class":607},"gUsers",[454,1460,1117],{"class":603},[454,1462,1463],{"class":696},"create",[454,1465,1466],{"class":708},"()",[454,1468,626],{"class":603},[454,1470,1471],{"class":456,"line":818},[454,1472,684],{"emptyLinePlaceholder":60},[454,1474,1475,1477,1479,1482,1484,1487,1489,1491,1493,1495,1497,1499,1501,1503,1506,1508,1510,1512,1514,1516,1519,1521,1523,1525,1527,1529,1531,1534,1536,1538,1540],{"class":456,"line":826},[454,1476,1108],{"class":599},[454,1478,1111],{"class":603},[454,1480,1481],{"class":607},"gQueue",[454,1483,1117],{"class":603},[454,1485,1486],{"class":696},"add",[454,1488,699],{"class":708},[454,1490,969],{"class":603},[454,1492,972],{"class":708},[454,1494,712],{"class":603},[454,1496,617],{"class":603},[454,1498,979],{"class":464},[454,1500,623],{"class":603},[454,1502,639],{"class":603},[454,1504,1505],{"class":708}," job",[454,1507,712],{"class":603},[454,1509,617],{"class":603},[454,1511,1053],{"class":464},[454,1513,623],{"class":603},[454,1515,639],{"class":603},[454,1517,1518],{"class":708}," payload",[454,1520,712],{"class":603},[454,1522,604],{"class":603},[454,1524,1081],{"class":708},[454,1526,712],{"class":603},[454,1528,1447],{"class":607},[454,1530,1117],{"class":603},[454,1532,1533],{"class":607},"id",[454,1535,611],{"class":603},[454,1537,611],{"class":603},[454,1539,813],{"class":708},[454,1541,626],{"class":603},[454,1543,1544],{"class":456,"line":837},[454,1545,684],{"emptyLinePlaceholder":60},[454,1547,1548,1551,1553,1555,1557,1560],{"class":456,"line":845},[454,1549,1550],{"class":599},"    return",[454,1552,604],{"class":603},[454,1554,1429],{"class":708},[454,1556,712],{"class":603},[454,1558,1434],{"class":1559},"sfNiH",[454,1561,1562],{"class":603}," };\n",[454,1564,1566],{"class":456,"line":1565},17,[454,1567,1138],{"class":603},[454,1569,1571],{"class":456,"line":1570},18,[454,1572,1143],{"class":603},[354,1574,1575],{},"That is the whole setup. The response goes out immediately, and the welcome mail is sent by a worker.",[437,1577,1579],{"id":1578},"how-a-job-travels","How a job travels",[1581,1582,1583,1590,1593,1596],"ol",{},[1584,1585,1586,1589],"li",{},[388,1587,1588],{},"add()"," hands the job to the mounted strategy, together with the headers the module needs to route and retry it.",[1584,1591,1592],{},"The transport delivers it back, possibly in another process, to the strategy consuming that queue.",[1584,1594,1595],{},"The manager finds the handler registered for the job name, validates the payload if the handler declares a schema, and runs the handler.",[1584,1597,1598],{},"Returning marks the job done. Throwing marks the attempt failed and applies the retry policy.",[354,1600,1601,1602,1604],{},"Everything in step 3 and 4 behaves identically on every transport, which is the point of the module: switching from ",[388,1603,390],{}," to BullMQ or Kafka changes where jobs live, not how your code reads.",[437,1606,1608],{"id":1607},"retries-delays-and-timeouts","Retries, delays and timeouts",[354,1610,1611],{},"Every transport declares what it can do natively, and the manager fills in the rest:",[444,1613,1615],{"className":589,"code":1614,"language":592,"meta":450,"style":450},"@Job('digest', {\n  attempts: 3,\n  backoff: { type: 'exponential', delay: 1000 },\n  timeout: 30_000,\n})\npublic async digest(payload: Digest): Promise\u003Cvoid> {}\n",[388,1616,1617,1636,1648,1680,1692,1698],{"__ignoreMap":450},[454,1618,1619,1621,1623,1625,1627,1630,1632,1634],{"class":456,"line":457},[454,1620,961],{"class":603},[454,1622,1046],{"class":696},[454,1624,699],{"class":607},[454,1626,623],{"class":603},[454,1628,1629],{"class":464},"digest",[454,1631,623],{"class":603},[454,1633,639],{"class":603},[454,1635,726],{"class":603},[454,1637,1638,1641,1643,1646],{"class":456,"line":629},[454,1639,1640],{"class":708},"  attempts",[454,1642,712],{"class":603},[454,1644,1645],{"class":798}," 3",[454,1647,759],{"class":603},[454,1649,1650,1653,1655,1657,1659,1661,1663,1666,1668,1670,1673,1675,1678],{"class":456,"line":658},[454,1651,1652],{"class":708},"  backoff",[454,1654,712],{"class":603},[454,1656,604],{"class":603},[454,1658,1184],{"class":708},[454,1660,712],{"class":603},[454,1662,617],{"class":603},[454,1664,1665],{"class":464},"exponential",[454,1667,623],{"class":603},[454,1669,639],{"class":603},[454,1671,1672],{"class":708}," delay",[454,1674,712],{"class":603},[454,1676,1677],{"class":798}," 1000",[454,1679,804],{"class":603},[454,1681,1682,1685,1687,1690],{"class":456,"line":681},[454,1683,1684],{"class":708},"  timeout",[454,1686,712],{"class":603},[454,1688,1689],{"class":798}," 30_000",[454,1691,759],{"class":603},[454,1693,1694,1696],{"class":456,"line":687},[454,1695,848],{"class":603},[454,1697,996],{"class":607},[454,1699,1700,1703,1705,1708,1711,1714],{"class":456,"line":705},[454,1701,1702],{"class":607},"public async ",[454,1704,1629],{"class":696},[454,1706,1707],{"class":607},"(payload: Digest): ",[454,1709,1710],{"class":460},"Promise",[454,1712,1713],{"class":603},"\u003Cvoid>",[454,1715,1716],{"class":603}," {}\n",[1718,1719,1720,1726,1729,1732],"ul",{},[1584,1721,1722,1723,1117],{},"On BullMQ, attempts and backoff belong to the broker, so pass them when adding the job: ",[388,1724,1725],{},"add({ ..., options: { attempts: 3, backoff: 1000 } })",[1584,1727,1728],{},"On RabbitMQ, Kafka and memory, the manager retries the job itself by publishing it again with a higher attempt counter, waiting for the backoff first.",[1584,1730,1731],{},"A job that runs out of attempts is reported as failed and handed back to the transport, which is where a RabbitMQ dead letter exchange picks it up.",[1584,1733,1734,1737],{},[388,1735,1736],{},"timeout"," is enforced by the manager on every transport. A timed out handler keeps running, it is only no longer waited for.",[1739,1740,1741],"note",{},[354,1742,1743],{},"A payload that fails validation is never retried. Retrying a message that can never be parsed only burns attempts, so it is failed immediately.",[437,1745,1747],{"id":1746},"type-safe-queues","Type-safe queues",[354,1749,1750,1751,1753],{},"Queue and job names are plain strings by default. Augment the registry and every ",[388,1752,1588],{}," is checked against it, while unregistered queues keep working as before.",[444,1755,1758],{"className":589,"code":1756,"filename":1757,"language":592,"meta":450,"style":450},"declare module '@vercube\u002Fqueue' {\n  namespace QueueTypes {\n    interface Registry {\n      emails: {\n        welcome: { userId: string };\n        digest: { userId: string; period: 'daily' | 'weekly' };\n      };\n    }\n  }\n}\n","src\u002Ftypes\u002Fqueues.d.ts",[388,1759,1760,1776,1786,1796,1805,1822,1864,1869,1874,1878],{"__ignoreMap":450},[454,1761,1762,1765,1768,1770,1772,1774],{"class":456,"line":457},[454,1763,1764],{"class":1003},"declare",[454,1766,1767],{"class":1003}," module",[454,1769,617],{"class":603},[454,1771,651],{"class":464},[454,1773,623],{"class":603},[454,1775,726],{"class":603},[454,1777,1778,1781,1784],{"class":456,"line":629},[454,1779,1780],{"class":1003},"  namespace",[454,1782,1783],{"class":460}," QueueTypes",[454,1785,726],{"class":603},[454,1787,1788,1791,1794],{"class":456,"line":658},[454,1789,1790],{"class":1003},"    interface",[454,1792,1793],{"class":460}," Registry",[454,1795,726],{"class":603},[454,1797,1798,1801,1803],{"class":456,"line":681},[454,1799,1800],{"class":708},"      emails",[454,1802,712],{"class":603},[454,1804,726],{"class":603},[454,1806,1807,1810,1812,1814,1816,1818,1820],{"class":456,"line":687},[454,1808,1809],{"class":708},"        welcome",[454,1811,712],{"class":603},[454,1813,604],{"class":603},[454,1815,1081],{"class":708},[454,1817,712],{"class":603},[454,1819,1086],{"class":460},[454,1821,1562],{"class":603},[454,1823,1824,1827,1829,1831,1833,1835,1837,1840,1843,1845,1847,1850,1852,1855,1857,1860,1862],{"class":456,"line":705},[454,1825,1826],{"class":708},"        digest",[454,1828,712],{"class":603},[454,1830,604],{"class":603},[454,1832,1081],{"class":708},[454,1834,712],{"class":603},[454,1836,1086],{"class":460},[454,1838,1839],{"class":603},";",[454,1841,1842],{"class":708}," period",[454,1844,712],{"class":603},[454,1846,617],{"class":603},[454,1848,1849],{"class":464},"daily",[454,1851,623],{"class":603},[454,1853,1854],{"class":603}," |",[454,1856,617],{"class":603},[454,1858,1859],{"class":464},"weekly",[454,1861,623],{"class":603},[454,1863,1562],{"class":603},[454,1865,1866],{"class":456,"line":718},[454,1867,1868],{"class":603},"      };\n",[454,1870,1871],{"class":456,"line":729},[454,1872,1873],{"class":603},"    }\n",[454,1875,1876],{"class":456,"line":739},[454,1877,1138],{"class":603},[454,1879,1880],{"class":456,"line":749},[454,1881,1143],{"class":603},[444,1883,1885],{"className":589,"code":1884,"language":592,"meta":450,"style":450},"\u002F\u002F checked: the job exists on the queue and the payload matches\nawait queue.add({ queue: 'emails', job: 'welcome', payload: { userId: '1' } });\n\n\u002F\u002F a compile error: 'wellcome' is not a job of 'emails'\nawait queue.add({ queue: 'emails', job: 'wellcome', payload: { userId: '1' } });\n",[388,1886,1887,1893,1957,1961,1966],{"__ignoreMap":450},[454,1888,1889],{"class":456,"line":457},[454,1890,1892],{"class":1891},"sHwdD","\u002F\u002F checked: the job exists on the queue and the payload matches\n",[454,1894,1895,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924,1926,1928,1930,1932,1934,1936,1938,1940,1942,1944,1947,1949,1951,1953,1955],{"class":456,"line":629},[454,1896,1897],{"class":599},"await",[454,1899,972],{"class":607},[454,1901,1117],{"class":603},[454,1903,1486],{"class":696},[454,1905,699],{"class":607},[454,1907,969],{"class":603},[454,1909,972],{"class":708},[454,1911,712],{"class":603},[454,1913,617],{"class":603},[454,1915,979],{"class":464},[454,1917,623],{"class":603},[454,1919,639],{"class":603},[454,1921,1505],{"class":708},[454,1923,712],{"class":603},[454,1925,617],{"class":603},[454,1927,1053],{"class":464},[454,1929,623],{"class":603},[454,1931,639],{"class":603},[454,1933,1518],{"class":708},[454,1935,712],{"class":603},[454,1937,604],{"class":603},[454,1939,1081],{"class":708},[454,1941,712],{"class":603},[454,1943,617],{"class":603},[454,1945,1946],{"class":464},"1",[454,1948,623],{"class":603},[454,1950,611],{"class":603},[454,1952,611],{"class":603},[454,1954,813],{"class":607},[454,1956,626],{"class":603},[454,1958,1959],{"class":456,"line":658},[454,1960,684],{"emptyLinePlaceholder":60},[454,1962,1963],{"class":456,"line":681},[454,1964,1965],{"class":1891},"\u002F\u002F a compile error: 'wellcome' is not a job of 'emails'\n",[454,1967,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2001,2003,2005,2007,2009,2011,2013,2015,2017,2019,2021,2023,2025,2027],{"class":456,"line":687},[454,1969,1897],{"class":599},[454,1971,972],{"class":607},[454,1973,1117],{"class":603},[454,1975,1486],{"class":696},[454,1977,699],{"class":607},[454,1979,969],{"class":603},[454,1981,972],{"class":708},[454,1983,712],{"class":603},[454,1985,617],{"class":603},[454,1987,979],{"class":464},[454,1989,623],{"class":603},[454,1991,639],{"class":603},[454,1993,1505],{"class":708},[454,1995,712],{"class":603},[454,1997,617],{"class":603},[454,1999,2000],{"class":464},"wellcome",[454,2002,623],{"class":603},[454,2004,639],{"class":603},[454,2006,1518],{"class":708},[454,2008,712],{"class":603},[454,2010,604],{"class":603},[454,2012,1081],{"class":708},[454,2014,712],{"class":603},[454,2016,617],{"class":603},[454,2018,1946],{"class":464},[454,2020,623],{"class":603},[454,2022,611],{"class":603},[454,2024,611],{"class":603},[454,2026,813],{"class":607},[454,2028,626],{"class":603},[437,2030,2032],{"id":2031},"tracing","Tracing",[354,2034,2035,2036,2038],{},"The module traces itself. ",[388,2037,1588],{}," opens a producer span and writes the active trace context into the job's headers; the consumer reads those headers back and opens its span as a child of it. A request that queues a job and a worker that runs it half a minute later, in another process, end up in one trace.",[354,2040,2041],{},"Nothing has to be passed around for this. Turn telemetry on and it works:",[444,2043,2045],{"className":589,"code":2044,"language":592,"meta":450,"style":450},"export default defineConfig({\n  telemetry: true,\n});\n",[388,2046,2047,2059,2070],{"__ignoreMap":450},[454,2048,2049,2051,2053,2055,2057],{"class":456,"line":457},[454,2050,690],{"class":599},[454,2052,693],{"class":599},[454,2054,608],{"class":696},[454,2056,699],{"class":607},[454,2058,702],{"class":603},[454,2060,2061,2064,2066,2068],{"class":456,"line":629},[454,2062,2063],{"class":708},"  telemetry",[454,2065,712],{"class":603},[454,2067,1434],{"class":1559},[454,2069,759],{"class":603},[454,2071,2072,2074,2076],{"class":456,"line":658},[454,2073,848],{"class":603},[454,2075,813],{"class":607},[454,2077,626],{"class":603},[354,2079,2080,2081,2084,2085,2088,2089,2092,2093,2092,2096,2092,2099,2102],{},"Every attempt reuses the headers of the original publish, so a retry stays in the trace that queued the job rather than starting one of its own. Two counters come with it: ",[388,2082,2083],{},"vercube.queue.published"," and ",[388,2086,2087],{},"vercube.queue.processed",", the latter split by outcome (",[388,2090,2091],{},"completed",", ",[388,2094,2095],{},"failed",[388,2097,2098],{},"retried",[388,2100,2101],{},"unhandled",").",[354,2104,2105,2106,2109],{},"See ",[2107,2108,93],"a",{"href":98}," for exporting any of it.",[437,2111,2113],{"id":2112},"producers-without-consumers","Producers without consumers",[354,2115,2116],{},"A web process usually publishes jobs while a separate worker process handles them. Turn the consumers off where they do not belong, and the same code keeps publishing.",[444,2118,2120],{"className":589,"code":2119,"language":592,"meta":450,"style":450},"app.addPlugin(QueuePlugin, {\n  autoStart: false,\n  strategies: [defineQueueStrategy({ strategy: BullMQStrategy, initOptions: { connection } })],\n});\n",[388,2121,2122,2139,2151,2196],{"__ignoreMap":450},[454,2123,2124,2127,2129,2132,2135,2137],{"class":456,"line":457},[454,2125,2126],{"class":607},"app",[454,2128,1117],{"class":603},[454,2130,2131],{"class":696},"addPlugin",[454,2133,2134],{"class":607},"(QueuePlugin",[454,2136,639],{"class":603},[454,2138,726],{"class":603},[454,2140,2141,2144,2146,2149],{"class":456,"line":629},[454,2142,2143],{"class":708},"  autoStart",[454,2145,712],{"class":603},[454,2147,2148],{"class":1559}," false",[454,2150,759],{"class":603},[454,2152,2153,2156,2158,2161,2164,2166,2168,2171,2173,2175,2177,2180,2182,2184,2187,2189,2191,2194],{"class":456,"line":658},[454,2154,2155],{"class":708},"  strategies",[454,2157,712],{"class":603},[454,2159,2160],{"class":607}," [",[454,2162,2163],{"class":696},"defineQueueStrategy",[454,2165,699],{"class":607},[454,2167,969],{"class":603},[454,2169,2170],{"class":708}," strategy",[454,2172,712],{"class":603},[454,2174,665],{"class":607},[454,2176,639],{"class":603},[454,2178,2179],{"class":708}," initOptions",[454,2181,712],{"class":603},[454,2183,604],{"class":603},[454,2185,2186],{"class":607}," connection ",[454,2188,848],{"class":603},[454,2190,611],{"class":603},[454,2192,2193],{"class":607},")]",[454,2195,759],{"class":603},[454,2197,2198,2200,2202],{"class":456,"line":681},[454,2199,848],{"class":603},[454,2201,813],{"class":607},[454,2203,626],{"class":603},[437,2205,2207],{"id":2206},"what-next","What next",[1718,2209,2210,2215,2220,2228],{},[1584,2211,2212,2214],{},[2107,2213,117],{"href":118}," covers the decorators, the job context, payload validation and how to consume a queue somebody else fills.",[1584,2216,2217,2219],{},[2107,2218,121],{"href":122}," covers every transport, its options and its limits.",[1584,2221,2222,2224,2225,2227],{},[2107,2223,101],{"href":125}," is the reference for ",[388,2226,585],{}," and the types around it.",[1584,2229,2230,2232],{},[2107,2231,82],{"href":87}," has a Queues panel showing the mounted transports, the counters and what a queue is holding.",[2234,2235,2236],"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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":450,"searchDepth":457,"depth":629,"links":2238},[2239,2240,2241,2242,2243,2244,2245,2246],{"id":439,"depth":629,"text":18},{"id":570,"depth":629,"text":571},{"id":1578,"depth":629,"text":1579},{"id":1607,"depth":629,"text":1608},{"id":1746,"depth":629,"text":1747},{"id":2031,"depth":629,"text":2032},{"id":2112,"depth":629,"text":2113},{"id":2206,"depth":629,"text":2207},"Background jobs for Vercube, with one job model over BullMQ, RabbitMQ, Kafka and memory","md",null,{},{"title":70,"description":2247},"MbJOEDWnqwLojc_xHKXp8MoJFmVuOQq4kabxLjuMVE4",[2254,2256],{"title":105,"path":106,"stem":107,"description":2255,"children":-1},"Producing spans and metrics from a library of your own",{"title":117,"path":118,"stem":119,"description":2257,"children":-1},"Decorators, job context, validation and lifecycle hooks",1791443501534]