@igniter-js/jobs 0.1.1 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/AGENTS.md +1118 -96
  2. package/CHANGELOG.md +8 -0
  3. package/README.md +2146 -93
  4. package/dist/{adapter-PiDCQWQd.d.mts → adapter-CXZxomI9.d.mts} +2 -2
  5. package/dist/{adapter-PiDCQWQd.d.ts → adapter-CXZxomI9.d.ts} +2 -2
  6. package/dist/adapters/bullmq.adapter.d.mts +2 -2
  7. package/dist/adapters/bullmq.adapter.d.ts +2 -2
  8. package/dist/adapters/bullmq.adapter.js +2 -2
  9. package/dist/adapters/bullmq.adapter.js.map +1 -1
  10. package/dist/adapters/bullmq.adapter.mjs +1 -1
  11. package/dist/adapters/bullmq.adapter.mjs.map +1 -1
  12. package/dist/adapters/index.d.mts +140 -2
  13. package/dist/adapters/index.d.ts +140 -2
  14. package/dist/adapters/index.js +864 -31
  15. package/dist/adapters/index.js.map +1 -1
  16. package/dist/adapters/index.mjs +863 -31
  17. package/dist/adapters/index.mjs.map +1 -1
  18. package/dist/adapters/memory.adapter.d.mts +2 -2
  19. package/dist/adapters/memory.adapter.d.ts +2 -2
  20. package/dist/adapters/memory.adapter.js +122 -30
  21. package/dist/adapters/memory.adapter.js.map +1 -1
  22. package/dist/adapters/memory.adapter.mjs +121 -29
  23. package/dist/adapters/memory.adapter.mjs.map +1 -1
  24. package/dist/index.d.mts +452 -342
  25. package/dist/index.d.ts +452 -342
  26. package/dist/index.js +1923 -1002
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1921 -1001
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/shim.d.mts +36 -0
  31. package/dist/shim.d.ts +36 -0
  32. package/dist/shim.js +75 -0
  33. package/dist/shim.js.map +1 -0
  34. package/dist/shim.mjs +67 -0
  35. package/dist/shim.mjs.map +1 -0
  36. package/dist/telemetry/index.d.mts +281 -0
  37. package/dist/telemetry/index.d.ts +281 -0
  38. package/dist/telemetry/index.js +97 -0
  39. package/dist/telemetry/index.js.map +1 -0
  40. package/dist/telemetry/index.mjs +95 -0
  41. package/dist/telemetry/index.mjs.map +1 -0
  42. package/package.json +44 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/prefix.ts","../../src/errors/igniter-jobs.error.ts","../../src/adapters/bullmq.adapter.ts","../../src/utils/id-generator.ts","../../src/adapters/memory.adapter.ts"],"names":["IgniterError","options","createBullMQAdapter"],"mappings":";;;;;;;;AAGO,IAAM,kBAAA,GAAN,MAAM,kBAAA,CAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAY7B,OAAc,eAAe,KAAA,EAAuB;AAClD,IAAA,OAAO,CAAA,EAAG,kBAAA,CAAkB,WAAW,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAc,mBAAmB,MAAA,EAItB;AACT,IAAA,MAAM,IAAA,GAAO,GAAG,kBAAA,CAAkB,WAAW,WAAW,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAA;AAC5F,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,IAAA;AAC1B,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,CAAA;AAAA,EAC9D;AACF,CAAA;AA/Ba,kBAAA,CACY,WAAA,GAAc,cAAA;AADhC,IAAM,iBAAA,GAAN,kBAAA;AC6DA,IAAM,gBAAA,GAAN,cAA+BA,iBAAA,CAAa;AAAA,EACjD,YAAY,OAAA,EAAkC;AAC5C,IAAA,KAAA,CAAM,OAAO,CAAA;AAAA,EACf;AACF,CAAA;;;AC9BA,SAAS,YAAY,MAAA,EAAmD;AACtE,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,YAAa,OAAO,CAAA,GAAI,IAAI,IAAA,CAAK,CAAC,CAAE,CAAA;AAChE;AAQO,IAAM,wBAAA,GAAN,MAAM,yBAAA,CAAuD;AAAA,EAiB1D,YAAY,OAAA,EAA0C;AAX9D,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAyC;AAE5E,IAAA,IAAA,CAAQ,WAAA,GAAkD,IAAA;AAC1D,IAAA,IAAA,CAAQ,YAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,aAAA,GAAgB,IAAA;AAExB,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAA8D;AACjG,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAA0D;AAK5F,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,KAAA;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAElC,IAAA,IAAA,CAAK,UAAA,CAAW,EAAA,CAAG,SAAA,EAAW,CAAC,SAAiB,OAAA,KAAoB;AAClE,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACxC,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,CAAA,EAAG;AAC5B,MAAA,IAAI,OAAA,GAAe,OAAA;AACnB,MAAA,IAAI;AACF,QAAA,OAAA,GAAU,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC9B,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,IAAA,EAAM,YAAY,IAAA,CAAK,UAAA,EAAW;AAAA,MAClC,GAAA,EAAK,OAAO,IAAA,KAAS,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,MAC3C,YAAA,EAAc,OAAO,IAAA,KAAS,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,MACzD,OAAA,EAAS,OAAO,IAAA,EAAM,MAAA,KAAW;AAC/B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACtC,QAAA,OAAO,KAAK,IAAA,EAAK,CAAE,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAa,CAAA;AAAA,MACvD,CAAA;AAAA,MACA,KAAA,EAAO,OAAO,IAAA,KAAS,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC3C,MAAA,EAAQ,OAAO,IAAA,KAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,MAC7C,QAAA,EAAU,OAAO,IAAA,KAAS;AACxB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACtC,QAAA,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,MACzC,CAAA;AAAA,MACA,KAAA,EAAO,OAAO,IAAA,KAAS,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC3C,OAAO,OAAO,IAAA,EAAMC,aAAY,IAAA,CAAK,UAAA,CAAW,MAAMA,QAAO,CAAA;AAAA,MAC7D,YAAY,OAAO,IAAA,EAAMA,aAAY,IAAA,CAAK,eAAA,CAAgB,MAAMA,QAAO;AAAA,KACzE;AAAA,EACF;AAAA,EAEA,OAAc,OAAO,OAAA,EAA8D;AACjF,IAAA,OAAO,IAAI,0BAAyB,OAAO,CAAA;AAAA,EAC7C;AAAA,EAEO,WAAA,CAAY,SAAA,EAAmB,OAAA,EAAiB,UAAA,EAAuD;AAC5G,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,SAAS,CAAA,wBAAS,GAAA,EAAI;AACvD,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA,EAAG;AACpB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,CAAA,KAAA,EAAQ,OAAO,CAAA,kCAAA,EAAqC,SAAS,CAAA,EAAA;AAAA,OACvE,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,SAAS,UAAU,CAAA;AAC3B,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,EACvB;AAAA,EAEO,YAAA,CAAa,SAAA,EAAmB,QAAA,EAAkB,UAAA,EAAmD;AAC1G,IAAA,MAAM,MAAM,IAAA,CAAK,YAAA,CAAa,IAAI,SAAS,CAAA,wBAAS,GAAA,EAAI;AACxD,IAAA,IAAI,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,CAAA,MAAA,EAAS,QAAQ,CAAA,kCAAA,EAAqC,SAAS,CAAA,EAAA;AAAA,OACzE,CAAA;AAAA,IACH;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,UAAU,UAAU,CAAA;AAC5B,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAA,EAAW,GAAG,CAAA;AACpC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,EACvB;AAAA,EAEA,MAAa,SAAS,MAAA,EAA2D;AAC/E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,EAAS;AACrC,IAAA,MAAM,SAAA,GAAa,QAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,mCAAA;AAAA,OAChC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,UAAU,OAAA,CAAQ;AAAA,MACvB,MAAM,MAAA,CAAO,OAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,SAAS,MAAA,CAAO;AAAA,KACjB,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,SAAS,MAAA,EAA2D;AAC/E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,QAAA,EAAS;AACrC,IAAA,MAAM,SAAA,GAAa,QAAA,CAAiB,MAAA,CAAO,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,sBAAA;AAAA,QACN,OAAA,EAAS,CAAA,OAAA,EAAU,MAAA,CAAO,KAAK,CAAA,mCAAA;AAAA,OAChC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,QAAA,GAAoC;AAAA,MACxC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,MACzB,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,QACE,MAAA,CAAO,IAAA,IACP,MAAA,CAAO,KAAA,IACP,OAAO,aAAA,IACP,MAAA,CAAO,YAAA,IACP,MAAA,CAAO,qBACP,MAAA,CAAO,aAAA,IACP,MAAA,CAAO,YAAA,IACP,OAAO,SAAA,GACL;AAAA,QACE,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,OAAO,MAAA,CAAO,aAAA;AAAA,QACd,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,mBAAmB,MAAA,CAAO,iBAAA;AAAA,QAC1B,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,SAAA,EAAW,WAAA,CAAY,MAAA,CAAO,SAAS;AAAA,OACzC,GACA;AAAA,KACN;AAEA,IAAA,OAAO,UAAU,QAAA,CAAS;AAAA,MACxB,MAAM,MAAA,CAAO,OAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,MAAA,CAAO,KAAA,EAAe,KAAA,EAAwD;AACzF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,IAAI,MAAS,CAAA;AAC/F,IAAA,OAAO,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,EAC/C;AAAA,EAEA,MAAa,WAAA,CAAY,KAAA,EAAe,KAAA,EAAkD;AACxF,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,IAAI,MAAS,CAAA;AACnG,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAa,UAAA,CAAW,KAAA,EAAe,KAAA,EAA8C;AACnF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,IAAI,MAAS,CAAA;AACjG,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAa,cAAA,CAAe,KAAA,EAAe,KAAA,EAAiC;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,WAAA,CAAY,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EAC3F;AAAA,EAEA,MAAa,QAAA,CAAS,KAAA,EAAe,KAAA,EAA+B;AAClE,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EACpF;AAAA,EAEA,MAAa,SAAA,CAAU,KAAA,EAAe,KAAA,EAA+B;AACnE,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EACrF;AAAA,EAEA,MAAa,UAAA,CAAW,KAAA,EAAe,KAAA,EAA+B;AACpE,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EACtF;AAAA,EAEA,MAAa,eAAA,CAAgB,KAAA,EAAe,MAAA,EAAgB,KAAA,EAA+B;AACzF,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EACnG;AAAA,EAEA,MAAa,aAAA,CAAc,MAAA,EAAkB,KAAA,EAA+B;AAC1E,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EACzF;AAAA,EAEA,MAAa,cAAA,CAAe,MAAA,EAAkB,KAAA,EAA+B;AAC3E,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,GAAA,CAAI,UAAA,CAAW,MAAA,EAAQ,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,GAAI,MAAS,CAAA;AAAA,EAC1F;AAAA,EAEA,MAAa,aAAa,KAAA,EAAqD;AAC7E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,OAAO,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AACrE,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAa,kBAAkB,KAAA,EAA6B;AAC1D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,OAAO,YAAA,CAAa,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAChF,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,UAAA,GAA8C;AACzD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,OAAO,IAAA,EAAK;AAC3C,IAAA,OAAO,KAAK,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAa,WAAW,KAAA,EAA8B;AACpD,IAAA,MAAM,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAa,YAAY,KAAA,EAA8B;AACrD,IAAA,MAAM,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,OAAO,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAa,WAAW,KAAA,EAAgC;AACtD,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAC,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAa,UAAA,CAAW,KAAA,EAAe,OAAA,EAAwD;AAC7F,IAAA,OAAO,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,MAAM,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG,OAAc,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAa,eAAA,CAAgB,KAAA,EAAe,OAAA,EAA8C;AACxF,IAAA,MAAM,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,WAAW,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAa,gBAAgB,KAAA,EAAgC;AAC3D,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAK,CAAE,MAAA,CAAO,QAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAC,QAAQ,CAAA,EAAG,KAAA,EAAO,KAAa,CAAA;AACrH,IAAA,MAAM,QAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,KAAK,IAAA,EAAK,CAAE,GAAA,CAAI,KAAA,CAAM,EAAE,EAAA,EAAI,IAAA,CAAK,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAA;AAC3F,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,MAAa,YAAA,CAAa,KAAA,EAAe,OAAA,EAAgC;AAGvE,IAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,MACzB,IAAA,EAAM,6BAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,aAAA,CAAc,KAAA,EAAe,OAAA,EAAgC;AAGxE,IAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,MACzB,IAAA,EAAM,6BAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAEA,MAAa,WAAW,MAAA,EAAgD;AAEtE,IAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,IAAA,MAAM,SAAS,MAAA,EAAQ,MAAA;AACvB,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AAEjC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAe,CAAA;AAC3G,MAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,KAAK,MAAA,CAAO,CAAA,EAAU,KAAK,CAAC,CAAA;AAAA,IACrD;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,EAAW;AACrC,IAAA,MAAM,UAAoC,EAAC;AAC3C,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,OAAO,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,OAAO,OAAA,CAAQ,IAAA,CAAK,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAe,CAAA;AAC5G,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAU,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAC9D,MAAA,IAAI,OAAA,CAAQ,UAAU,KAAA,EAAO;AAAA,IAC/B;AACA,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/B;AAAA,EAEA,MAAa,aAAa,MAAA,EAA8C;AACtE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,EAAW;AAClC,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,WAAW,MAAA,EAAQ,QAAA;AACzB,IAAA,OAAO,GAAA,CACJ,OAAO,CAAC,CAAA,KAAO,OAAO,CAAA,CAAE,IAAA,CAAK,SAAS,IAAI,CAAA,GAAI,IAAK,CAAA,CACnD,MAAA,CAAO,CAAC,CAAA,KAAO,OAAO,aAAa,SAAA,GAAY,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,IAAK,CAAA;AAAA,EACnF;AAAA,EAEA,MAAa,cAAc,MAAA,EAAiD;AAC1E,IAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,IAAA,MAAM,YAAY,MAAA,EAAQ,SAAA;AAE1B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,MAAK,CAAE,UAAA,EAAW,CAAE,MAAA,EAAQ,CAAA;AACxD,IAAA,OAAO,GAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM;AACb,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAC5C,MAAA,MAAM,SAAU,CAAA,CAAU,MAAA,EAAQ,MAAA,IAAU,CAAE,EAAU,SAAS,CAAA;AACjE,MAAA,OAAO,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,GAAI,KAAA;AAAA,IAC9D,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAO,OAAO,SAAA,KAAc,SAAA,GAAa,SAAA,GAAY,CAAA,CAAE,SAAA,EAAU,GAAI,CAAC,CAAA,CAAE,SAAA,EAAU,GAAK,IAAK,CAAA,CACpG,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,aAAa,MAAA,EAA0E;AAElG,IAAA,MAAM,KAAK,QAAA,EAAS;AAEpB,IAAA,MAAM,YAAA,GACJ,OAAO,MAAA,EAAQ,MAAA,GACX,OAAO,MAAA,GACP,KAAA,CAAM,IAAA,iBAAK,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,MAAK,EAAG,GAAG,KAAK,YAAA,CAAa,IAAA,EAAM,CAAC,CAAC,CAAA;AACnF,IAAA,MAAM,MAAA,GAAS,aAAa,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC,CAAA;AAC9D,IAAA,MAAM,UAAA,GAA8B;AAAA,MAClC,MAAA;AAAA,MACA,WAAA,EAAa,OAAO,WAAA,IAAe,CAAA;AAAA,MACnC,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,QAAA,EAAU,OAAO,QAAA,EAAU,QAAA;AAAA,MAC3B,SAAA,EAAW,OAAO,QAAA,EAAU,SAAA;AAAA,MAC5B,SAAA,EAAW,OAAO,QAAA,EAAU,SAAA;AAAA,MAC5B,MAAA,EAAQ,OAAO,QAAA,EAAU;AAAA,KAC3B;AACA,IAAA,MAAM,SAAS,MAAO,IAAA,CAAK,IAAA,EAAK,CAAU,OAAO,UAAU,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,EAC9B;AAAA,EAEO,UAAA,GAAmD;AACxD,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAqC;AACrD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,MAAM,CAAA,IAAK,KAAK,IAAA,EAAK,CAAE,UAAA,EAAW,MAAO,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACvF,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAa,YAAA,CAAa,OAAA,EAAiB,OAAA,EAAiC;AAC1E,IAAA,MAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EAC/D;AAAA,EAEA,MAAa,cAAA,CAAe,OAAA,EAAiB,OAAA,EAAgE;AAC3G,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA,wBAAS,GAAA,EAA4B;AAC7E,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAAiB,KAAK,QAAQ,OAAc,CAAA;AAC7D,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAEjC,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,OAAO,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,YAAY;AACjB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,OAAO,OAAO,CAAA;AACtB,MAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,OAAO,CAAA;AAC/B,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,OAAO,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,MAAa,QAAA,GAA0B;AACrC,IAAA,MAAM,IAAA,CAAK,WAAW,IAAA,EAAK;AAAA,EAG7B;AAAA,EAEQ,IAAA,GAAoC;AAC1C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAErB,MAAA,IAAA,CAAK,cAAcC,iCAAA,CAAyB;AAAA,QAC1C,KAAA,EAAQ,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA;AAAM,OAC9B,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,MAAc,QAAA,GAAwC;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,YAAA,SAAqB,IAAA,CAAK,YAAA;AAE1D,IAAA,MAAM,UAA2C,EAAC;AAClD,IAAA,MAAM,YAA8D,EAAC;AAErE,IAAA,MAAM,SAAA,mBAAY,IAAI,GAAA,CAAY,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK,EAAG,GAAG,IAAA,CAAK,YAAA,CAAa,IAAA,EAAM,CAAC,CAAA;AAE3F,IAAA,KAAA,MAAW,aAAa,SAAA,EAAW;AACjC,MAAA,MAAM,WAA6D,EAAC;AAEpE,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC3C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,KAAA,MAAW,CAAC,OAAA,EAAS,GAAG,CAAA,IAAK,IAAA,CAAK,SAAQ,EAAG;AAC3C,UAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,CAAA,GAAK,SAAA;AACxD,UAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,cAAA,CAAe,KAAK,CAAA;AACxD,UAAA,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA,CAAK,oBAAoB,SAAA,EAAW,OAAA,EAAS,KAAK,SAAS,CAAA;AAAA,QACjF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,SAAS,CAAA;AAC7C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,MAAW,CAAC,QAAA,EAAU,GAAG,CAAA,IAAK,KAAA,CAAM,SAAQ,EAAG;AAC7C,UAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,cAAA,CAAe,SAAS,CAAA;AAC5D,UAAA,QAAA,CAAS,QAAQ,CAAA,GAAI,IAAA,CAAK,wBAAwB,SAAA,EAAW,QAAA,EAAU,KAAK,SAAS,CAAA;AAAA,QACvF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,WAAW,CAAA,EAAG;AAExC,MAAA,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO;AAAA,QACtC,IAAA,EAAM,QAAA;AAAA,QACN,SAAA,EAAW;AAAA,OACZ,CAAA;AAED,MAAA,KAAA,MAAW,CAAC,OAAA,EAAS,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACrD,QAAA,SAAA,CAAU,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,OAAO,EAAE,CAAA,GAAI,GAAA;AAAA,MACzC;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,CAAK,IAAA,EAAK,CAAE,YAAA,CAAa,SAAgB,CAAA;AAE/C,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,OAAc,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEQ,gBAAgB,SAAA,EAA2B;AACjD,IAAA,OAAO,iBAAA,CAAkB,eAAe,SAAS,CAAA;AAAA,EACnD;AAAA,EAEQ,aAAa,IAAA,EAAiC;AACpD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA;AAAA,MACtC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,kBAAkB,IAAA,EAAsB;AAC9C,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,iBAAA,CAAkB,WAAW,CAAA,CAAA,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,WAAW,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,GAAI,IAAA;AAAA,EAC/D;AAAA,EAEQ,MAAA,CAAO,KAAU,KAAA,EAAwC;AAC/D,IAAA,MAAM,CAAA,GAAI,SAAS,IAAA,CAAK,iBAAA,CAAkB,IAAI,QAAA,EAAU,KAAA,IAAS,GAAA,CAAI,SAAA,IAAa,EAAE,CAAA;AACpF,IAAA,MAAM,KAAA,GAAS,IAAI,QAAA,EAAkB,oBAAA;AACrC,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,OAAO,GAAA,CAAI,OAAA;AAAA,MACX,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAA,EAAU,CAAA;AAAA,MACV,YAAA,EAAc,IAAI,YAAA,IAAgB,CAAA;AAAA,MAClC,QAAA,EAAU,IAAI,QAAA,IAAY,CAAA;AAAA,MAC1B,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI,WAAA;AAAA,MACf,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,UAAU,MAAA,EAAsC;AACtD,IAAA,MAAM,SAAU,MAAA,CAAe,MAAA,EAAQ,MAAA,IAAU,CAAE,OAAe,SAAS,CAAA;AAC3E,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,MAAA,EAAS,OAAoB,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,MACjE,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA,EAAM;AAAA,MAC1B,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA,EAAO;AAAA,MAC5B,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA,EAAM;AAAA,MAC1B,SAAA,EAAW,MAAM,MAAA,CAAO,SAAA,EAAU;AAAA,MAClC,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA,EAAS;AAAA,MAChC,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA,EAAS;AAAA,MAChC,UAAA,EAAY,YAAY,MAAA,CAAO,UAAA;AAAW,KAC5C;AAAA,EACF;AAAA,EAEQ,mBAAA,CACN,SAAA,EACA,OAAA,EACA,GAAA,EACA,aAAA,EACkC;AAClC,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAA2C;AAChE,MAAA,OAAO,IAAI,OAAA,CAAQ;AAAA,QACjB,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,GAAA,EAAK;AAAA,UACH,EAAA,EAAI,IAAI,GAAA,CAAI,EAAA;AAAA,UACZ,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,YAAA,EAAc,IAAI,GAAA,CAAI,YAAA;AAAA,UACtB,SAAA,EAAY,IAAI,GAAA,CAAY,SAAA;AAAA,UAC5B,QAAA,EAAU,IAAI,GAAA,CAAI;AAAA,SACpB;AAAA,QACA,KAAA,EAAQ,GAAA,CAAI,GAAA,CAAI,QAAA,EAAkB;AAAA,OAC5B,CAAA;AAAA,IACV,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,OAAA;AAAA,MACA,KAAA,EAAO,EAAE,IAAA,EAAM,aAAA,EAAc;AAAA,MAC7B,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,kBAAkB,GAAA,CAAI,gBAAA;AAAA,MACtB,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,uBAAA,CACN,SAAA,EACA,QAAA,EACA,GAAA,EACA,aAAA,EACkC;AAClC,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,KAA2C;AAChE,MAAA,OAAO,IAAI,OAAA,CAAQ;AAAA,QACjB,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,GAAA,EAAK;AAAA,UACH,EAAA,EAAI,IAAI,GAAA,CAAI,EAAA;AAAA,UACZ,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,SAAA;AAAA,UACP,YAAA,EAAc,IAAI,GAAA,CAAI,YAAA;AAAA,UACtB,SAAA,EAAY,IAAI,GAAA,CAAY,SAAA;AAAA,UAC5B,QAAA,EAAU,IAAI,GAAA,CAAI;AAAA,SACpB;AAAA,QACA,KAAA,EAAQ,GAAA,CAAI,GAAA,CAAI,QAAA,EAAkB;AAAA,OAC5B,CAAA;AAAA,IACV,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,OAAA;AAAA,MACA,KAAA,EAAO,EAAE,IAAA,EAAM,aAAA,EAAc;AAAA,MAC7B,MAAA,EAAQ;AAAA,QACN,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,IAAI,GAAA,CAAI,EAAA;AAAA,QACR,OAAO,GAAA,CAAI,aAAA;AAAA,QACX,WAAW,GAAA,CAAI,SAAA;AAAA,QACf,SAAS,GAAA,CAAI;AAAA,OACf;AAAA,MACA,QAAA,EACE,GAAA,CAAI,iBAAA,IAAqB,GAAA,CAAI,gBAAgB,GAAA,CAAI,aAAA,IAAiB,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,SAAA,IAAc,GAAA,CAAI,SAAA,IAAa,IAAI,OAAA,GACzH;AAAA,QACE,kBAAA,EAAoB;AAAA,UAClB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,UACvB,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,eAAe,GAAA,CAAI,aAAA;AAAA,UACnB,SAAA,EAAW,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAAA,UACpC,cAAc,GAAA,CAAI,YAAA;AAAA,UAClB,OAAA,EAAS,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,OAAA,GAAU,CAAC,GAAA,CAAI,SAAA,EAAW,GAAA,CAAI,OAAO,CAAA,GAAI;AAAA;AACzE,OACF,GACA;AAAA,KACR;AAAA,EACF;AACF;;;ACpmBO,IAAM,yBAAN,MAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASlC,OAAc,SAAS,MAAA,EAAwB;AAC7C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACpD,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,IAAI,MAAM,CAAA,CAAA;AAAA,EACnC;AACF,CAAA;;;ACiDO,IAAM,wBAAA,GAAN,MAAM,yBAAA,CAAuD;AAAA,EAA7D,WAAA,GAAA;AACL,IAAA,IAAA,CAAgB,MAAA,GAAS;AAAA,MACvB,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,IAAA,CAAiB,QAAA,uBAAe,GAAA,EAAuB;AACvD,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAAsB;AACzD,IAAA,IAAA,CAAiB,cAAA,uBAAqB,GAAA,EAA8D;AACpG,IAAA,IAAA,CAAiB,eAAA,uBAAsB,GAAA,EAA0D;AAEjG,IAAA,IAAA,CAAiB,OAAA,uBAAc,GAAA,EAA+B;AAE9D,IAAA,IAAA,CAAiB,WAAA,uBAAkB,GAAA,EAA0C;AAE7E,IAAA,IAAA,CAAgB,MAAA,GAAkC;AAAA,MAChD,IAAA,EAAM,YAAY,IAAA,CAAK,UAAA,EAAW;AAAA,MAClC,GAAA,EAAK,OAAO,IAAA,KAAS,IAAA,CAAK,aAAa,IAAI,CAAA;AAAA,MAC3C,YAAA,EAAc,OAAO,IAAA,KAAS,IAAA,CAAK,kBAAkB,IAAI,CAAA;AAAA,MACzD,OAAA,EAAS,OAAO,IAAA,EAAM,MAAA,KAAW;AAC/B,QAAA,MAAM,WAAW,MAAA,EAAQ,MAAA;AACzB,QAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,QAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AACjC,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW;AAAA,UACpC,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,QAAA;AAAA,UACR,KAAA;AAAA,UACA;AAAA,SACM,CAAA;AACR,QAAA,OAAO,OAAA;AAAA,MACT,CAAA;AAAA,MACA,KAAA,EAAO,OAAO,IAAA,KAAS,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC3C,MAAA,EAAQ,OAAO,IAAA,KAAS,IAAA,CAAK,YAAY,IAAI,CAAA;AAAA,MAC7C,QAAA,EAAU,OAAO,IAAA,KAAS;AAGxB,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AACzC,QAAA,OAAO,MAAM,QAAA,IAAY,KAAA;AAAA,MAC3B,CAAA;AAAA,MACA,KAAA,EAAO,OAAO,IAAA,KAAS,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC3C,OAAO,OAAO,IAAA,EAAM,YAAY,IAAA,CAAK,UAAA,CAAW,MAAM,OAAO,CAAA;AAAA,MAC7D,YAAY,OAAO,IAAA,EAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,MAAM,OAAO;AAAA,KACzE;AAEA,IAAA,IAAA,CAAiB,YAAA,uBAAmB,GAAA,EAAY;AAAA,EAAA;AAAA,EAEhD,OAAc,MAAA,GAA6B;AACzC,IAAA,OAAO,IAAI,yBAAA,EAAyB;AAAA,EACtC;AAAA,EAEO,WAAA,CAAY,SAAA,EAAmB,OAAA,EAAiB,UAAA,EAAuD;AAC5G,IAAA,MAAM,YAAY,IAAA,CAAK,cAAA,CAAe,IAAI,SAAS,CAAA,wBAAS,GAAA,EAAiD;AAC7G,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,oBAAA;AAAA,QACN,OAAA,EAAS,CAAA,KAAA,EAAQ,OAAO,CAAA,gCAAA,EAAmC,SAAS,CAAA,EAAA;AAAA,OACrE,CAAA;AAAA,IACH;AACA,IAAA,SAAA,CAAU,GAAA,CAAI,SAAS,UAAU,CAAA;AACjC,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,SAAS,CAAA;AAAA,EAC9C;AAAA,EAEO,YAAA,CAAa,SAAA,EAAmB,QAAA,EAAkB,UAAA,EAAmD;AAC1G,IAAA,MAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,IAAI,SAAS,CAAA,wBAAS,GAAA,EAA6C;AAC3G,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,QACzB,IAAA,EAAM,mBAAA;AAAA,QACN,OAAA,EAAS,CAAA,MAAA,EAAS,QAAQ,CAAA,gCAAA,EAAmC,SAAS,CAAA,EAAA;AAAA,OACvE,CAAA;AAAA,IACH;AACA,IAAA,UAAA,CAAW,GAAA,CAAI,UAAU,UAAU,CAAA;AACnC,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,EAAW,UAAU,CAAA;AAAA,EAChD;AAAA,EAEA,MAAa,SAAS,MAAA,EAA2D;AAC/E,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,sBAAA,CAAuB,SAAS,KAAK,CAAA;AACnE,IAAA,MAAM,WAAA,GAAc,OAAO,QAAA,IAAY,CAAA;AAEvC,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,IAAY,EAAC;AAErC,IAAA,MAAM,GAAA,GAAiB;AAAA,MACrB,EAAA,EAAI,KAAA;AAAA,MACJ,MAAM,MAAA,CAAO,OAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,QAAA,GAAY,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,GAAQ,IAAI,SAAA,GAAY,SAAA;AAAA,MACzG,QAAA,EAAU,CAAA;AAAA,MACV,YAAA,EAAc,CAAA;AAAA,MACd,WAAA;AAAA,MACA,QAAA,EAAU,OAAO,QAAA,IAAY,CAAA;AAAA,MAC7B,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,QAAA;AAAA,MACA,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAM;AAAC,KACT;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAC5B,IAAA,MAAM,YAAY,IAAA,CAAK,WAAA,CAAY,IAAI,MAAA,CAAO,KAAK,KAAK,EAAC;AACzD,IAAA,SAAA,CAAU,KAAK,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA;AAE5C,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,KAAA,GAAQ,CAAA,EAAG;AACpC,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACtC,QAAA,IAAI,CAAC,MAAA,EAAQ;AACb,QAAA,IAAI,CAAC,KAAK,YAAA,CAAa,GAAA,CAAI,OAAO,KAAK,CAAA,SAAU,MAAA,GAAS,SAAA;AAC1D,QAAA,KAAK,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAAA,MACpC,CAAA,EAAG,OAAO,KAAK,CAAA;AACf,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,KAAK,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAa,SAAS,MAAA,EAA2D;AAC/E,IAAA,IAAI,OAAO,EAAA,EAAI;AACb,MAAA,MAAM,QAAQ,MAAA,CAAO,EAAA,CAAG,OAAA,EAAQ,GAAI,KAAK,GAAA,EAAI;AAC7C,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,UACzB,IAAA,EAAM,uBAAA;AAAA,UACN,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AACA,MAAA,OAAO,KAAK,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,KAAA,EAAO;AAG/B,MAAA,OAAO,IAAA,CAAK,SAAS,EAAE,GAAG,QAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,CAAA,EAAG,CAAA;AAAA,IAC9D;AACA,IAAA,OAAO,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAa,MAAA,CAAO,KAAA,EAAe,KAAA,EAAwD;AACzF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO,OAAO,IAAA;AACzC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC;AAAA,EAEA,MAAa,WAAA,CAAY,KAAA,EAAe,KAAA,EAAkD;AACxF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO,OAAO,IAAA;AACzC,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA,EAEA,MAAa,UAAA,CAAW,KAAA,EAAe,KAAA,EAA8C;AACnF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,SAAc,EAAC;AAC1C,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA,EAEA,MAAa,cAAA,CAAe,KAAA,EAAe,KAAA,EAAiC;AAC1E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AACjB,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO,OAAO,CAAA;AACzC,IAAA,OAAO,GAAA,CAAI,QAAA;AAAA,EACb;AAAA,EAEA,MAAa,QAAA,CAAS,KAAA,EAAe,KAAA,EAA+B;AAClE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,iBAAiB,EAAE,IAAA,EAAM,kBAAkB,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,YAAA,CAAA,EAAgB,CAAA;AAAA,IAC7F;AACA,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,gBAAA,CAAiB,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,sBAAA,EAAyB,KAAK,CAAA,EAAA,CAAA,EAAM,CAAA;AAAA,IACjH;AACA,IAAA,GAAA,CAAI,MAAA,GAAS,SAAA;AACb,IAAA,GAAA,CAAI,KAAA,GAAQ,MAAA;AACZ,IAAA,GAAA,CAAI,WAAA,GAAc,MAAA;AAClB,IAAA,GAAA,CAAI,QAAA,GAAW,CAAA;AACf,IAAA,KAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,MAAa,SAAA,CAAU,KAAA,EAAe,KAAA,EAA+B;AACnE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO;AAClC,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,KAAK,CAAA;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAI,KAAK,CAAA;AAC3C,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,KAAO,KAAK,CAAC,CAAA;AAAA,EAC7E;AAAA,EAEA,MAAa,UAAA,CAAW,KAAA,EAAe,KAAA,EAA+B;AACpE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,iBAAiB,EAAE,IAAA,EAAM,kBAAkB,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,YAAA,CAAA,EAAgB,CAAA;AAAA,IAC7F;AACA,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,gBAAA,CAAiB,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,sBAAA,EAAyB,KAAK,CAAA,EAAA,CAAA,EAAM,CAAA;AAAA,IACjH;AACA,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,WAAW,QAAA,EAAU;AACvD,MAAA,GAAA,CAAI,SAAS,IAAA,CAAK,YAAA,CAAa,IAAI,GAAA,CAAI,KAAK,IAAI,QAAA,GAAW,SAAA;AAC3D,MAAA,KAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAa,eAAA,CAAgB,KAAA,EAAe,MAAA,EAAgB,KAAA,EAA+B;AACzF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,iBAAiB,EAAE,IAAA,EAAM,kBAAkB,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,YAAA,CAAA,EAAgB,CAAA;AAAA,IAC7F;AACA,IAAA,IAAI,KAAA,IAAS,GAAA,CAAI,KAAA,KAAU,KAAA,EAAO;AAChC,MAAA,MAAM,IAAI,gBAAA,CAAiB,EAAE,IAAA,EAAM,gBAAA,EAAkB,OAAA,EAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,sBAAA,EAAyB,KAAK,CAAA,EAAA,CAAA,EAAM,CAAA;AAAA,IACjH;AACA,IAAA,GAAA,CAAI,MAAA,GAAS,QAAA;AACb,IAAA,GAAA,CAAI,KAAA,GAAQ,MAAA;AACZ,IAAA,GAAA,CAAI,WAAA,uBAAkB,IAAA,EAAK;AAAA,EAC7B;AAAA,EAEA,MAAa,aAAA,CAAc,MAAA,EAAkB,KAAA,EAA+B;AAC1E,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAa,cAAA,CAAe,MAAA,EAAkB,KAAA,EAA+B;AAC3E,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AAAA,EACjE;AAAA,EAEA,MAAa,aAAa,KAAA,EAAqD;AAC7E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,QAAA,EAAU,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAAA,MACrC,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAAA,EAEA,MAAa,kBAAkB,KAAA,EAA0C;AACvE,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ,CAAA;AAAA,MACR,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ,CAAA;AAAA,MACR,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,GAAA,CAAI,UAAU,MAAA,EAAQ;AACvB,QAAC,MAAA,CAAe,IAAI,MAAM,CAAA,EAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,UAAA,GAA8C;AACzD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,iBAAK,IAAI,IAAI,CAAC,GAAG,IAAA,CAAK,WAAA,CAAY,IAAA,EAAK,EAAG,GAAG,IAAA,CAAK,cAAA,CAAe,MAAK,EAAG,GAAG,KAAK,eAAA,CAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAC9H,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAA,CAAO,IAAA,CAAM,MAAM,IAAA,CAAK,YAAA,CAAa,CAAC,CAAG,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAa,WAAW,KAAA,EAA8B;AACpD,IAAA,IAAA,CAAK,YAAA,CAAa,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,SAAA,EAAW,GAAA,CAAI,MAAA,GAAS,QAAA;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAa,YAAY,KAAA,EAA8B;AACrD,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,CAAA;AAC9B,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,QAAA,EAAU,GAAA,CAAI,MAAA,GAAS,SAAA;AAAA,IAC5C;AACA,IAAA,KAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAa,WAAW,KAAA,EAAgC;AACtD,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,SAAA,IAAa,GAAA,CAAI,WAAW,QAAA,EAAU;AACvD,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,CAAC,EAAA,KAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA;AACxE,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAa,UAAA,CAAW,KAAA,EAAe,OAAA,EAAwD;AAC7F,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAC,OAAA,CAAQ,MAAM,CAAA;AACjF,IAAA,MAAM,SAAA,GAAY,QAAQ,SAAA,IAAa,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO,iBAAA;AAEtC,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,KAAA,MAAW,EAAA,IAAM,CAAC,GAAG,MAAM,CAAA,EAAG;AAC5B,MAAA,IAAI,WAAW,KAAA,EAAO;AACtB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,EAAG;AACpC,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,GAAA,CAAI,SAAA,CAAU,OAAA,EAAQ;AAC1C,MAAA,IAAI,QAAQ,SAAA,EAAW;AACvB,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AACvB,MAAA,OAAA,EAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,CAAC,EAAA,KAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAC,CAAC,CAAA;AACxE,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAa,eAAA,CAAgB,KAAA,EAAe,OAAA,EAA8C;AAExF,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AAChD,IAAA,IAAA,CAAK,WAAA,CAAY,OAAO,KAAK,CAAA;AAC7B,IAAA,IAAA,CAAK,cAAA,CAAe,OAAO,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,KAAK,CAAA;AAAA,EAChC;AAAA,EAEA,MAAa,gBAAgB,KAAA,EAAgC;AAC3D,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,GAAA,CAAI,WAAW,QAAA,EAAU;AAC3B,QAAA,MAAM,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,KAAK,CAAA;AAC7B,QAAA,OAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAa,YAAA,CAAa,KAAA,EAAe,OAAA,EAAgC;AAGvE,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,IAAI,IAAA,KAAS,OAAA,IAAW,IAAI,MAAA,KAAW,SAAA,MAAe,MAAA,GAAS,QAAA;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,MAAa,aAAA,CAAc,KAAA,EAAe,OAAA,EAAgC;AACxE,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC/C,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAChC,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAI,IAAI,IAAA,KAAS,OAAA,IAAW,IAAI,MAAA,KAAW,QAAA,MAAc,MAAA,GAAS,SAAA;AAAA,IACpE;AACA,IAAA,KAAK,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAa,WAAW,MAAA,EAAgD;AACtE,IAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,IAAA,MAAM,WAA2C,MAAA,EAAQ,MAAA;AACzD,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,GAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,CAAA;AAEjC,IAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAC1C,MAAA,CAAO,CAAC,CAAA,KAAO,KAAA,GAAQ,EAAE,KAAA,KAAU,KAAA,GAAQ,IAAK,CAAA,CAChD,MAAA,CAAO,CAAC,CAAA,KAAO,QAAA,GAAW,SAAS,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,GAAI,IAAK,EAC7D,IAAA,CAAK,CAAC,GAAG,CAAA,KAAO,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA,IAAc,EAAE,SAAA,CAAU,OAAA,KAAY,CAAA,CAAE,SAAA,CAAU,SAAU,CAAA;AAE9F,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAa,aAAa,MAAA,EAA8C;AACtE,IAAA,MAAM,OAAO,MAAA,EAAQ,IAAA;AACrB,IAAA,MAAM,WAAW,MAAA,EAAQ,QAAA;AACzB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,UAAA,EAAW;AAClC,IAAA,OAAO,GAAA,CACJ,OAAO,CAAC,CAAA,KAAO,OAAO,CAAA,CAAE,IAAA,CAAK,SAAS,IAAI,CAAA,GAAI,IAAK,CAAA,CACnD,MAAA,CAAO,CAAC,CAAA,KAAO,OAAO,aAAa,SAAA,GAAY,CAAA,CAAE,QAAA,KAAa,QAAA,GAAW,IAAK,CAAA;AAAA,EACnF;AAAA,EAEA,MAAa,cAAc,MAAA,EAAiD;AAC1E,IAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,IAAA,MAAM,YAAY,MAAA,EAAQ,SAAA;AAC1B,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CACpC,MAAA,CAAO,CAAC,CAAA,KAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,KAAK,CAAA,GAAI,IAAK,CAAA,CACvD,MAAA,CAAO,CAAC,CAAA,KAAO,OAAO,SAAA,KAAc,SAAA,GAAa,SAAA,GAAY,CAAC,EAAE,MAAA,GAAS,CAAA,CAAE,MAAA,GAAU,IAAK,EAC1F,GAAA,CAAI,CAAC,MAAM,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,EACtC;AAAA,EAEA,MAAa,aAAa,MAAA,EAA0E;AAClG,IAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,QAAA,CAAS,QAAQ,CAAA;AACzD,IAAA,MAAM,KAAA,GAA2B;AAAA,MAC/B,EAAA,EAAI,QAAA;AAAA,MACJ,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,MAC1B,WAAA,EAAa,OAAO,WAAA,IAAe,CAAA;AAAA,MACnC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,SAAS,EAAE,SAAA,EAAW,GAAG,MAAA,EAAQ,CAAA,EAAG,eAAe,CAAA,EAAE;AAAA,MACrD,UAAU,MAAA,CAAO;AAAA,KACnB;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAGhC,IAAA,KAAA,MAAW,KAAK,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAA,CAAK,YAAY,CAAC,CAAA;AAErD,IAAA,OAAO,IAAA,CAAK,eAAe,KAAK,CAAA;AAAA,EAClC;AAAA,EAEO,UAAA,GAAmD;AACxD,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAqC;AACrD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,cAAA,CAAe,KAAK,CAAC,CAAA;AAC9E,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAa,YAAA,CAAa,OAAA,EAAiB,OAAA,EAAiC;AAC1E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC7C,IAAA,IAAI,CAAC,QAAA,EAAU;AACf,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA,KAAM,CAAA,CAAE,OAAc,CAAC,CAAC,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAa,cAAA,CAAe,OAAA,EAAiB,OAAA,EAAgE;AAC3G,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,IAAI,OAAO,CAAA,wBAAS,GAAA,EAA6B;AAC9E,IAAA,GAAA,CAAI,IAAI,OAAO,CAAA;AACf,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAEjC,IAAA,OAAO,YAAY;AACjB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,OAAA,CAAQ,OAAO,OAAO,CAAA;AACtB,MAAA,IAAI,QAAQ,IAAA,KAAS,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,OAAO,OAAO,CAAA;AAAA,IACzD,CAAA;AAAA,EACF;AAAA,EAEA,MAAa,QAAA,GAA0B;AACrC,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA,EAEQ,eAAe,GAAA,EAAwC;AAC7D,IAAA,OAAO;AAAA,MACL,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAO,GAAA,CAAI;AAAA,KACb;AAAA,EACF;AAAA,EAEQ,eAAe,MAAA,EAAoD;AACzE,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,OAAO,YAAY;AAAE,QAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAAA,MAAK,CAAA;AAAA,MAC1C,QAAQ,YAAY;AAAE,QAAA,MAAA,CAAO,MAAA,GAAS,KAAA;AAAO,QAAA,KAAA,MAAW,KAAK,MAAA,CAAO,MAAA,EAAQ,KAAK,IAAA,CAAK,YAAY,CAAC,CAAA;AAAA,MAAE,CAAA;AAAA,MACrG,OAAO,YAAY;AAAE,QAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAAA,MAAK,CAAA;AAAA,MAC1C,WAAW,MAAM,CAAC,MAAA,CAAO,MAAA,IAAU,CAAC,MAAA,CAAO,MAAA;AAAA,MAC3C,QAAA,EAAU,MAAM,MAAA,CAAO,MAAA;AAAA,MACvB,QAAA,EAAU,MAAM,MAAA,CAAO,MAAA;AAAA,MACvB,UAAA,EAAY,YAAY,IAAA,CAAK,eAAA,CAAgB,MAAM;AAAA,KACrD;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAA,EAAqD;AAC3E,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,EAAI,GAAI,MAAA,CAAO,UAAU,OAAA,EAAQ;AACrD,IAAA,MAAM,SAAA,GAAY,OAAO,OAAA,CAAQ,SAAA;AACjC,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA;AAAA,MACvB,aAAa,SAAA,GAAY,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,gBAAgB,SAAA,GAAY,CAAA;AAAA,MACxE,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,KAAA,EAA8B;AACtD,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,MAAA,IAAU,CAAC,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,CAAO,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,CAAE,CAAA;AAC9I,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAE3B,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,KAAK,IAAA,CAAK,WAAA,CAAY,CAAA,EAAG,KAAK,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAc,WAAA,CAAY,MAAA,EAA2B,KAAA,EAA8B;AACjF,IAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA,EAAQ;AACpC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,WAAW,CAAA;AAElD,IAAA,MAAM,UAAW,MAAA,CAAe,SAAA;AAChC,IAAA,MAAM,iBAAiB,OAAA,IAAW,CAAA;AAClC,IAAA,IAAI,kBAAkB,WAAA,EAAa;AAClC,IAAC,MAAA,CAAe,YAAY,cAAA,GAAiB,CAAA;AAE9C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA;AAC/B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,IACpC,CAAA,SAAE;AACC,MAAC,MAAA,CAAe,SAAA,GAAc,MAAA,CAAe,SAAA,GAAuB,CAAA;AAErE,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAK,CAAA,OAAQ,IAAA,CAAK,WAAA,CAAY,QAAQ,KAAK,CAAA;AAAA,WAAA,IACnD,OAAO,QAAA,EAAU,MAAA,EAAQ,MAAM,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,QAAQ,KAAA,EAAiC;AAC/C,IAAA,MAAM,MAAM,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,KAAK,EAAC;AAC5C,IAAA,MAAM,aAAa,GAAA,CAChB,GAAA,CAAI,CAAC,EAAA,KAAO,IAAA,CAAK,SAAS,GAAA,CAAI,EAAE,CAAC,CAAA,CACjC,OAAO,CAAC,CAAA,KAAsB,QAAQ,CAAC,CAAC,EACxC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,SAAS,CAAA,CACpC,KAAK,CAAC,CAAA,EAAG,MAAO,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,IAAc,EAAE,SAAA,CAAU,OAAA,KAAY,CAAA,CAAE,SAAA,CAAU,SAAU,CAAA;AAC9F,IAAA,OAAO,UAAA,CAAW,CAAC,CAAA,IAAK,IAAA;AAAA,EAC1B;AAAA,EAEA,MAAc,UAAA,CAAW,MAAA,EAA2B,GAAA,EAA+B;AACjF,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,EAAG;AACpC,MAAA,GAAA,CAAI,MAAA,GAAS,QAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,MAAA,GAAS,QAAA;AACb,IAAA,GAAA,CAAI,SAAA,uBAAgB,IAAA,EAAK;AACzB,IAAA,GAAA,CAAI,YAAA,IAAgB,CAAA;AACpB,IAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,CAAA;AAE9E,IAAA,IAAI,MAAA,CAAO,QAAA,EAAU,QAAA,EAAU,MAAM,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,EAAE,GAAA,EAAK,IAAA,CAAK,cAAA,CAAe,GAAG,GAAG,CAAA;AAE/F,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,EAAI;AAEvB,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,KAAK,cAAA,CAAe,GAAA,CAAI,IAAI,KAAK,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACnE,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAM,IAAI,gBAAA,CAAiB;AAAA,UACzB,IAAA,EAAM,qBAAA;AAAA,UACN,SAAS,CAAA,KAAA,EAAQ,GAAA,CAAI,IAAI,CAAA,+BAAA,EAAkC,IAAI,KAAK,CAAA,EAAA;AAAA,SACrE,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,MAAM,WAAW,OAAA,CAAQ;AAAA,UACvB,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,SAAS,EAAC;AAAA,UACV,KAAK,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,MAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAO,YAAA,EAAc,GAAA,CAAI,YAAA,EAAc,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,UAC5G,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,WAAW,GAAA,CAAI;AAAA,SACT,CAAA;AAAA,MACV;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,OAAA,CAAQ;AAAA,QACtC,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,SAAS,EAAC;AAAA,QACV,KAAK,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,MAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAO,YAAA,EAAc,GAAA,CAAI,YAAA,EAAc,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,QAC5G,OAAO,GAAA,CAAI;AAAA,OACL,CAAA;AAER,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA;AAC9B,MAAA,GAAA,CAAI,MAAA,GAAS,WAAA;AACb,MAAA,GAAA,CAAI,WAAA,uBAAkB,IAAA,EAAK;AAC3B,MAAA,GAAA,CAAI,MAAA,GAAS,MAAA;AACb,MAAA,GAAA,CAAI,QAAA,GAAW,GAAA;AACf,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,CAAA,iBAAA,EAAoB,QAAQ,MAAM,CAAA;AAEjG,MAAA,MAAA,CAAO,QAAQ,SAAA,IAAa,CAAA;AAC5B,MAAA,MAAA,CAAO,QAAQ,aAAA,IAAiB,QAAA;AAEhC,MAAA,IAAI,WAAW,SAAA,EAAW;AACxB,QAAA,MAAM,WAAW,SAAA,CAAU;AAAA,UACzB,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,SAAS,EAAC;AAAA,UACV,KAAK,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,MAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAO,YAAA,EAAc,GAAA,CAAI,YAAA,EAAc,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,UAC5G,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,MAAA;AAAA,UACA;AAAA,SACM,CAAA;AAAA,MACV;AAEA,MAAA,IAAI,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW,MAAM,OAAO,QAAA,CAAS,SAAA,CAAU,EAAE,GAAA,EAAK,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EAAG,QAAQ,CAAA;AAAA,IAC3G,SAAS,KAAA,EAAY;AAEnB,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA,EAAO,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA;AAC1C,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,EAAE,SAAA,kBAAW,IAAI,IAAA,EAAK,EAAG,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,GAAA,CAAI,KAAA,IAAS,iBAAiB,CAAA;AAE9F,MAAA,MAAM,cAAA,GAAiB,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,WAAA;AAC/C,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,GAAA,CAAI,MAAA,GAAS,QAAA;AACb,QAAA,GAAA,CAAI,WAAA,uBAAkB,IAAA,EAAK;AAC3B,QAAA,MAAA,CAAO,QAAQ,MAAA,IAAU,CAAA;AAEzB,QAAA,MAAM,UAAA,GAAa,KAAK,cAAA,CAAe,GAAA,CAAI,IAAI,KAAK,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACnE,QAAA,IAAI,YAAY,SAAA,EAAW;AACzB,UAAA,MAAM,WAAW,SAAA,CAAU;AAAA,YACzB,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,SAAS,EAAC;AAAA,YACV,KAAK,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,MAAM,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAO,YAAA,EAAc,GAAA,CAAI,YAAA,EAAc,QAAA,EAAU,IAAI,QAAA,EAAS;AAAA,YAC5G,OAAO,GAAA,CAAI,KAAA;AAAA,YACX,KAAA;AAAA,YACA,cAAA,EAAgB;AAAA,WACV,CAAA;AAAA,QACV;AAEA,QAAA,IAAI,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW,MAAM,OAAO,QAAA,CAAS,SAAA,CAAU,EAAE,GAAA,EAAK,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,EAAG,OAAO,CAAA;AAAA,MAC1G,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,MAAA,GAAS,SAAA;AACb,QAAA,KAAK,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF","file":"index.js","sourcesContent":["/**\n * Helpers for building consistent key/queue prefixes.\n */\nexport class IgniterJobsPrefix {\n public static readonly BASE_PREFIX = 'igniter:jobs'\n\n /**\n * Builds a normalized queue name using the global prefix and queue id.\n *\n * @example\n * ```typescript\n * const name = IgniterJobsPrefix.buildQueueName('email')\n * // -> igniter:jobs:email\n * ```\n */\n public static buildQueueName(queue: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:${queue}`\n }\n\n /**\n * Builds the event channel used for pub/sub.\n *\n * Unscoped events are published to a global channel per service/environment.\n * Scoped events are also published to an additional channel for that scope.\n */\n public static buildEventsChannel(params: {\n service: string\n environment: string\n scope?: { type: string; id: string | number }\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:events:${params.environment}:${params.service}`\n if (!params.scope) return base\n return `${base}:scope:${params.scope.type}:${params.scope.id}`\n }\n}\n","import { IgniterError } from '@igniter-js/core'\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview BullMQ adapter for @igniter-js/jobs (wraps @igniter-js/adapter-bullmq)\n * @module @igniter-js/jobs/adapters/bullmq\n */\n\nimport type { Redis } from 'ioredis'\nimport type {\n AdvancedScheduleOptions,\n IgniterJobQueueAdapter,\n JobsRouter,\n JobDefinition as CoreJobDefinition,\n JobExecutionContext as CoreJobExecutionContext,\n JobWorkerConfig,\n} from '@igniter-js/core'\nimport { createBullMQAdapter } from '@igniter-js/adapter-bullmq'\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsBullMQAdapterOptions,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from '../types'\nimport { IgniterJobsPrefix } from '../utils/prefix'\nimport { IgniterJobsError } from '../errors'\n\ntype CoreMergedExecutor = ReturnType<IgniterJobQueueAdapter<any>['merge']>\n\nfunction toDateArray(values?: Array<string | Date>): Date[] | undefined {\n if (!values) return undefined\n return values.map((v) => (v instanceof Date ? v : new Date(v)))\n}\n\n/**\n * BullMQ adapter facade.\n *\n * It reuses the mature BullMQ integration from `@igniter-js/adapter-bullmq` to keep\n * feature parity (workers, queue/job management, advanced scheduling, hooks).\n */\nexport class IgniterJobsBullMQAdapter implements IgniterJobsAdapter {\n public readonly client: unknown\n\n private readonly redis: Redis\n private readonly publisher: Redis\n private readonly subscriber: Redis\n private readonly subscribers = new Map<string, Set<(payload: any) => void>>()\n\n private coreAdapter: IgniterJobQueueAdapter<any> | null = null\n private coreExecutor: CoreMergedExecutor | null = null\n private executorDirty = true\n\n private readonly jobsByQueue = new Map<string, Map<string, IgniterJobDefinition<any, any, any>>>()\n private readonly cronsByQueue = new Map<string, Map<string, IgniterCronDefinition<any, any>>>()\n\n public readonly queues: IgniterJobsQueueManager\n\n private constructor(options: IgniterJobsBullMQAdapterOptions) {\n this.redis = options.redis\n this.publisher = this.redis\n this.subscriber = this.redis.duplicate()\n this.client = { redis: this.redis }\n\n this.subscriber.on('message', (channel: string, message: string) => {\n const set = this.subscribers.get(channel)\n if (!set || set.size === 0) return\n let payload: any = message\n try {\n payload = JSON.parse(message)\n } catch {\n // ignore, treat as raw\n }\n for (const handler of set) handler(payload)\n })\n\n this.queues = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const full = this.toCoreQueueName(name)\n return this.core().queues.getJobs(full, filter as any) as any\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n const full = this.toCoreQueueName(name)\n return this.core().queues.isPaused(full)\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n }\n }\n\n public static create(options: IgniterJobsBullMQAdapterOptions): IgniterJobsAdapter {\n return new IgniterJobsBullMQAdapter(options)\n }\n\n public registerJob(queueName: string, jobName: string, definition: IgniterJobDefinition<any, any, any>): void {\n const map = this.jobsByQueue.get(queueName) ?? new Map()\n if (map.has(jobName)) {\n throw new IgniterJobsError({\n code: 'JOBS_DUPLICATE_JOB',\n message: `Job \"${jobName}\" is already registered in queue \"${queueName}\".`,\n })\n }\n map.set(jobName, definition)\n this.jobsByQueue.set(queueName, map)\n this.executorDirty = true\n }\n\n public registerCron(queueName: string, cronName: string, definition: IgniterCronDefinition<any, any>): void {\n const map = this.cronsByQueue.get(queueName) ?? new Map()\n if (map.has(cronName)) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" is already registered in queue \"${queueName}\".`,\n })\n }\n map.set(cronName, definition)\n this.cronsByQueue.set(queueName, map)\n this.executorDirty = true\n }\n\n public async dispatch(params: IgniterJobsAdapterDispatchParams): Promise<string> {\n const executor = await this.executor()\n const namespace = (executor as any)[params.queue]\n if (!namespace) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n })\n }\n return namespace.enqueue({\n task: params.jobName,\n input: params.input,\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n })\n }\n\n public async schedule(params: IgniterJobsAdapterScheduleParams): Promise<string> {\n const executor = await this.executor()\n const namespace = (executor as any)[params.queue]\n if (!namespace) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n })\n }\n\n const schedule: AdvancedScheduleOptions = {\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n at: params.at,\n repeat:\n params.cron ||\n params.every ||\n params.maxExecutions ||\n params.skipWeekends ||\n params.onlyBusinessHours ||\n params.businessHours ||\n params.onlyWeekdays ||\n params.skipDates\n ? {\n cron: params.cron,\n every: params.every,\n times: params.maxExecutions,\n skipWeekends: params.skipWeekends,\n onlyBusinessHours: params.onlyBusinessHours,\n businessHours: params.businessHours,\n onlyWeekdays: params.onlyWeekdays,\n skipDates: toDateArray(params.skipDates),\n }\n : undefined,\n }\n\n return namespace.schedule({\n task: params.jobName,\n input: params.input,\n ...schedule,\n })\n }\n\n public async getJob(jobId: string, queue?: string): Promise<IgniterJobSearchResult | null> {\n const result = await this.core().job.get(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return result ? this.mapJob(result, queue) : null\n }\n\n public async getJobState(jobId: string, queue?: string): Promise<IgniterJobStatus | null> {\n const state = await this.core().job.getState(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return state as any\n }\n\n public async getJobLogs(jobId: string, queue?: string): Promise<IgniterJobsJobLog[]> {\n const logs = await this.core().job.getLogs(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return logs as any\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n return this.core().job.getProgress(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.retry(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.remove(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.promote(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async moveJobToFailed(jobId: string, reason: string, queue?: string): Promise<void> {\n await this.core().job.moveToFailed(jobId, reason, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.retryMany(jobIds, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.removeMany(jobIds, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async getQueueInfo(queue: string): Promise<IgniterJobsQueueInfo | null> {\n const info = await this.core().queues.get(this.toCoreQueueName(queue))\n if (!info) return null\n return this.mapQueueInfo(info)\n }\n\n public async getQueueJobCounts(queue: string): Promise<any> {\n const counts = await this.core().queues.getJobCounts(this.toCoreQueueName(queue))\n return counts as any\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const list = await this.core().queues.list()\n return list.map((q) => this.mapQueueInfo(q))\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n await this.core().queues.pause(this.toCoreQueueName(queue))\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n await this.core().queues.resume(this.toCoreQueueName(queue))\n }\n\n public async drainQueue(queue: string): Promise<number> {\n return this.core().queues.drain(this.toCoreQueueName(queue))\n }\n\n public async cleanQueue(queue: string, options: IgniterJobsQueueCleanOptions): Promise<number> {\n return this.core().queues.clean(this.toCoreQueueName(queue), options as any)\n }\n\n public async obliterateQueue(queue: string, options?: { force?: boolean }): Promise<void> {\n await this.core().queues.obliterate(this.toCoreQueueName(queue), options)\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), { status: ['failed'], limit: 1000 } as any)\n await Promise.all(jobs.map((j) => this.core().job.retry(j.id, this.toCoreQueueName(queue))))\n return jobs.length\n }\n\n public async pauseJobType(queue: string, jobName: string): Promise<void> {\n void queue\n void jobName\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_OPERATION_FAILED',\n message: 'BullMQ backend does not support pausing a single job type; pause the queue or adjust worker filters.',\n })\n }\n\n public async resumeJobType(queue: string, jobName: string): Promise<void> {\n void queue\n void jobName\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_OPERATION_FAILED',\n message: 'BullMQ backend does not support resuming a single job type; resume the queue or adjust worker filters.',\n })\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n // Minimal implementation: list jobs from a specific queue when provided, otherwise aggregate known queues.\n const queue = filter?.queue as string | undefined\n const status = filter?.status as IgniterJobStatus[] | undefined\n const limit = filter?.limit ?? 100\n const offset = filter?.offset ?? 0\n\n if (queue) {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), { status, limit, offset } as any)\n return jobs.map((j) => this.mapJob(j as any, queue))\n }\n\n const queues = await this.listQueues()\n const results: IgniterJobSearchResult[] = []\n for (const q of queues) {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(q.name), { status, limit, offset } as any)\n results.push(...jobs.map((j) => this.mapJob(j as any, q.name)))\n if (results.length >= limit) break\n }\n return results.slice(0, limit)\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const all = await this.listQueues()\n const name = filter?.name as string | undefined\n const isPaused = filter?.isPaused as boolean | undefined\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) => (typeof isPaused === 'boolean' ? q.isPaused === isPaused : true))\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined\n const isRunning = filter?.isRunning as boolean | undefined\n\n const all = Array.from(this.core().getWorkers().values())\n return all\n .filter((w) => {\n if (!queue) return true\n const coreQueue = this.toCoreQueueName(queue)\n const queues = (w as any).config?.queues ?? [(w as any).queueName]\n return Array.isArray(queues) ? queues.includes(coreQueue) : false\n })\n .filter((w) => (typeof isRunning === 'boolean' ? (isRunning ? w.isRunning() : !w.isRunning()) : true))\n .map((w) => this.mapWorker(w))\n }\n\n public async createWorker(config: IgniterJobsWorkerBuilderConfig): Promise<IgniterJobsWorkerHandle> {\n // Ensure jobs/crons are registered in the underlying BullMQ adapter before starting workers.\n await this.executor()\n\n const queuesSource =\n config.queues?.length\n ? config.queues\n : Array.from(new Set([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()]))\n const queues = queuesSource.map((q) => this.toCoreQueueName(q))\n const coreConfig: JobWorkerConfig = {\n queues,\n concurrency: config.concurrency ?? 1,\n limiter: config.limiter as any,\n onActive: config.handlers?.onActive as any,\n onSuccess: config.handlers?.onSuccess as any,\n onFailure: config.handlers?.onFailure as any,\n onIdle: config.handlers?.onIdle as any,\n }\n const handle = await (this.core() as any).worker(coreConfig)\n return this.mapWorker(handle)\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>()\n for (const [id, handle] of this.core().getWorkers()) out.set(id, this.mapWorker(handle))\n return out\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n await this.publisher.publish(channel, JSON.stringify(payload))\n }\n\n public async subscribeEvent(channel: string, handler: IgniterJobsEventHandler): Promise<() => Promise<void>> {\n const set = this.subscribers.get(channel) ?? new Set<(payload: any) => void>()\n const wrapped = (payload: any) => void handler(payload as any)\n set.add(wrapped)\n this.subscribers.set(channel, set)\n\n if (set.size === 1) {\n await this.subscriber.subscribe(channel)\n }\n\n return async () => {\n const current = this.subscribers.get(channel)\n if (!current) return\n current.delete(wrapped)\n if (current.size === 0) {\n this.subscribers.delete(channel)\n await this.subscriber.unsubscribe(channel)\n }\n }\n }\n\n public async shutdown(): Promise<void> {\n await this.subscriber.quit()\n // BullMQ adapter does not expose global shutdown on the core adapter in a single method;\n // queue/worker cleanup is handled by worker close and queue obliterate.\n }\n\n private core(): IgniterJobQueueAdapter<any> {\n if (!this.coreAdapter) {\n // We only need the Redis connection. The wrapped job handlers can create real context.\n this.coreAdapter = createBullMQAdapter<any>({\n store: ({ client: this.redis } as any),\n })\n }\n return this.coreAdapter\n }\n\n private async executor(): Promise<CoreMergedExecutor> {\n if (!this.executorDirty && this.coreExecutor) return this.coreExecutor\n\n const routers: Record<string, JobsRouter<any>> = {}\n const flattened: Record<string, CoreJobDefinition<any, any, any>> = {}\n\n const allQueues = new Set<string>([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()])\n\n for (const queueName of allQueues) {\n const coreJobs: Record<string, CoreJobDefinition<any, any, any>> = {}\n\n const jobs = this.jobsByQueue.get(queueName)\n if (jobs) {\n for (const [jobName, def] of jobs.entries()) {\n const queue = def.queue ? `${queueName}.${def.queue}` : queueName\n const fullQueue = IgniterJobsPrefix.buildQueueName(queue)\n coreJobs[jobName] = this.toCoreJobDefinition(queueName, jobName, def, fullQueue)\n }\n }\n\n const crons = this.cronsByQueue.get(queueName)\n if (crons) {\n for (const [cronName, def] of crons.entries()) {\n const fullQueue = IgniterJobsPrefix.buildQueueName(queueName)\n coreJobs[cronName] = this.toCoreCronJobDefinition(queueName, cronName, def, fullQueue)\n }\n }\n\n if (Object.keys(coreJobs).length === 0) continue\n\n routers[queueName] = this.core().router({\n jobs: coreJobs as any,\n namespace: queueName,\n })\n\n for (const [jobName, def] of Object.entries(coreJobs)) {\n flattened[`${queueName}.${jobName}`] = def\n }\n }\n\n // Register jobs in bulk so management APIs and workers can resolve handlers.\n await this.core().bulkRegister(flattened as any)\n\n this.coreExecutor = this.core().merge(routers as any) as any\n this.executorDirty = false\n return this.coreExecutor as CoreMergedExecutor\n }\n\n private toCoreQueueName(queueName: string): string {\n return IgniterJobsPrefix.buildQueueName(queueName)\n }\n\n private mapQueueInfo(info: any): IgniterJobsQueueInfo {\n return {\n name: this.fromCoreQueueName(info.name),\n isPaused: info.isPaused,\n jobCounts: info.jobCounts,\n }\n }\n\n private fromCoreQueueName(full: string): string {\n const prefix = `${IgniterJobsPrefix.BASE_PREFIX}:`\n return full.startsWith(prefix) ? full.slice(prefix.length) : full\n }\n\n private mapJob(job: any, queue?: string): IgniterJobSearchResult {\n const q = queue ?? this.fromCoreQueueName(job.metadata?.queue ?? job.queueName ?? '')\n const scope = (job.metadata as any)?.__igniter_jobs_scope\n return {\n id: job.id,\n name: job.name,\n queue: q,\n status: job.status,\n input: job.payload,\n result: job.result,\n error: job.error,\n progress: 0,\n attemptsMade: job.attemptsMade ?? 0,\n priority: job.priority ?? 0,\n createdAt: job.createdAt,\n startedAt: job.processedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope,\n }\n }\n\n private mapWorker(handle: any): IgniterJobsWorkerHandle {\n const queues = (handle as any).config?.queues ?? [(handle as any).queueName]\n return {\n id: handle.id,\n queues: (queues as string[]).map((q) => this.fromCoreQueueName(q)),\n pause: () => handle.pause(),\n resume: () => handle.resume(),\n close: () => handle.close(),\n isRunning: () => handle.isRunning(),\n isPaused: () => handle.isPaused(),\n isClosed: () => handle.isClosed(),\n getMetrics: async () => handle.getMetrics() as IgniterJobsWorkerMetrics,\n }\n }\n\n private toCoreJobDefinition(\n queueName: string,\n jobName: string,\n def: IgniterJobDefinition<any, any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n input: ctx.input as any,\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: jobName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any)\n }\n\n return {\n name: jobName,\n input: def.input as any,\n handler,\n queue: { name: fullQueueName },\n attempts: def.attempts,\n priority: def.priority,\n delay: def.delay,\n removeOnComplete: def.removeOnComplete as any,\n removeOnFail: def.removeOnFail as any,\n metadata: def.metadata as any,\n limiter: def.limiter as any,\n onStart: def.onStart as any,\n onSuccess: def.onSuccess as any,\n onFailure: def.onFailure as any,\n onProgress: def.onProgress as any,\n } as any\n }\n\n private toCoreCronJobDefinition(\n queueName: string,\n cronName: string,\n def: IgniterCronDefinition<any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: cronName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any)\n }\n\n return {\n name: cronName,\n handler,\n queue: { name: fullQueueName },\n repeat: {\n cron: def.cron,\n tz: def.tz,\n limit: def.maxExecutions,\n startDate: def.startDate,\n endDate: def.endDate,\n },\n metadata:\n def.onlyBusinessHours || def.skipWeekends || def.businessHours || def.onlyWeekdays || def.skipDates || (def.startDate && def.endDate)\n ? {\n advancedScheduling: {\n onlyBusinessHours: def.onlyBusinessHours,\n skipWeekends: def.skipWeekends,\n businessHours: def.businessHours,\n skipDates: toDateArray(def.skipDates),\n onlyWeekdays: def.onlyWeekdays,\n between: def.startDate && def.endDate ? [def.startDate, def.endDate] : undefined,\n },\n }\n : undefined,\n } as any\n }\n}\n","/**\n * Generates consistent identifiers for jobs, workers, and schedules.\n */\nexport class IgniterJobsIdGenerator {\n /**\n * Generates a unique identifier with a prefix.\n *\n * @example\n * ```typescript\n * const jobId = IgniterJobsIdGenerator.generate('job')\n * ```\n */\n public static generate(prefix: string): string {\n const now = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `${prefix}_${now}_${random}`\n }\n}\n","/**\n * @fileoverview In-memory adapter for @igniter-js/jobs (tests/dev only)\n * @module @igniter-js/jobs/adapters/memory\n */\n\nimport type {\n IgniterCronDefinition,\n IgniterJobCounts,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from '../types'\nimport { IgniterJobsIdGenerator } from '../utils/id-generator'\nimport { IgniterJobsError } from '../errors/igniter-jobs.error'\n\ntype MemoryJob = {\n id: string\n name: string\n queue: string\n input: unknown\n status: IgniterJobStatus\n progress: number\n attemptsMade: number\n maxAttempts: number\n priority: number\n createdAt: Date\n startedAt?: Date\n completedAt?: Date\n result?: unknown\n error?: string\n metadata?: Record<string, unknown>\n scope?: unknown\n logs: IgniterJobsJobLog[]\n}\n\ntype MemoryWorkerState = {\n id: string\n queues: string[]\n concurrency: number\n paused: boolean\n closed: boolean\n startedAt: Date\n metrics: {\n processed: number\n failed: number\n totalDuration: number\n }\n handlers?: IgniterJobsWorkerBuilderConfig['handlers']\n}\n\n/**\n * Lightweight in-memory adapter used for unit tests and local development.\n *\n * This adapter is not suitable for production use.\n */\nexport class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {\n public readonly client = {\n type: 'memory' as const,\n }\n\n private readonly jobsById = new Map<string, MemoryJob>()\n private readonly jobsByQueue = new Map<string, string[]>()\n private readonly registeredJobs = new Map<string, Map<string, IgniterJobDefinition<any, any, any>>>()\n private readonly registeredCrons = new Map<string, Map<string, IgniterCronDefinition<any, any>>>()\n\n private readonly workers = new Map<string, MemoryWorkerState>()\n\n private readonly subscribers = new Map<string, Set<IgniterJobsEventHandler>>()\n\n public readonly queues: IgniterJobsQueueManager = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const statuses = filter?.status\n const limit = filter?.limit ?? 100\n const offset = filter?.offset ?? 0\n const results = await this.searchJobs({\n queue: name,\n status: statuses,\n limit,\n offset,\n } as any)\n return results\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n // Queue-level pause is stored as a special marker job list state.\n // For memory adapter, we model it by a metadata flag in queue info.\n const info = await this.getQueueInfo(name)\n return info?.isPaused ?? false\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n }\n\n private readonly pausedQueues = new Set<string>()\n\n public static create(): IgniterJobsAdapter {\n return new IgniterJobsMemoryAdapter()\n }\n\n public registerJob(queueName: string, jobName: string, definition: IgniterJobDefinition<any, any, any>): void {\n const queueJobs = this.registeredJobs.get(queueName) ?? new Map<string, IgniterJobDefinition<any, any, any>>()\n if (queueJobs.has(jobName)) {\n throw new IgniterJobsError({\n code: 'JOBS_DUPLICATE_JOB',\n message: `Job \"${jobName}\" already registered for queue \"${queueName}\".`,\n })\n }\n queueJobs.set(jobName, definition)\n this.registeredJobs.set(queueName, queueJobs)\n }\n\n public registerCron(queueName: string, cronName: string, definition: IgniterCronDefinition<any, any>): void {\n const queueCrons = this.registeredCrons.get(queueName) ?? new Map<string, IgniterCronDefinition<any, any>>()\n if (queueCrons.has(cronName)) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" already registered for queue \"${queueName}\".`,\n })\n }\n queueCrons.set(cronName, definition)\n this.registeredCrons.set(queueName, queueCrons)\n }\n\n public async dispatch(params: IgniterJobsAdapterDispatchParams): Promise<string> {\n const jobId = params.jobId ?? IgniterJobsIdGenerator.generate('job')\n const maxAttempts = params.attempts ?? 1\n\n const metadata = params.metadata ?? {}\n\n const job: MemoryJob = {\n id: jobId,\n name: params.jobName,\n queue: params.queue,\n input: params.input,\n status: this.pausedQueues.has(params.queue) ? 'paused' : (params.delay && params.delay > 0 ? 'delayed' : 'waiting'),\n progress: 0,\n attemptsMade: 0,\n maxAttempts,\n priority: params.priority ?? 0,\n createdAt: new Date(),\n metadata: metadata as Record<string, unknown>,\n scope: params.scope,\n logs: [],\n }\n\n this.jobsById.set(jobId, job)\n const queueList = this.jobsByQueue.get(params.queue) ?? []\n queueList.push(jobId)\n this.jobsByQueue.set(params.queue, queueList)\n\n if (params.delay && params.delay > 0) {\n setTimeout(() => {\n const stored = this.jobsById.get(jobId)\n if (!stored) return\n if (!this.pausedQueues.has(params.queue)) stored.status = 'waiting'\n void this.kickWorkers(params.queue)\n }, params.delay)\n return jobId\n }\n\n void this.kickWorkers(params.queue)\n return jobId\n }\n\n public async schedule(params: IgniterJobsAdapterScheduleParams): Promise<string> {\n if (params.at) {\n const delay = params.at.getTime() - Date.now()\n if (delay <= 0) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_SCHEDULE',\n message: 'Scheduled time must be in the future.',\n })\n }\n return this.dispatch({ ...params, delay })\n }\n if (params.cron || params.every) {\n // Memory adapter does not implement a cron engine. It stores the job as delayed and relies on tests\n // to invoke dispatch manually if needed.\n return this.dispatch({ ...params, delay: params.delay ?? 0 })\n }\n return this.dispatch(params)\n }\n\n public async getJob(jobId: string, queue?: string): Promise<IgniterJobSearchResult | null> {\n const job = this.jobsById.get(jobId)\n if (!job) return null\n if (queue && job.queue !== queue) return null\n return this.toSearchResult(job)\n }\n\n public async getJobState(jobId: string, queue?: string): Promise<IgniterJobStatus | null> {\n const job = this.jobsById.get(jobId)\n if (!job) return null\n if (queue && job.queue !== queue) return null\n return job.status\n }\n\n public async getJobLogs(jobId: string, queue?: string): Promise<IgniterJobsJobLog[]> {\n const job = this.jobsById.get(jobId)\n if (!job) return []\n if (queue && job.queue !== queue) return []\n return job.logs\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n const job = this.jobsById.get(jobId)\n if (!job) return 0\n if (queue && job.queue !== queue) return 0\n return job.progress\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId)\n if (!job) {\n throw new IgniterJobsError({ code: 'JOBS_NOT_FOUND', message: `Job \"${jobId}\" not found.` })\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({ code: 'JOBS_NOT_FOUND', message: `Job \"${jobId}\" not found in queue \"${queue}\".` })\n }\n job.status = 'waiting'\n job.error = undefined\n job.completedAt = undefined\n job.progress = 0\n void this.kickWorkers(job.queue)\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId)\n if (!job) return\n if (queue && job.queue !== queue) return\n this.jobsById.delete(jobId)\n const list = this.jobsByQueue.get(job.queue)\n if (list) this.jobsByQueue.set(job.queue, list.filter((id) => id !== jobId))\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId)\n if (!job) {\n throw new IgniterJobsError({ code: 'JOBS_NOT_FOUND', message: `Job \"${jobId}\" not found.` })\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({ code: 'JOBS_NOT_FOUND', message: `Job \"${jobId}\" not found in queue \"${queue}\".` })\n }\n if (job.status === 'delayed' || job.status === 'paused') {\n job.status = this.pausedQueues.has(job.queue) ? 'paused' : 'waiting'\n void this.kickWorkers(job.queue)\n }\n }\n\n public async moveJobToFailed(jobId: string, reason: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId)\n if (!job) {\n throw new IgniterJobsError({ code: 'JOBS_NOT_FOUND', message: `Job \"${jobId}\" not found.` })\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({ code: 'JOBS_NOT_FOUND', message: `Job \"${jobId}\" not found in queue \"${queue}\".` })\n }\n job.status = 'failed'\n job.error = reason\n job.completedAt = new Date()\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.retryJob(id, queue)))\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.removeJob(id, queue)))\n }\n\n public async getQueueInfo(queue: string): Promise<IgniterJobsQueueInfo | null> {\n const counts = await this.getQueueJobCounts(queue)\n return {\n name: queue,\n isPaused: this.pausedQueues.has(queue),\n jobCounts: counts,\n }\n }\n\n public async getQueueJobCounts(queue: string): Promise<IgniterJobCounts> {\n const jobIds = this.jobsByQueue.get(queue) ?? []\n const counts: IgniterJobCounts = {\n waiting: 0,\n active: 0,\n completed: 0,\n failed: 0,\n delayed: 0,\n paused: 0,\n }\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.status in counts) {\n ;(counts as any)[job.status]++\n }\n }\n return counts\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const queues = Array.from(new Set([...this.jobsByQueue.keys(), ...this.registeredJobs.keys(), ...this.registeredCrons.keys()]))\n const result: IgniterJobsQueueInfo[] = []\n for (const q of queues) {\n result.push((await this.getQueueInfo(q))!)\n }\n return result\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n this.pausedQueues.add(queue)\n const jobIds = this.jobsByQueue.get(queue) ?? []\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.status === 'waiting') job.status = 'paused'\n }\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n this.pausedQueues.delete(queue)\n const jobIds = this.jobsByQueue.get(queue) ?? []\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.status === 'paused') job.status = 'waiting'\n }\n void this.kickWorkers(queue)\n }\n\n public async drainQueue(queue: string): Promise<number> {\n const jobIds = this.jobsByQueue.get(queue) ?? []\n let removed = 0\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.status === 'waiting' || job.status === 'paused') {\n this.jobsById.delete(id)\n removed++\n }\n }\n this.jobsByQueue.set(queue, jobIds.filter((id) => this.jobsById.has(id)))\n return removed\n }\n\n public async cleanQueue(queue: string, options: IgniterJobsQueueCleanOptions): Promise<number> {\n const statuses = Array.isArray(options.status) ? options.status : [options.status]\n const olderThan = options.olderThan ?? 0\n const limit = options.limit ?? Number.POSITIVE_INFINITY\n\n const jobIds = this.jobsByQueue.get(queue) ?? []\n const now = Date.now()\n let cleaned = 0\n\n for (const id of [...jobIds]) {\n if (cleaned >= limit) break\n const job = this.jobsById.get(id)\n if (!job) continue\n if (!statuses.includes(job.status)) continue\n const ageMs = now - job.createdAt.getTime()\n if (ageMs < olderThan) continue\n this.jobsById.delete(id)\n cleaned++\n }\n\n this.jobsByQueue.set(queue, jobIds.filter((id) => this.jobsById.has(id)))\n return cleaned\n }\n\n public async obliterateQueue(queue: string, options?: { force?: boolean }): Promise<void> {\n void options\n const jobIds = this.jobsByQueue.get(queue) ?? []\n for (const id of jobIds) this.jobsById.delete(id)\n this.jobsByQueue.delete(queue)\n this.registeredJobs.delete(queue)\n this.registeredCrons.delete(queue)\n this.pausedQueues.delete(queue)\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobIds = this.jobsByQueue.get(queue) ?? []\n let retried = 0\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.status === 'failed') {\n await this.retryJob(id, queue)\n retried++\n }\n }\n return retried\n }\n\n public async pauseJobType(queue: string, jobName: string): Promise<void> {\n // Memory adapter supports job-type pause by blocking processing inside workers.\n // We model it by marking matching waiting jobs as paused.\n const jobIds = this.jobsByQueue.get(queue) ?? []\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.name === jobName && job.status === 'waiting') job.status = 'paused'\n }\n }\n\n public async resumeJobType(queue: string, jobName: string): Promise<void> {\n const jobIds = this.jobsByQueue.get(queue) ?? []\n for (const id of jobIds) {\n const job = this.jobsById.get(id)\n if (!job) continue\n if (job.name === jobName && job.status === 'paused') job.status = 'waiting'\n }\n void this.kickWorkers(queue)\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n const queue = filter?.queue as string | undefined\n const statuses: IgniterJobStatus[] | undefined = filter?.status\n const limit = filter?.limit ?? 100\n const offset = filter?.offset ?? 0\n\n const all = Array.from(this.jobsById.values())\n .filter((j) => (queue ? j.queue === queue : true))\n .filter((j) => (statuses ? statuses.includes(j.status) : true))\n .sort((a, b) => (b.priority - a.priority) || (a.createdAt.getTime() - b.createdAt.getTime()))\n\n return all.slice(offset, offset + limit).map((j) => this.toSearchResult(j))\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const name = filter?.name as string | undefined\n const isPaused = filter?.isPaused as boolean | undefined\n const all = await this.listQueues()\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) => (typeof isPaused === 'boolean' ? q.isPaused === isPaused : true))\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined\n const isRunning = filter?.isRunning as boolean | undefined\n return Array.from(this.workers.values())\n .filter((w) => (queue ? w.queues.includes(queue) : true))\n .filter((w) => (typeof isRunning === 'boolean' ? (isRunning ? !w.closed : w.closed) : true))\n .map((w) => this.toWorkerHandle(w))\n }\n\n public async createWorker(config: IgniterJobsWorkerBuilderConfig): Promise<IgniterJobsWorkerHandle> {\n const workerId = IgniterJobsIdGenerator.generate('worker')\n const state: MemoryWorkerState = {\n id: workerId,\n queues: config.queues ?? [],\n concurrency: config.concurrency ?? 1,\n paused: false,\n closed: false,\n startedAt: new Date(),\n metrics: { processed: 0, failed: 0, totalDuration: 0 },\n handlers: config.handlers,\n }\n this.workers.set(workerId, state)\n\n // Kick initial processing.\n for (const q of state.queues) void this.kickWorkers(q)\n\n return this.toWorkerHandle(state)\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>()\n for (const [id, state] of this.workers) out.set(id, this.toWorkerHandle(state))\n return out\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n const handlers = this.subscribers.get(channel)\n if (!handlers) return\n await Promise.all(Array.from(handlers).map(async (h) => h(payload as any)))\n }\n\n public async subscribeEvent(channel: string, handler: IgniterJobsEventHandler): Promise<() => Promise<void>> {\n const set = this.subscribers.get(channel) ?? new Set<IgniterJobsEventHandler>()\n set.add(handler)\n this.subscribers.set(channel, set)\n\n return async () => {\n const current = this.subscribers.get(channel)\n if (!current) return\n current.delete(handler)\n if (current.size === 0) this.subscribers.delete(channel)\n }\n }\n\n public async shutdown(): Promise<void> {\n this.workers.clear()\n this.subscribers.clear()\n }\n\n private toSearchResult(job: MemoryJob): IgniterJobSearchResult {\n return {\n id: job.id,\n name: job.name,\n queue: job.queue,\n status: job.status,\n input: job.input,\n result: job.result,\n error: job.error,\n progress: job.progress,\n attemptsMade: job.attemptsMade,\n priority: job.priority,\n createdAt: job.createdAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope: job.scope as any,\n }\n }\n\n private toWorkerHandle(worker: MemoryWorkerState): IgniterJobsWorkerHandle {\n return {\n id: worker.id,\n queues: worker.queues,\n pause: async () => { worker.paused = true },\n resume: async () => { worker.paused = false; for (const q of worker.queues) void this.kickWorkers(q) },\n close: async () => { worker.closed = true },\n isRunning: () => !worker.closed && !worker.paused,\n isPaused: () => worker.paused,\n isClosed: () => worker.closed,\n getMetrics: async () => this.toWorkerMetrics(worker),\n }\n }\n\n private toWorkerMetrics(worker: MemoryWorkerState): IgniterJobsWorkerMetrics {\n const uptime = Date.now() - worker.startedAt.getTime()\n const processed = worker.metrics.processed\n return {\n processed,\n failed: worker.metrics.failed,\n avgDuration: processed > 0 ? worker.metrics.totalDuration / processed : 0,\n concurrency: worker.concurrency,\n uptime,\n }\n }\n\n private async kickWorkers(queue: string): Promise<void> {\n if (this.pausedQueues.has(queue)) return\n const relevant = Array.from(this.workers.values()).filter((w) => !w.closed && !w.paused && (w.queues.length === 0 || w.queues.includes(queue)))\n if (relevant.length === 0) return\n\n for (const w of relevant) {\n void this.processLoop(w, queue)\n }\n }\n\n private async processLoop(worker: MemoryWorkerState, queue: string): Promise<void> {\n if (worker.closed || worker.paused) return\n const concurrency = Math.max(1, worker.concurrency)\n\n const running = (worker as any).__running as number | undefined\n const currentRunning = running ?? 0\n if (currentRunning >= concurrency) return\n ;(worker as any).__running = currentRunning + 1\n\n try {\n const next = this.nextJob(queue)\n if (!next) return\n await this.processJob(worker, next)\n } finally {\n ;(worker as any).__running = ((worker as any).__running as number) - 1\n // Continue draining if more work exists.\n if (this.nextJob(queue)) void this.processLoop(worker, queue)\n else if (worker.handlers?.onIdle) await worker.handlers.onIdle()\n }\n }\n\n private nextJob(queue: string): MemoryJob | null {\n const ids = this.jobsByQueue.get(queue) ?? []\n const candidates = ids\n .map((id) => this.jobsById.get(id))\n .filter((j): j is MemoryJob => Boolean(j))\n .filter((j) => j.status === 'waiting')\n .sort((a, b) => (b.priority - a.priority) || (a.createdAt.getTime() - b.createdAt.getTime()))\n return candidates[0] ?? null\n }\n\n private async processJob(worker: MemoryWorkerState, job: MemoryJob): Promise<void> {\n if (this.pausedQueues.has(job.queue)) {\n job.status = 'paused'\n return\n }\n\n job.status = 'active'\n job.startedAt = new Date()\n job.attemptsMade += 1\n job.logs.push({ timestamp: new Date(), level: 'info', message: 'Job started' })\n\n if (worker.handlers?.onActive) await worker.handlers.onActive({ job: this.toSearchResult(job) })\n\n const start = Date.now()\n\n try {\n const definition = this.registeredJobs.get(job.queue)?.get(job.name)\n if (!definition) {\n throw new IgniterJobsError({\n code: 'JOBS_NOT_REGISTERED',\n message: `Job \"${job.name}\" is not registered for queue \"${job.queue}\".`,\n })\n }\n\n if (definition.onStart) {\n await definition.onStart({\n input: job.input as any,\n context: {} as any,\n job: { id: job.id, name: job.name, queue: job.queue, attemptsMade: job.attemptsMade, metadata: job.metadata },\n scope: job.scope as any,\n startedAt: job.startedAt,\n } as any)\n }\n\n const result = await definition.handler({\n input: job.input as any,\n context: {} as any,\n job: { id: job.id, name: job.name, queue: job.queue, attemptsMade: job.attemptsMade, metadata: job.metadata },\n scope: job.scope as any,\n } as any)\n\n const duration = Date.now() - start\n job.status = 'completed'\n job.completedAt = new Date()\n job.result = result\n job.progress = 100\n job.logs.push({ timestamp: new Date(), level: 'info', message: `Job completed in ${duration}ms` })\n\n worker.metrics.processed += 1\n worker.metrics.totalDuration += duration\n\n if (definition.onSuccess) {\n await definition.onSuccess({\n input: job.input as any,\n context: {} as any,\n job: { id: job.id, name: job.name, queue: job.queue, attemptsMade: job.attemptsMade, metadata: job.metadata },\n scope: job.scope as any,\n result,\n duration,\n } as any)\n }\n\n if (worker.handlers?.onSuccess) await worker.handlers.onSuccess({ job: this.toSearchResult(job), result })\n } catch (error: any) {\n const duration = Date.now() - start\n job.error = error?.message ?? String(error)\n job.logs.push({ timestamp: new Date(), level: 'error', message: job.error ?? 'Unknown error' })\n\n const isFinalAttempt = job.attemptsMade >= job.maxAttempts\n if (isFinalAttempt) {\n job.status = 'failed'\n job.completedAt = new Date()\n worker.metrics.failed += 1\n\n const definition = this.registeredJobs.get(job.queue)?.get(job.name)\n if (definition?.onFailure) {\n await definition.onFailure({\n input: job.input as any,\n context: {} as any,\n job: { id: job.id, name: job.name, queue: job.queue, attemptsMade: job.attemptsMade, metadata: job.metadata },\n scope: job.scope as any,\n error,\n isFinalAttempt: true,\n } as any)\n }\n\n if (worker.handlers?.onFailure) await worker.handlers.onFailure({ job: this.toSearchResult(job), error })\n } else {\n job.status = 'waiting'\n void this.kickWorkers(job.queue)\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/prefix.ts","../../src/errors/jobs.error.ts","../../src/adapters/bullmq.adapter.ts","../../src/utils/id-generator.ts","../../src/adapters/memory.adapter.ts","../../src/adapters/sqlite.adapter.ts"],"names":["IgniterError","options","createBullMQAdapter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Helpers for building consistent key/queue prefixes.\n */\nexport class IgniterJobsPrefix {\n public static readonly BASE_PREFIX = 'igniter:jobs'\n\n /**\n * Builds a normalized queue name using the global prefix and queue id.\n *\n * @example\n * ```typescript\n * const name = IgniterJobsPrefix.buildQueueName('email')\n * // -> igniter:jobs:email\n * ```\n */\n public static buildQueueName(queue: string): string {\n return `${IgniterJobsPrefix.BASE_PREFIX}:${queue}`\n }\n\n /**\n * Builds the event channel used for pub/sub.\n *\n * Unscoped events are published to a global channel per service/environment.\n * Scoped events are also published to an additional channel for that scope.\n */\n public static buildEventsChannel(params: {\n service: string\n environment: string\n scope?: { type: string; id: string | number }\n }): string {\n const base = `${IgniterJobsPrefix.BASE_PREFIX}:events:${params.environment}:${params.service}`\n if (!params.scope) return base\n return `${base}:scope:${params.scope.type}:${params.scope.id}`\n }\n}\n","import { IgniterError } from \"@igniter-js/common\";\n\n/**\n * Canonical error codes for `@igniter-js/jobs`.\n */\nexport const IGNITER_JOBS_ERROR_CODES = {\n JOBS_ADAPTER_REQUIRED: 'JOBS_ADAPTER_REQUIRED',\n JOBS_SERVICE_REQUIRED: 'JOBS_SERVICE_REQUIRED',\n JOBS_CONTEXT_REQUIRED: 'JOBS_CONTEXT_REQUIRED',\n JOBS_CONFIGURATION_INVALID: 'JOBS_CONFIGURATION_INVALID',\n JOBS_QUEUE_NOT_FOUND: 'JOBS_QUEUE_NOT_FOUND',\n JOBS_QUEUE_DUPLICATE: 'JOBS_QUEUE_DUPLICATE',\n JOBS_QUEUE_OPERATION_FAILED: 'JOBS_QUEUE_OPERATION_FAILED',\n JOBS_INVALID_DEFINITION: 'JOBS_INVALID_DEFINITION',\n JOBS_HANDLER_REQUIRED: 'JOBS_HANDLER_REQUIRED',\n JOBS_DUPLICATE_JOB: 'JOBS_DUPLICATE_JOB',\n JOBS_NOT_FOUND: 'JOBS_NOT_FOUND',\n JOBS_NOT_REGISTERED: 'JOBS_NOT_REGISTERED',\n JOBS_EXECUTION_FAILED: 'JOBS_EXECUTION_FAILED',\n JOBS_TIMEOUT: 'JOBS_TIMEOUT',\n JOBS_CONTEXT_FACTORY_FAILED: 'JOBS_CONTEXT_FACTORY_FAILED',\n JOBS_VALIDATION_FAILED: 'JOBS_VALIDATION_FAILED',\n JOBS_INVALID_INPUT: 'JOBS_INVALID_INPUT',\n JOBS_INVALID_CRON: 'JOBS_INVALID_CRON',\n JOBS_INVALID_SCHEDULE: 'JOBS_INVALID_SCHEDULE',\n JOBS_SCOPE_ALREADY_DEFINED: 'JOBS_SCOPE_ALREADY_DEFINED',\n JOBS_WORKER_FAILED: 'JOBS_WORKER_FAILED',\n JOBS_ADAPTER_ERROR: 'JOBS_ADAPTER_ERROR',\n JOBS_ADAPTER_CONNECTION_FAILED: 'JOBS_ADAPTER_CONNECTION_FAILED',\n JOBS_SUBSCRIBE_FAILED: 'JOBS_SUBSCRIBE_FAILED',\n} as const\n\nexport type IgniterJobsErrorCode = keyof typeof IGNITER_JOBS_ERROR_CODES\n\nexport interface IgniterJobsErrorOptions {\n /** Error code scoped to Igniter Jobs. */\n code: IgniterJobsErrorCode\n /** Human-readable message. */\n message: string\n /** HTTP-like status code hint (default: 500). */\n statusCode?: number\n /** Optional structured details for debugging and clients. */\n details?: unknown\n /** Optional metadata for logs and tracing. */\n metadata?: Record<string, unknown>\n /** Optional causer tag used by some Igniter tooling. */\n causer?: string\n /** Underlying cause for debugging (optional). */\n cause?: Error\n /** Optional logger passthrough to align with other Igniter errors. */\n logger?: any\n}\n\n/**\n * Typed error class for the Jobs package.\n *\n * @example\n * ```typescript\n * throw new IgniterJobsError({\n * code: 'JOBS_INVALID_INPUT',\n * message: 'Input payload failed validation',\n * })\n * ```\n */\nexport class IgniterJobsError extends IgniterError {\n constructor(options: IgniterJobsErrorOptions) {\n super(options)\n }\n}\n","/**\n * @fileoverview BullMQ adapter for @igniter-js/jobs (wraps @igniter-js/adapter-bullmq)\n * @module @igniter-js/jobs/adapters/bullmq\n */\n\nimport type { Redis } from 'ioredis'\nimport type {\n AdvancedScheduleOptions,\n IgniterJobQueueAdapter,\n JobsRouter,\n JobDefinition as CoreJobDefinition,\n JobExecutionContext as CoreJobExecutionContext,\n JobWorkerConfig,\n} from '@igniter-js/core'\nimport { createBullMQAdapter } from '@igniter-js/adapter-bullmq'\nimport type {\n IgniterCronDefinition,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsBullMQAdapterOptions,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from '../types'\nimport { IgniterJobsPrefix } from '../utils/prefix'\nimport { IgniterJobsError } from '../errors'\n\ntype CoreMergedExecutor = ReturnType<IgniterJobQueueAdapter<any>['merge']>\n\nfunction toDateArray(values?: Array<string | Date>): Date[] | undefined {\n if (!values) return undefined\n return values.map((v) => (v instanceof Date ? v : new Date(v)))\n}\n\n/**\n * BullMQ adapter facade.\n *\n * It reuses the mature BullMQ integration from `@igniter-js/adapter-bullmq` to keep\n * feature parity (workers, queue/job management, advanced scheduling, hooks).\n */\nexport class IgniterJobsBullMQAdapter implements IgniterJobsAdapter {\n public readonly client: unknown\n\n private readonly redis: Redis\n private readonly publisher: Redis\n private readonly subscriber: Redis\n private readonly subscribers = new Map<string, Set<(payload: any) => void>>()\n\n private coreAdapter: IgniterJobQueueAdapter<any> | null = null\n private coreExecutor: CoreMergedExecutor | null = null\n private executorDirty = true\n\n private readonly jobsByQueue = new Map<string, Map<string, IgniterJobDefinition<any, any, any>>>()\n private readonly cronsByQueue = new Map<string, Map<string, IgniterCronDefinition<any, any>>>()\n\n public readonly queues: IgniterJobsQueueManager\n\n private constructor(options: IgniterJobsBullMQAdapterOptions) {\n this.redis = options.redis\n this.publisher = this.redis\n this.subscriber = this.redis.duplicate()\n this.client = { redis: this.redis }\n\n this.subscriber.on('message', (channel: string, message: string) => {\n const set = this.subscribers.get(channel)\n if (!set || set.size === 0) return\n let payload: any = message\n try {\n payload = JSON.parse(message)\n } catch {\n // ignore, treat as raw\n }\n for (const handler of set) handler(payload)\n })\n\n this.queues = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const full = this.toCoreQueueName(name)\n return this.core().queues.getJobs(full, filter as any) as any\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n const full = this.toCoreQueueName(name)\n return this.core().queues.isPaused(full)\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n }\n }\n\n public static create(options: IgniterJobsBullMQAdapterOptions): IgniterJobsAdapter {\n return new IgniterJobsBullMQAdapter(options)\n }\n\n public registerJob(queueName: string, jobName: string, definition: IgniterJobDefinition<any, any, any>): void {\n const map = this.jobsByQueue.get(queueName) ?? new Map()\n if (map.has(jobName)) {\n throw new IgniterJobsError({\n code: 'JOBS_DUPLICATE_JOB',\n message: `Job \"${jobName}\" is already registered in queue \"${queueName}\".`,\n })\n }\n map.set(jobName, definition)\n this.jobsByQueue.set(queueName, map)\n this.executorDirty = true\n }\n\n public registerCron(queueName: string, cronName: string, definition: IgniterCronDefinition<any, any>): void {\n const map = this.cronsByQueue.get(queueName) ?? new Map()\n if (map.has(cronName)) {\n throw new IgniterJobsError({\n code: 'JOBS_INVALID_CRON',\n message: `Cron \"${cronName}\" is already registered in queue \"${queueName}\".`,\n })\n }\n map.set(cronName, definition)\n this.cronsByQueue.set(queueName, map)\n this.executorDirty = true\n }\n\n public async dispatch(params: IgniterJobsAdapterDispatchParams): Promise<string> {\n const executor = await this.executor()\n const namespace = (executor as any)[params.queue]\n if (!namespace) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n })\n }\n return namespace.enqueue({\n task: params.jobName,\n input: params.input,\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n })\n }\n\n public async schedule(params: IgniterJobsAdapterScheduleParams): Promise<string> {\n const executor = await this.executor()\n const namespace = (executor as any)[params.queue]\n if (!namespace) {\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_NOT_FOUND',\n message: `Queue \"${params.queue}\" is not registered in the adapter.`,\n })\n }\n\n const schedule: AdvancedScheduleOptions = {\n jobId: params.jobId,\n delay: params.delay,\n priority: params.priority,\n attempts: params.attempts,\n metadata: params.metadata as any,\n removeOnComplete: params.removeOnComplete as any,\n removeOnFail: params.removeOnFail as any,\n limiter: params.limiter as any,\n at: params.at,\n repeat:\n params.cron ||\n params.every ||\n params.maxExecutions ||\n params.skipWeekends ||\n params.onlyBusinessHours ||\n params.businessHours ||\n params.onlyWeekdays ||\n params.skipDates\n ? {\n cron: params.cron,\n every: params.every,\n times: params.maxExecutions,\n skipWeekends: params.skipWeekends,\n onlyBusinessHours: params.onlyBusinessHours,\n businessHours: params.businessHours,\n onlyWeekdays: params.onlyWeekdays,\n skipDates: toDateArray(params.skipDates),\n }\n : undefined,\n }\n\n return namespace.schedule({\n task: params.jobName,\n input: params.input,\n ...schedule,\n })\n }\n\n public async getJob(jobId: string, queue?: string): Promise<IgniterJobSearchResult | null> {\n const result = await this.core().job.get(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return result ? this.mapJob(result, queue) : null\n }\n\n public async getJobState(jobId: string, queue?: string): Promise<IgniterJobStatus | null> {\n const state = await this.core().job.getState(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return state as any\n }\n\n public async getJobLogs(jobId: string, queue?: string): Promise<IgniterJobsJobLog[]> {\n const logs = await this.core().job.getLogs(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n return logs as any\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n return this.core().job.getProgress(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.retry(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.remove(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n await this.core().job.promote(jobId, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async moveJobToFailed(jobId: string, reason: string, queue?: string): Promise<void> {\n await this.core().job.moveToFailed(jobId, reason, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.retryMany(jobIds, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await this.core().job.removeMany(jobIds, queue ? this.toCoreQueueName(queue) : undefined)\n }\n\n public async getQueueInfo(queue: string): Promise<IgniterJobsQueueInfo | null> {\n const info = await this.core().queues.get(this.toCoreQueueName(queue))\n if (!info) return null\n return this.mapQueueInfo(info)\n }\n\n public async getQueueJobCounts(queue: string): Promise<any> {\n const counts = await this.core().queues.getJobCounts(this.toCoreQueueName(queue))\n return counts as any\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const list = await this.core().queues.list()\n return list.map((q) => this.mapQueueInfo(q))\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n await this.core().queues.pause(this.toCoreQueueName(queue))\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n await this.core().queues.resume(this.toCoreQueueName(queue))\n }\n\n public async drainQueue(queue: string): Promise<number> {\n return this.core().queues.drain(this.toCoreQueueName(queue))\n }\n\n public async cleanQueue(queue: string, options: IgniterJobsQueueCleanOptions): Promise<number> {\n return this.core().queues.clean(this.toCoreQueueName(queue), options as any)\n }\n\n public async obliterateQueue(queue: string, options?: { force?: boolean }): Promise<void> {\n await this.core().queues.obliterate(this.toCoreQueueName(queue), options)\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), { status: ['failed'], limit: 1000 } as any)\n await Promise.all(jobs.map((j) => this.core().job.retry(j.id, this.toCoreQueueName(queue))))\n return jobs.length\n }\n\n public async pauseJobType(queue: string, jobName: string): Promise<void> {\n void queue\n void jobName\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_OPERATION_FAILED',\n message: 'BullMQ backend does not support pausing a single job type; pause the queue or adjust worker filters.',\n })\n }\n\n public async resumeJobType(queue: string, jobName: string): Promise<void> {\n void queue\n void jobName\n throw new IgniterJobsError({\n code: 'JOBS_QUEUE_OPERATION_FAILED',\n message: 'BullMQ backend does not support resuming a single job type; resume the queue or adjust worker filters.',\n })\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n // Minimal implementation: list jobs from a specific queue when provided, otherwise aggregate known queues.\n const queue = filter?.queue as string | undefined\n const status = filter?.status as IgniterJobStatus[] | undefined\n const limit = filter?.limit ?? 100\n const offset = filter?.offset ?? 0\n\n if (queue) {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(queue), { status, limit, offset } as any)\n return jobs.map((j) => this.mapJob(j as any, queue))\n }\n\n const queues = await this.listQueues()\n const results: IgniterJobSearchResult[] = []\n for (const q of queues) {\n const jobs = await this.core().queues.getJobs(this.toCoreQueueName(q.name), { status, limit, offset } as any)\n results.push(...jobs.map((j) => this.mapJob(j as any, q.name)))\n if (results.length >= limit) break\n }\n return results.slice(0, limit)\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const all = await this.listQueues()\n const name = filter?.name as string | undefined\n const isPaused = filter?.isPaused as boolean | undefined\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) => (typeof isPaused === 'boolean' ? q.isPaused === isPaused : true))\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined\n const isRunning = filter?.isRunning as boolean | undefined\n\n const all = Array.from(this.core().getWorkers().values())\n return all\n .filter((w) => {\n if (!queue) return true\n const coreQueue = this.toCoreQueueName(queue)\n const queues = (w as any).config?.queues ?? [(w as any).queueName]\n return Array.isArray(queues) ? queues.includes(coreQueue) : false\n })\n .filter((w) => (typeof isRunning === 'boolean' ? (isRunning ? w.isRunning() : !w.isRunning()) : true))\n .map((w) => this.mapWorker(w))\n }\n\n public async createWorker(config: IgniterJobsWorkerBuilderConfig): Promise<IgniterJobsWorkerHandle> {\n // Ensure jobs/crons are registered in the underlying BullMQ adapter before starting workers.\n await this.executor()\n\n const queuesSource =\n config.queues?.length\n ? config.queues\n : Array.from(new Set([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()]))\n const queues = queuesSource.map((q) => this.toCoreQueueName(q))\n const coreConfig: JobWorkerConfig = {\n queues,\n concurrency: config.concurrency ?? 1,\n limiter: config.limiter as any,\n onActive: config.handlers?.onActive as any,\n onSuccess: config.handlers?.onSuccess as any,\n onFailure: config.handlers?.onFailure as any,\n onIdle: config.handlers?.onIdle as any,\n }\n const handle = await (this.core() as any).worker(coreConfig)\n return this.mapWorker(handle)\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>()\n for (const [id, handle] of this.core().getWorkers()) out.set(id, this.mapWorker(handle))\n return out\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n await this.publisher.publish(channel, JSON.stringify(payload))\n }\n\n public async subscribeEvent(channel: string, handler: IgniterJobsEventHandler): Promise<() => Promise<void>> {\n const set = this.subscribers.get(channel) ?? new Set<(payload: any) => void>()\n const wrapped = (payload: any) => void handler(payload as any)\n set.add(wrapped)\n this.subscribers.set(channel, set)\n\n if (set.size === 1) {\n await this.subscriber.subscribe(channel)\n }\n\n return async () => {\n const current = this.subscribers.get(channel)\n if (!current) return\n current.delete(wrapped)\n if (current.size === 0) {\n this.subscribers.delete(channel)\n await this.subscriber.unsubscribe(channel)\n }\n }\n }\n\n public async shutdown(): Promise<void> {\n await this.subscriber.quit()\n // BullMQ adapter does not expose global shutdown on the core adapter in a single method;\n // queue/worker cleanup is handled by worker close and queue obliterate.\n }\n\n private core(): IgniterJobQueueAdapter<any> {\n if (!this.coreAdapter) {\n // We only need the Redis connection. The wrapped job handlers can create real context.\n this.coreAdapter = createBullMQAdapter({\n store: ({ client: this.redis } as any),\n }) as unknown as IgniterJobQueueAdapter<any>\n }\n\n return this.coreAdapter\n }\n\n private async executor(): Promise<CoreMergedExecutor> {\n if (!this.executorDirty && this.coreExecutor) return this.coreExecutor\n\n const routers: Record<string, JobsRouter<any>> = {}\n const flattened: Record<string, CoreJobDefinition<any, any, any>> = {}\n\n const allQueues = new Set<string>([...this.jobsByQueue.keys(), ...this.cronsByQueue.keys()])\n\n for (const queueName of allQueues) {\n const coreJobs: Record<string, CoreJobDefinition<any, any, any>> = {}\n\n const jobs = this.jobsByQueue.get(queueName)\n if (jobs) {\n for (const [jobName, def] of jobs.entries()) {\n const queue = def.queue ? `${queueName}.${def.queue}` : queueName\n const fullQueue = IgniterJobsPrefix.buildQueueName(queue)\n coreJobs[jobName] = this.toCoreJobDefinition(queueName, jobName, def, fullQueue)\n }\n }\n\n const crons = this.cronsByQueue.get(queueName)\n if (crons) {\n for (const [cronName, def] of crons.entries()) {\n const fullQueue = IgniterJobsPrefix.buildQueueName(queueName)\n coreJobs[cronName] = this.toCoreCronJobDefinition(queueName, cronName, def, fullQueue)\n }\n }\n\n if (Object.keys(coreJobs).length === 0) continue\n\n routers[queueName] = this.core().router({\n jobs: coreJobs as any,\n namespace: queueName,\n })\n\n for (const [jobName, def] of Object.entries(coreJobs)) {\n flattened[`${queueName}.${jobName}`] = def\n }\n }\n\n // Register jobs in bulk so management APIs and workers can resolve handlers.\n await this.core().bulkRegister(flattened as any)\n\n this.coreExecutor = this.core().merge(routers as any) as any\n this.executorDirty = false\n return this.coreExecutor as CoreMergedExecutor\n }\n\n private toCoreQueueName(queueName: string): string {\n return IgniterJobsPrefix.buildQueueName(queueName)\n }\n\n private mapQueueInfo(info: any): IgniterJobsQueueInfo {\n return {\n name: this.fromCoreQueueName(info.name),\n isPaused: info.isPaused,\n jobCounts: info.jobCounts,\n }\n }\n\n private fromCoreQueueName(full: string): string {\n const prefix = `${IgniterJobsPrefix.BASE_PREFIX}:`\n return full.startsWith(prefix) ? full.slice(prefix.length) : full\n }\n\n private mapJob(job: any, queue?: string): IgniterJobSearchResult {\n const q = queue ?? this.fromCoreQueueName(job.metadata?.queue ?? job.queueName ?? '')\n const scope = (job.metadata as any)?.__igniter_jobs_scope\n return {\n id: job.id,\n name: job.name,\n queue: q,\n status: job.status,\n input: job.payload,\n result: job.result,\n error: job.error,\n progress: 0,\n attemptsMade: job.attemptsMade ?? 0,\n priority: job.priority ?? 0,\n createdAt: job.createdAt,\n startedAt: job.processedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope,\n }\n }\n\n private mapWorker(handle: any): IgniterJobsWorkerHandle {\n const queues = (handle as any).config?.queues ?? [(handle as any).queueName]\n return {\n id: handle.id,\n queues: (queues as string[]).map((q) => this.fromCoreQueueName(q)),\n pause: () => handle.pause(),\n resume: () => handle.resume(),\n close: () => handle.close(),\n isRunning: () => handle.isRunning(),\n isPaused: () => handle.isPaused(),\n isClosed: () => handle.isClosed(),\n getMetrics: async () => handle.getMetrics() as IgniterJobsWorkerMetrics,\n }\n }\n\n private toCoreJobDefinition(\n queueName: string,\n jobName: string,\n def: IgniterJobDefinition<any, any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n input: ctx.input as any,\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: jobName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any)\n }\n\n return {\n name: jobName,\n input: def.input as any,\n handler,\n queue: { name: fullQueueName },\n attempts: def.attempts,\n priority: def.priority,\n delay: def.delay,\n removeOnComplete: def.removeOnComplete as any,\n removeOnFail: def.removeOnFail as any,\n metadata: def.metadata as any,\n limiter: def.limiter as any,\n onStart: def.onStart as any,\n onSuccess: def.onSuccess as any,\n onFailure: def.onFailure as any,\n onProgress: def.onProgress as any,\n } as any\n }\n\n private toCoreCronJobDefinition(\n queueName: string,\n cronName: string,\n def: IgniterCronDefinition<any, any>,\n fullQueueName: string,\n ): CoreJobDefinition<any, any, any> {\n const handler = async (ctx: CoreJobExecutionContext<any, any>) => {\n return def.handler({\n context: ctx.context as any,\n job: {\n id: ctx.job.id,\n name: cronName,\n queue: queueName,\n attemptsMade: ctx.job.attemptsMade,\n createdAt: (ctx.job as any).createdAt,\n metadata: ctx.job.metadata,\n },\n scope: (ctx.job.metadata as any)?.__igniter_jobs_scope,\n } as any)\n }\n\n return {\n name: cronName,\n handler,\n queue: { name: fullQueueName },\n repeat: {\n cron: def.cron,\n tz: def.tz,\n limit: def.maxExecutions,\n startDate: def.startDate,\n endDate: def.endDate,\n },\n metadata:\n def.onlyBusinessHours || def.skipWeekends || def.businessHours || def.onlyWeekdays || def.skipDates || (def.startDate && def.endDate)\n ? {\n advancedScheduling: {\n onlyBusinessHours: def.onlyBusinessHours,\n skipWeekends: def.skipWeekends,\n businessHours: def.businessHours,\n skipDates: toDateArray(def.skipDates),\n onlyWeekdays: def.onlyWeekdays,\n between: def.startDate && def.endDate ? [def.startDate, def.endDate] : undefined,\n },\n }\n : undefined,\n } as any\n }\n}\n","/**\n * Generates consistent identifiers for jobs, workers, and schedules.\n */\nexport class IgniterJobsIdGenerator {\n /**\n * Generates a unique identifier with a prefix.\n *\n * @example\n * ```typescript\n * const jobId = IgniterJobsIdGenerator.generate('job')\n * ```\n */\n public static generate(prefix: string): string {\n const now = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 8)\n return `${prefix}_${now}_${random}`\n }\n}\n","/**\n * @fileoverview In-memory adapter for @igniter-js/jobs (tests/dev only)\n * @module @igniter-js/jobs/adapters/memory\n */\n\nimport type {\n IgniterCronDefinition,\n IgniterJobCounts,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from \"../types\";\nimport { IgniterJobsIdGenerator } from \"../utils/id-generator\";\nimport { IgniterJobsError } from \"../errors\";\n\ntype MemoryJob = {\n id: string;\n name: string;\n queue: string;\n input: unknown;\n status: IgniterJobStatus;\n progress: number;\n attemptsMade: number;\n maxAttempts: number;\n priority: number;\n createdAt: Date;\n startedAt?: Date;\n completedAt?: Date;\n result?: unknown;\n error?: string;\n metadata?: Record<string, unknown>;\n scope?: unknown;\n logs: IgniterJobsJobLog[];\n};\n\ntype MemoryWorkerState = {\n id: string;\n queues: string[];\n concurrency: number;\n paused: boolean;\n closed: boolean;\n startedAt: Date;\n metrics: {\n processed: number;\n failed: number;\n totalDuration: number;\n };\n handlers?: IgniterJobsWorkerBuilderConfig[\"handlers\"];\n};\n\n/**\n * Lightweight in-memory adapter used for unit tests and local development.\n *\n * This adapter is not suitable for production use.\n */\nexport class IgniterJobsMemoryAdapter implements IgniterJobsAdapter {\n public readonly client = {\n type: \"memory\" as const,\n };\n\n private readonly jobsById = new Map<string, MemoryJob>();\n private readonly jobsByQueue = new Map<string, string[]>();\n private readonly registeredJobs = new Map<\n string,\n Map<string, IgniterJobDefinition<any, any, any>>\n >();\n private readonly registeredCrons = new Map<\n string,\n Map<string, IgniterCronDefinition<any, any>>\n >();\n\n private readonly workers = new Map<string, MemoryWorkerState>();\n\n private readonly subscribers = new Map<\n string,\n Set<IgniterJobsEventHandler>\n >();\n\n public readonly queues: IgniterJobsQueueManager = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const statuses = filter?.status;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n const results = await this.searchJobs({\n queue: name,\n status: statuses,\n limit,\n offset,\n } as any);\n return results;\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n // Queue-level pause is stored as a special marker job list state.\n // For memory adapter, we model it by a metadata flag in queue info.\n const info = await this.getQueueInfo(name);\n return info?.isPaused ?? false;\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n };\n\n private readonly pausedQueues = new Set<string>();\n\n public static create(): IgniterJobsAdapter {\n return new IgniterJobsMemoryAdapter();\n }\n\n public registerJob(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>,\n ): void {\n const queueJobs =\n this.registeredJobs.get(queueName) ??\n new Map<string, IgniterJobDefinition<any, any, any>>();\n if (queueJobs.has(jobName)) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" already registered for queue \"${queueName}\".`,\n });\n }\n queueJobs.set(jobName, definition);\n this.registeredJobs.set(queueName, queueJobs);\n }\n\n public registerCron(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>,\n ): void {\n const queueCrons =\n this.registeredCrons.get(queueName) ??\n new Map<string, IgniterCronDefinition<any, any>>();\n if (queueCrons.has(cronName)) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" already registered for queue \"${queueName}\".`,\n });\n }\n queueCrons.set(cronName, definition);\n this.registeredCrons.set(queueName, queueCrons);\n }\n\n public async dispatch(\n params: IgniterJobsAdapterDispatchParams,\n ): Promise<string> {\n const jobId = params.jobId ?? IgniterJobsIdGenerator.generate(\"job\");\n const maxAttempts = params.attempts ?? 1;\n\n const metadata = params.metadata ?? {};\n\n const job: MemoryJob = {\n id: jobId,\n name: params.jobName,\n queue: params.queue,\n input: params.input,\n status: this.pausedQueues.has(params.queue)\n ? \"paused\"\n : params.delay && params.delay > 0\n ? \"delayed\"\n : \"waiting\",\n progress: 0,\n attemptsMade: 0,\n maxAttempts,\n priority: params.priority ?? 0,\n createdAt: new Date(),\n metadata: metadata as Record<string, unknown>,\n scope: params.scope,\n logs: [],\n };\n\n this.jobsById.set(jobId, job);\n const queueList = this.jobsByQueue.get(params.queue) ?? [];\n queueList.push(jobId);\n this.jobsByQueue.set(params.queue, queueList);\n\n if (params.delay && params.delay > 0) {\n setTimeout(() => {\n const stored = this.jobsById.get(jobId);\n if (!stored) return;\n if (!this.pausedQueues.has(params.queue)) stored.status = \"waiting\";\n void this.kickWorkers(params.queue);\n }, params.delay);\n return jobId;\n }\n\n void this.kickWorkers(params.queue);\n return jobId;\n }\n\n public async schedule(\n params: IgniterJobsAdapterScheduleParams,\n ): Promise<string> {\n if (params.at) {\n const delay = params.at.getTime() - Date.now();\n if (delay <= 0) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_SCHEDULE\",\n message: \"Scheduled time must be in the future.\",\n });\n }\n return this.dispatch({ ...params, delay });\n }\n if (params.cron || params.every) {\n // Memory adapter does not implement a cron engine. It stores the job as delayed and relies on tests\n // to invoke dispatch manually if needed.\n return this.dispatch({ ...params, delay: params.delay ?? 0 });\n }\n return this.dispatch(params);\n }\n\n public async getJob(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobSearchResult | null> {\n const job = this.jobsById.get(jobId);\n if (!job) return null;\n if (queue && job.queue !== queue) return null;\n return this.toSearchResult(job);\n }\n\n public async getJobState(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobStatus | null> {\n const job = this.jobsById.get(jobId);\n if (!job) return null;\n if (queue && job.queue !== queue) return null;\n return job.status;\n }\n\n public async getJobLogs(\n jobId: string,\n queue?: string,\n ): Promise<IgniterJobsJobLog[]> {\n const job = this.jobsById.get(jobId);\n if (!job) return [];\n if (queue && job.queue !== queue) return [];\n return job.logs;\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n const job = this.jobsById.get(jobId);\n if (!job) return 0;\n if (queue && job.queue !== queue) return 0;\n return job.progress;\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found in queue \"${queue}\".`,\n });\n }\n job.status = \"waiting\";\n job.error = undefined;\n job.completedAt = undefined;\n job.progress = 0;\n void this.kickWorkers(job.queue);\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) return;\n if (queue && job.queue !== queue) return;\n this.jobsById.delete(jobId);\n const list = this.jobsByQueue.get(job.queue);\n if (list)\n this.jobsByQueue.set(\n job.queue,\n list.filter((id) => id !== jobId),\n );\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found in queue \"${queue}\".`,\n });\n }\n if (job.status === \"delayed\" || job.status === \"paused\") {\n job.status = this.pausedQueues.has(job.queue) ? \"paused\" : \"waiting\";\n void this.kickWorkers(job.queue);\n }\n }\n\n public async moveJobToFailed(\n jobId: string,\n reason: string,\n queue?: string,\n ): Promise<void> {\n const job = this.jobsById.get(jobId);\n if (!job) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found.`,\n });\n }\n if (queue && job.queue !== queue) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found in queue \"${queue}\".`,\n });\n }\n job.status = \"failed\";\n job.error = reason;\n job.completedAt = new Date();\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.retryJob(id, queue)));\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.removeJob(id, queue)));\n }\n\n public async getQueueInfo(\n queue: string,\n ): Promise<IgniterJobsQueueInfo | null> {\n const counts = await this.getQueueJobCounts(queue);\n return {\n name: queue,\n isPaused: this.pausedQueues.has(queue),\n jobCounts: counts,\n };\n }\n\n public async getQueueJobCounts(queue: string): Promise<IgniterJobCounts> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n const counts: IgniterJobCounts = {\n waiting: 0,\n active: 0,\n completed: 0,\n failed: 0,\n delayed: 0,\n paused: 0,\n };\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status in counts) {\n (counts as any)[job.status]++;\n }\n }\n return counts;\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n const queues = Array.from(\n new Set([\n ...this.jobsByQueue.keys(),\n ...this.registeredJobs.keys(),\n ...this.registeredCrons.keys(),\n ]),\n );\n const result: IgniterJobsQueueInfo[] = [];\n for (const q of queues) {\n result.push((await this.getQueueInfo(q))!);\n }\n return result;\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n this.pausedQueues.add(queue);\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"waiting\") job.status = \"paused\";\n }\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n this.pausedQueues.delete(queue);\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"paused\") job.status = \"waiting\";\n }\n void this.kickWorkers(queue);\n }\n\n public async drainQueue(queue: string): Promise<number> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n let removed = 0;\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"waiting\" || job.status === \"paused\") {\n this.jobsById.delete(id);\n removed++;\n }\n }\n this.jobsByQueue.set(\n queue,\n jobIds.filter((id) => this.jobsById.has(id)),\n );\n return removed;\n }\n\n public async cleanQueue(\n queue: string,\n options: IgniterJobsQueueCleanOptions,\n ): Promise<number> {\n const statuses = Array.isArray(options.status)\n ? options.status\n : [options.status];\n const olderThan = options.olderThan ?? 0;\n const limit = options.limit ?? Number.POSITIVE_INFINITY;\n\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n const now = Date.now();\n let cleaned = 0;\n\n for (const id of [...jobIds]) {\n if (cleaned >= limit) break;\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (!statuses.includes(job.status)) continue;\n const ageMs = now - job.createdAt.getTime();\n if (ageMs < olderThan) continue;\n this.jobsById.delete(id);\n cleaned++;\n }\n\n this.jobsByQueue.set(\n queue,\n jobIds.filter((id) => this.jobsById.has(id)),\n );\n return cleaned;\n }\n\n public async obliterateQueue(\n queue: string,\n options?: { force?: boolean },\n ): Promise<void> {\n void options;\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) this.jobsById.delete(id);\n this.jobsByQueue.delete(queue);\n this.registeredJobs.delete(queue);\n this.registeredCrons.delete(queue);\n this.pausedQueues.delete(queue);\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n let retried = 0;\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.status === \"failed\") {\n await this.retryJob(id, queue);\n retried++;\n }\n }\n return retried;\n }\n\n public async pauseJobType(queue: string, jobName: string): Promise<void> {\n // Memory adapter supports job-type pause by blocking processing inside workers.\n // We model it by marking matching waiting jobs as paused.\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.name === jobName && job.status === \"waiting\")\n job.status = \"paused\";\n }\n }\n\n public async resumeJobType(queue: string, jobName: string): Promise<void> {\n const jobIds = this.jobsByQueue.get(queue) ?? [];\n for (const id of jobIds) {\n const job = this.jobsById.get(id);\n if (!job) continue;\n if (job.name === jobName && job.status === \"paused\")\n job.status = \"waiting\";\n }\n void this.kickWorkers(queue);\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n const queue = filter?.queue as string | undefined;\n const statuses: IgniterJobStatus[] | undefined = filter?.status;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n\n const all = Array.from(this.jobsById.values())\n .filter((j) => (queue ? j.queue === queue : true))\n .filter((j) => (statuses ? statuses.includes(j.status) : true))\n .sort(\n (a, b) =>\n b.priority - a.priority ||\n a.createdAt.getTime() - b.createdAt.getTime(),\n );\n\n return all.slice(offset, offset + limit).map((j) => this.toSearchResult(j));\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const name = filter?.name as string | undefined;\n const isPaused = filter?.isPaused as boolean | undefined;\n const all = await this.listQueues();\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) =>\n typeof isPaused === \"boolean\" ? q.isPaused === isPaused : true,\n );\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined;\n const isRunning = filter?.isRunning as boolean | undefined;\n return Array.from(this.workers.values())\n .filter((w) => (queue ? w.queues.includes(queue) : true))\n .filter((w) =>\n typeof isRunning === \"boolean\"\n ? isRunning\n ? !w.closed\n : w.closed\n : true,\n )\n .map((w) => this.toWorkerHandle(w));\n }\n\n public async createWorker(\n config: IgniterJobsWorkerBuilderConfig,\n ): Promise<IgniterJobsWorkerHandle> {\n const workerId = IgniterJobsIdGenerator.generate(\"worker\");\n const state: MemoryWorkerState = {\n id: workerId,\n queues: config.queues ?? [],\n concurrency: config.concurrency ?? 1,\n paused: false,\n closed: false,\n startedAt: new Date(),\n metrics: { processed: 0, failed: 0, totalDuration: 0 },\n handlers: config.handlers,\n };\n this.workers.set(workerId, state);\n\n // Kick initial processing.\n for (const q of state.queues) void this.kickWorkers(q);\n\n return this.toWorkerHandle(state);\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>();\n for (const [id, state] of this.workers)\n out.set(id, this.toWorkerHandle(state));\n return out;\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n const handlers = this.subscribers.get(channel);\n if (!handlers) return;\n await Promise.all(Array.from(handlers).map(async (h) => h(payload as any)));\n }\n\n public async subscribeEvent(\n channel: string,\n handler: IgniterJobsEventHandler,\n ): Promise<() => Promise<void>> {\n const set =\n this.subscribers.get(channel) ?? new Set<IgniterJobsEventHandler>();\n set.add(handler);\n this.subscribers.set(channel, set);\n\n return async () => {\n const current = this.subscribers.get(channel);\n if (!current) return;\n current.delete(handler);\n if (current.size === 0) this.subscribers.delete(channel);\n };\n }\n\n public async shutdown(): Promise<void> {\n this.workers.clear();\n this.subscribers.clear();\n }\n\n private toSearchResult(job: MemoryJob): IgniterJobSearchResult {\n return {\n id: job.id,\n name: job.name,\n queue: job.queue,\n status: job.status,\n input: job.input,\n result: job.result,\n error: job.error,\n progress: job.progress,\n attemptsMade: job.attemptsMade,\n priority: job.priority,\n createdAt: job.createdAt,\n startedAt: job.startedAt,\n completedAt: job.completedAt,\n metadata: job.metadata,\n scope: job.scope as any,\n };\n }\n\n private toWorkerHandle(worker: MemoryWorkerState): IgniterJobsWorkerHandle {\n return {\n id: worker.id,\n queues: worker.queues,\n pause: async () => {\n worker.paused = true;\n },\n resume: async () => {\n worker.paused = false;\n for (const q of worker.queues) void this.kickWorkers(q);\n },\n close: async () => {\n worker.closed = true;\n },\n isRunning: () => !worker.closed && !worker.paused,\n isPaused: () => worker.paused,\n isClosed: () => worker.closed,\n getMetrics: async () => this.toWorkerMetrics(worker),\n };\n }\n\n private toWorkerMetrics(worker: MemoryWorkerState): IgniterJobsWorkerMetrics {\n const uptime = Date.now() - worker.startedAt.getTime();\n const processed = worker.metrics.processed;\n return {\n processed,\n failed: worker.metrics.failed,\n avgDuration: processed > 0 ? worker.metrics.totalDuration / processed : 0,\n concurrency: worker.concurrency,\n uptime,\n };\n }\n\n private async kickWorkers(queue: string): Promise<void> {\n if (this.pausedQueues.has(queue)) return;\n const relevant = Array.from(this.workers.values()).filter(\n (w) =>\n !w.closed &&\n !w.paused &&\n (w.queues.length === 0 || w.queues.includes(queue)),\n );\n if (relevant.length === 0) return;\n\n for (const w of relevant) {\n void this.processLoop(w, queue);\n }\n }\n\n private async processLoop(\n worker: MemoryWorkerState,\n queue: string,\n ): Promise<void> {\n if (worker.closed || worker.paused) return;\n const concurrency = Math.max(1, worker.concurrency);\n\n const running = (worker as any).__running as number | undefined;\n const currentRunning = running ?? 0;\n if (currentRunning >= concurrency) return;\n (worker as any).__running = currentRunning + 1;\n\n try {\n const next = this.nextJob(queue);\n if (!next) return;\n await this.processJob(worker, next);\n } finally {\n (worker as any).__running = ((worker as any).__running as number) - 1;\n // Continue draining if more work exists.\n if (this.nextJob(queue)) void this.processLoop(worker, queue);\n else if (worker.handlers?.onIdle) await worker.handlers.onIdle();\n }\n }\n\n private nextJob(queue: string): MemoryJob | null {\n const ids = this.jobsByQueue.get(queue) ?? [];\n const candidates = ids\n .map((id) => this.jobsById.get(id))\n .filter((j): j is MemoryJob => Boolean(j))\n .filter((j) => j.status === \"waiting\")\n .sort(\n (a, b) =>\n b.priority - a.priority ||\n a.createdAt.getTime() - b.createdAt.getTime(),\n );\n return candidates[0] ?? null;\n }\n\n private async processJob(\n worker: MemoryWorkerState,\n job: MemoryJob,\n ): Promise<void> {\n if (this.pausedQueues.has(job.queue)) {\n job.status = \"paused\";\n return;\n }\n\n job.status = \"active\";\n job.startedAt = new Date();\n job.attemptsMade += 1;\n job.logs.push({\n timestamp: new Date(),\n level: \"info\",\n message: \"Job started\",\n });\n\n if (worker.handlers?.onActive)\n await worker.handlers.onActive({ job: this.toSearchResult(job) });\n\n const start = Date.now();\n\n try {\n const definition = this.registeredJobs.get(job.queue)?.get(job.name);\n if (!definition) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_REGISTERED\",\n message: `Job \"${job.name}\" is not registered for queue \"${job.queue}\".`,\n });\n }\n\n if (definition.onStart) {\n await definition.onStart({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n },\n scope: job.scope as any,\n startedAt: job.startedAt,\n } as any);\n }\n\n const result = await definition.handler({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n },\n scope: job.scope as any,\n } as any);\n\n const duration = Date.now() - start;\n job.status = \"completed\";\n job.completedAt = new Date();\n job.result = result;\n job.progress = 100;\n job.logs.push({\n timestamp: new Date(),\n level: \"info\",\n message: `Job completed in ${duration}ms`,\n });\n\n worker.metrics.processed += 1;\n worker.metrics.totalDuration += duration;\n\n if (definition.onSuccess) {\n await definition.onSuccess({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n },\n scope: job.scope as any,\n result,\n duration,\n } as any);\n }\n\n if (worker.handlers?.onSuccess)\n await worker.handlers.onSuccess({\n job: this.toSearchResult(job),\n result,\n });\n } catch (error: any) {\n const duration = Date.now() - start;\n job.error = error?.message ?? String(error);\n job.logs.push({\n timestamp: new Date(),\n level: \"error\",\n message: job.error ?? \"Unknown error\",\n });\n\n const isFinalAttempt = job.attemptsMade >= job.maxAttempts;\n if (isFinalAttempt) {\n job.status = \"failed\";\n job.completedAt = new Date();\n worker.metrics.failed += 1;\n\n const definition = this.registeredJobs.get(job.queue)?.get(job.name);\n if (definition?.onFailure) {\n await definition.onFailure({\n input: job.input as any,\n context: {} as any,\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade,\n metadata: job.metadata,\n },\n scope: job.scope as any,\n error,\n isFinalAttempt: true,\n } as any);\n }\n\n if (worker.handlers?.onFailure)\n await worker.handlers.onFailure({\n job: this.toSearchResult(job),\n error,\n });\n } else {\n job.status = \"waiting\";\n void this.kickWorkers(job.queue);\n }\n }\n }\n}\n","/**\n * @fileoverview SQLite adapter for @igniter-js/jobs (local/desktop/CLI environments)\n * @module @igniter-js/jobs/adapters/sqlite\n *\n * This adapter provides persistent job queue storage using SQLite, ideal for:\n * - Desktop applications (Tauri, Electron)\n * - CLI tools\n * - MCP Servers\n * - Local development\n * - Edge/embedded environments\n */\n\nimport type {\n IgniterCronDefinition,\n IgniterJobCounts,\n IgniterJobDefinition,\n IgniterJobSearchResult,\n IgniterJobStatus,\n IgniterJobsAdapter,\n IgniterJobsAdapterDispatchParams,\n IgniterJobsAdapterScheduleParams,\n IgniterJobsEventHandler,\n IgniterJobsJobLog,\n IgniterJobsQueueCleanOptions,\n IgniterJobsQueueInfo,\n IgniterJobsQueueManager,\n IgniterJobsWorkerBuilderConfig,\n IgniterJobsWorkerHandle,\n IgniterJobsWorkerMetrics,\n} from \"../types\";\nimport { IgniterJobsIdGenerator } from \"../utils/id-generator\";\nimport { IgniterJobsError } from \"../errors\";\n\n/**\n * Configuration options for the SQLite adapter.\n */\nexport interface IgniterJobsSQLiteAdapterOptions {\n /**\n * Path to the SQLite database file.\n * Use `:memory:` for an in-memory database (useful for testing).\n * @example './data/jobs.sqlite'\n * @example ':memory:'\n */\n path: string;\n\n /**\n * Interval in milliseconds for the worker polling loop.\n * Lower values mean faster job pickup but higher CPU usage.\n * @default 500\n */\n pollingInterval?: number;\n\n /**\n * Whether to enable WAL mode for better concurrent read/write performance.\n * @default true\n */\n enableWAL?: boolean;\n}\n\ntype SQLiteDatabase = {\n exec(sql: string): void;\n prepare<T = unknown>(sql: string): SQLiteStatement<T>;\n close(): void;\n};\n\ntype SQLiteStatement<T = unknown> = {\n run(...params: unknown[]): { changes: number; lastInsertRowid: number | bigint };\n get(...params: unknown[]): T | undefined;\n all(...params: unknown[]): T[];\n};\n\ntype JobRow = {\n id: string;\n name: string;\n queue: string;\n input: string;\n status: IgniterJobStatus;\n progress: number;\n attempts_made: number;\n max_attempts: number;\n priority: number;\n created_at: string;\n started_at: string | null;\n completed_at: string | null;\n scheduled_at: string | null;\n result: string | null;\n error: string | null;\n metadata: string | null;\n scope: string | null;\n};\n\ntype LogRow = {\n id: number;\n job_id: string;\n timestamp: string;\n level: \"info\" | \"warn\" | \"error\";\n message: string;\n};\n\ntype WorkerState = {\n id: string;\n queues: string[];\n concurrency: number;\n paused: boolean;\n closed: boolean;\n startedAt: Date;\n metrics: {\n processed: number;\n failed: number;\n totalDuration: number;\n };\n handlers?: IgniterJobsWorkerBuilderConfig[\"handlers\"];\n pollingTimer?: ReturnType<typeof setInterval>;\n activeJobs: number;\n};\n\n/**\n * SQLite-based adapter for local/desktop/CLI job queue persistence.\n *\n * Features:\n * - Full persistence across process restarts\n * - Zero external dependencies (SQLite is embedded)\n * - WAL mode for concurrent access\n * - Automatic schema migrations\n * - Compatible with Tauri, Electron, Node.js CLIs\n *\n * @example\n * ```ts\n * const adapter = IgniterJobsSQLiteAdapter.create({\n * path: './data/jobs.sqlite'\n * });\n *\n * const jobs = IgniterJobs.create()\n * .withAdapter(adapter)\n * .build();\n * ```\n */\nexport class IgniterJobsSQLiteAdapter implements IgniterJobsAdapter {\n public readonly client: { type: \"sqlite\"; path: string };\n\n private db: SQLiteDatabase;\n private readonly options: Required<IgniterJobsSQLiteAdapterOptions>;\n\n private readonly registeredJobs = new Map<\n string,\n Map<string, IgniterJobDefinition<any, any, any>>\n >();\n private readonly registeredCrons = new Map<\n string,\n Map<string, IgniterCronDefinition<any, any>>\n >();\n\n private readonly workers = new Map<string, WorkerState>();\n\n private readonly subscribers = new Map<\n string,\n Set<IgniterJobsEventHandler>\n >();\n\n private readonly pausedQueues = new Set<string>();\n\n public readonly queues: IgniterJobsQueueManager = {\n list: async () => this.listQueues(),\n get: async (name) => this.getQueueInfo(name),\n getJobCounts: async (name) => this.getQueueJobCounts(name),\n getJobs: async (name, filter) => {\n const statuses = filter?.status;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n const results = await this.searchJobs({\n queue: name,\n status: statuses,\n limit,\n offset,\n } as any);\n return results;\n },\n pause: async (name) => this.pauseQueue(name),\n resume: async (name) => this.resumeQueue(name),\n isPaused: async (name) => {\n const info = await this.getQueueInfo(name);\n return info?.isPaused ?? false;\n },\n drain: async (name) => this.drainQueue(name),\n clean: async (name, options) => this.cleanQueue(name, options),\n obliterate: async (name, options) => this.obliterateQueue(name, options),\n };\n\n private constructor(options: IgniterJobsSQLiteAdapterOptions) {\n this.options = {\n path: options.path,\n pollingInterval: options.pollingInterval ?? 500,\n enableWAL: options.enableWAL ?? true,\n };\n\n this.client = {\n type: \"sqlite\",\n path: this.options.path,\n };\n\n // Dynamic import of better-sqlite3\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const Database = require(\"better-sqlite3\");\n this.db = new Database(this.options.path) as SQLiteDatabase;\n\n this.initializeSchema();\n }\n\n /**\n * Creates a new SQLite adapter instance.\n *\n * @param options - Configuration options\n * @returns A new adapter instance\n *\n * @example\n * ```ts\n * // File-based database (persistent)\n * const adapter = IgniterJobsSQLiteAdapter.create({\n * path: './data/jobs.sqlite'\n * });\n *\n * // In-memory database (for testing)\n * const testAdapter = IgniterJobsSQLiteAdapter.create({\n * path: ':memory:'\n * });\n * ```\n */\n public static create(\n options: IgniterJobsSQLiteAdapterOptions\n ): IgniterJobsAdapter {\n return new IgniterJobsSQLiteAdapter(options);\n }\n\n private initializeSchema(): void {\n // Enable WAL mode for better concurrent performance\n if (this.options.enableWAL) {\n this.db.exec(\"PRAGMA journal_mode = WAL;\");\n }\n\n // Jobs table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS jobs (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n queue TEXT NOT NULL,\n input TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'waiting',\n progress REAL NOT NULL DEFAULT 0,\n attempts_made INTEGER NOT NULL DEFAULT 0,\n max_attempts INTEGER NOT NULL DEFAULT 1,\n priority INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT,\n scheduled_at TEXT,\n result TEXT,\n error TEXT,\n metadata TEXT,\n scope TEXT\n );\n\n CREATE INDEX IF NOT EXISTS idx_jobs_queue_status ON jobs(queue, status);\n CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status);\n CREATE INDEX IF NOT EXISTS idx_jobs_scheduled_at ON jobs(scheduled_at);\n CREATE INDEX IF NOT EXISTS idx_jobs_priority ON jobs(priority DESC, created_at ASC);\n `);\n\n // Logs table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS job_logs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_id TEXT NOT NULL,\n timestamp TEXT NOT NULL,\n level TEXT NOT NULL,\n message TEXT NOT NULL,\n FOREIGN KEY (job_id) REFERENCES jobs(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_job_logs_job_id ON job_logs(job_id);\n `);\n\n // Paused queues table\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS paused_queues (\n name TEXT PRIMARY KEY\n );\n `);\n\n // Load paused queues from database\n const pausedRows = this.db.prepare<{ name: string }>(\n \"SELECT name FROM paused_queues\"\n ).all();\n for (const row of pausedRows) {\n this.pausedQueues.add(row.name);\n }\n }\n\n public registerJob(\n queueName: string,\n jobName: string,\n definition: IgniterJobDefinition<any, any, any>\n ): void {\n const queueJobs =\n this.registeredJobs.get(queueName) ??\n new Map<string, IgniterJobDefinition<any, any, any>>();\n if (queueJobs.has(jobName)) {\n throw new IgniterJobsError({\n code: \"JOBS_DUPLICATE_JOB\",\n message: `Job \"${jobName}\" already registered for queue \"${queueName}\".`,\n });\n }\n queueJobs.set(jobName, definition);\n this.registeredJobs.set(queueName, queueJobs);\n }\n\n public registerCron(\n queueName: string,\n cronName: string,\n definition: IgniterCronDefinition<any, any>\n ): void {\n const queueCrons =\n this.registeredCrons.get(queueName) ??\n new Map<string, IgniterCronDefinition<any, any>>();\n if (queueCrons.has(cronName)) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_CRON\",\n message: `Cron \"${cronName}\" already registered for queue \"${queueName}\".`,\n });\n }\n queueCrons.set(cronName, definition);\n this.registeredCrons.set(queueName, queueCrons);\n }\n\n public async dispatch(\n params: IgniterJobsAdapterDispatchParams\n ): Promise<string> {\n const jobId = params.jobId ?? IgniterJobsIdGenerator.generate(\"job\");\n const maxAttempts = params.attempts ?? 1;\n const now = new Date();\n\n let status: IgniterJobStatus = \"waiting\";\n let scheduledAt: Date | null = null;\n\n if (this.pausedQueues.has(params.queue)) {\n status = \"paused\";\n } else if (params.delay && params.delay > 0) {\n status = \"delayed\";\n scheduledAt = new Date(now.getTime() + params.delay);\n }\n\n const stmt = this.db.prepare(`\n INSERT INTO jobs (\n id, name, queue, input, status, progress, attempts_made, max_attempts,\n priority, created_at, scheduled_at, metadata, scope\n ) VALUES (?, ?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n jobId,\n params.jobName,\n params.queue,\n JSON.stringify(params.input ?? {}),\n status,\n maxAttempts,\n params.priority ?? 0,\n now.toISOString(),\n scheduledAt?.toISOString() ?? null,\n params.metadata ? JSON.stringify(params.metadata) : null,\n params.scope ? JSON.stringify(params.scope) : null\n );\n\n // If delayed, schedule promotion\n if (params.delay && params.delay > 0) {\n setTimeout(() => {\n this.promoteDelayedJob(jobId, params.queue);\n }, params.delay);\n }\n\n return jobId;\n }\n\n private promoteDelayedJob(jobId: string, queue: string): void {\n if (this.pausedQueues.has(queue)) return;\n\n const stmt = this.db.prepare(`\n UPDATE jobs SET status = 'waiting', scheduled_at = NULL\n WHERE id = ? AND status = 'delayed'\n `);\n stmt.run(jobId);\n }\n\n public async schedule(\n params: IgniterJobsAdapterScheduleParams\n ): Promise<string> {\n if (params.at) {\n const delay = params.at.getTime() - Date.now();\n if (delay <= 0) {\n throw new IgniterJobsError({\n code: \"JOBS_INVALID_SCHEDULE\",\n message: \"Scheduled time must be in the future.\",\n });\n }\n return this.dispatch({ ...params, delay });\n }\n if (params.cron || params.every) {\n // SQLite adapter doesn't implement a cron engine.\n // Store as delayed and rely on external cron setup if needed.\n return this.dispatch({ ...params, delay: params.delay ?? 0 });\n }\n return this.dispatch(params);\n }\n\n public async getJob(\n jobId: string,\n queue?: string\n ): Promise<IgniterJobSearchResult | null> {\n let sql = \"SELECT * FROM jobs WHERE id = ?\";\n const params: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n params.push(queue);\n }\n\n const row = this.db.prepare<JobRow>(sql).get(...params);\n if (!row) return null;\n return this.rowToSearchResult(row);\n }\n\n public async getJobState(\n jobId: string,\n queue?: string\n ): Promise<IgniterJobStatus | null> {\n let sql = \"SELECT status FROM jobs WHERE id = ?\";\n const params: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n params.push(queue);\n }\n\n const row = this.db.prepare<{ status: IgniterJobStatus }>(sql).get(...params);\n return row?.status ?? null;\n }\n\n public async getJobLogs(\n jobId: string,\n queue?: string\n ): Promise<IgniterJobsJobLog[]> {\n // Verify job exists and belongs to queue if specified\n if (queue) {\n const job = await this.getJob(jobId, queue);\n if (!job) return [];\n }\n\n const rows = this.db\n .prepare<LogRow>(\"SELECT * FROM job_logs WHERE job_id = ? ORDER BY timestamp ASC\")\n .all(jobId);\n\n return rows.map((row) => ({\n timestamp: new Date(row.timestamp),\n level: row.level,\n message: row.message,\n }));\n }\n\n public async getJobProgress(jobId: string, queue?: string): Promise<number> {\n let sql = \"SELECT progress FROM jobs WHERE id = ?\";\n const params: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n params.push(queue);\n }\n\n const row = this.db.prepare<{ progress: number }>(sql).get(...params);\n return row?.progress ?? 0;\n }\n\n public async retryJob(jobId: string, queue?: string): Promise<void> {\n let sql = \"SELECT id FROM jobs WHERE id = ?\";\n const checkParams: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n checkParams.push(queue);\n }\n\n const exists = this.db.prepare<{ id: string }>(sql).get(...checkParams);\n if (!exists) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found${queue ? ` in queue \"${queue}\"` : \"\"}.`,\n });\n }\n\n let updateSql = \"UPDATE jobs SET status = 'waiting', error = NULL, completed_at = NULL, progress = 0 WHERE id = ?\";\n const updateParams: unknown[] = [jobId];\n\n if (queue) {\n updateSql = updateSql.replace(\"WHERE id = ?\", \"WHERE id = ? AND queue = ?\");\n updateParams.push(queue);\n }\n\n this.db.prepare(updateSql).run(...updateParams);\n }\n\n public async removeJob(jobId: string, queue?: string): Promise<void> {\n let sql = \"DELETE FROM jobs WHERE id = ?\";\n const params: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n params.push(queue);\n }\n\n this.db.prepare(sql).run(...params);\n }\n\n public async promoteJob(jobId: string, queue?: string): Promise<void> {\n let sql = \"SELECT id, status, queue FROM jobs WHERE id = ?\";\n const checkParams: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n checkParams.push(queue);\n }\n\n const row = this.db.prepare<{ id: string; status: string; queue: string }>(sql).get(...checkParams);\n if (!row) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found${queue ? ` in queue \"${queue}\"` : \"\"}.`,\n });\n }\n\n if (row.status === \"delayed\" || row.status === \"paused\") {\n const newStatus = this.pausedQueues.has(row.queue) ? \"paused\" : \"waiting\";\n this.db.prepare(\"UPDATE jobs SET status = ?, scheduled_at = NULL WHERE id = ?\").run(newStatus, jobId);\n }\n }\n\n public async moveJobToFailed(\n jobId: string,\n reason: string,\n queue?: string\n ): Promise<void> {\n let sql = \"SELECT id FROM jobs WHERE id = ?\";\n const checkParams: unknown[] = [jobId];\n\n if (queue) {\n sql += \" AND queue = ?\";\n checkParams.push(queue);\n }\n\n const exists = this.db.prepare<{ id: string }>(sql).get(...checkParams);\n if (!exists) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_FOUND\",\n message: `Job \"${jobId}\" not found${queue ? ` in queue \"${queue}\"` : \"\"}.`,\n });\n }\n\n this.db.prepare(`\n UPDATE jobs SET status = 'failed', error = ?, completed_at = ?\n WHERE id = ?\n `).run(reason, new Date().toISOString(), jobId);\n }\n\n public async retryManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.retryJob(id, queue)));\n }\n\n public async removeManyJobs(jobIds: string[], queue?: string): Promise<void> {\n await Promise.all(jobIds.map((id) => this.removeJob(id, queue)));\n }\n\n public async getQueueInfo(\n queue: string\n ): Promise<IgniterJobsQueueInfo | null> {\n const counts = await this.getQueueJobCounts(queue);\n return {\n name: queue,\n isPaused: this.pausedQueues.has(queue),\n jobCounts: counts,\n };\n }\n\n public async getQueueJobCounts(queue: string): Promise<IgniterJobCounts> {\n const counts: IgniterJobCounts = {\n waiting: 0,\n active: 0,\n completed: 0,\n failed: 0,\n delayed: 0,\n paused: 0,\n };\n\n const rows = this.db\n .prepare<{ status: IgniterJobStatus; count: number }>(\n \"SELECT status, COUNT(*) as count FROM jobs WHERE queue = ? GROUP BY status\"\n )\n .all(queue);\n\n for (const row of rows) {\n if (row.status in counts) {\n (counts as any)[row.status] = row.count;\n }\n }\n\n return counts;\n }\n\n public async listQueues(): Promise<IgniterJobsQueueInfo[]> {\n // Get queues from jobs table\n const jobQueues = this.db\n .prepare<{ queue: string }>(\"SELECT DISTINCT queue FROM jobs\")\n .all()\n .map((r) => r.queue);\n\n // Combine with registered job queues\n const allQueues = new Set([\n ...jobQueues,\n ...this.registeredJobs.keys(),\n ...this.registeredCrons.keys(),\n ]);\n\n const result: IgniterJobsQueueInfo[] = [];\n for (const q of allQueues) {\n const info = await this.getQueueInfo(q);\n if (info) result.push(info);\n }\n return result;\n }\n\n public async pauseQueue(queue: string): Promise<void> {\n this.pausedQueues.add(queue);\n this.db.prepare(\"INSERT OR IGNORE INTO paused_queues (name) VALUES (?)\").run(queue);\n\n // Mark waiting jobs as paused\n this.db.prepare(\n \"UPDATE jobs SET status = 'paused' WHERE queue = ? AND status = 'waiting'\"\n ).run(queue);\n }\n\n public async resumeQueue(queue: string): Promise<void> {\n this.pausedQueues.delete(queue);\n this.db.prepare(\"DELETE FROM paused_queues WHERE name = ?\").run(queue);\n\n // Mark paused jobs as waiting\n this.db.prepare(\n \"UPDATE jobs SET status = 'waiting' WHERE queue = ? AND status = 'paused'\"\n ).run(queue);\n }\n\n public async drainQueue(queue: string): Promise<number> {\n const result = this.db.prepare(\n \"DELETE FROM jobs WHERE queue = ? AND status IN ('waiting', 'paused')\"\n ).run(queue);\n return result.changes;\n }\n\n public async cleanQueue(\n queue: string,\n options: IgniterJobsQueueCleanOptions\n ): Promise<number> {\n const statuses = Array.isArray(options.status)\n ? options.status\n : [options.status];\n const olderThan = options.olderThan ?? 0;\n const limit = options.limit ?? Number.POSITIVE_INFINITY;\n\n const cutoffTime = new Date(Date.now() - olderThan).toISOString();\n const statusPlaceholders = statuses.map(() => \"?\").join(\", \");\n\n let sql = `\n DELETE FROM jobs WHERE id IN (\n SELECT id FROM jobs\n WHERE queue = ? AND status IN (${statusPlaceholders}) AND created_at < ?\n ORDER BY created_at ASC\n LIMIT ?\n )\n `;\n\n const result = this.db.prepare(sql).run(\n queue,\n ...statuses,\n cutoffTime,\n limit === Number.POSITIVE_INFINITY ? -1 : limit\n );\n\n return result.changes;\n }\n\n public async obliterateQueue(\n queue: string,\n _options?: { force?: boolean }\n ): Promise<void> {\n this.db.prepare(\"DELETE FROM jobs WHERE queue = ?\").run(queue);\n this.registeredJobs.delete(queue);\n this.registeredCrons.delete(queue);\n this.pausedQueues.delete(queue);\n this.db.prepare(\"DELETE FROM paused_queues WHERE name = ?\").run(queue);\n }\n\n public async retryAllInQueue(queue: string): Promise<number> {\n const result = this.db.prepare(`\n UPDATE jobs SET status = 'waiting', error = NULL, completed_at = NULL, progress = 0\n WHERE queue = ? AND status = 'failed'\n `).run(queue);\n return result.changes;\n }\n\n public async pauseJobType(queue: string, jobName: string): Promise<void> {\n this.db.prepare(\n \"UPDATE jobs SET status = 'paused' WHERE queue = ? AND name = ? AND status = 'waiting'\"\n ).run(queue, jobName);\n }\n\n public async resumeJobType(queue: string, jobName: string): Promise<void> {\n this.db.prepare(\n \"UPDATE jobs SET status = 'waiting' WHERE queue = ? AND name = ? AND status = 'paused'\"\n ).run(queue, jobName);\n }\n\n public async searchJobs(filter: any): Promise<IgniterJobSearchResult[]> {\n const queue = filter?.queue as string | undefined;\n const statuses: IgniterJobStatus[] | undefined = filter?.status;\n const limit = filter?.limit ?? 100;\n const offset = filter?.offset ?? 0;\n\n let sql = \"SELECT * FROM jobs WHERE 1=1\";\n const params: unknown[] = [];\n\n if (queue) {\n sql += \" AND queue = ?\";\n params.push(queue);\n }\n\n if (statuses && statuses.length > 0) {\n const placeholders = statuses.map(() => \"?\").join(\", \");\n sql += ` AND status IN (${placeholders})`;\n params.push(...statuses);\n }\n\n sql += \" ORDER BY priority DESC, created_at ASC LIMIT ? OFFSET ?\";\n params.push(limit, offset);\n\n const rows = this.db.prepare<JobRow>(sql).all(...params);\n return rows.map((row) => this.rowToSearchResult(row));\n }\n\n public async searchQueues(filter: any): Promise<IgniterJobsQueueInfo[]> {\n const name = filter?.name as string | undefined;\n const isPaused = filter?.isPaused as boolean | undefined;\n const all = await this.listQueues();\n return all\n .filter((q) => (name ? q.name.includes(name) : true))\n .filter((q) =>\n typeof isPaused === \"boolean\" ? q.isPaused === isPaused : true\n );\n }\n\n public async searchWorkers(filter: any): Promise<IgniterJobsWorkerHandle[]> {\n const queue = filter?.queue as string | undefined;\n const isRunning = filter?.isRunning as boolean | undefined;\n return Array.from(this.workers.values())\n .filter((w) => (queue ? w.queues.includes(queue) : true))\n .filter((w) =>\n typeof isRunning === \"boolean\"\n ? isRunning\n ? !w.closed\n : w.closed\n : true\n )\n .map((w) => this.toWorkerHandle(w));\n }\n\n public async createWorker(\n config: IgniterJobsWorkerBuilderConfig\n ): Promise<IgniterJobsWorkerHandle> {\n const workerId = IgniterJobsIdGenerator.generate(\"worker\");\n const state: WorkerState = {\n id: workerId,\n queues: config.queues ?? [],\n concurrency: config.concurrency ?? 1,\n paused: false,\n closed: false,\n startedAt: new Date(),\n metrics: { processed: 0, failed: 0, totalDuration: 0 },\n handlers: config.handlers,\n activeJobs: 0,\n };\n this.workers.set(workerId, state);\n\n // Start polling loop\n this.startPollingLoop(state);\n\n return this.toWorkerHandle(state);\n }\n\n public getWorkers(): Map<string, IgniterJobsWorkerHandle> {\n const out = new Map<string, IgniterJobsWorkerHandle>();\n for (const [id, state] of this.workers) {\n out.set(id, this.toWorkerHandle(state));\n }\n return out;\n }\n\n public async publishEvent(channel: string, payload: unknown): Promise<void> {\n const handlers = this.subscribers.get(channel);\n if (!handlers) return;\n await Promise.all(Array.from(handlers).map(async (h) => h(payload as any)));\n }\n\n public async subscribeEvent(\n channel: string,\n handler: IgniterJobsEventHandler\n ): Promise<() => Promise<void>> {\n const set =\n this.subscribers.get(channel) ?? new Set<IgniterJobsEventHandler>();\n set.add(handler);\n this.subscribers.set(channel, set);\n\n return async () => {\n const current = this.subscribers.get(channel);\n if (!current) return;\n current.delete(handler);\n if (current.size === 0) this.subscribers.delete(channel);\n };\n }\n\n public async shutdown(): Promise<void> {\n // Stop all workers\n for (const worker of this.workers.values()) {\n worker.closed = true;\n if (worker.pollingTimer) {\n clearInterval(worker.pollingTimer);\n }\n }\n this.workers.clear();\n this.subscribers.clear();\n\n // Close database connection\n this.db.close();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private helpers\n // ─────────────────────────────────────────────────────────────────────────────\n\n private rowToSearchResult(row: JobRow): IgniterJobSearchResult {\n return {\n id: row.id,\n name: row.name,\n queue: row.queue,\n status: row.status,\n input: JSON.parse(row.input),\n result: row.result ? JSON.parse(row.result) : undefined,\n error: row.error ?? undefined,\n progress: row.progress,\n attemptsMade: row.attempts_made,\n priority: row.priority,\n createdAt: new Date(row.created_at),\n startedAt: row.started_at ? new Date(row.started_at) : undefined,\n completedAt: row.completed_at ? new Date(row.completed_at) : undefined,\n metadata: row.metadata ? JSON.parse(row.metadata) : undefined,\n scope: row.scope ? JSON.parse(row.scope) : undefined,\n };\n }\n\n private toWorkerHandle(worker: WorkerState): IgniterJobsWorkerHandle {\n return {\n id: worker.id,\n queues: worker.queues,\n pause: async () => {\n worker.paused = true;\n },\n resume: async () => {\n worker.paused = false;\n },\n close: async () => {\n worker.closed = true;\n if (worker.pollingTimer) {\n clearInterval(worker.pollingTimer);\n }\n },\n isRunning: () => !worker.closed && !worker.paused,\n isPaused: () => worker.paused,\n isClosed: () => worker.closed,\n getMetrics: async () => this.toWorkerMetrics(worker),\n };\n }\n\n private toWorkerMetrics(worker: WorkerState): IgniterJobsWorkerMetrics {\n const uptime = Date.now() - worker.startedAt.getTime();\n const processed = worker.metrics.processed;\n return {\n processed,\n failed: worker.metrics.failed,\n avgDuration: processed > 0 ? worker.metrics.totalDuration / processed : 0,\n concurrency: worker.concurrency,\n uptime,\n };\n }\n\n private startPollingLoop(worker: WorkerState): void {\n const poll = () => {\n if (worker.closed || worker.paused) return;\n void this.processNextJobs(worker);\n };\n\n // Initial poll\n poll();\n\n // Set up polling interval\n worker.pollingTimer = setInterval(poll, this.options.pollingInterval);\n }\n\n private async processNextJobs(worker: WorkerState): Promise<void> {\n if (worker.closed || worker.paused) return;\n\n const availableSlots = worker.concurrency - worker.activeJobs;\n if (availableSlots <= 0) return;\n\n // Build queue filter\n const queueFilter = worker.queues.length > 0\n ? `queue IN (${worker.queues.map(() => \"?\").join(\", \")})`\n : \"1=1\";\n\n const params: unknown[] = worker.queues.length > 0 ? [...worker.queues, availableSlots] : [availableSlots];\n\n // Get next jobs to process\n const rows = this.db.prepare<JobRow>(`\n SELECT * FROM jobs\n WHERE status = 'waiting' AND ${queueFilter}\n ORDER BY priority DESC, created_at ASC\n LIMIT ?\n `).all(...params);\n\n for (const row of rows) {\n if (worker.closed || worker.paused) break;\n if (worker.activeJobs >= worker.concurrency) break;\n\n // Mark as active\n const claimed = this.db.prepare(`\n UPDATE jobs SET status = 'active', started_at = ?\n WHERE id = ? AND status = 'waiting'\n `).run(new Date().toISOString(), row.id);\n\n if (claimed.changes === 0) continue; // Job was claimed by another worker\n\n worker.activeJobs++;\n void this.processJob(worker, row.id).finally(() => {\n worker.activeJobs--;\n if (worker.handlers?.onIdle && worker.activeJobs === 0) {\n void worker.handlers.onIdle();\n }\n });\n }\n }\n\n private async processJob(worker: WorkerState, jobId: string): Promise<void> {\n const row = this.db.prepare<JobRow>(\"SELECT * FROM jobs WHERE id = ?\").get(jobId);\n if (!row) return;\n\n const job = this.rowToSearchResult(row);\n\n // Add log entry\n this.addJobLog(jobId, \"info\", \"Job started\");\n\n if (worker.handlers?.onActive) {\n await worker.handlers.onActive({ job });\n }\n\n const start = Date.now();\n\n try {\n const definition = this.registeredJobs.get(row.queue)?.get(row.name);\n if (!definition) {\n throw new IgniterJobsError({\n code: \"JOBS_NOT_REGISTERED\",\n message: `Job \"${row.name}\" is not registered for queue \"${row.queue}\".`,\n });\n }\n\n // Update attempts\n this.db.prepare(\"UPDATE jobs SET attempts_made = attempts_made + 1 WHERE id = ?\").run(jobId);\n\n if (definition.onStart) {\n await definition.onStart({\n input: job.input,\n context: {},\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade + 1,\n metadata: job.metadata,\n },\n scope: job.scope,\n startedAt: new Date(),\n } as any);\n }\n\n const result = await definition.handler({\n input: job.input,\n context: {},\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade + 1,\n metadata: job.metadata,\n },\n scope: job.scope,\n } as any);\n\n const duration = Date.now() - start;\n\n // Mark as completed\n this.db.prepare(`\n UPDATE jobs SET status = 'completed', completed_at = ?, result = ?, progress = 100\n WHERE id = ?\n `).run(new Date().toISOString(), JSON.stringify(result), jobId);\n\n this.addJobLog(jobId, \"info\", `Job completed in ${duration}ms`);\n\n worker.metrics.processed++;\n worker.metrics.totalDuration += duration;\n\n if (definition.onSuccess) {\n await definition.onSuccess({\n input: job.input,\n context: {},\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: job.attemptsMade + 1,\n metadata: job.metadata,\n },\n scope: job.scope,\n result,\n duration,\n } as any);\n }\n\n if (worker.handlers?.onSuccess) {\n const updatedJob = await this.getJob(jobId);\n if (updatedJob) {\n await worker.handlers.onSuccess({ job: updatedJob, result });\n }\n }\n } catch (error: any) {\n const duration = Date.now() - start;\n const errorMessage = error?.message ?? String(error);\n\n this.addJobLog(jobId, \"error\", errorMessage);\n\n // Get current attempts\n const current = this.db.prepare<{ attempts_made: number; max_attempts: number }>(\n \"SELECT attempts_made, max_attempts FROM jobs WHERE id = ?\"\n ).get(jobId);\n\n const isFinalAttempt = (current?.attempts_made ?? 0) >= (current?.max_attempts ?? 1);\n\n if (isFinalAttempt) {\n this.db.prepare(`\n UPDATE jobs SET status = 'failed', error = ?, completed_at = ?\n WHERE id = ?\n `).run(errorMessage, new Date().toISOString(), jobId);\n\n worker.metrics.failed++;\n\n const definition = this.registeredJobs.get(row.queue)?.get(row.name);\n if (definition?.onFailure) {\n await definition.onFailure({\n input: job.input,\n context: {},\n job: {\n id: job.id,\n name: job.name,\n queue: job.queue,\n attemptsMade: current?.attempts_made ?? 1,\n metadata: job.metadata,\n },\n scope: job.scope,\n error,\n isFinalAttempt: true,\n } as any);\n }\n\n if (worker.handlers?.onFailure) {\n const updatedJob = await this.getJob(jobId);\n if (updatedJob) {\n await worker.handlers.onFailure({ job: updatedJob, error });\n }\n }\n } else {\n // Retry - put back to waiting\n this.db.prepare(\"UPDATE jobs SET status = 'waiting' WHERE id = ?\").run(jobId);\n }\n }\n }\n\n private addJobLog(jobId: string, level: \"info\" | \"warn\" | \"error\", message: string): void {\n this.db.prepare(`\n INSERT INTO job_logs (job_id, timestamp, level, message)\n VALUES (?, ?, ?, ?)\n `).run(jobId, new Date().toISOString(), level, message);\n }\n}\n"]}