redis-smq-common 3.0.0-rc.8 → 3.0.0-rc.9

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 (112) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/index.cjs +3 -0
  3. package/dist/index.d.cts +460 -0
  4. package/dist/index.d.ts +460 -19
  5. package/dist/index.js +2 -46
  6. package/package.json +1 -1
  7. package/dist/package.json +0 -3
  8. package/dist/src/async/async.d.ts +0 -7
  9. package/dist/src/async/async.js +0 -80
  10. package/dist/src/errors/callback-empty-reply.error.d.ts +0 -4
  11. package/dist/src/errors/callback-empty-reply.error.js +0 -11
  12. package/dist/src/errors/callback-invalid-reply.error.d.ts +0 -4
  13. package/dist/src/errors/callback-invalid-reply.error.js +0 -11
  14. package/dist/src/errors/index.d.ts +0 -4
  15. package/dist/src/errors/index.js +0 -12
  16. package/dist/src/errors/panic.error.d.ts +0 -3
  17. package/dist/src/errors/panic.error.js +0 -8
  18. package/dist/src/errors/redis-smq.error.d.ts +0 -4
  19. package/dist/src/errors/redis-smq.error.js +0 -13
  20. package/dist/src/event/event-emitter.d.ts +0 -11
  21. package/dist/src/event/event-emitter.js +0 -8
  22. package/dist/src/event/index.d.ts +0 -1
  23. package/dist/src/event/index.js +0 -18
  24. package/dist/src/lock/errors/index.d.ts +0 -7
  25. package/dist/src/lock/errors/index.js +0 -18
  26. package/dist/src/lock/errors/lock-abort.error.d.ts +0 -4
  27. package/dist/src/lock/errors/lock-abort.error.js +0 -11
  28. package/dist/src/lock/errors/lock-acquire.error.d.ts +0 -4
  29. package/dist/src/lock/errors/lock-acquire.error.js +0 -11
  30. package/dist/src/lock/errors/lock-extend.error.d.ts +0 -4
  31. package/dist/src/lock/errors/lock-extend.error.js +0 -11
  32. package/dist/src/lock/errors/lock-method-not-allowed.error.d.ts +0 -4
  33. package/dist/src/lock/errors/lock-method-not-allowed.error.js +0 -11
  34. package/dist/src/lock/errors/lock-not-acquired.error.d.ts +0 -4
  35. package/dist/src/lock/errors/lock-not-acquired.error.js +0 -11
  36. package/dist/src/lock/errors/lock-not-released.error.d.ts +0 -4
  37. package/dist/src/lock/errors/lock-not-released.error.js +0 -11
  38. package/dist/src/lock/errors/lock.error.d.ts +0 -3
  39. package/dist/src/lock/errors/lock.error.js +0 -8
  40. package/dist/src/lock/lock.d.ts +0 -37
  41. package/dist/src/lock/lock.js +0 -192
  42. package/dist/src/lock/redis-client/redis-client.d.ts +0 -4
  43. package/dist/src/lock/redis-client/redis-client.js +0 -17
  44. package/dist/src/lock/redis-client/redis-client.ts +0 -26
  45. package/dist/src/logger/errors/index.d.ts +0 -1
  46. package/dist/src/logger/errors/index.js +0 -6
  47. package/dist/src/logger/errors/logger.error.d.ts +0 -3
  48. package/dist/src/logger/errors/logger.error.js +0 -8
  49. package/dist/src/logger/logger.d.ts +0 -10
  50. package/dist/src/logger/logger.js +0 -50
  51. package/dist/src/power-switch/errors/index.d.ts +0 -1
  52. package/dist/src/power-switch/errors/index.js +0 -6
  53. package/dist/src/power-switch/errors/power-switch.error.d.ts +0 -3
  54. package/dist/src/power-switch/errors/power-switch.error.js +0 -8
  55. package/dist/src/power-switch/power-switch.d.ts +0 -16
  56. package/dist/src/power-switch/power-switch.js +0 -63
  57. package/dist/src/redis-client/clients/ioredis-client-multi.d.ts +0 -24
  58. package/dist/src/redis-client/clients/ioredis-client-multi.js +0 -108
  59. package/dist/src/redis-client/clients/ioredis-client.d.ts +0 -80
  60. package/dist/src/redis-client/clients/ioredis-client.js +0 -260
  61. package/dist/src/redis-client/clients/node-redis-client-multi.d.ts +0 -23
  62. package/dist/src/redis-client/clients/node-redis-client-multi.js +0 -91
  63. package/dist/src/redis-client/clients/node-redis-client.d.ts +0 -80
  64. package/dist/src/redis-client/clients/node-redis-client.js +0 -364
  65. package/dist/src/redis-client/errors/index.d.ts +0 -2
  66. package/dist/src/redis-client/errors/index.js +0 -8
  67. package/dist/src/redis-client/errors/redis-client.error.d.ts +0 -3
  68. package/dist/src/redis-client/errors/redis-client.error.js +0 -8
  69. package/dist/src/redis-client/errors/watched-keys-changed.error.d.ts +0 -4
  70. package/dist/src/redis-client/errors/watched-keys-changed.error.js +0 -11
  71. package/dist/src/redis-client/index.d.ts +0 -7
  72. package/dist/src/redis-client/index.js +0 -31
  73. package/dist/src/redis-client/lua-script.d.ts +0 -19
  74. package/dist/src/redis-client/lua-script.js +0 -82
  75. package/dist/src/redis-client/redis-client.d.ts +0 -94
  76. package/dist/src/redis-client/redis-client.js +0 -140
  77. package/dist/src/ticker/errors/index.d.ts +0 -1
  78. package/dist/src/ticker/errors/index.js +0 -6
  79. package/dist/src/ticker/errors/ticker.error.d.ts +0 -3
  80. package/dist/src/ticker/errors/ticker.error.js +0 -8
  81. package/dist/src/ticker/ticker.d.ts +0 -23
  82. package/dist/src/ticker/ticker.js +0 -120
  83. package/dist/src/worker/errors/index.d.ts +0 -1
  84. package/dist/src/worker/errors/index.js +0 -6
  85. package/dist/src/worker/errors/worker-error.d.ts +0 -3
  86. package/dist/src/worker/errors/worker-error.js +0 -8
  87. package/dist/src/worker/worker-runner/worker-pool.d.ts +0 -8
  88. package/dist/src/worker/worker-runner/worker-pool.js +0 -31
  89. package/dist/src/worker/worker-runner/worker-runner.d.ts +0 -21
  90. package/dist/src/worker/worker-runner/worker-runner.js +0 -65
  91. package/dist/src/worker/worker.d.ts +0 -13
  92. package/dist/src/worker/worker.js +0 -62
  93. package/dist/types/common.d.ts +0 -6
  94. package/dist/types/common.js +0 -3
  95. package/dist/types/event/event.d.ts +0 -9
  96. package/dist/types/event/event.js +0 -3
  97. package/dist/types/event/index.d.ts +0 -1
  98. package/dist/types/event/index.js +0 -18
  99. package/dist/types/index.d.ts +0 -4
  100. package/dist/types/index.js +0 -21
  101. package/dist/types/logger/config.d.ts +0 -5
  102. package/dist/types/logger/config.js +0 -3
  103. package/dist/types/logger/index.d.ts +0 -7
  104. package/dist/types/logger/index.js +0 -18
  105. package/dist/types/redis/config.d.ts +0 -15
  106. package/dist/types/redis/config.js +0 -9
  107. package/dist/types/redis/index.d.ts +0 -119
  108. package/dist/types/redis/index.js +0 -18
  109. /package/dist/{src/lock/redis-client/lua → lua}/extend-lock.lua +0 -0
  110. /package/dist/{src/redis-client/lua → lua}/lpoprpush.lua +0 -0
  111. /package/dist/{src/lock/redis-client/lua → lua}/release-lock.lua +0 -0
  112. /package/dist/{src/redis-client/lua → lua}/zpoprpush.lua +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,28 @@
1
1
 
2
2
 
