[{"data":1,"prerenderedAt":2579},["ShallowReactive",2],{"navigation":3,"docs-path-index":340,"-docs-modules-scheduler-api":446,"-docs-modules-scheduler-api-surround":2574},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":64},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,30,65,293,318],{"title":11,"path":12,"stem":13,"children":14,"icon":29},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21,25],{"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",{"title":26,"path":27,"stem":28},"Project Generator","\u002Fdocs\u002Fgetting-started\u002Fproject-generator","docs\u002F1.getting-started\u002F4.project-generator","i-lucide-rocket",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":64},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[36,40,44,48,52,56,60],{"title":37,"path":38,"stem":39},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":41,"path":42,"stem":43},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":45,"path":46,"stem":47},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":49,"path":50,"stem":51},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":53,"path":54,"stem":55},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",{"title":57,"path":58,"stem":59},"Introspection","\u002Fdocs\u002Fcore-features\u002Fintrospection","docs\u002F2.core-features\u002F5.introspection",{"title":61,"path":62,"stem":63},"Health Checks","\u002Fdocs\u002Fcore-features\u002Fhealth","docs\u002F2.core-features\u002F6.health",false,{"title":66,"icon":67,"defaultOpen":68,"path":69,"stem":70,"children":71,"page":64},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[72,89,100,116,135,154,177,191,206,214,229,240,255,274,282],{"title":73,"icon":64,"defaultOpen":64,"path":74,"stem":75,"children":76,"page":64},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[77,81,85],{"title":78,"path":79,"stem":80},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":82,"path":83,"stem":84},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":86,"path":87,"stem":88},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":90,"icon":64,"defaultOpen":64,"path":91,"stem":92,"children":93,"page":64},"Devtools","\u002Fdocs\u002Fmodules\u002Fdevtools","docs\u002F3.modules\u002F10.devtools",[94,97],{"title":78,"path":95,"stem":96},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Foverview","docs\u002F3.modules\u002F10.devtools\u002F0.overview",{"title":37,"path":98,"stem":99},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002Fconfiguration","docs\u002F3.modules\u002F10.devtools\u002F1.configuration",{"title":101,"icon":64,"defaultOpen":64,"path":102,"stem":103,"children":104,"page":64},"Telemetry","\u002Fdocs\u002Fmodules\u002Ftelemetry","docs\u002F3.modules\u002F11.telemetry",[105,108,112],{"title":78,"path":106,"stem":107},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Foverview","docs\u002F3.modules\u002F11.telemetry\u002F0.overview",{"title":109,"path":110,"stem":111},"API","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Fapi","docs\u002F3.modules\u002F11.telemetry\u002F1.api",{"title":113,"path":114,"stem":115},"Instrumentation","\u002Fdocs\u002Fmodules\u002Ftelemetry\u002Finstrumentation","docs\u002F3.modules\u002F11.telemetry\u002F2.instrumentation",{"title":117,"icon":64,"defaultOpen":64,"path":118,"stem":119,"children":120,"page":64},"Queue","\u002Fdocs\u002Fmodules\u002Fqueue","docs\u002F3.modules\u002F12.queue",[121,124,128,132],{"title":78,"path":122,"stem":123},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Foverview","docs\u002F3.modules\u002F12.queue\u002F0.overview",{"title":125,"path":126,"stem":127},"Consumers","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fconsumers","docs\u002F3.modules\u002F12.queue\u002F1.consumers",{"title":129,"path":130,"stem":131},"Strategies","\u002Fdocs\u002Fmodules\u002Fqueue\u002Fstrategies","docs\u002F3.modules\u002F12.queue\u002F2.strategies",{"title":109,"path":133,"stem":134},"\u002Fdocs\u002Fmodules\u002Fqueue\u002Fapi","docs\u002F3.modules\u002F12.queue\u002F3.api",{"title":136,"icon":64,"defaultOpen":64,"path":137,"stem":138,"children":139,"page":64},"Scheduler","\u002Fdocs\u002Fmodules\u002Fscheduler","docs\u002F3.modules\u002F13.scheduler",[140,143,147,151],{"title":78,"path":141,"stem":142},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Foverview","docs\u002F3.modules\u002F13.scheduler\u002F0.overview",{"title":144,"path":145,"stem":146},"Jobs","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fjobs","docs\u002F3.modules\u002F13.scheduler\u002F1.jobs",{"title":148,"path":149,"stem":150},"Clustering","\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fclustering","docs\u002F3.modules\u002F13.scheduler\u002F2.clustering",{"title":109,"path":152,"stem":153},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fapi","docs\u002F3.modules\u002F13.scheduler\u002F3.api",{"title":155,"icon":64,"defaultOpen":64,"path":156,"stem":157,"children":158,"page":64},"Testing","\u002Fdocs\u002Fmodules\u002Ftesting","docs\u002F3.modules\u002F14.testing",[159,162,166,170,174],{"title":78,"path":160,"stem":161},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Foverview","docs\u002F3.modules\u002F14.testing\u002F0.overview",{"title":163,"path":164,"stem":165},"Requests","\u002Fdocs\u002Fmodules\u002Ftesting\u002Frequests","docs\u002F3.modules\u002F14.testing\u002F1.requests",{"title":167,"path":168,"stem":169},"Dependencies","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fdependencies","docs\u002F3.modules\u002F14.testing\u002F2.dependencies",{"title":171,"path":172,"stem":173},"Extensions","\u002Fdocs\u002Fmodules\u002Ftesting\u002Fextensions","docs\u002F3.modules\u002F14.testing\u002F3.extensions",{"title":109,"path":175,"stem":176},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Fapi","docs\u002F3.modules\u002F14.testing\u002F4.api",{"title":178,"icon":64,"defaultOpen":64,"path":179,"stem":180,"children":181,"page":64},"Client","\u002Fdocs\u002Fmodules\u002Fclient","docs\u002F3.modules\u002F15.client",[182,185,188],{"title":78,"path":183,"stem":184},"\u002Fdocs\u002Fmodules\u002Fclient\u002Foverview","docs\u002F3.modules\u002F15.client\u002F0.overview",{"title":163,"path":186,"stem":187},"\u002Fdocs\u002Fmodules\u002Fclient\u002Frequests","docs\u002F3.modules\u002F15.client\u002F1.requests",{"title":109,"path":189,"stem":190},"\u002Fdocs\u002Fmodules\u002Fclient\u002Fapi","docs\u002F3.modules\u002F15.client\u002F2.api",{"title":192,"icon":64,"defaultOpen":64,"path":193,"stem":194,"children":195,"page":64},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[196,199,203],{"title":78,"path":197,"stem":198},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":200,"path":201,"stem":202},"Drains & Adapters","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":109,"path":204,"stem":205},"\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":207,"icon":64,"defaultOpen":64,"path":208,"stem":209,"children":210,"page":64},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[211],{"title":78,"path":212,"stem":213},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":215,"icon":64,"defaultOpen":64,"path":216,"stem":217,"children":218,"page":64},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[219,222,226],{"title":78,"path":220,"stem":221},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":223,"path":224,"stem":225},"Drivers","\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":109,"path":227,"stem":228},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":230,"icon":64,"defaultOpen":64,"path":231,"stem":232,"children":233,"page":64},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[234,237],{"title":78,"path":235,"stem":236},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":109,"path":238,"stem":239},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":241,"icon":64,"defaultOpen":64,"path":242,"stem":243,"children":244,"page":64},"Schema","\u002Fdocs\u002Fmodules\u002Fschema","docs\u002F3.modules\u002F6.schema",[245,248,251],{"title":78,"path":246,"stem":247},"\u002Fdocs\u002Fmodules\u002Fschema\u002Foverview","docs\u002F3.modules\u002F6.schema\u002F0.overview",{"title":82,"path":249,"stem":250},"\u002Fdocs\u002Fmodules\u002Fschema\u002Fdecorators","docs\u002F3.modules\u002F6.schema\u002F1.decorators",{"title":252,"path":253,"stem":254},"Scalar","\u002Fdocs\u002Fmodules\u002Fschema\u002Fscalar","docs\u002F3.modules\u002F6.schema\u002F2.scalar",{"title":256,"icon":64,"defaultOpen":64,"path":257,"stem":258,"children":259,"page":64},"Nitro","\u002Fdocs\u002Fmodules\u002Fnitro","docs\u002F3.modules\u002F7.nitro",[260,263,266,270],{"title":78,"path":261,"stem":262},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Foverview","docs\u002F3.modules\u002F7.nitro\u002F0.overview",{"title":215,"path":264,"stem":265},"\u002Fdocs\u002Fmodules\u002Fnitro\u002Fstorage","docs\u002F3.modules\u002F7.nitro\u002F1.storage",{"title":267,"path":268,"stem":269},"File-Based Routes","\u002Fdocs\u002Fmodules\u002Fnitro\u002Ffile-based-routes","docs\u002F3.modules\u002F7.nitro\u002F2.file-based-routes",{"title":271,"path":272,"stem":273},"Middleware","\u002Fdocs\u002Fmodules\u002Fnitro\u002Fmiddleware","docs\u002F3.modules\u002F7.nitro\u002F3.middleware",{"title":275,"icon":64,"defaultOpen":64,"path":276,"stem":277,"children":278,"page":64},"Vite","\u002Fdocs\u002Fmodules\u002Fvite","docs\u002F3.modules\u002F8.vite",[279],{"title":78,"path":280,"stem":281},"\u002Fdocs\u002Fmodules\u002Fvite\u002Foverview","docs\u002F3.modules\u002F8.vite\u002F0.overview",{"title":283,"icon":64,"defaultOpen":64,"path":284,"stem":285,"children":286,"page":64},"Cache","\u002Fdocs\u002Fmodules\u002Fcache","docs\u002F3.modules\u002F9.cache",[287,290],{"title":78,"path":288,"stem":289},"\u002Fdocs\u002Fmodules\u002Fcache\u002Foverview","docs\u002F3.modules\u002F9.cache\u002F0.overview",{"title":109,"path":291,"stem":292},"\u002Fdocs\u002Fmodules\u002Fcache\u002Fapi","docs\u002F3.modules\u002F9.cache\u002F1.api",{"title":294,"icon":295,"path":296,"stem":297,"children":298,"page":64},"Deployment","i-lucide-cloud-upload","\u002Fdocs\u002Fdeployment","docs\u002F4.deployment",[299,302,306,310,314],{"title":78,"path":300,"stem":301},"\u002Fdocs\u002Fdeployment\u002Foverview","docs\u002F4.deployment\u002F0.overview",{"title":303,"path":304,"stem":305},"Vercel","\u002Fdocs\u002Fdeployment\u002Fvercel","docs\u002F4.deployment\u002F1.vercel",{"title":307,"path":308,"stem":309},"AWS Lambda","\u002Fdocs\u002Fdeployment\u002Faws-lambda","docs\u002F4.deployment\u002F2.aws-lambda",{"title":311,"path":312,"stem":313},"Azure Functions","\u002Fdocs\u002Fdeployment\u002Fazure-functions","docs\u002F4.deployment\u002F3.azure-functions",{"title":315,"path":316,"stem":317},"Node.js Server","\u002Fdocs\u002Fdeployment\u002Fnode-server","docs\u002F4.deployment\u002F4.node-server",{"title":319,"icon":320,"path":321,"stem":322,"children":323,"page":64},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[324,328,332,336],{"title":325,"path":326,"stem":327},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":329,"path":330,"stem":331},"Plugins","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",{"title":333,"path":334,"stem":335},"Custom CLI Command","\u002Fdocs\u002Fadvanced\u002Fcustom-cli-command","docs\u002F99.advanced\u002F3.custom-cli-command",{"title":337,"path":338,"stem":339},"Writing a Recipe","\u002Fdocs\u002Fadvanced\u002Fwriting-a-recipe","docs\u002F99.advanced\u002F4.writing-a-recipe",[341,343,345,346,347,348,349,351,352,353,354,355,356,357,358,360,362,363,364,365,367,368,369,371,372,373,374,376,377,378,379,380,382,383,384,385,386,388,389,390,391,392,393,395,396,397,398,400,401,402,403,405,406,408,409,410,411,413,414,415,417,418,419,420,422,423,424,425,426,428,429,431,432,433,435,436,437,438,439,440,442,443,444,445],{"path":342},"\u002Fdocs\u002F.navigation",{"path":344},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":27},{"path":350},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":38},{"path":42},{"path":46},{"path":50},{"path":54},{"path":58},{"path":62},{"path":359},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":361},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":79},{"path":83},{"path":87},{"path":366},"\u002Fdocs\u002Fmodules\u002Fdevtools\u002F.navigation",{"path":95},{"path":98},{"path":370},"\u002Fdocs\u002Fmodules\u002Ftelemetry\u002F.navigation",{"path":106},{"path":110},{"path":114},{"path":375},"\u002Fdocs\u002Fmodules\u002Fqueue\u002F.navigation",{"path":122},{"path":126},{"path":130},{"path":133},{"path":381},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002F.navigation",{"path":141},{"path":145},{"path":149},{"path":152},{"path":387},"\u002Fdocs\u002Fmodules\u002Ftesting\u002F.navigation",{"path":160},{"path":164},{"path":168},{"path":172},{"path":175},{"path":394},"\u002Fdocs\u002Fmodules\u002Fclient\u002F.navigation",{"path":183},{"path":186},{"path":189},{"path":399},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":197},{"path":201},{"path":204},{"path":404},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":212},{"path":407},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":220},{"path":224},{"path":227},{"path":412},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":235},{"path":238},{"path":416},"\u002Fdocs\u002Fmodules\u002Fschema\u002F.navigation",{"path":246},{"path":249},{"path":253},{"path":421},"\u002Fdocs\u002Fmodules\u002Fnitro\u002F.navigation",{"path":261},{"path":264},{"path":268},{"path":272},{"path":427},"\u002Fdocs\u002Fmodules\u002Fvite\u002F.navigation",{"path":280},{"path":430},"\u002Fdocs\u002Fmodules\u002Fcache\u002F.navigation",{"path":288},{"path":291},{"path":434},"\u002Fdocs\u002Fdeployment\u002F.navigation",{"path":300},{"path":304},{"path":308},{"path":312},{"path":316},{"path":441},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":326},{"path":330},{"path":334},{"path":338},{"id":447,"title":109,"body":448,"description":2568,"extension":2569,"links":2570,"meta":2571,"navigation":68,"path":152,"seo":2572,"stem":153,"__hash__":2573},"docs\u002Fdocs\u002F3.modules\u002F13.scheduler\u002F3.api.md",{"type":449,"value":450,"toc":2552},"minimark",[451,456,465,643,844,847,850,855,1004,1027,1031,1034,1080,1134,1161,1165,1179,1183,1189,1193,1274,1278,1281,1328,1332,1476,1483,1487,1497,1501,1523,2022,2025,2035,2239,2306,2317,2338,2465,2468,2471,2548],[452,453,455],"h2",{"id":454},"schedulerplugin","SchedulerPlugin",[457,458,459,460,464],"p",{},"Binds the ",[461,462,463],"code",{},"SchedulerManager",", mounts the store and arms the timers once the container is initialized.",[466,467,472],"pre",{"className":468,"code":469,"language":470,"meta":471,"style":471},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","app.addPlugin(SchedulerPlugin, {\n  store: defineSchedulerStore({\n    store: RedisStore,\n    initOptions: { url: process.env.REDIS_URL },\n  }),\n  defaults: { timezone: 'Europe\u002FWarsaw', lockTtl: '1m' },\n  handleSignals: true,\n});\n","ts","",[461,473,474,500,519,533,565,576,618,632],{"__ignoreMap":471},[475,476,479,483,487,491,494,497],"span",{"class":477,"line":478},"line",1,[475,480,482],{"class":481},"sTEyZ","app",[475,484,486],{"class":485},"sMK4o",".",[475,488,490],{"class":489},"s2Zo4","addPlugin",[475,492,493],{"class":481},"(SchedulerPlugin",[475,495,496],{"class":485},",",[475,498,499],{"class":485}," {\n",[475,501,503,507,510,513,516],{"class":477,"line":502},2,[475,504,506],{"class":505},"swJcz","  store",[475,508,509],{"class":485},":",[475,511,512],{"class":489}," defineSchedulerStore",[475,514,515],{"class":481},"(",[475,517,518],{"class":485},"{\n",[475,520,522,525,527,530],{"class":477,"line":521},3,[475,523,524],{"class":505},"    store",[475,526,509],{"class":485},[475,528,529],{"class":481}," RedisStore",[475,531,532],{"class":485},",\n",[475,534,536,539,541,544,547,549,552,554,557,559,562],{"class":477,"line":535},4,[475,537,538],{"class":505},"    initOptions",[475,540,509],{"class":485},[475,542,543],{"class":485}," {",[475,545,546],{"class":505}," url",[475,548,509],{"class":485},[475,550,551],{"class":481}," process",[475,553,486],{"class":485},[475,555,556],{"class":481},"env",[475,558,486],{"class":485},[475,560,561],{"class":481},"REDIS_URL ",[475,563,564],{"class":485},"},\n",[475,566,568,571,574],{"class":477,"line":567},5,[475,569,570],{"class":485},"  }",[475,572,573],{"class":481},")",[475,575,532],{"class":485},[475,577,579,582,584,586,589,591,594,598,601,603,606,608,610,613,615],{"class":477,"line":578},6,[475,580,581],{"class":505},"  defaults",[475,583,509],{"class":485},[475,585,543],{"class":485},[475,587,588],{"class":505}," timezone",[475,590,509],{"class":485},[475,592,593],{"class":485}," '",[475,595,597],{"class":596},"sfazB","Europe\u002FWarsaw",[475,599,600],{"class":485},"'",[475,602,496],{"class":485},[475,604,605],{"class":505}," lockTtl",[475,607,509],{"class":485},[475,609,593],{"class":485},[475,611,612],{"class":596},"1m",[475,614,600],{"class":485},[475,616,617],{"class":485}," },\n",[475,619,621,624,626,630],{"class":477,"line":620},7,[475,622,623],{"class":505},"  handleSignals",[475,625,509],{"class":485},[475,627,629],{"class":628},"sfNiH"," true",[475,631,532],{"class":485},[475,633,635,638,640],{"class":477,"line":634},8,[475,636,637],{"class":485},"}",[475,639,573],{"class":481},[475,641,642],{"class":485},";\n",[644,645,646,662],"table",{},[647,648,649],"thead",{},[650,651,652,656,659],"tr",{},[653,654,655],"th",{},"Option",[653,657,658],{},"Default",[653,660,661],{},"Description",[663,664,665,687,705,728,742,757,772,794,816,831],"tbody",{},[650,666,667,673,676],{},[668,669,670],"td",{},[461,671,672],{},"store",[668,674,675],{},"none",[668,677,678,679,682,683,686],{},"Store holding the claims of cluster jobs. Wrap it in ",[461,680,681],{},"defineSchedulerStore()"," to have its ",[461,684,685],{},"initOptions"," checked.",[650,688,689,694,699],{},[668,690,691],{},[461,692,693],{},"defaults",[668,695,696],{},[461,697,698],{},"{}",[668,700,701,702,486],{},"Job options applied to every job that does not set them, plus ",[461,703,704],{},"timezone",[650,706,707,712,717],{},[668,708,709],{},[461,710,711],{},"autoStart",[668,713,714],{},[461,715,716],{},"true",[668,718,719,720,723,724,727],{},"Arm the timers once the container is initialized. ",[461,721,722],{},"app.listen()"," waits for that start, so a scheduler that cannot start (a cluster job without a store) fails the boot before the port is bound. A mounted store that cannot connect is logged and does not stop the boot. ",[461,725,726],{},"false"," registers jobs without running them, for web-only pods.",[650,729,730,735,739],{},[668,731,732],{},[461,733,734],{},"allowLocalCluster",[668,736,737],{},[461,738,726],{},[668,740,741],{},"Allow cluster jobs on a store that is not distributed in production.",[650,743,744,749,754],{},[668,745,746],{},[461,747,748],{},"instanceId",[668,750,751],{},[461,752,753],{},"HOSTNAME-pid-random",[668,755,756],{},"Id of this replica.",[650,758,759,764,769],{},[668,760,761],{},[461,762,763],{},"shutdownTimeout",[668,765,766],{},[461,767,768],{},"'25s'",[668,770,771],{},"How long a signal-triggered stop waits for runs in flight before aborting them.",[650,773,774,779,783],{},[668,775,776],{},[461,777,778],{},"handleSignals",[668,780,781],{},[461,782,726],{},[668,784,785,786,789,790,793],{},"Stop on ",[461,787,788],{},"SIGTERM"," and ",[461,791,792],{},"SIGINT",", or on the signals listed.",[650,795,796,801,803],{},[668,797,798],{},[461,799,800],{},"http",[668,802,675],{},[668,804,805,808,809,812,813,486],{},[461,806,807],{},"{ path?: string; secret: string }"," mounts the HTTP trigger. ",[461,810,811],{},"path"," defaults to ",[461,814,815],{},"\u002F_scheduler",[650,817,818,823,828],{},[668,819,820],{},[461,821,822],{},"maxEvents",[668,824,825],{},[461,826,827],{},"50",[668,829,830],{},"How many run events are kept for inspection.",[650,832,833,838,841],{},[668,834,835],{},[461,836,837],{},"clock",[668,839,840],{},"system clock",[668,842,843],{},"Source of time and timers, for tests.",[457,845,846],{},"Registering the plugin twice is harmless: the manager is bound once, settings are merged, and a mounted store is kept.",[452,848,463],{"id":849},"schedulermanager",[851,852,854],"h3",{"id":853},"add-and-remove","add() and remove()",[466,856,858],{"className":468,"code":857,"language":470,"meta":471,"style":471},"scheduler.add({\n  name: 'tenant.42.sync',\n  schedule: { every: '15m' },\n  handler: (ctx) => sync(42, ctx.signal),\n  scope: 'cluster',\n});\n\nscheduler.remove('tenant.42.sync');\n",[461,859,860,874,890,913,954,970,978,983],{"__ignoreMap":471},[475,861,862,865,867,870,872],{"class":477,"line":478},[475,863,864],{"class":481},"scheduler",[475,866,486],{"class":485},[475,868,869],{"class":489},"add",[475,871,515],{"class":481},[475,873,518],{"class":485},[475,875,876,879,881,883,886,888],{"class":477,"line":502},[475,877,878],{"class":505},"  name",[475,880,509],{"class":485},[475,882,593],{"class":485},[475,884,885],{"class":596},"tenant.42.sync",[475,887,600],{"class":485},[475,889,532],{"class":485},[475,891,892,895,897,899,902,904,906,909,911],{"class":477,"line":521},[475,893,894],{"class":505},"  schedule",[475,896,509],{"class":485},[475,898,543],{"class":485},[475,900,901],{"class":505}," every",[475,903,509],{"class":485},[475,905,593],{"class":485},[475,907,908],{"class":596},"15m",[475,910,600],{"class":485},[475,912,617],{"class":485},[475,914,915,918,920,923,927,929,933,936,938,942,944,947,949,952],{"class":477,"line":535},[475,916,917],{"class":489},"  handler",[475,919,509],{"class":485},[475,921,922],{"class":485}," (",[475,924,926],{"class":925},"sHdIc","ctx",[475,928,573],{"class":485},[475,930,932],{"class":931},"spNyl"," =>",[475,934,935],{"class":489}," sync",[475,937,515],{"class":481},[475,939,941],{"class":940},"sbssI","42",[475,943,496],{"class":485},[475,945,946],{"class":481}," ctx",[475,948,486],{"class":485},[475,950,951],{"class":481},"signal)",[475,953,532],{"class":485},[475,955,956,959,961,963,966,968],{"class":477,"line":567},[475,957,958],{"class":505},"  scope",[475,960,509],{"class":485},[475,962,593],{"class":485},[475,964,965],{"class":596},"cluster",[475,967,600],{"class":485},[475,969,532],{"class":485},[475,971,972,974,976],{"class":477,"line":578},[475,973,637],{"class":485},[475,975,573],{"class":481},[475,977,642],{"class":485},[475,979,980],{"class":477,"line":620},[475,981,982],{"emptyLinePlaceholder":68},"\n",[475,984,985,987,989,992,994,996,998,1000,1002],{"class":477,"line":634},[475,986,864],{"class":481},[475,988,486],{"class":485},[475,990,991],{"class":489},"remove",[475,993,515],{"class":481},[475,995,600],{"class":485},[475,997,885],{"class":596},[475,999,600],{"class":485},[475,1001,573],{"class":481},[475,1003,642],{"class":485},[457,1005,1006,1009,1010,1013,1014,1017,1018,1023,1024,486],{},[461,1007,1008],{},"schedule"," is ",[461,1011,1012],{},"{ cron: string; timezone?: string }"," or ",[461,1015,1016],{},"{ every: Duration; offset?: Duration }",". Every other field is a ",[1019,1020,1022],"a",{"href":1021},"\u002Fdocs\u002Fmodules\u002Fscheduler\u002Fjobs#options","job option",". An invalid schedule, a taken name or a bad option throws a ",[461,1025,1026],{},"SchedulerError",[851,1028,1030],{"id":1029},"trigger","trigger()",[457,1032,1033],{},"Runs a job now, through the same pipeline as its timer.",[466,1035,1037],{"className":468,"code":1036,"language":470,"meta":471,"style":471},"const result = await scheduler.trigger('billing.close-day');\n\u002F\u002F { name, occurrenceId, scheduledAt, outcome, attempts, durationMs, error? }\n",[461,1038,1039,1074],{"__ignoreMap":471},[475,1040,1041,1044,1047,1050,1054,1057,1059,1061,1063,1065,1068,1070,1072],{"class":477,"line":478},[475,1042,1043],{"class":931},"const",[475,1045,1046],{"class":481}," result ",[475,1048,1049],{"class":485},"=",[475,1051,1053],{"class":1052},"s7zQu"," await",[475,1055,1056],{"class":481}," scheduler",[475,1058,486],{"class":485},[475,1060,1029],{"class":489},[475,1062,515],{"class":481},[475,1064,600],{"class":485},[475,1066,1067],{"class":596},"billing.close-day",[475,1069,600],{"class":485},[475,1071,573],{"class":481},[475,1073,642],{"class":485},[475,1075,1076],{"class":477,"line":502},[475,1077,1079],{"class":1078},"sHwdD","\u002F\u002F { name, occurrenceId, scheduledAt, outcome, attempts, durationMs, error? }\n",[644,1081,1082,1090],{},[647,1083,1084],{},[650,1085,1086,1088],{},[653,1087,655],{},[653,1089,661],{},[663,1091,1092,1106,1124],{},[650,1093,1094,1099],{},[668,1095,1096],{},[461,1097,1098],{},"scheduledAt",[668,1100,1101,1102,1105],{},"Occurrence to claim. Without it, the run gets an occurrence of its own, ",[461,1103,1104],{},"name@manual:\u003Cepoch ms>",", which never collides with a timer.",[650,1107,1108,1113],{},[668,1109,1110],{},[461,1111,1112],{},"source",[668,1114,1115,1116,1119,1120,1123],{},"Reported as ",[461,1117,1118],{},"ctx.trigger",", ",[461,1121,1122],{},"manual"," by default.",[650,1125,1126,1131],{},[668,1127,1128],{},[461,1129,1130],{},"force",[668,1132,1133],{},"Skip the occurrence claim. Overlap still applies.",[457,1135,1136,1139,1140,1119,1143,1119,1146,1119,1149,1119,1152,1119,1155,1013,1158,486],{},[461,1137,1138],{},"outcome"," is one of ",[461,1141,1142],{},"completed",[461,1144,1145],{},"failed",[461,1147,1148],{},"aborted",[461,1150,1151],{},"enqueued",[461,1153,1154],{},"skipped-claimed",[461,1156,1157],{},"skipped-overlap",[461,1159,1160],{},"skipped-paused",[851,1162,1164],{"id":1163},"start-stop-and-close","start(), stop() and close()",[457,1166,1167,1170,1171,1174,1175,1178],{},[461,1168,1169],{},"start()"," arms the timers and runs the startup catch-up. ",[461,1172,1173],{},"stop({ timeout })"," disarms them, waits for runs in flight, aborts what is left at the timeout and releases overlap locks. ",[461,1176,1177],{},"close()"," stops and closes the store. All three are safe to call more than once.",[851,1180,1182],{"id":1181},"pause-and-resume","pause() and resume()",[457,1184,1185,1186,1188],{},"Stop and restart the timer of one job on this replica. Other replicas keep running it. A paused job is skipped by ",[461,1187,1030],{}," too.",[851,1190,1192],{"id":1191},"list-nextruns-and-currentoccurrence","list(), nextRuns() and currentOccurrence()",[466,1194,1196],{"className":468,"code":1195,"language":470,"meta":471,"style":471},"\u002F\u002F every job: schedule, scope, target, next run, last run on this replica\nscheduler.list();\n\u002F\u002F the next three occurrences\nscheduler.nextRuns('billing.close-day', 3);\n\u002F\u002F the latest occurrence at or before now\nscheduler.currentOccurrence('billing.close-day');\n",[461,1197,1198,1203,1217,1222,1248,1253],{"__ignoreMap":471},[475,1199,1200],{"class":477,"line":478},[475,1201,1202],{"class":1078},"\u002F\u002F every job: schedule, scope, target, next run, last run on this replica\n",[475,1204,1205,1207,1209,1212,1215],{"class":477,"line":502},[475,1206,864],{"class":481},[475,1208,486],{"class":485},[475,1210,1211],{"class":489},"list",[475,1213,1214],{"class":481},"()",[475,1216,642],{"class":485},[475,1218,1219],{"class":477,"line":521},[475,1220,1221],{"class":1078},"\u002F\u002F the next three occurrences\n",[475,1223,1224,1226,1228,1231,1233,1235,1237,1239,1241,1244,1246],{"class":477,"line":535},[475,1225,864],{"class":481},[475,1227,486],{"class":485},[475,1229,1230],{"class":489},"nextRuns",[475,1232,515],{"class":481},[475,1234,600],{"class":485},[475,1236,1067],{"class":596},[475,1238,600],{"class":485},[475,1240,496],{"class":485},[475,1242,1243],{"class":940}," 3",[475,1245,573],{"class":481},[475,1247,642],{"class":485},[475,1249,1250],{"class":477,"line":567},[475,1251,1252],{"class":1078},"\u002F\u002F the latest occurrence at or before now\n",[475,1254,1255,1257,1259,1262,1264,1266,1268,1270,1272],{"class":477,"line":578},[475,1256,864],{"class":481},[475,1258,486],{"class":485},[475,1260,1261],{"class":489},"currentOccurrence",[475,1263,515],{"class":481},[475,1265,600],{"class":485},[475,1267,1067],{"class":596},[475,1269,600],{"class":485},[475,1271,573],{"class":481},[475,1273,642],{"class":485},[851,1275,1277],{"id":1276},"getstates","getStates()",[457,1279,1280],{},"Reads what the store remembers of the last run of each job, which covers runs done by other replicas.",[466,1282,1284],{"className":468,"code":1283,"language":470,"meta":471,"style":471},"const states = await scheduler.getStates(['billing.close-day']);\n\u002F\u002F { 'billing.close-day': { lastScheduledAt, lastStartedAt, lastFinishedAt,\n\u002F\u002F lastOutcome, lastInstance, lastError } }\n",[461,1285,1286,1318,1323],{"__ignoreMap":471},[475,1287,1288,1290,1293,1295,1297,1299,1301,1304,1307,1309,1311,1313,1316],{"class":477,"line":478},[475,1289,1043],{"class":931},[475,1291,1292],{"class":481}," states ",[475,1294,1049],{"class":485},[475,1296,1053],{"class":1052},[475,1298,1056],{"class":481},[475,1300,486],{"class":485},[475,1302,1303],{"class":489},"getStates",[475,1305,1306],{"class":481},"([",[475,1308,600],{"class":485},[475,1310,1067],{"class":596},[475,1312,600],{"class":485},[475,1314,1315],{"class":481},"])",[475,1317,642],{"class":485},[475,1319,1320],{"class":477,"line":502},[475,1321,1322],{"class":1078},"\u002F\u002F { 'billing.close-day': { lastScheduledAt, lastStartedAt, lastFinishedAt,\n",[475,1324,1325],{"class":477,"line":521},[475,1326,1327],{"class":1078},"\u002F\u002F lastOutcome, lastInstance, lastError } }\n",[851,1329,1331],{"id":1330},"subscribe","subscribe()",[466,1333,1335],{"className":468,"code":1334,"language":470,"meta":471,"style":471},"const unsubscribe = scheduler.subscribe((event) => {\n  if (event.outcome === 'failed') {\n    alerts.notify(\n      `${event.name} failed on ${event.instanceId}: ${event.error?.message}`,\n    );\n  }\n});\n",[461,1336,1337,1365,1392,1405,1456,1463,1468],{"__ignoreMap":471},[475,1338,1339,1341,1344,1346,1348,1350,1352,1354,1356,1359,1361,1363],{"class":477,"line":478},[475,1340,1043],{"class":931},[475,1342,1343],{"class":481}," unsubscribe ",[475,1345,1049],{"class":485},[475,1347,1056],{"class":481},[475,1349,486],{"class":485},[475,1351,1330],{"class":489},[475,1353,515],{"class":481},[475,1355,515],{"class":485},[475,1357,1358],{"class":925},"event",[475,1360,573],{"class":485},[475,1362,932],{"class":931},[475,1364,499],{"class":485},[475,1366,1367,1370,1372,1374,1376,1378,1381,1383,1385,1387,1390],{"class":477,"line":502},[475,1368,1369],{"class":1052},"  if",[475,1371,922],{"class":505},[475,1373,1358],{"class":481},[475,1375,486],{"class":485},[475,1377,1138],{"class":481},[475,1379,1380],{"class":485}," ===",[475,1382,593],{"class":485},[475,1384,1145],{"class":596},[475,1386,600],{"class":485},[475,1388,1389],{"class":505},") ",[475,1391,518],{"class":485},[475,1393,1394,1397,1399,1402],{"class":477,"line":521},[475,1395,1396],{"class":481},"    alerts",[475,1398,486],{"class":485},[475,1400,1401],{"class":489},"notify",[475,1403,1404],{"class":505},"(\n",[475,1406,1407,1410,1412,1414,1417,1419,1422,1425,1427,1429,1431,1433,1436,1438,1440,1442,1445,1448,1451,1454],{"class":477,"line":535},[475,1408,1409],{"class":485},"      `${",[475,1411,1358],{"class":481},[475,1413,486],{"class":485},[475,1415,1416],{"class":481},"name",[475,1418,637],{"class":485},[475,1420,1421],{"class":596}," failed on ",[475,1423,1424],{"class":485},"${",[475,1426,1358],{"class":481},[475,1428,486],{"class":485},[475,1430,748],{"class":481},[475,1432,637],{"class":485},[475,1434,1435],{"class":596},": ",[475,1437,1424],{"class":485},[475,1439,1358],{"class":481},[475,1441,486],{"class":485},[475,1443,1444],{"class":481},"error",[475,1446,1447],{"class":485},"?.",[475,1449,1450],{"class":481},"message",[475,1452,1453],{"class":485},"}`",[475,1455,532],{"class":485},[475,1457,1458,1461],{"class":477,"line":567},[475,1459,1460],{"class":505},"    )",[475,1462,642],{"class":485},[475,1464,1465],{"class":477,"line":578},[475,1466,1467],{"class":485},"  }\n",[475,1469,1470,1472,1474],{"class":477,"line":620},[475,1471,637],{"class":485},[475,1473,573],{"class":481},[475,1475,642],{"class":485},[457,1477,1478,1479,1482],{},"Every occurrence this replica handles produces one event, skips and ",[461,1480,1481],{},"missed"," included.",[851,1484,1486],{"id":1485},"inspect-and-drain","inspect() and drain()",[457,1488,1489,1492,1493,1496],{},[461,1490,1491],{},"inspect()"," returns the started flag, the replica id, the store's status, every job and the recent events. Devtools reads it. ",[461,1494,1495],{},"drain()"," waits for every run in flight, including the ones timers started in the background.",[452,1498,1500],{"id":1499},"writing-your-own-store","Writing your own store",[457,1502,1503,1504,1507,1508,1119,1511,789,1514,1517,1518,789,1520,1522],{},"Extend ",[461,1505,1506],{},"SchedulerStore"," and implement six methods. ",[461,1509,1510],{},"claim",[461,1512,1513],{},"extend",[461,1515,1516],{},"release"," must be atomic, and ",[461,1519,1513],{},[461,1521,1516],{}," must only act while the owner still holds the key.",[466,1524,1526],{"className":468,"code":1525,"language":470,"meta":471,"style":471},"import { SchedulerStore } from '@vercube\u002Fscheduler';\nimport type { SchedulerTypes } from '@vercube\u002Fscheduler';\n\nexport class EtcdStore extends SchedulerStore\u003C{ endpoints: string[] }> {\n  public readonly name = 'etcd';\n\n  public override get capabilities(): SchedulerTypes.StoreCapabilities {\n    return { distributed: true };\n  }\n\n  public async initialize(options: { endpoints: string[] }): Promise\u003Cvoid> {}\n  public async claim(key: string, owner: string, ttlMs: number): Promise\u003Cboolean> {}\n  public async extend(\n    key: string,\n    owner: string,\n    ttlMs: number,\n  ): Promise\u003Cboolean> {}\n  public async release(key: string, owner: string): Promise\u003Cboolean> {}\n  public async getState(job: string): Promise\u003CSchedulerTypes.JobState | null> {}\n  public async setState(\n    job: string,\n    state: SchedulerTypes.JobState,\n  ): Promise\u003Cvoid> {}\n  public async close(): Promise\u003Cvoid> {}\n}\n",[461,1527,1528,1553,1577,1581,1617,1640,1644,1669,1686,1691,1696,1742,1794,1806,1818,1830,1842,1858,1896,1939,1951,1963,1979,1994,2016],{"__ignoreMap":471},[475,1529,1530,1533,1535,1538,1541,1544,1546,1549,1551],{"class":477,"line":478},[475,1531,1532],{"class":1052},"import",[475,1534,543],{"class":485},[475,1536,1537],{"class":481}," SchedulerStore",[475,1539,1540],{"class":485}," }",[475,1542,1543],{"class":1052}," from",[475,1545,593],{"class":485},[475,1547,1548],{"class":596},"@vercube\u002Fscheduler",[475,1550,600],{"class":485},[475,1552,642],{"class":485},[475,1554,1555,1557,1560,1562,1565,1567,1569,1571,1573,1575],{"class":477,"line":502},[475,1556,1532],{"class":1052},[475,1558,1559],{"class":1052}," type",[475,1561,543],{"class":485},[475,1563,1564],{"class":481}," SchedulerTypes",[475,1566,1540],{"class":485},[475,1568,1543],{"class":1052},[475,1570,593],{"class":485},[475,1572,1548],{"class":596},[475,1574,600],{"class":485},[475,1576,642],{"class":485},[475,1578,1579],{"class":477,"line":521},[475,1580,982],{"emptyLinePlaceholder":68},[475,1582,1583,1586,1589,1593,1596,1598,1601,1604,1606,1609,1612,1615],{"class":477,"line":535},[475,1584,1585],{"class":1052},"export",[475,1587,1588],{"class":931}," class",[475,1590,1592],{"class":1591},"sBMFI"," EtcdStore",[475,1594,1595],{"class":931}," extends",[475,1597,1537],{"class":1591},[475,1599,1600],{"class":485},"\u003C{",[475,1602,1603],{"class":505}," endpoints",[475,1605,509],{"class":485},[475,1607,1608],{"class":1591}," string",[475,1610,1611],{"class":481},"[] ",[475,1613,1614],{"class":485},"}>",[475,1616,499],{"class":485},[475,1618,1619,1622,1625,1628,1631,1633,1636,1638],{"class":477,"line":567},[475,1620,1621],{"class":931},"  public",[475,1623,1624],{"class":931}," readonly",[475,1626,1627],{"class":505}," name",[475,1629,1630],{"class":485}," =",[475,1632,593],{"class":485},[475,1634,1635],{"class":596},"etcd",[475,1637,600],{"class":485},[475,1639,642],{"class":485},[475,1641,1642],{"class":477,"line":578},[475,1643,982],{"emptyLinePlaceholder":68},[475,1645,1646,1648,1651,1654,1657,1660,1662,1664,1667],{"class":477,"line":620},[475,1647,1621],{"class":931},[475,1649,1650],{"class":931}," override",[475,1652,1653],{"class":931}," get",[475,1655,1656],{"class":505}," capabilities",[475,1658,1659],{"class":485},"():",[475,1661,1564],{"class":1591},[475,1663,486],{"class":485},[475,1665,1666],{"class":1591},"StoreCapabilities",[475,1668,499],{"class":485},[475,1670,1671,1674,1676,1679,1681,1683],{"class":477,"line":634},[475,1672,1673],{"class":1052},"    return",[475,1675,543],{"class":485},[475,1677,1678],{"class":505}," distributed",[475,1680,509],{"class":485},[475,1682,629],{"class":628},[475,1684,1685],{"class":485}," };\n",[475,1687,1689],{"class":477,"line":1688},9,[475,1690,1467],{"class":485},[475,1692,1694],{"class":477,"line":1693},10,[475,1695,982],{"emptyLinePlaceholder":68},[475,1697,1699,1701,1704,1707,1709,1712,1714,1716,1718,1720,1722,1724,1727,1730,1733,1736,1739],{"class":477,"line":1698},11,[475,1700,1621],{"class":931},[475,1702,1703],{"class":931}," async",[475,1705,1706],{"class":505}," initialize",[475,1708,515],{"class":485},[475,1710,1711],{"class":925},"options",[475,1713,509],{"class":485},[475,1715,543],{"class":485},[475,1717,1603],{"class":505},[475,1719,509],{"class":485},[475,1721,1608],{"class":1591},[475,1723,1611],{"class":481},[475,1725,1726],{"class":485},"}):",[475,1728,1729],{"class":1591}," Promise",[475,1731,1732],{"class":485},"\u003C",[475,1734,1735],{"class":1591},"void",[475,1737,1738],{"class":485},">",[475,1740,1741],{"class":485}," {}\n",[475,1743,1745,1747,1749,1752,1754,1757,1759,1761,1763,1766,1768,1770,1772,1775,1777,1780,1783,1785,1787,1790,1792],{"class":477,"line":1744},12,[475,1746,1621],{"class":931},[475,1748,1703],{"class":931},[475,1750,1751],{"class":505}," claim",[475,1753,515],{"class":485},[475,1755,1756],{"class":925},"key",[475,1758,509],{"class":485},[475,1760,1608],{"class":1591},[475,1762,496],{"class":485},[475,1764,1765],{"class":925}," owner",[475,1767,509],{"class":485},[475,1769,1608],{"class":1591},[475,1771,496],{"class":485},[475,1773,1774],{"class":925}," ttlMs",[475,1776,509],{"class":485},[475,1778,1779],{"class":1591}," number",[475,1781,1782],{"class":485},"):",[475,1784,1729],{"class":1591},[475,1786,1732],{"class":485},[475,1788,1789],{"class":1591},"boolean",[475,1791,1738],{"class":485},[475,1793,1741],{"class":485},[475,1795,1797,1799,1801,1804],{"class":477,"line":1796},13,[475,1798,1621],{"class":931},[475,1800,1703],{"class":931},[475,1802,1803],{"class":505}," extend",[475,1805,1404],{"class":485},[475,1807,1809,1812,1814,1816],{"class":477,"line":1808},14,[475,1810,1811],{"class":925},"    key",[475,1813,509],{"class":485},[475,1815,1608],{"class":1591},[475,1817,532],{"class":485},[475,1819,1821,1824,1826,1828],{"class":477,"line":1820},15,[475,1822,1823],{"class":925},"    owner",[475,1825,509],{"class":485},[475,1827,1608],{"class":1591},[475,1829,532],{"class":485},[475,1831,1833,1836,1838,1840],{"class":477,"line":1832},16,[475,1834,1835],{"class":925},"    ttlMs",[475,1837,509],{"class":485},[475,1839,1779],{"class":1591},[475,1841,532],{"class":485},[475,1843,1845,1848,1850,1852,1854,1856],{"class":477,"line":1844},17,[475,1846,1847],{"class":485},"  ):",[475,1849,1729],{"class":1591},[475,1851,1732],{"class":485},[475,1853,1789],{"class":1591},[475,1855,1738],{"class":485},[475,1857,1741],{"class":485},[475,1859,1861,1863,1865,1868,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1890,1892,1894],{"class":477,"line":1860},18,[475,1862,1621],{"class":931},[475,1864,1703],{"class":931},[475,1866,1867],{"class":505}," release",[475,1869,515],{"class":485},[475,1871,1756],{"class":925},[475,1873,509],{"class":485},[475,1875,1608],{"class":1591},[475,1877,496],{"class":485},[475,1879,1765],{"class":925},[475,1881,509],{"class":485},[475,1883,1608],{"class":1591},[475,1885,1782],{"class":485},[475,1887,1729],{"class":1591},[475,1889,1732],{"class":485},[475,1891,1789],{"class":1591},[475,1893,1738],{"class":485},[475,1895,1741],{"class":485},[475,1897,1899,1901,1903,1906,1908,1911,1913,1915,1917,1919,1921,1924,1926,1929,1932,1935,1937],{"class":477,"line":1898},19,[475,1900,1621],{"class":931},[475,1902,1703],{"class":931},[475,1904,1905],{"class":505}," getState",[475,1907,515],{"class":485},[475,1909,1910],{"class":925},"job",[475,1912,509],{"class":485},[475,1914,1608],{"class":1591},[475,1916,1782],{"class":485},[475,1918,1729],{"class":1591},[475,1920,1732],{"class":485},[475,1922,1923],{"class":1591},"SchedulerTypes",[475,1925,486],{"class":485},[475,1927,1928],{"class":1591},"JobState",[475,1930,1931],{"class":485}," |",[475,1933,1934],{"class":1591}," null",[475,1936,1738],{"class":485},[475,1938,1741],{"class":485},[475,1940,1942,1944,1946,1949],{"class":477,"line":1941},20,[475,1943,1621],{"class":931},[475,1945,1703],{"class":931},[475,1947,1948],{"class":505}," setState",[475,1950,1404],{"class":485},[475,1952,1954,1957,1959,1961],{"class":477,"line":1953},21,[475,1955,1956],{"class":925},"    job",[475,1958,509],{"class":485},[475,1960,1608],{"class":1591},[475,1962,532],{"class":485},[475,1964,1966,1969,1971,1973,1975,1977],{"class":477,"line":1965},22,[475,1967,1968],{"class":925},"    state",[475,1970,509],{"class":485},[475,1972,1564],{"class":1591},[475,1974,486],{"class":485},[475,1976,1928],{"class":1591},[475,1978,532],{"class":485},[475,1980,1982,1984,1986,1988,1990,1992],{"class":477,"line":1981},23,[475,1983,1847],{"class":485},[475,1985,1729],{"class":1591},[475,1987,1732],{"class":485},[475,1989,1735],{"class":1591},[475,1991,1738],{"class":485},[475,1993,1741],{"class":485},[475,1995,1997,1999,2001,2004,2006,2008,2010,2012,2014],{"class":477,"line":1996},24,[475,1998,1621],{"class":931},[475,2000,1703],{"class":931},[475,2002,2003],{"class":505}," close",[475,2005,1659],{"class":485},[475,2007,1729],{"class":1591},[475,2009,1732],{"class":485},[475,2011,1735],{"class":1591},[475,2013,1738],{"class":485},[475,2015,1741],{"class":485},[475,2017,2019],{"class":477,"line":2018},25,[475,2020,2021],{"class":485},"}\n",[452,2023,155],{"id":2024},"testing",[457,2026,2027,2030,2031,2034],{},[461,2028,2029],{},"ManualClock"," from ",[461,2032,2033],{},"@vercube\u002Fscheduler\u002Ftesting"," replaces real time. Advancing it fires due timers in order and waits for the runs they start, so a test never sleeps.",[466,2036,2038],{"className":468,"code":2037,"language":470,"meta":471,"style":471},"import { SchedulerPlugin } from '@vercube\u002Fscheduler';\nimport { MemoryStore } from '@vercube\u002Fscheduler\u002Fstores\u002FMemoryStore';\nimport { ManualClock } from '@vercube\u002Fscheduler\u002Ftesting';\n\nconst clock = new ManualClock('2026-01-01T02:59:00Z');\n\napp.addPlugin(SchedulerPlugin, { clock, store: { store: MemoryStore } });\n\nawait clock.advance('1m');\nexpect(invoices.closedDays).toEqual(['2026-01-01']);\n",[461,2039,2040,2061,2083,2104,2108,2135,2139,2180,2184,2208],{"__ignoreMap":471},[475,2041,2042,2044,2046,2049,2051,2053,2055,2057,2059],{"class":477,"line":478},[475,2043,1532],{"class":1052},[475,2045,543],{"class":485},[475,2047,2048],{"class":481}," SchedulerPlugin",[475,2050,1540],{"class":485},[475,2052,1543],{"class":1052},[475,2054,593],{"class":485},[475,2056,1548],{"class":596},[475,2058,600],{"class":485},[475,2060,642],{"class":485},[475,2062,2063,2065,2067,2070,2072,2074,2076,2079,2081],{"class":477,"line":502},[475,2064,1532],{"class":1052},[475,2066,543],{"class":485},[475,2068,2069],{"class":481}," MemoryStore",[475,2071,1540],{"class":485},[475,2073,1543],{"class":1052},[475,2075,593],{"class":485},[475,2077,2078],{"class":596},"@vercube\u002Fscheduler\u002Fstores\u002FMemoryStore",[475,2080,600],{"class":485},[475,2082,642],{"class":485},[475,2084,2085,2087,2089,2092,2094,2096,2098,2100,2102],{"class":477,"line":521},[475,2086,1532],{"class":1052},[475,2088,543],{"class":485},[475,2090,2091],{"class":481}," ManualClock",[475,2093,1540],{"class":485},[475,2095,1543],{"class":1052},[475,2097,593],{"class":485},[475,2099,2033],{"class":596},[475,2101,600],{"class":485},[475,2103,642],{"class":485},[475,2105,2106],{"class":477,"line":535},[475,2107,982],{"emptyLinePlaceholder":68},[475,2109,2110,2112,2115,2117,2120,2122,2124,2126,2129,2131,2133],{"class":477,"line":567},[475,2111,1043],{"class":931},[475,2113,2114],{"class":481}," clock ",[475,2116,1049],{"class":485},[475,2118,2119],{"class":485}," new",[475,2121,2091],{"class":489},[475,2123,515],{"class":481},[475,2125,600],{"class":485},[475,2127,2128],{"class":596},"2026-01-01T02:59:00Z",[475,2130,600],{"class":485},[475,2132,573],{"class":481},[475,2134,642],{"class":485},[475,2136,2137],{"class":477,"line":578},[475,2138,982],{"emptyLinePlaceholder":68},[475,2140,2141,2143,2145,2147,2149,2151,2153,2156,2158,2161,2163,2165,2167,2169,2172,2174,2176,2178],{"class":477,"line":620},[475,2142,482],{"class":481},[475,2144,486],{"class":485},[475,2146,490],{"class":489},[475,2148,493],{"class":481},[475,2150,496],{"class":485},[475,2152,543],{"class":485},[475,2154,2155],{"class":481}," clock",[475,2157,496],{"class":485},[475,2159,2160],{"class":505}," store",[475,2162,509],{"class":485},[475,2164,543],{"class":485},[475,2166,2160],{"class":505},[475,2168,509],{"class":485},[475,2170,2171],{"class":481}," MemoryStore ",[475,2173,637],{"class":485},[475,2175,1540],{"class":485},[475,2177,573],{"class":481},[475,2179,642],{"class":485},[475,2181,2182],{"class":477,"line":634},[475,2183,982],{"emptyLinePlaceholder":68},[475,2185,2186,2189,2191,2193,2196,2198,2200,2202,2204,2206],{"class":477,"line":1688},[475,2187,2188],{"class":1052},"await",[475,2190,2155],{"class":481},[475,2192,486],{"class":485},[475,2194,2195],{"class":489},"advance",[475,2197,515],{"class":481},[475,2199,600],{"class":485},[475,2201,612],{"class":596},[475,2203,600],{"class":485},[475,2205,573],{"class":481},[475,2207,642],{"class":485},[475,2209,2210,2213,2216,2218,2221,2223,2226,2228,2230,2233,2235,2237],{"class":477,"line":1693},[475,2211,2212],{"class":489},"expect",[475,2214,2215],{"class":481},"(invoices",[475,2217,486],{"class":485},[475,2219,2220],{"class":481},"closedDays)",[475,2222,486],{"class":485},[475,2224,2225],{"class":489},"toEqual",[475,2227,1306],{"class":481},[475,2229,600],{"class":485},[475,2231,2232],{"class":596},"2026-01-01",[475,2234,600],{"class":485},[475,2236,1315],{"class":481},[475,2238,642],{"class":485},[644,2240,2241,2250],{},[647,2242,2243],{},[650,2244,2245,2248],{},[653,2246,2247],{},"Method",[653,2249,661],{},[663,2251,2252,2262,2276,2286,2296],{},[650,2253,2254,2259],{},[668,2255,2256],{},[461,2257,2258],{},"advance(duration)",[668,2260,2261],{},"Moves time forward, firing due timers and waiting for their runs.",[650,2263,2264,2269],{},[668,2265,2266],{},[461,2267,2268],{},"set(date)",[668,2270,2271,2272,2275],{},"Jumps without firing anything, like a laptop waking up. The next ",[461,2273,2274],{},"advance()"," fires overdue timers late.",[650,2277,2278,2283],{},[668,2279,2280],{},[461,2281,2282],{},"sleep(duration)",[668,2284,2285],{},"Waits on the manual clock, for handlers simulating long work.",[650,2287,2288,2293],{},[668,2289,2290],{},[461,2291,2292],{},"pending()",[668,2294,2295],{},"When the pending timers are due.",[650,2297,2298,2303],{},[668,2299,2300],{},[461,2301,2302],{},"skewed(offset)",[668,2304,2305],{},"A view of the clock that is ahead or behind, sharing its timers, to simulate a replica with a skewed clock.",[457,2307,2308,2309,2312,2313,2316],{},"To simulate several replicas, give several managers the same ",[461,2310,2311],{},"MemoryStore"," instance: ",[461,2314,2315],{},"mount({ store: sharedStore })"," accepts an instance as well as a class.",[457,2318,2319,2320,1119,2323,2326,2327,2329,2330,2333,2334,486],{},"With ",[461,2321,2322],{},"@vercube\u002Ftesting",[461,2324,2325],{},"withManualClock()"," wires a clock and a ",[461,2328,2311],{}," into ",[461,2331,2332],{},"createTestApp()",". See ",[1019,2335,2337],{"href":2336},"\u002Fdocs\u002Fmodules\u002Ftesting\u002Fextensions#scheduler","Testing extensions",[466,2339,2341],{"className":468,"code":2340,"language":470,"meta":471,"style":471},"import { withManualClock } from '@vercube\u002Fscheduler\u002Ftesting';\n\nconst time = withManualClock('2026-01-01T02:59:00Z');\nconst app = await createTestApp({ providers: [BillingJobs], extensions: [time] });\n\nawait time.clock.advance('1m');\n",[461,2342,2343,2364,2368,2391,2434,2438],{"__ignoreMap":471},[475,2344,2345,2347,2349,2352,2354,2356,2358,2360,2362],{"class":477,"line":478},[475,2346,1532],{"class":1052},[475,2348,543],{"class":485},[475,2350,2351],{"class":481}," withManualClock",[475,2353,1540],{"class":485},[475,2355,1543],{"class":1052},[475,2357,593],{"class":485},[475,2359,2033],{"class":596},[475,2361,600],{"class":485},[475,2363,642],{"class":485},[475,2365,2366],{"class":477,"line":502},[475,2367,982],{"emptyLinePlaceholder":68},[475,2369,2370,2372,2375,2377,2379,2381,2383,2385,2387,2389],{"class":477,"line":521},[475,2371,1043],{"class":931},[475,2373,2374],{"class":481}," time ",[475,2376,1049],{"class":485},[475,2378,2351],{"class":489},[475,2380,515],{"class":481},[475,2382,600],{"class":485},[475,2384,2128],{"class":596},[475,2386,600],{"class":485},[475,2388,573],{"class":481},[475,2390,642],{"class":485},[475,2392,2393,2395,2398,2400,2402,2405,2407,2410,2413,2415,2418,2420,2423,2425,2428,2430,2432],{"class":477,"line":535},[475,2394,1043],{"class":931},[475,2396,2397],{"class":481}," app ",[475,2399,1049],{"class":485},[475,2401,1053],{"class":1052},[475,2403,2404],{"class":489}," createTestApp",[475,2406,515],{"class":481},[475,2408,2409],{"class":485},"{",[475,2411,2412],{"class":505}," providers",[475,2414,509],{"class":485},[475,2416,2417],{"class":481}," [BillingJobs]",[475,2419,496],{"class":485},[475,2421,2422],{"class":505}," extensions",[475,2424,509],{"class":485},[475,2426,2427],{"class":481}," [time] ",[475,2429,637],{"class":485},[475,2431,573],{"class":481},[475,2433,642],{"class":485},[475,2435,2436],{"class":477,"line":567},[475,2437,982],{"emptyLinePlaceholder":68},[475,2439,2440,2442,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463],{"class":477,"line":578},[475,2441,2188],{"class":1052},[475,2443,2444],{"class":481}," time",[475,2446,486],{"class":485},[475,2448,837],{"class":481},[475,2450,486],{"class":485},[475,2452,2195],{"class":489},[475,2454,515],{"class":481},[475,2456,600],{"class":485},[475,2458,612],{"class":596},[475,2460,600],{"class":485},[475,2462,573],{"class":481},[475,2464,642],{"class":485},[452,2466,1026],{"id":2467},"schedulererror",[457,2469,2470],{},"Every error the module throws.",[644,2472,2473,2482],{},[647,2474,2475],{},[650,2476,2477,2480],{},[653,2478,2479],{},"Field",[653,2481,661],{},[663,2483,2484,2518,2528,2538],{},[650,2485,2486,2491],{},[668,2487,2488],{},[461,2489,2490],{},"operation",[668,2492,2493,2494,1119,2497,1119,2500,1119,2503,1119,2505,2508,2509,1119,2512,1119,2515,486],{},"What failed: ",[461,2495,2496],{},"register",[461,2498,2499],{},"configure",[461,2501,2502],{},"start",[461,2504,1510],{},[461,2506,2507],{},"enqueue",", or the reason a run was aborted: ",[461,2510,2511],{},"timeout",[461,2513,2514],{},"lock-lost",[461,2516,2517],{},"shutdown",[650,2519,2520,2525],{},[668,2521,2522],{},[461,2523,2524],{},"cause",[668,2526,2527],{},"The underlying error, when there is one.",[650,2529,2530,2535],{},[668,2531,2532],{},[461,2533,2534],{},"metadata",[668,2536,2537],{},"Non-sensitive context, such as the job names involved.",[650,2539,2540,2545],{},[668,2541,2542],{},[461,2543,2544],{},"retryable",[668,2546,2547],{},"Whether trying again could succeed.",[2549,2550,2551],"style",{},"html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":471,"searchDepth":478,"depth":502,"links":2553},[2554,2555,2565,2566,2567],{"id":454,"depth":502,"text":455},{"id":849,"depth":502,"text":463,"children":2556},[2557,2558,2559,2560,2561,2562,2563,2564],{"id":853,"depth":521,"text":854},{"id":1029,"depth":521,"text":1030},{"id":1163,"depth":521,"text":1164},{"id":1181,"depth":521,"text":1182},{"id":1191,"depth":521,"text":1192},{"id":1276,"depth":521,"text":1277},{"id":1330,"depth":521,"text":1331},{"id":1485,"depth":521,"text":1486},{"id":1499,"depth":502,"text":1500},{"id":2024,"depth":502,"text":155},{"id":2467,"depth":502,"text":1026},"Reference for SchedulerPlugin, SchedulerManager, the stores, the CLI, testing helpers and errors","md",null,{},{"title":109,"description":2568},"shV9qT5CIS_GBLOZzFUemu75BnoTbVdLfvUG8qpOjUo",[2575,2577],{"title":148,"path":149,"stem":150,"description":2576,"children":-1},"How the scheduler runs each occurrence once across replicas, the stores, Kubernetes, graceful shutdown, external triggers and queue targets",{"title":78,"path":160,"stem":161,"description":2578,"children":-1},"Test a Vercube app the way you write it, with real controllers, real DI and any dependency swapped for a fake",1794396686591]