3
+ ## [3.0.0-rc.9](https://github.com/weyoss/redis-smq-common/compare/v3.0.0-rc.8...v3.0.0-rc.9) (2024-01-25)
4
+
5
+
6
+ ### Misc
7
+
8
+ * update package-lock.json ([d001ba1](https://github.com/weyoss/redis-smq-common/commit/d001ba1938ed34e4a76f5da1814de56dde72ca99))
9
+
10
+ ## [3.0.0-rc.8](https://github.com/weyoss/redis-smq-common/compare/v3.0.0-rc.7...v3.0.0-rc.8) (2024-01-25)
11
+
12
+
13
+ ### ⚠ BREAKING CHANGES
14
+
15
+ * drop support for node-redis v3
16
+
17
+ ### Documentation
18
+
19
+ * drop support for node-redis v3 ([3481d53](https://github.com/weyoss/redis-smq-common/commit/3481d53de1df805e9a4fc9ec244c6f6b7e131947))
20
+
21
+
22
+ ### Codebase Refactoring
23
+
24
+ * drop support for node-redis v3 ([0b89843](https://github.com/weyoss/redis-smq-common/commit/0b8984396ec0ccb57eb1e183e9b7b0a6f1935e9b))
25
+
3
26
  ## [3.0.0-rc.7](https://github.com/weyoss/redis-smq-common/compare/v3.0.0-rc.6...v3.0.0-rc.7) (2023-11-26)
4
27
 
5
28
 
package/dist/index.cjs ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";var vt=Object.create;var F=Object.defineProperty,ft=Object.defineProperties,Ct=Object.getOwnPropertyDescriptor,It=Object.getOwnPropertyDescriptors,xt=Object.getOwnPropertyNames,et=Object.getOwnPropertySymbols,wt=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty,Tt=Object.prototype.propertyIsEnumerable;var rt=(o,r,t)=>r in o?F(o,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[r]=t,D=(o,r)=>{for(var t in r||(r={}))nt.call(r,t)&&rt(o,t,r[t]);if(et)for(var t of et(r))Tt.call(r,t)&&rt(o,t,r[t]);return o},st=(o,r)=>ft(o,It(r));var Et=(o,r)=>{for(var t in r)F(o,t,{get:r[t],enumerable:!0})},ot=(o,r,t,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let e of xt(r))!nt.call(o,e)&&e!==t&&F(o,e,{get:()=>r[e],enumerable:!(i=Ct(r,e))||i.enumerable});return o};var J=(o,r,t)=>(t=o!=null?vt(wt(o)):{},ot(r||!o||!o.__esModule?F(t,"default",{value:o,enumerable:!0}):t,o)),yt=o=>ot(F({},"__esModule",{value:!0}),o);var Ut={};Et(Ut,{CallbackEmptyReplyError:()=>m,CallbackInvalidReplyError:()=>q,ERedisConfigClient:()=>Z,EventEmitter:()=>N,Lock:()=>H,LockAbortError:()=>C,LockAcquireError:()=>w,LockError:()=>h,LockExtendError:()=>L,LockMethodNotAllowedError:()=>M,LockNotAcquiredError:()=>O,LockNotReleasedError:()=>z,LoggerError:()=>P,PanicError:()=>x,PowerSwitch:()=>v,PowerSwitchError:()=>I,RedisClient:()=>k,RedisClientError:()=>u,RedisSMQError:()=>d,Ticker:()=>y,TickerError:()=>S,WatchedKeysChangedError:()=>T,Worker:()=>X,WorkerError:()=>E,WorkerPool:()=>V,WorkerRunner:()=>G,async:()=>b,logger:()=>ht,redis:()=>kt});module.exports=yt(Ut);var Z=(t=>(t.IOREDIS="ioredis",t.REDIS="redis",t))(Z||{});var d=class extends Error{constructor(r){super(r)}get name(){return this.constructor.name}};var m=class extends d{constructor(){super("Expected a non-empty reply")}};var q=class extends d{constructor(){super("Invalid reply type")}};var x=class extends d{};var P=class extends d{};var S=class extends d{};var h=class extends d{};var C=class extends h{constructor(r="releaseLock() may have been called. Abandoning."){super(r)}};var w=class extends h{constructor(r="Could not acquire a lock"){super(r)}};var L=class extends h{constructor(r="Acquired lock could not be extended"){super(r)}};var M=class extends h{constructor(r="This method can not be used when autoExtend is enabled"){super(r)}};var O=class extends h{constructor(r="Can not extend a lock which has not been yet acquired. Maybe a pending operation is in progress."){super(r)}};var z=class extends h{constructor(r="A lock has been already obtained but not yet released or maybe a pending operation is in progress."){super(r)}};var u=class extends d{};var T=class extends u{constructor(r="One (or more) of the watched keys has been changed"){super(r)}};var E=class extends x{};var I=class extends d{};var dt=require("uuid");var tt=J(require("fs"),1),it=require("path");var ct=require("events");var lt=(o,r,t)=>{if(o.length){let i=0,e=()=>{r(o[i],i,n=>{i+=1,n||i>=o.length?t(n):setTimeout(()=>e(),0)})};e()}else t()},at=(o,r,t)=>{let i=Object.keys(o);if(i.length){let e=0,n=()=>{let s=i[e];r(o[s],s,l=>{e+=1,l||e>=i.length?t(l):setTimeout(()=>n(),0)})};n()}else t()},Rt=(o,r,t)=>{Array.isArray(o)?lt(o,r,t):at(o,r,t)},St=(o,r)=>{if(o.length){let t=0,i=(e,...n)=>{t+=1,e?r(e):t<o.length?setTimeout(()=>{n.length?o[t](...n,i):o[t](i)},0):n.length?r(null,n[0]):r()};o[t](i)}else r()},b={each:Rt,eachIn:at,eachOf:lt,waterfall:St};var j=J(require("fs"),1),Y=require("path");var A=class A{constructor(){this.isLoaded=!1;this.scripts=new Map,this.addScript("ZPOPRPUSH",j.default.readFileSync((0,Y.resolve)(__dirname,"./lua/zpoprpush.lua")).toString()),this.addScript("LPOPRPUSH",j.default.readFileSync((0,Y.resolve)(__dirname,"./lua/lpoprpush.lua")).toString())}hasScript(r){return this.scripts.has(r)}addScript(r,t){return this.hasScript(r)?!1:(this.scripts.set(r,{content:t}),this.isLoaded=!1,!0)}loadScripts(r,t){if(this.isLoaded)t();else{let i=[];this.scripts.forEach(e=>i.push(n=>{e.id?n():r.loadScript(e.content,(s,l)=>{s?n(s):l?(e.id=l,n()):n(new m)})})),b.waterfall(i,e=>{e?t(e):(this.isLoaded=!0,t())})}}getScriptId(r){var i;let{id:t}=(i=this.scripts.get(r))!=null?i:{};if(!t)throw new u(`ID of script [${r}] is missing`);return t}static getInstance(){return A.instance||(A.instance=new A),A.instance}};A.instance=null;var U=A;var Lt=[4,0,0],p=class p extends ct.EventEmitter{constructor(){super(...arguments);this.connectionClosed=!0}validateRedisVersion(t,i=0,e=0){if(!p.redisServerVersion)throw new u("UNKNOWN_REDIS_SERVER_VERSION");return p.redisServerVersion[0]>t||p.redisServerVersion[0]===t&&p.redisServerVersion[1]>=i&&p.redisServerVersion[2]>=e}validateRedisServerSupport(t){let i=e=>{let[n,s,l]=Lt;this.validateRedisVersion(n,s,l)?e():e(new u("UNSUPPORTED_REDIS_SERVER_VERSION"))};p.redisServerVersion?i(t):this.updateServerVersion(e=>{e?t(e):i(t)})}sscanAll(t,i,e){let n=new Set,s=l=>{this.sscan(t,l,i,(a,c)=>{a?e(a):c?(c.items.forEach(g=>n.add(g)),c.cursor==="0"?e(null,[...n]):s(c.cursor)):e(new m)})};s("0")}hscanAll(t,i,e){let n={},s=l=>{this.hscan(t,l,i,(a,c)=>{a?e(a):c?(Object.assign(n,c.result),c.cursor==="0"?e(null,n):s(c.cursor)):e(new m)})};s("0")}zpoprpush(t,i,e){this.runScript("ZPOPRPUSH",[t,i],[],(n,s)=>{n?e(n):e(null,typeof s=="string"?s:null)})}lpoprpush(t,i,e){this.validateRedisVersion(6,2)?this.lmove(t,i,"LEFT","RIGHT",e):this.runScript("LPOPRPUSH",[t,i],[],(n,s)=>{n?e(n):e(null,typeof s=="string"?s:null)})}updateServerVersion(t){p.redisServerVersion?t():this.getInfo((i,e)=>{i?t(i):e?(p.redisServerVersion=e.split(`\r
2
+ `)[1].split(":")[1].split(".").map(n=>Number(n)),t()):t(new m)})}loadScripts(t){U.getInstance().loadScripts(this,t)}runScript(t,i,e,n){let s=U.getInstance().getScriptId(t);this.evalsha(s,[i.length,...i,...e],(l,a)=>{l?n(l):n(null,a)})}static addScript(t,i){if(!U.getInstance().addScript(t,i))throw new u(`A script with name [${t}] already exists`)}};p.redisServerVersion=null;var k=p;k.addScript("RELEASE_LOCK",tt.default.readFileSync((0,it.resolve)(__dirname,"./lua/release-lock.lua")).toString());k.addScript("EXTEND_LOCK",tt.default.readFileSync((0,it.resolve)(__dirname,"./lua/extend-lock.lua")).toString());var H=class{constructor(r,t,i,e=!1,n=!1,s=!0){this.status=0;this.lockingTimer=null;this.autoExtendTimer=null;this.throwExceptions=!0;this.lockKey=t,this.ttl=i,this.retryOnFail=e,this.lockId=(0,dt.v4)(),this.redisClient=r,this.autoExtend=n,this.throwExceptions=s}resetTimers(){this.lockingTimer&&(clearTimeout(this.lockingTimer),this.lockingTimer=null),this.autoExtendTimer&&(clearTimeout(this.autoExtendTimer),this.autoExtendTimer=null)}setUnlocked(){this.status=0}setLocked(){this.status=2}setExtended(){this.status=5}extend(r){this.isLocked()?(this.status=4,this.redisClient.runScript("EXTEND_LOCK",[this.lockKey],[this.lockId,this.ttl],(t,i)=>{t?r(t):this.status===4?i?(this.setExtended(),r()):(this.setUnlocked(),r(new L)):r(new C)})):r(new O)}runAutoExtendTimer(){let r=Math.ceil(this.ttl/2);this.autoExtendTimer=setTimeout(()=>this.extend(t=>{if(!t)this.runAutoExtendTimer();else if(this.throwExceptions&&!(t instanceof C))throw t}),r)}acquireLock(r){if(!this.isReleased())r(new z);else{this.status=1;let t=()=>{this.status===1?this.redisClient.set(this.lockKey,this.lockId,{expire:{mode:"PX",value:this.ttl},exists:"NX"},(i,e)=>{i?r(i):this.status===1?e?(this.setLocked(),this.autoExtend&&this.runAutoExtendTimer(),r()):this.retryOnFail?this.lockingTimer=setTimeout(t,1e3):(this.setUnlocked(),r(new w)):r(new C)}):r(new C)};t()}}extendLock(r){this.autoExtend?r(new M):this.extend(r)}releaseLock(r){this.status===0?r():this.isLocked()?(this.resetTimers(),this.status=3,this.redisClient.runScript("RELEASE_LOCK",[this.lockKey],[this.lockId],i=>{i?r(i):(this.setUnlocked(),r())})):r(new O)}acquireOrExtend(r){if(this.autoExtend)r(new M);else{let t=()=>{this.acquireLock(i=>{i?r(i):r(null,2)})};this.isLocked()?this.extend(i=>{i?i instanceof L?t():r(i):r(null,5)}):t()}}isLocked(){return this.status===2||this.status===5}isReleased(){return this.status===0}getId(){return this.lockId}};var v=class{constructor(r=!0){this.isPowered=!1;this.pendingState=null;this.throwExceptionOnError=r}switch(r){if(this.pendingState!==null){if(this.throwExceptionOnError)throw new I("Can not switch state while another state transition is in progress.");return!1}if(r===this.isPowered){if(this.throwExceptionOnError)throw new I("Can not switch to the same current state.");return!1}return this.pendingState=r,!0}isUp(){return this.isPowered}isDown(){return!this.isPowered}isGoingUp(){return this.pendingState===!0}isGoingDown(){return this.pendingState===!1}isRunning(){return this.isUp()&&this.pendingState===null}goingUp(){return this.switch(!0)}goingDown(){return this.switch(!1)}commit(){if(this.pendingState===null)throw new I("Expected a pending state");this.isPowered=this.pendingState,this.pendingState=null}rollback(){if(this.pendingState===null)throw new I("Expected a pending state");this.pendingState=null}};var ut=require("events"),N=class extends ut.EventEmitter{};var y=class extends N{constructor(t=()=>{},i=1e3){super();this.powerManager=new v;this.onNextTickFn=null;this.timeout=null;this.interval=null;this.shutdownTimeout=null;this.aborted=!1;this.onTickFn=t,this.time=i,this.powerManager.goingUp()}shutdown(){this.shutdownTimeout&&clearTimeout(this.shutdownTimeout),this.powerManager.commit(),this.emit("down")}onTick(){var t;if(this.powerManager.isGoingDown())this.shutdown();else if(this.powerManager.isRunning()){let i=(t=this.onNextTickFn)!=null?t:this.onTickFn;this.onNextTickFn=null,i()}else this.emit("error",new x("Unexpected call"))}abort(){this.aborted||(this.aborted=!0,this.powerManager.isGoingDown()?this.shutdown():this.quit())}quit(){this.powerManager.isGoingUp()?(this.powerManager.rollback(),this.emit("down")):this.aborted&&this.powerManager.isDown()?this.emit("down"):(this.powerManager.goingDown(),this.timeout?(clearTimeout(this.timeout),this.shutdown()):this.interval?(clearInterval(this.interval),this.shutdown()):this.aborted?this.shutdown():this.shutdownTimeout=setTimeout(()=>{this.powerManager.isGoingDown()&&this.shutdown()},6e4))}isTicking(){return!!(this.timeout||this.interval)}nextTick(){if(this.isTicking())throw new S("A timer is already running");this.powerManager.isGoingDown()?this.shutdown():(this.powerManager.isGoingUp()&&this.powerManager.commit(),this.powerManager.isRunning()&&(this.timeout=setTimeout(()=>{this.timeout=null,this.onTick()},this.time)))}nextTickFn(t){this.onNextTickFn=t,this.nextTick()}runTimer(){if(this.isTicking())throw new S("A timer is already running");this.powerManager.isGoingUp()&&this.powerManager.commit(),this.powerManager.isRunning()&&(this.interval=setInterval(()=>this.onTick(),this.time))}};var X=class{constructor(r,t=1e3){this.ticker=null;this.powerManager=null;this.getTicker=()=>{if(!this.ticker)throw new E("Expected an instance of Ticker");return this.ticker};this.onTick=()=>{this.work(r=>{if(r)throw r;this.getTicker().nextTick()})};this.run=()=>{if(this.managed)throw new E("You can not run a managed worker");let r=this.getPowerManager();r.goingUp(),this.getTicker().nextTick(),r.commit()};this.quit=r=>{if(this.managed)r();else{let t=this.getPowerManager();t.goingDown();let i=this.getTicker();i.on("down",()=>{t.commit(),r()}),i.quit()}};this.managed=r,r||(this.ticker=new y(this.onTick,t),this.powerManager=new v)}getPowerManager(){if(!this.powerManager)throw new E("Expected an instance of PowerSwitch");return this.powerManager}};var G=class extends N{constructor(t,i,e,n){super();this.onTick=()=>{b.waterfall([t=>{this.lock.acquireOrExtend((i,e)=>{e===2&&this.logger.info(`Workers are exclusively running from this instance (Lock ID ${this.lock.getId()}).`),t(i)})},t=>{this.workerPool.work(t)}],t=>{!t||t instanceof w?this.ticker.nextTick():this.emit("error",t)})};this.clearWorkerPool=t=>{this.workerPool.clear(t)};this.stopTicker=t=>{this.ticker.once("down",t),this.ticker.quit()};this.releaseLock=t=>{this.lock.releaseLock(t)};this.run=()=>{this.emit("up"),this.ticker.nextTick()};this.quit=t=>{b.waterfall([this.stopTicker,this.clearWorkerPool,this.releaseLock],()=>{this.emit("down"),t()})};this.powerManager=new v,this.redisClient=t,this.logger=n,this.lock=new H(t,i,6e4),this.ticker=new y(this.onTick),this.workerPool=e}addWorker(t){this.workerPool.add(t)}};var V=class{constructor(){this.pool=[];this.work=r=>{if(this.pool.length){let t=this.pool.map(i=>e=>i.work(e));b.waterfall(t,r)}else r()};this.add=r=>(this.pool.push(r),this.pool.length);this.clear=r=>{b.each(this.pool,(t,i,e)=>{t.quit(e)},()=>{this.pool=[],r()})}}};var gt=require("bunyan");var W=()=>{},Mt={debug:W,warn:W,info:W,error:W},f=null;function Ot(){f=null}function At(o){if(f)throw new P("Logger has been already initialized.");f=o}function Nt(o,r){var t;if(!o.enabled)return Mt;if(f||(f=(0,gt.createLogger)(st(D({},(t=o.options)!=null?t:{}),{name:"redis-smq"}))),r){let i=(e,n)=>(s,...l)=>{let a=typeof s=="string"?`${r} | ${s}`:s;return n[e](a,...l)};return{info:i("info",f),warn:i("warn",f),debug:i("debug",f),error:i("error",f)}}return f}var ht={getLogger:Nt,setLogger:At,destroy:Ot};var bt=require("@redis/client");var mt=require("@redis/client");var K=class{constructor(r){this.multi=r.multi()}lrem(r,t,i){return this.multi.lRem(r,t,i),this}lpop(r){return this.multi.lPop(r),this}lpush(r,t){return this.multi.lPush(r,t),this}ltrim(r,t,i){return this.multi.lTrim(r,t,i),this}rpop(r){return this.multi.rPop(r),this}rpush(r,t){return this.multi.rPush(r,t),this}zadd(r,t,i){return this.multi.zAdd(r,{score:t,value:i}),this}zrem(r,t){return this.multi.zRem(r,t),this}sadd(r,t){return this.multi.sAdd(r,t),this}srem(r,t){return this.multi.sRem(r,t),this}hset(r,t,i){return this.multi.hSet(r,t,i),this}hdel(r,t){return this.multi.hDel(r,t),this}hincrby(r,t,i){return this.multi.hIncrBy(r,t,i),this}pexpire(r,t){return this.multi.pExpire(r,t),this}expire(r,t){return this.multi.expire(r,t),this}rpoplpush(r,t){return this.multi.rPopLPush(r,t),this}del(r){return this.multi.del(r),this}exec(r){this.multi.exec().then(t=>r(null,t)).catch(t=>{t instanceof mt.WatchError?r(new T):r(t)})}};var _=class extends k{constructor(t={}){super();this.client=(0,bt.createClient)(t),this.client.once("ready",()=>{this.connectionClosed=!1,this.emit("ready")}),this.client.once("end",()=>{this.connectionClosed=!0,this.emit("end")}),this.client.connect()}set(t,i,e,n){this.client.set(t,i,D(D({},e.expire?{[e.expire.mode]:e.expire.value}:{}),e.exists?{[e.exists]:!0}:{})).then(s=>n(null,s)).catch(n)}zadd(t,i,e,n){this.client.zAdd(t,{score:i,value:e}).then(s=>n(null,s)).catch(n)}multi(){return new K(this.client)}watch(t,i){this.client.watch(t).then(e=>i(null,e)).catch(i)}unwatch(t){this.client.unwatch().then(i=>t(null,i)).catch(t)}sismember(t,i,e){this.client.sIsMember(t,i).then(n=>e(null,Number(n))).catch(e)}zcard(t,i){this.client.zCard(t).then(e=>i(null,e)).catch(i)}zrange(t,i,e,n){this.client.zRange(t,i,e).then(s=>n(null,(Array.isArray(s)?s:[]).map(l=>String(l)))).catch(n)}zrevrange(t,i,e,n){this.client.sendCommand(["ZREVRANGE",t,String(i),String(e)]).then(s=>n(null,(Array.isArray(s)?s:[]).map(l=>String(l)))).catch(n)}zrem(t,i,e){this.client.zRem(t,i).then(n=>e(null,n)).catch(e)}psubscribe(t){this.client.pSubscribe(t,(i,e)=>{this.client.emit("pmessage",t,e,i)})}punsubscribe(t){this.client.pUnsubscribe(t).catch(()=>{})}subscribe(t){this.client.subscribe(t,(i,e)=>{this.client.emit("message",e,i)})}unsubscribe(t){this.client.unsubscribe(t).catch(()=>{})}zrangebyscore(t,i,e,n,s,l){this.client.zRangeByScore(t,i,e,{LIMIT:{offset:n,count:s}}).then(a=>l(null,a)).catch(l)}smembers(t,i){this.client.sMembers(t).then(e=>i(null,e)).catch(i)}sscan(t,i,e,n){let s=[t,Number(i),e];this.client.sScan(...s).then(({cursor:l,members:a})=>{n(null,{cursor:String(l),items:a})}).catch(n)}zscan(t,i,e,n){let s=[t,Number(i),e];this.client.zScan(...s).then(({cursor:l,members:a})=>{let c=new Set;for(let g of a)c.add(g.value);n(null,{cursor:String(l),items:[...c]})}).catch(n)}sadd(t,i,e){this.client.sAdd(t,i).then(n=>e(null,n)).catch(e)}srem(t,i,e){this.client.sRem(t,i).then(n=>e(null,n)).catch(e)}hgetall(t,i){this.client.hGetAll(t).then(e=>i(null,e)).catch(i)}hscan(t,i,e,n){let s=[t,Number(i),e];this.client.hScan(...s).then(({cursor:l,tuples:a})=>{let c={};for(;a.length;){let g=a.shift();g&&(c[g.field]=g.value)}n(null,{cursor:String(l),result:c})}).catch(n)}hget(t,i,e){this.client.hGet(t,i).then(n=>e(null,n!=null?n:null)).catch(e)}hset(t,i,e,n){this.client.hSet(t,i,e).then(s=>n(null,s)).catch(n)}hdel(t,i,e){this.client.hDel(t,i).then(n=>e(null,Number(n))).catch(e)}lrange(t,i,e,n){this.client.lRange(t,i,e).then(s=>n(null,s)).catch(n)}hkeys(t,i){this.client.hKeys(t).then(e=>i(null,e)).catch(i)}hlen(t,i){this.client.hLen(t).then(e=>i(null,e)).catch(i)}brpoplpush(t,i,e,n){this.client.brPopLPush(t,i,e).then(s=>n(null,s)).catch(n)}rpoplpush(t,i,e){this.client.rPopLPush(t,i).then(n=>e(null,n)).catch(e)}zrangebyscorewithscores(t,i,e,n){this.client.zRangeByScoreWithScores(t,i,e).then(s=>{let l={};for(let{score:a,value:c}of s)l[a]=c;n(null,l)}).catch(n)}rpop(t,i){this.client.rPop(t).then(e=>i(null,e)).catch(i)}lrem(t,i,e,n){this.client.lRem(t,i,e).then(s=>n(null,s)).catch(n)}publish(t,i,e){this.client.publish(t,i).then(n=>e(null,n)).catch(e)}flushall(t){this.client.flushAll().then(i=>t(null,i)).catch(t)}loadScript(t,i){this.client.sendCommand(["SCRIPT","LOAD",t]).then(e=>i(null,typeof e=="string"?e:String(e))).catch(i)}evalsha(t,i,e){let n=[t],s=Array.isArray(i)?i:[i];this.client.sendCommand(["evalsha",...n.concat(s).map(l=>String(l))]).then(l=>{Array.isArray(l)?e(null,l.map(a=>a instanceof Buffer?a.toString():a)):l instanceof Buffer?e(null,l.toString()):e(null,l)}).catch(e)}get(t,i){this.client.sendCommand(["get",t]).then(e=>i(null,typeof e=="string"?e:null)).catch(i)}del(t,i){this.client.del(t).then(e=>i(null,e)).catch(i)}llen(t,i){this.client.sendCommand(["llen",t]).then(e=>i(null,Number(e))).catch(i)}lmove(t,i,e,n,s){this.validateRedisVersion(6,2)?this.client.lMove(t,i,e,n).then(l=>s(null,l)).catch(s):s(new u("Command not supported by your Redis server. Minimal required Redis server version is 6.2.0."))}zremrangebyscore(t,i,e,n){this.client.sendCommand(["zremrangebyscore",t,`${i}`,`${e}`]).then(s=>n(null,Number(s))).catch(n)}hmget(t,i,e){this.client.hmGet(t,i).then(n=>e(null,n)).catch(e)}halt(t){this.connectionClosed?t():(this.client.once("end",t),this.end())}end(){this.connectionClosed||this.client.disconnect().catch(()=>{})}quit(t=()=>{}){this.connectionClosed?t():(this.client.once("end",t),this.client.quit())}getInfo(t){this.client.info().then(i=>t(null,i)).catch(t)}on(t,i){return this.client.on(t,i),this}};var pt=J(require("ioredis"),1);var Q=class{constructor(r){this.multi=r.multi()}lrem(r,t,i){return this.multi.lrem(r,t,i),this}lpop(r){return this.multi.lpop(r),this}lpush(r,t){return this.multi.lpush(r,t),this}ltrim(r,t,i){return this.multi.ltrim(r,t,i),this}rpop(r){return this.multi.rpop(r),this}rpush(r,t){return this.multi.rpush(r,t),this}zadd(r,t,i){return this.multi.zadd(r,t,i),this}zrem(r,t){return this.multi.zrem(r,...typeof t=="string"?[t]:t),this}sadd(r,t){return this.multi.sadd(r,t),this}srem(r,t){return this.multi.srem(r,...typeof t=="string"?[t]:t),this}hset(r,t,i){return this.multi.hset(r,t,i),this}hdel(r,t){return this.multi.hdel(r,...typeof t=="string"?[t]:t),this}hincrby(r,t,i){return this.multi.hincrby(r,t,i),this}pexpire(r,t){return this.multi.pexpire(r,t),this}expire(r,t){return this.multi.expire(r,t),this}rpoplpush(r,t){return this.multi.rpoplpush(r,t),this}del(r){return this.multi.del(...typeof r=="string"?[r]:r),this}exec(r){this.multi.exec((t,i)=>{if(t)r(t);else if(!i)r(new T);else{let e=[],n=null;for(let s of i){if(!Array.isArray(s)){n=new u("Expected an array reply from multi.exec()");break}let[l,a]=s;if(l instanceof Error){n=l;break}e.push(a)}n?r(n):r(null,e)}})}};var B=class extends k{constructor(t={}){super();this.client=new pt.default(t),this.client.once("ready",()=>{this.connectionClosed=!1,this.emit("ready")}),this.client.once("end",()=>{this.connectionClosed=!0,this.emit("end")})}set(t,i,e,n){e.exists&&e.expire?this.client.set(t,i,e.expire.mode,e.expire.value,e.exists,n):e.expire?this.client.set(t,i,e.expire.mode,e.expire.value,n):e.exists?this.client.set(t,i,e.exists,n):this.client.set(t,i,n)}zadd(t,i,e,n){this.client.zadd(t,i,e,n)}multi(){return new Q(this.client)}watch(t,i){this.client.watch(t,i)}unwatch(t){this.client.unwatch(t)}sismember(t,i,e){this.client.sismember(t,i,e)}sscan(t,i,e,n){let s=[t,i];e.MATCH&&s.push("MATCH",e.MATCH),e.COUNT&&s.push("COUNT",String(e.COUNT)),this.client.sscan(...s,(l,[a,c])=>{l?n(l):n(null,{cursor:a,items:c})})}zcard(t,i){this.client.zcard(t,i)}zrange(t,i,e,n){this.client.zrange(t,i,e,n)}zscan(t,i,e,n){let s=[t,i];e.MATCH&&s.push("MATCH",e.MATCH),e.COUNT&&s.push("COUNT",String(e.COUNT)),this.client.zscan(...s,(l,a)=>{if(l)n(l);else if(!a)n(new m);else{let c=new Set,[g,R]=a;for(;R.length;){let $=String(R.shift()),Ht=String(R.shift());c.add($)}n(null,{cursor:g,items:[...c]})}})}zrevrange(t,i,e,n){this.client.zrevrange(t,i,e,n)}zrem(t,i,e){this.client.zrem(t,i,e)}psubscribe(t){this.client.psubscribe(t)}punsubscribe(t){this.client.punsubscribe(t)}subscribe(t){this.client.subscribe(t)}unsubscribe(t){this.client.unsubscribe(t)}zrangebyscore(t,i,e,n,s,l){this.client.zrangebyscore(t,i,e,"LIMIT",n,s,l)}smembers(t,i){this.client.smembers(t,i)}sadd(t,i,e){this.client.sadd(t,i,e)}srem(t,i,e){this.client.srem(t,i,e)}hgetall(t,i){this.client.hgetall(t,i)}hscan(t,i,e,n){let s=[t,i];e.MATCH&&s.push("MATCH",e.MATCH),e.COUNT&&s.push("COUNT",String(e.COUNT)),this.client.hscan(...s,(l,[a,c])=>{if(l)n(l);else{let g={};for(;c.length;){let R=String(c.shift());g[R]=String(c.shift())}n(null,{cursor:a,result:g})}})}hget(t,i,e){this.client.hget(t,i,e)}hset(t,i,e,n){this.client.hset(t,i,e,n)}hdel(t,i,e){this.client.hdel(t,i,e)}lrange(t,i,e,n){this.client.lrange(t,i,e,n)}hkeys(t,i){this.client.hkeys(t,i)}hlen(t,i){this.client.hlen(t,i)}brpoplpush(t,i,e,n){this.client.brpoplpush(t,i,e,n)}rpoplpush(t,i,e){this.client.rpoplpush(t,i,e)}zrangebyscorewithscores(t,i,e,n){this.client.zrangebyscore(t,i,e,"WITHSCORES",(s,l)=>{if(s)n(s);else{let a=l!=null?l:[],c={};for(let g=a.splice(0,2);g.length>0;g=a.splice(0,2)){let[R,$]=g;c[$]=R}n(null,c)}})}rpop(t,i){this.client.rpop(t,i)}lrem(t,i,e,n){this.client.lrem(t,i,e,n)}publish(t,i,e){this.client.publish(t,i,e)}flushall(t){this.client.flushall(t)}loadScript(t,i){this.client.script("load",t,i)}evalsha(t,i,e){let n=[t],s=Array.isArray(i)?i:[i];this.client.evalsha(n.concat(s),e)}get(t,i){this.client.get(t,i)}del(t,i){this.client.del(t,i)}llen(t,i){this.client.llen(t,i)}lmove(t,i,e,n,s){this.validateRedisVersion(6,2)?this.client.lmove(t,i,e,n,s):s(new u("Command not supported by your Redis server. Minimal required Redis server version is 6.2.0."))}zremrangebyscore(t,i,e,n){this.client.zremrangebyscore(t,i,e,n)}hmget(t,i,e){this.client.hmget(t,i,e)}halt(t){this.connectionClosed?t():(this.client.once("end",t),this.end())}end(){this.connectionClosed||this.client.disconnect(!1)}quit(t=()=>{}){this.connectionClosed?t():(this.client.once("end",t),this.client.quit())}getInfo(t){this.client.info(t)}on(t,i){return this.client.on(t,i),this}};function Pt(o){return o.client==="redis"?new _(o.options):new B(o.options)}function zt(o,r){let t=Pt(o);t.once("ready",()=>{b.waterfall([i=>t.validateRedisServerSupport(i),i=>t.loadScripts(i)],i=>{if(i)throw i;r(null,t)})})}var kt={createInstance:zt};0&&(module.exports={CallbackEmptyReplyError,CallbackInvalidReplyError,ERedisConfigClient,EventEmitter,Lock,LockAbortError,LockAcquireError,LockError,LockExtendError,LockMethodNotAllowedError,LockNotAcquiredError,LockNotReleasedError,LoggerError,PanicError,PowerSwitch,PowerSwitchError,RedisClient,RedisClientError,RedisSMQError,Ticker,TickerError,WatchedKeysChangedError,Worker,WorkerError,WorkerPool,WorkerRunner,async,logger,redis});
3
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,460 @@
1
+ import { RedisClientMultiCommandType } from '@redis/client/dist/lib/client/multi-command';
2
+ import { RedisClientOptions, RedisModules, RedisFunctions, RedisScripts, RedisClientType } from '@redis/client';
3
+ import { EventEmitter as EventEmitter$1 } from 'events';
4
+ import * as Logger from 'bunyan';
5
+ import { RedisOptions } from 'ioredis';
6
+
7
+ interface ICallback<T> {
8
+ (err?: Error | null, reply?: T): void;
9
+ (err: undefined | null, reply: T): void;
10
+ }
11
+ type TFunction<TReturn = void, TArgs = any> = (...args: TArgs[]) => TReturn;
12
+ type TUnaryFunction<T, E = void> = (reply: T) => E;
13
+
14
+ interface IRedisConfigIORedis {
15
+ client: ERedisConfigClient.IOREDIS;
16
+ options?: RedisOptions;
17
+ }
18
+ declare enum ERedisConfigClient {
19
+ IOREDIS = "ioredis",
20
+ REDIS = "redis"
21
+ }
22
+ interface IRedisConfigNodeRedis {
23
+ client: ERedisConfigClient.REDIS;
24
+ options?: RedisClientOptions;
25
+ }
26
+ type IRedisConfig = IRedisConfigIORedis | IRedisConfigNodeRedis;
27
+
28
+ type TRedisTransactionNodeRedis = RedisClientMultiCommandType<RedisModules, RedisFunctions, RedisScripts>;
29
+ type TRedisClientNodeRedis = RedisClientType<RedisModules, RedisFunctions, RedisScripts>;
30
+ interface IRedisClient {
31
+ validateRedisVersion(major: number, feature?: number, minor?: number): boolean;
32
+ validateRedisServerSupport(cb: ICallback<void>): void;
33
+ set(key: string, value: string, options: {
34
+ expire?: {
35
+ mode: 'EX' | 'PX';
36
+ value: number;
37
+ };
38
+ exists?: 'NX' | 'XX';
39
+ }, cb: ICallback<string | null>): void;
40
+ zadd(key: string, score: number, member: string, cb: ICallback<number | string>): void;
41
+ multi(): IRedisTransaction;
42
+ watch(args: string[], cb: ICallback<string>): void;
43
+ unwatch(cb: ICallback<string>): void;
44
+ sismember(key: string, member: string, cb: ICallback<number>): void;
45
+ zcard(key: string, cb: ICallback<number>): void;
46
+ zrange(key: string, min: number, max: number, cb: ICallback<string[]>): void;
47
+ zrevrange(key: string, min: number, max: number, cb: ICallback<string[]>): void;
48
+ psubscribe(pattern: string): void;
49
+ punsubscribe(channel: string): void;
50
+ subscribe(channel: string): void;
51
+ unsubscribe(channel: string): void;
52
+ zrangebyscore(key: string, min: number | string, max: number | string, offset: number, count: number, cb: ICallback<string[]>): void;
53
+ smembers(key: string, cb: ICallback<string[]>): void;
54
+ sscan(key: string, cursor: string, options: {
55
+ MATCH?: string;
56
+ COUNT?: number;
57
+ }, cb: ICallback<{
58
+ cursor: string;
59
+ items: string[];
60
+ }>): void;
61
+ sscanAll(key: string, options: {
62
+ MATCH?: string;
63
+ COUNT?: number;
64
+ }, cb: ICallback<string[]>): void;
65
+ sadd(key: string, member: string, cb: ICallback<number>): void;
66
+ srem(key: string, member: string, cb: ICallback<number>): void;
67
+ hgetall(key: string, cb: ICallback<Record<string, string>>): void;
68
+ hscan(key: string, cursor: string, options: {
69
+ MATCH?: string;
70
+ COUNT?: number;
71
+ }, cb: ICallback<{
72
+ cursor: string;
73
+ result: Record<string, string>;
74
+ }>): void;
75
+ hscanAll(key: string, options: {
76
+ MATCH?: string;
77
+ COUNT?: number;
78
+ }, cb: ICallback<Record<string, string>>): void;
79
+ hget(key: string, field: string, cb: ICallback<string | null>): void;
80
+ hset(key: string, field: string, value: string | number, cb: ICallback<number>): void;
81
+ hdel(key: string, fields: string | string[], cb: ICallback<number>): void;
82
+ lrange(key: string, start: number, stop: number, cb: ICallback<string[]>): void;
83
+ hkeys(key: string, cb: ICallback<string[]>): void;
84
+ hlen(key: string, cb: ICallback<number>): void;
85
+ brpoplpush(source: string, destination: string, timeout: number, cb: ICallback<string | null>): void;
86
+ rpoplpush(source: string, destination: string, cb: ICallback<string | null>): void;
87
+ zpoprpush(source: string, destination: string, cb: ICallback<string | null>): void;
88
+ zscan(key: string, cursor: string, options: {
89
+ MATCH?: string;
90
+ COUNT?: number;
91
+ }, cb: ICallback<{
92
+ cursor: string;
93
+ items: string[];
94
+ }>): void;
95
+ lpoprpush(source: string, destination: string, cb: ICallback<string | null>): void;
96
+ zrangebyscorewithscores(source: string, min: number, max: number, cb: ICallback<Record<string, string>>): void;
97
+ zrem(source: string, id: string, cb: ICallback<number>): void;
98
+ rpop(key: string, cb: ICallback<string | null>): void;
99
+ lrem(key: string, count: number, element: string, cb: ICallback<number>): void;
100
+ publish(channel: string, message: string, cb: ICallback<number>): void;
101
+ flushall(cb: ICallback<string>): void;
102
+ loadScript(script: string, cb: ICallback<string>): void;
103
+ evalsha(hash: string, args: (string | number)[] | string | number, cb: (err?: Error | null, res?: unknown) => void): void;
104
+ get(key: string, cb: ICallback<string | null>): void;
105
+ del(key: string | string[], cb: ICallback<number>): void;
106
+ llen(key: string, cb: ICallback<number>): void;
107
+ lmove(source: string, destination: string, from: 'LEFT' | 'RIGHT', to: 'LEFT' | 'RIGHT', cb: ICallback<string | null>): void;
108
+ zremrangebyscore(source: string, min: number | string, max: number | string, cb: ICallback<number>): void;
109
+ hmget(source: string, keys: string[], cb: ICallback<(string | null)[]>): void;
110
+ halt(cb: ICallback<void>): void;
111
+ end(flush: boolean): void;
112
+ quit(cb: ICallback<void>): void;
113
+ getInfo(cb: ICallback<string>): void;
114
+ updateServerVersion(cb: ICallback<void>): void;
115
+ loadScripts(cb: ICallback<void>): void;
116
+ runScript(scriptName: string, keys: (string | number)[], args: (string | number)[], cb: ICallback<unknown>): void;
117
+ }
118
+ interface IRedisTransaction {
119
+ lrem(key: string, count: number, element: string): this;
120
+ lpop(key: string): this;
121
+ rpush(key: string, element: string): this;
122
+ rpop(key: string): this;
123
+ lpush(key: string, element: string): this;
124
+ hdel(key: string, field: string | string[]): this;
125
+ hincrby(key: string, field: string, by: number): this;
126
+ del(key: string | string[]): this;
127
+ srem(key: string, element: string | string[]): this;
128
+ sadd(key: string, element: string): this;
129
+ zrem(key: string, element: string | string[]): this;
130
+ zadd(key: string, score: number, element: string): this;
131
+ hset(key: string, field: string, value: string | number): this;
132
+ pexpire(key: string, millis: number): this;
133
+ expire(key: string, secs: number): this;
134
+ ltrim(key: string, start: number, stop: number): this;
135
+ rpoplpush(source: string, destination: string): this;
136
+ exec(cb: ICallback<unknown[]>): void;
137
+ }
138
+ declare module 'ioredis' {
139
+ interface Commands {
140
+ lmove(source: string, destination: string, from: 'LEFT' | 'RIGHT', to: 'LEFT' | 'RIGHT', cb: ICallback<string>): void;
141
+ }
142
+ }
143
+
144
+ interface ILoggerConfig {
145
+ enabled: boolean;
146
+ options?: Partial<Logger.LoggerOptions>;
147
+ }
148
+
149
+ interface ILogger {
150
+ info(message: unknown, ...params: unknown[]): void;
151
+ warn(message: unknown, ...params: unknown[]): void;
152
+ error(message: unknown, ...params: unknown[]): void;
153
+ debug(message: unknown, ...params: unknown[]): void;
154
+ }
155
+
156
+ type TEvent = {
157
+ error: (err: Error) => void;
158
+ next: () => void;
159
+ up: () => void;
160
+ down: () => void;
161
+ goingUp: () => void;
162
+ goingDown: () => void;
163
+ tick: () => void;
164
+ };
165
+
166
+ declare abstract class RedisSMQError extends Error {
167
+ constructor(message?: string);
168
+ get name(): string;
169
+ }
170
+
171
+ declare class CallbackEmptyReplyError extends RedisSMQError {
172
+ constructor();
173
+ }
174
+
175
+ declare class CallbackInvalidReplyError extends RedisSMQError {
176
+ constructor();
177
+ }
178
+
179
+ declare class PanicError extends RedisSMQError {
180
+ }
181
+
182
+ declare class LoggerError extends RedisSMQError {
183
+ }
184
+
185
+ declare class TickerError extends RedisSMQError {
186
+ }
187
+
188
+ declare class LockError extends RedisSMQError {
189
+ }
190
+
191
+ declare class LockAbortError extends LockError {
192
+ constructor(message?: string);
193
+ }
194
+
195
+ declare class LockAcquireError extends LockError {
196
+ constructor(message?: string);
197
+ }
198
+
199
+ declare class LockExtendError extends LockError {
200
+ constructor(message?: string);
201
+ }
202
+
203
+ declare class LockMethodNotAllowedError extends LockError {
204
+ constructor(message?: string);
205
+ }
206
+
207
+ declare class LockNotAcquiredError extends LockError {
208
+ constructor(message?: string);
209
+ }
210
+
211
+ declare class LockNotReleasedError extends LockError {
212
+ constructor(message?: string);
213
+ }
214
+
215
+ declare class RedisClientError extends RedisSMQError {
216
+ }
217
+
218
+ declare class WatchedKeysChangedError extends RedisClientError {
219
+ constructor(msg?: string);
220
+ }
221
+
222
+ declare class WorkerError extends PanicError {
223
+ }
224
+
225
+ declare class PowerSwitchError extends RedisSMQError {
226
+ }
227
+
228
+ declare abstract class RedisClient extends EventEmitter$1 implements IRedisClient {
229
+ protected static redisServerVersion: number[] | null;
230
+ protected connectionClosed: boolean;
231
+ validateRedisVersion(major: number, feature?: number, minor?: number): boolean;
232
+ validateRedisServerSupport(cb: ICallback<void>): void;
233
+ abstract set(key: string, value: string, options: {
234
+ expire?: {
235
+ mode: 'EX' | 'PX';
236
+ value: number;
237
+ };
238
+ exists?: 'NX' | 'XX';
239
+ }, cb: ICallback<string | null>): void;
240
+ abstract zadd(key: string, score: number, member: string, cb: ICallback<number | string>): void;
241
+ abstract multi(): IRedisTransaction;
242
+ abstract watch(args: string[], cb: ICallback<string>): void;
243
+ abstract unwatch(cb: ICallback<string>): void;
244
+ abstract sismember(key: string, member: string, cb: ICallback<number>): void;
245
+ abstract zcard(key: string, cb: ICallback<number>): void;
246
+ abstract zrange(key: string, min: number, max: number, cb: ICallback<string[]>): void;
247
+ abstract zrevrange(key: string, min: number, max: number, cb: ICallback<string[]>): void;
248
+ abstract psubscribe(pattern: string): void;
249
+ abstract punsubscribe(channel: string): void;
250
+ abstract subscribe(channel: string): void;
251
+ abstract unsubscribe(channel: string): void;
252
+ abstract zrangebyscore(key: string, min: number | string, max: number | string, offset: number, count: number, cb: ICallback<string[]>): void;
253
+ abstract smembers(key: string, cb: ICallback<string[]>): void;
254
+ abstract sscan(key: string, cursor: string, options: {
255
+ MATCH?: string;
256
+ COUNT?: number;
257
+ }, cb: ICallback<{
258
+ cursor: string;
259
+ items: string[];
260
+ }>): void;
261
+ sscanAll(key: string, options: {
262
+ MATCH?: string;
263
+ COUNT?: number;
264
+ }, cb: ICallback<string[]>): void;
265
+ abstract sadd(key: string, member: string, cb: ICallback<number>): void;
266
+ abstract srem(key: string, member: string, cb: ICallback<number>): void;
267
+ abstract hgetall(key: string, cb: ICallback<Record<string, string>>): void;
268
+ abstract hscan(key: string, cursor: string, options: {
269
+ MATCH?: string;
270
+ COUNT?: number;
271
+ }, cb: ICallback<{
272
+ cursor: string;
273
+ result: Record<string, string>;
274
+ }>): void;
275
+ hscanAll(key: string, options: {
276
+ MATCH?: string;
277
+ COUNT?: number;
278
+ }, cb: ICallback<Record<string, string>>): void;
279
+ abstract hget(key: string, field: string, cb: ICallback<string | null>): void;
280
+ abstract hset(key: string, field: string, value: string | number, cb: ICallback<number>): void;
281
+ abstract hdel(key: string, fields: string | string[], cb: ICallback<number>): void;
282
+ abstract lrange(key: string, start: number, stop: number, cb: ICallback<string[]>): void;
283
+ abstract hkeys(key: string, cb: ICallback<string[]>): void;
284
+ abstract hlen(key: string, cb: ICallback<number>): void;
285
+ abstract brpoplpush(source: string, destination: string, timeout: number, cb: ICallback<string | null>): void;
286
+ abstract rpoplpush(source: string, destination: string, cb: ICallback<string | null>): void;
287
+ zpoprpush(source: string, destination: string, cb: ICallback<string | null>): void;
288
+ abstract zscan(key: string, cursor: string, options: {
289
+ MATCH?: string;
290
+ COUNT?: number;
291
+ }, cb: ICallback<{
292
+ cursor: string;
293
+ items: string[];
294
+ }>): void;
295
+ lpoprpush(source: string, destination: string, cb: ICallback<string | null>): void;
296
+ abstract zrangebyscorewithscores(source: string, min: number, max: number, cb: ICallback<Record<string, string>>): void;
297
+ abstract zrem(source: string, id: string, cb: ICallback<number>): void;
298
+ abstract rpop(key: string, cb: ICallback<string | null>): void;
299
+ abstract lrem(key: string, count: number, element: string, cb: ICallback<number>): void;
300
+ abstract publish(channel: string, message: string, cb: ICallback<number>): void;
301
+ abstract flushall(cb: ICallback<string>): void;
302
+ abstract loadScript(script: string, cb: ICallback<string>): void;
303
+ abstract evalsha(hash: string, args: (string | number)[] | string | number, cb: (err?: Error | null, res?: unknown) => void): void;
304
+ abstract get(key: string, cb: ICallback<string | null>): void;
305
+ abstract del(key: string | string[], cb: ICallback<number>): void;
306
+ abstract llen(key: string, cb: ICallback<number>): void;
307
+ abstract lmove(source: string, destination: string, from: 'LEFT' | 'RIGHT', to: 'LEFT' | 'RIGHT', cb: ICallback<string | null>): void;
308
+ abstract zremrangebyscore(source: string, min: number | string, max: number | string, cb: ICallback<number>): void;
309
+ abstract hmget(source: string, keys: string[], cb: ICallback<(string | null)[]>): void;
310
+ abstract halt(cb: ICallback<void>): void;
311
+ abstract end(flush: boolean): void;
312
+ abstract quit(cb: ICallback<void>): void;
313
+ abstract getInfo(cb: ICallback<string>): void;
314
+ updateServerVersion(cb: ICallback<void>): void;
315
+ loadScripts(cb: ICallback<void>): void;
316
+ runScript(scriptName: string, keys: (string | number)[], args: (string | number)[], cb: ICallback<unknown>): void;
317
+ static addScript(name: string, content: string): void;
318
+ }
319
+
320
+ declare enum ELockStatus {
321
+ unlocked = 0,
322
+ locking = 1,
323
+ locked = 2,
324
+ releasing = 3,
325
+ extending = 4,
326
+ extended = 5
327
+ }
328
+ declare class Lock {
329
+ protected readonly lockId: string;
330
+ protected readonly lockKey: string;
331
+ protected readonly retryOnFail: boolean;
332
+ protected readonly ttl: number;
333
+ protected readonly redisClient: RedisClient;
334
+ protected readonly autoExtend: boolean;
335
+ protected status: ELockStatus;
336
+ protected lockingTimer: NodeJS.Timeout | null;
337
+ protected autoExtendTimer: NodeJS.Timeout | null;
338
+ protected throwExceptions: boolean;
339
+ constructor(redisClient: RedisClient, lockKey: string, ttl: number, retryOnFail?: boolean, autoExtend?: boolean, throwExceptions?: boolean);
340
+ protected resetTimers(): void;
341
+ protected setUnlocked(): void;
342
+ protected setLocked(): void;
343
+ protected setExtended(): void;
344
+ protected extend(cb: ICallback<void>): void;
345
+ protected runAutoExtendTimer(): void;
346
+ acquireLock(cb: ICallback<void>): void;
347
+ extendLock(cb: ICallback<void>): void;
348
+ releaseLock(cb: ICallback<void>): void;
349
+ acquireOrExtend(cb: ICallback<ELockStatus>): void;
350
+ isLocked(): boolean;
351
+ isReleased(): boolean;
352
+ getId(): string;
353
+ }
354
+
355
+ declare class PowerSwitch {
356
+ protected throwExceptionOnError: boolean;
357
+ protected isPowered: boolean;
358
+ protected pendingState: boolean | null;
359
+ constructor(throwExceptionOnError?: boolean);
360
+ protected switch(s: boolean): boolean;
361
+ isUp(): boolean;
362
+ isDown(): boolean;
363
+ isGoingUp(): boolean;
364
+ isGoingDown(): boolean;
365
+ isRunning(): boolean;
366
+ goingUp(): boolean;
367
+ goingDown(): boolean;
368
+ commit(): void;
369
+ rollback(): void;
370
+ }
371
+
372
+ type TEventEmitterEvent = Record<string | symbol, (...args: any) => any>;
373
+ declare interface EventEmitter<Events extends TEventEmitterEvent> extends EventEmitter$1 {
374
+ on<E extends keyof Events>(event: E, listener: Events[E]): this;
375
+ once<E extends keyof Events>(event: E, listener: Events[E]): this;
376
+ emit<E extends keyof Events>(event: E, ...args: Parameters<Events[E]>): boolean;
377
+ removeAllListeners<E extends keyof Events>(event?: E): this;
378
+ }
379
+ declare class EventEmitter<Events extends TEventEmitterEvent> extends EventEmitter$1 {
380
+ }
381
+
382
+ declare class Ticker extends EventEmitter<TEvent> {
383
+ protected powerManager: PowerSwitch;
384
+ protected onTickFn: TFunction;
385
+ protected onNextTickFn: TFunction | null;
386
+ protected time: number;
387
+ protected timeout: NodeJS.Timeout | null;
388
+ protected interval: NodeJS.Timeout | null;
389
+ protected shutdownTimeout: NodeJS.Timeout | null;
390
+ protected aborted: boolean;
391
+ constructor(onTickFn?: TFunction, time?: number);
392
+ protected shutdown(): void;
393
+ protected onTick(): void;
394
+ abort(): void;
395
+ quit(): void;
396
+ isTicking(): boolean;
397
+ nextTick(): void;
398
+ nextTickFn(fn: TFunction): void;
399
+ runTimer(): void;
400
+ }
401
+
402
+ declare abstract class Worker {
403
+ private readonly ticker;
404
+ private readonly powerManager;
405
+ private readonly managed;
406
+ constructor(managed: boolean, timeout?: number);
407
+ private getTicker;
408
+ private getPowerManager;
409
+ private onTick;
410
+ run: () => void;
411
+ quit: (cb: ICallback<void>) => void;
412
+ abstract work(cb: ICallback<void>): void;
413
+ }
414
+
415
+ declare class WorkerPool {
416
+ private pool;
417
+ work: (cb: ICallback<void>) => void;
418
+ add: (worker: Worker) => number;
419
+ clear: (cb: ICallback<void>) => void;
420
+ }
421
+
422
+ declare class WorkerRunner extends EventEmitter<TEvent> {
423
+ private readonly powerManager;
424
+ private readonly ticker;
425
+ private readonly lock;
426
+ private readonly redisClient;
427
+ private readonly logger;
428
+ private readonly workerPool;
429
+ constructor(redisClient: RedisClient, keyLock: string, workerPool: WorkerPool, logger: ILogger);
430
+ private onTick;
431
+ private clearWorkerPool;
432
+ private stopTicker;
433
+ private releaseLock;
434
+ addWorker(instance: Worker): void;
435
+ run: () => void;
436
+ quit: (cb: ICallback<void>) => void;
437
+ }
438
+
439
+ declare function destroy(): void;
440
+ declare function setLogger<T extends ILogger>(logger: T): void;
441
+ declare function getLogger(cfg: ILoggerConfig, ns?: string): ILogger;
442
+ declare const logger: {
443
+ getLogger: typeof getLogger;
444
+ setLogger: typeof setLogger;
445
+ destroy: typeof destroy;
446
+ };
447
+
448
+ declare const async: {
449
+ each: <T>(collection: Record<string, T> | T[], iteratee: (item: T, key: number | string, callback: ICallback<void>) => void, callback: ICallback<void>) => void;
450
+ eachIn: <T_1>(collection: Record<string, T_1>, iteratee: (item: T_1, key: string, callback: ICallback<void>) => void, callback: ICallback<void>) => void;
451
+ eachOf: <T_2>(collection: T_2[], iteratee: (item: T_2, key: number, callback: ICallback<void>) => void, callback: ICallback<void>) => void;
452
+ waterfall: <T_3>(tasks: TFunction[], callback: ICallback<T_3>) => void;
453
+ };
454
+
455
+ declare function createInstance(config: IRedisConfig, cb: ICallback<RedisClient>): void;
456
+ declare const redis: {
457
+ createInstance: typeof createInstance;
458
+ };
459
+
460
+ export { CallbackEmptyReplyError, CallbackInvalidReplyError, ERedisConfigClient, EventEmitter, type ICallback, type ILogger, type ILoggerConfig, type IRedisClient, type IRedisConfig, type IRedisConfigIORedis, type IRedisConfigNodeRedis, type IRedisTransaction, Lock, LockAbortError, LockAcquireError, LockError, LockExtendError, LockMethodNotAllowedError, LockNotAcquiredError, LockNotReleasedError, LoggerError, PanicError, PowerSwitch, PowerSwitchError, RedisClient, RedisClientError, RedisSMQError, type TEvent, type TEventEmitterEvent, type TFunction, type TRedisClientNodeRedis, type TRedisTransactionNodeRedis, type TUnaryFunction, Ticker, TickerError, WatchedKeysChangedError, Worker, WorkerError, WorkerPool, WorkerRunner, async, logger, redis };