@hotmeshio/hotmesh 0.3.32 → 0.4.1

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 (207) hide show
  1. package/README.md +128 -823
  2. package/build/index.d.ts +9 -9
  3. package/build/index.js +10 -10
  4. package/build/modules/enums.d.ts +23 -23
  5. package/build/modules/enums.js +26 -26
  6. package/build/modules/errors.d.ts +16 -16
  7. package/build/modules/errors.js +28 -28
  8. package/build/modules/key.js +190 -1
  9. package/build/modules/utils.js +374 -1
  10. package/build/package.json +22 -21
  11. package/build/services/activities/activity.js +549 -1
  12. package/build/services/activities/await.js +114 -1
  13. package/build/services/activities/cycle.js +112 -1
  14. package/build/services/activities/hook.js +168 -1
  15. package/build/services/activities/index.js +20 -1
  16. package/build/services/activities/interrupt.js +158 -1
  17. package/build/services/activities/signal.js +134 -1
  18. package/build/services/activities/trigger.js +246 -1
  19. package/build/services/activities/worker.js +106 -1
  20. package/build/services/collator/index.js +293 -1
  21. package/build/services/compiler/deployer.js +488 -1
  22. package/build/services/compiler/index.js +112 -1
  23. package/build/services/compiler/validator.js +147 -1
  24. package/build/services/engine/index.js +761 -1
  25. package/build/services/exporter/index.js +126 -1
  26. package/build/services/hotmesh/index.d.ts +160 -17
  27. package/build/services/hotmesh/index.js +160 -17
  28. package/build/services/mapper/index.js +81 -1
  29. package/build/services/{meshflow → memflow}/client.d.ts +3 -3
  30. package/build/services/{meshflow → memflow}/client.js +17 -16
  31. package/build/services/{meshflow → memflow}/connection.d.ts +2 -2
  32. package/build/services/{meshflow → memflow}/connection.js +1 -1
  33. package/build/services/memflow/context.d.ts +143 -0
  34. package/build/services/memflow/context.js +299 -0
  35. package/build/services/{meshflow → memflow}/exporter.d.ts +6 -6
  36. package/build/services/memflow/exporter.js +215 -0
  37. package/build/services/{meshflow → memflow}/handle.d.ts +4 -4
  38. package/build/services/{meshflow → memflow}/handle.js +2 -2
  39. package/build/services/{meshflow → memflow}/index.d.ts +18 -13
  40. package/build/services/{meshflow → memflow}/index.js +26 -21
  41. package/build/services/{meshflow → memflow}/schemas/factory.d.ts +4 -4
  42. package/build/services/{meshflow → memflow}/schemas/factory.js +5 -5
  43. package/build/services/{meshflow → memflow}/search.d.ts +1 -1
  44. package/build/services/{meshflow → memflow}/search.js +4 -4
  45. package/build/services/{meshflow → memflow}/worker.d.ts +5 -5
  46. package/build/services/{meshflow → memflow}/worker.js +24 -24
  47. package/build/services/memflow/workflow/common.d.ts +20 -0
  48. package/build/services/memflow/workflow/common.js +47 -0
  49. package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
  50. package/build/services/memflow/workflow/contextMethods.js +33 -0
  51. package/build/services/{meshflow → memflow}/workflow/execChild.js +12 -12
  52. package/build/services/memflow/workflow/execHook.d.ts +65 -0
  53. package/build/services/memflow/workflow/execHook.js +73 -0
  54. package/build/services/{meshflow → memflow}/workflow/hook.js +19 -3
  55. package/build/services/{meshflow → memflow}/workflow/index.d.ts +7 -3
  56. package/build/services/{meshflow → memflow}/workflow/index.js +7 -3
  57. package/build/services/{meshflow → memflow}/workflow/proxyActivities.d.ts +2 -2
  58. package/build/services/{meshflow → memflow}/workflow/proxyActivities.js +8 -8
  59. package/build/services/{meshflow → memflow}/workflow/sleepFor.js +2 -2
  60. package/build/services/{meshflow → memflow}/workflow/waitFor.js +2 -2
  61. package/build/services/meshdata/index.d.ts +24 -24
  62. package/build/services/meshdata/index.js +40 -40
  63. package/build/services/pipe/functions/array.js +74 -1
  64. package/build/services/pipe/functions/bitwise.js +24 -1
  65. package/build/services/pipe/functions/conditional.js +36 -1
  66. package/build/services/pipe/functions/cron.js +40 -1
  67. package/build/services/pipe/functions/date.js +171 -1
  68. package/build/services/pipe/functions/index.js +30 -1
  69. package/build/services/pipe/functions/json.js +12 -1
  70. package/build/services/pipe/functions/logical.js +12 -1
  71. package/build/services/pipe/functions/math.js +184 -1
  72. package/build/services/pipe/functions/number.js +60 -1
  73. package/build/services/pipe/functions/object.js +81 -1
  74. package/build/services/pipe/functions/string.js +69 -1
  75. package/build/services/pipe/functions/symbol.js +33 -1
  76. package/build/services/pipe/functions/unary.js +18 -1
  77. package/build/services/pipe/index.js +242 -1
  78. package/build/services/quorum/index.js +263 -1
  79. package/build/services/reporter/index.js +348 -1
  80. package/build/services/router/config/index.d.ts +11 -0
  81. package/build/services/router/config/index.js +36 -0
  82. package/build/services/router/consumption/index.d.ts +34 -0
  83. package/build/services/router/consumption/index.js +395 -0
  84. package/build/services/router/error-handling/index.d.ts +8 -0
  85. package/build/services/router/error-handling/index.js +98 -0
  86. package/build/services/router/index.d.ts +13 -16
  87. package/build/services/router/index.js +121 -1
  88. package/build/services/router/lifecycle/index.d.ts +27 -0
  89. package/build/services/router/lifecycle/index.js +80 -0
  90. package/build/services/router/telemetry/index.d.ts +11 -0
  91. package/build/services/router/telemetry/index.js +32 -0
  92. package/build/services/router/throttling/index.d.ts +23 -0
  93. package/build/services/router/throttling/index.js +76 -0
  94. package/build/services/search/index.d.ts +2 -1
  95. package/build/services/search/providers/postgres/postgres.d.ts +2 -1
  96. package/build/services/search/providers/postgres/postgres.js +149 -1
  97. package/build/services/search/providers/redis/ioredis.d.ts +1 -0
  98. package/build/services/search/providers/redis/ioredis.js +121 -1
  99. package/build/services/search/providers/redis/redis.d.ts +1 -0
  100. package/build/services/search/providers/redis/redis.js +134 -1
  101. package/build/services/serializer/index.js +282 -1
  102. package/build/services/store/providers/postgres/kvsql.d.ts +1 -1
  103. package/build/services/store/providers/postgres/kvsql.js +198 -1
  104. package/build/services/store/providers/postgres/kvtables.js +441 -1
  105. package/build/services/store/providers/postgres/kvtransaction.js +248 -1
  106. package/build/services/store/providers/postgres/kvtypes/hash.d.ts +1 -1
  107. package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -1
  108. package/build/services/store/providers/postgres/kvtypes/list.js +194 -1
  109. package/build/services/store/providers/postgres/kvtypes/string.js +115 -1
  110. package/build/services/store/providers/postgres/kvtypes/zset.js +214 -1
  111. package/build/services/store/providers/postgres/postgres.js +1036 -1
  112. package/build/services/store/providers/redis/_base.js +980 -1
  113. package/build/services/store/providers/redis/ioredis.js +180 -1
  114. package/build/services/store/providers/redis/redis.js +199 -1
  115. package/build/services/store/providers/store-initializable.js +2 -1
  116. package/build/services/stream/index.d.ts +5 -0
  117. package/build/services/stream/providers/nats/nats.d.ts +1 -0
  118. package/build/services/stream/providers/nats/nats.js +225 -1
  119. package/build/services/stream/providers/postgres/kvtables.d.ts +1 -0
  120. package/build/services/stream/providers/postgres/kvtables.js +146 -1
  121. package/build/services/stream/providers/postgres/postgres.d.ts +19 -0
  122. package/build/services/stream/providers/postgres/postgres.js +519 -1
  123. package/build/services/stream/providers/redis/ioredis.d.ts +1 -0
  124. package/build/services/stream/providers/redis/ioredis.js +272 -1
  125. package/build/services/stream/providers/redis/redis.d.ts +1 -0
  126. package/build/services/stream/providers/redis/redis.js +305 -1
  127. package/build/services/stream/providers/stream-initializable.js +2 -1
  128. package/build/services/sub/providers/nats/nats.js +105 -1
  129. package/build/services/sub/providers/postgres/postgres.js +92 -1
  130. package/build/services/sub/providers/redis/ioredis.js +81 -1
  131. package/build/services/sub/providers/redis/redis.js +72 -1
  132. package/build/services/task/index.js +206 -1
  133. package/build/services/telemetry/index.js +306 -1
  134. package/build/services/worker/index.js +197 -1
  135. package/build/types/error.d.ts +5 -5
  136. package/build/types/exporter.d.ts +1 -1
  137. package/build/types/index.d.ts +3 -3
  138. package/build/types/manifest.d.ts +2 -2
  139. package/build/types/{meshflow.d.ts → memflow.d.ts} +15 -15
  140. package/build/types/meshdata.d.ts +3 -3
  141. package/build/types/postgres.d.ts +7 -0
  142. package/build/types/stream.d.ts +3 -0
  143. package/index.ts +11 -11
  144. package/package.json +22 -21
  145. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
  146. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
  147. package/build/services/meshflow/exporter.js +0 -1
  148. package/build/services/meshflow/workflow/common.d.ts +0 -18
  149. package/build/services/meshflow/workflow/common.js +0 -45
  150. package/typedoc.json +0 -46
  151. package/types/activity.ts +0 -268
  152. package/types/app.ts +0 -20
  153. package/types/async.ts +0 -6
  154. package/types/cache.ts +0 -1
  155. package/types/collator.ts +0 -9
  156. package/types/error.ts +0 -56
  157. package/types/exporter.ts +0 -102
  158. package/types/hook.ts +0 -44
  159. package/types/hotmesh.ts +0 -314
  160. package/types/index.ts +0 -306
  161. package/types/job.ts +0 -233
  162. package/types/logger.ts +0 -8
  163. package/types/manifest.ts +0 -70
  164. package/types/map.ts +0 -5
  165. package/types/meshcall.ts +0 -235
  166. package/types/meshdata.ts +0 -278
  167. package/types/meshflow.ts +0 -645
  168. package/types/ms.d.ts +0 -7
  169. package/types/nats.ts +0 -270
  170. package/types/pipe.ts +0 -90
  171. package/types/postgres.ts +0 -105
  172. package/types/provider.ts +0 -161
  173. package/types/quorum.ts +0 -167
  174. package/types/redis.ts +0 -404
  175. package/types/serializer.ts +0 -40
  176. package/types/stats.ts +0 -117
  177. package/types/stream.ts +0 -227
  178. package/types/task.ts +0 -7
  179. package/types/telemetry.ts +0 -16
  180. package/types/transition.ts +0 -20
  181. /package/build/services/{meshflow → memflow}/workflow/all.d.ts +0 -0
  182. /package/build/services/{meshflow → memflow}/workflow/all.js +0 -0
  183. /package/build/services/{meshflow → memflow}/workflow/context.d.ts +0 -0
  184. /package/build/services/{meshflow → memflow}/workflow/context.js +0 -0
  185. /package/build/services/{meshflow → memflow}/workflow/didRun.d.ts +0 -0
  186. /package/build/services/{meshflow → memflow}/workflow/didRun.js +0 -0
  187. /package/build/services/{meshflow → memflow}/workflow/emit.d.ts +0 -0
  188. /package/build/services/{meshflow → memflow}/workflow/emit.js +0 -0
  189. /package/build/services/{meshflow → memflow}/workflow/enrich.d.ts +0 -0
  190. /package/build/services/{meshflow → memflow}/workflow/enrich.js +0 -0
  191. /package/build/services/{meshflow → memflow}/workflow/execChild.d.ts +0 -0
  192. /package/build/services/{meshflow → memflow}/workflow/hook.d.ts +0 -0
  193. /package/build/services/{meshflow → memflow}/workflow/interrupt.d.ts +0 -0
  194. /package/build/services/{meshflow → memflow}/workflow/interrupt.js +0 -0
  195. /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.d.ts +0 -0
  196. /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.js +0 -0
  197. /package/build/services/{meshflow → memflow}/workflow/random.d.ts +0 -0
  198. /package/build/services/{meshflow → memflow}/workflow/random.js +0 -0
  199. /package/build/services/{meshflow → memflow}/workflow/searchMethods.d.ts +0 -0
  200. /package/build/services/{meshflow → memflow}/workflow/searchMethods.js +0 -0
  201. /package/build/services/{meshflow → memflow}/workflow/signal.d.ts +0 -0
  202. /package/build/services/{meshflow → memflow}/workflow/signal.js +0 -0
  203. /package/build/services/{meshflow → memflow}/workflow/sleepFor.d.ts +0 -0
  204. /package/build/services/{meshflow → memflow}/workflow/trace.d.ts +0 -0
  205. /package/build/services/{meshflow → memflow}/workflow/trace.js +0 -0
  206. /package/build/services/{meshflow → memflow}/workflow/waitFor.d.ts +0 -0
  207. /package/build/types/{meshflow.js → memflow.js} +0 -0
@@ -1 +1,272 @@
1
- 'use strict';function b(c,d){const e=a();return b=function(f,g){f=f-0x119;let h=e[f];return h;},b(c,d);}function a(){const L=['1233943yALXpK','createConsumerGroup','defineProperty','length','storeClient','Error\x20in\x20deleting\x20messages:\x20','xclaim','claimMessage','\x20for\x20key:\x20','publishMessages','get','Error\x20deleting\x20consumer\x20group\x20','4WfCEeb','Error\x20consuming\x20messages\x20from\x20','__esModule','../../../../modules/enums','consumeMessages','xadd','multi','XPENDING','xack','Error\x20deleting\x20stream\x20','namespace','198OEdhGL','GROUP','acknowledgeMessages','Error\x20in\x20claiming\x20message\x20with\x20id:\x20','transaction','exec','getStreamDepth','ackAndDelete','error','createStream','toString','getStreamDepths','forEach','../../index','field','xdel','appId','deleteConsumerGroup','getProviderSpecificFeatures','logger','xlen','keys','Error\x20in\x20retrieving\x20pending\x20messages\x20for\x20[stream\x20','../../../../modules/utils','xgroup','963473iyiBji','KeyService','has','deleteStream','5968670wYKMdb','30ChHSBD','ioredis-xadd-error\x20key:\x20','streamClient','HMSH_BLOCK_TIME_MS','init','344920XrBbfn','StreamService','map','Error\x20getting\x20depth\x20for\x20','CREATE','isArray','mintKey','call','4Pazkbp','Error\x20in\x20acknowledging\x20messages:\x20[','IORedisStreamService','push','stream','message','Error\x20creating\x20stream\x20','debug','1873941pfAyhZ','STREAMS','isStreamMessage','minIdleTime','getPendingMessages','trimStream','18767796niQEga','set','12045110ClijYr','consumerName','22MJQrwY','xreadgroup'];a=function(){return L;};return a();}const r=b;(function(c,d){const q=b,e=c();while(!![]){try{const f=parseInt(q(0x146))/0x1+parseInt(q(0x132))/0x2*(-parseInt(q(0x13a))/0x3)+parseInt(q(0x152))/0x4*(-parseInt(q(0x124))/0x5)+-parseInt(q(0x125))/0x6*(parseInt(q(0x120))/0x7)+parseInt(q(0x12a))/0x8*(parseInt(q(0x15d))/0x9)+-parseInt(q(0x142))/0xa+-parseInt(q(0x144))/0xb*(-parseInt(q(0x140))/0xc);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xedf71));Object[r(0x148)](exports,r(0x154),{'value':!0x0}),exports[r(0x134)]=void 0x0;const index_1=require(r(0x16a)),utils_1=require(r(0x11e)),key_1=require('../../../../modules/key'),enums_1=require(r(0x155));class IORedisStreamService extends index_1[r(0x12b)]{constructor(c,d,f={}){super(c,d,f);}async[r(0x129)](c,d,f){const s=r;this[s(0x15c)]=c,this['logger']=f,this[s(0x16d)]=d;}[r(0x130)](c,d){const t=r;if(!this[t(0x15c)])throw new Error('namespace\x20not\x20set');return key_1[t(0x121)][t(0x130)](this[t(0x15c)],c,{...d,'appId':this['appId']});}['transact'](){const u=r;return this[u(0x127)]['multi']();}async[r(0x166)](c){const v=r;try{const d=await this[v(0x127)][v(0x157)](c,'*',v(0x16b),'value');return await this[v(0x127)][v(0x16c)](c,d),!0x0;}catch(f){throw this[v(0x11a)][v(0x165)](v(0x138)+c,{'error':f}),f;}}async[r(0x123)](c){const w=r;try{return await this[w(0x127)]['del'](c)>0x0;}catch(d){throw this[w(0x11a)]['error'](w(0x15b)+c,{'error':d}),d;}}async[r(0x147)](c,d){const x=r;try{return'OK'===await this[x(0x14a)][x(0x11f)](x(0x12e),c,d,'$','MKSTREAM');}catch(f){throw this[x(0x11a)][x(0x139)]('stream-mkstream-caught',{'key':c,'group':d}),f;}}async[r(0x16e)](c,d){const y=r;try{return 0x1===await this[y(0x127)][y(0x11f)]('DESTROY',c,d);}catch(f){throw this[y(0x11a)][y(0x165)](y(0x151)+d+'\x20for\x20stream\x20'+c,{'error':f}),f;}}async[r(0x14f)](c,d,f){const z=r;try{const g=f?.[z(0x161)]||d[z(0x149)]>0x1&&this['storeClient'][z(0x158)]();let h;for(const i of d)h=await(g||this[z(0x14a)])[z(0x157)](c,'*',z(0x137),i);return g&&!f?.['transaction']?(await g[z(0x162)]())[z(0x12c)](j=>j[0x1]):[h];}catch(j){throw this['logger'][z(0x165)](z(0x126)+c,{'error':j}),j;}}async[r(0x156)](c,d,f,g){const A=r;try{const h=await this[A(0x127)][A(0x145)](A(0x15e),d,f,'BLOCK',g?.['blockTimeout']??enums_1[A(0x128)],A(0x13b),c,'>'),j=[];if(!(0x0,utils_1[A(0x13c)])(h))return[];{const [[,k]]=h;for(const [l,m]of k)j[A(0x135)]({'id':l,'data':(0x0,utils_1['parseStreamMessage'])(m[0x1])});}return j;}catch(n){throw this['logger'][A(0x165)](A(0x153)+c,{'error':n}),n;}}async[r(0x164)](c,d,f){const B=r,g=this[B(0x14a)]['multi']();return this['acknowledgeMessages'](c,d,f,{'multi':g}),this['deleteMessages'](c,d,f,{'multi':g}),await g[B(0x162)](),f[B(0x149)];}async[r(0x15f)](c,d,f,g){const C=r;try{return g?.['multi']?(g[C(0x158)][C(0x15a)](c,d,...f),g[C(0x158)]):await this['streamClient'][C(0x15a)](c,d,...f);}catch(h){throw this[C(0x11a)][C(0x165)](C(0x133)+f+']\x20in\x20group:\x20'+d+'\x20for\x20key:\x20'+c,{'error':h}),h;}}async['deleteMessages'](c,d,f,g){const D=r;try{return g?.[D(0x158)]?(g[D(0x158)][D(0x16c)](c,...f),g[D(0x158)]):await this[D(0x127)][D(0x16c)](c,...f);}catch(h){throw this[D(0x11a)][D(0x165)](D(0x14b)+f+'\x20for\x20key:\x20'+c,{'error':h}),h;}}async['getPendingMessages'](c,d,f,g){const E=r;try{const h=[c,d];h['push']('-'),h[E(0x135)]('+'),void 0x0!==f&&h['push'](f[E(0x167)]()),g&&h[E(0x135)](g);try{return await this[E(0x127)][E(0x131)](E(0x159),...h);}catch(i){this[E(0x11a)][E(0x165)]('err,\x20args',{'error':i},h);}}catch(j){throw this[E(0x11a)][E(0x165)](E(0x11d)+c+'],\x20[group\x20'+d+']',{'error':j}),j;}}async['retryMessages'](c,d,f){const F=r;let g=[];const h=await this[F(0x13e)](c,d,f?.['limit']);for(const j of h)if(Array[F(0x12f)](j)){const [k,,l,m]=j;if(l>f?.[F(0x13d)]){const p=await this['claimMessage'](c,d,f?.[F(0x143)],f?.[F(0x13d)],k);g=g['concat'](p);}}return g;}async[r(0x14d)](c,d,f,g,h,...j){const G=r;try{const k=await this[G(0x127)][G(0x14c)](c,d,f,g,h,...j);return{'id':k[0x0][0x0],'data':(0x0,utils_1['parseStreamMessage'])(k[0x0][0x1][0x1])};}catch(l){throw this[G(0x11a)]['error'](G(0x160)+h+'\x20in\x20group:\x20'+d+G(0x14e)+c,{'error':l}),l;}}async['getStreamStats'](c){const H=r;return{'messageCount':await this[H(0x163)](c)};}async['getStreamDepth'](c,d){const I=r;try{if(d?.['multi'])return d[I(0x158)][I(0x11b)](c),0x0;return await this['streamClient'][I(0x11b)](c);}catch(f){throw this[I(0x11a)][I(0x165)](I(0x12d)+c,{'error':f}),f;}}async[r(0x168)](c){const J=r,d=this['storeClient'][J(0x158)](),f=new Map();c[J(0x169)](h=>{const K=J;f[K(0x122)](h[K(0x136)])||(f[K(0x141)](h['stream'],-0x1),this['getStreamDepth'](h[K(0x136)],{'multi':d}));});const g=await d[J(0x162)]();return Array['from'](f[J(0x11c)]())['forEach']((h,i)=>{f['set'](h,g[i][0x1]);}),c[J(0x12c)](h=>({'stream':h[J(0x136)],'depth':f[J(0x150)](h[J(0x136)])||0x0}));}async[r(0x13f)](c,d){return 0x0;}[r(0x119)](){return{'supportsBatching':!0x0,'supportsDeadLetterQueue':!0x1,'supportsOrdering':!0x0,'supportsTrimming':!0x0,'supportsRetry':!0x0,'maxMessageSize':0x20000000,'maxBatchSize':0x3e8};}}exports[r(0x134)]=IORedisStreamService;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IORedisStreamService = void 0;
4
+ const index_1 = require("../../index");
5
+ const utils_1 = require("../../../../modules/utils");
6
+ const key_1 = require("../../../../modules/key");
7
+ const enums_1 = require("../../../../modules/enums");
8
+ class IORedisStreamService extends index_1.StreamService {
9
+ constructor(streamClient, storeClient, config = {}) {
10
+ super(streamClient, storeClient, config);
11
+ }
12
+ async init(namespace, appId, logger) {
13
+ this.namespace = namespace;
14
+ this.logger = logger;
15
+ this.appId = appId;
16
+ }
17
+ mintKey(type, params) {
18
+ if (!this.namespace)
19
+ throw new Error('namespace not set');
20
+ return key_1.KeyService.mintKey(this.namespace, type, {
21
+ ...params,
22
+ appId: this.appId,
23
+ });
24
+ }
25
+ transact() {
26
+ return this.streamClient.multi();
27
+ }
28
+ // Core streaming operations
29
+ async createStream(streamName) {
30
+ try {
31
+ // streams are created when you add messages.
32
+ // To create an empty stream, we can add and delete a dummy message.
33
+ const dummyId = await this.streamClient.xadd(streamName, '*', 'field', 'value');
34
+ await this.streamClient.xdel(streamName, dummyId);
35
+ return true;
36
+ }
37
+ catch (error) {
38
+ this.logger.error(`Error creating stream ${streamName}`, { error });
39
+ throw error;
40
+ }
41
+ }
42
+ async deleteStream(streamName) {
43
+ try {
44
+ const result = await this.streamClient.del(streamName);
45
+ return result > 0;
46
+ }
47
+ catch (error) {
48
+ this.logger.error(`Error deleting stream ${streamName}`, { error });
49
+ throw error;
50
+ }
51
+ }
52
+ // Consumer group operations
53
+ async createConsumerGroup(key, groupName) {
54
+ try {
55
+ return ((await this.storeClient.xgroup('CREATE', key, groupName, '$', 'MKSTREAM')) === 'OK');
56
+ }
57
+ catch (err) {
58
+ this.logger.debug('stream-mkstream-caught', { key, group: groupName });
59
+ throw err;
60
+ }
61
+ }
62
+ async deleteConsumerGroup(streamName, groupName) {
63
+ try {
64
+ const result = await this.streamClient.xgroup('DESTROY', streamName, groupName);
65
+ return result === 1;
66
+ }
67
+ catch (error) {
68
+ this.logger.error(`Error deleting consumer group ${groupName} for stream ${streamName}`, { error });
69
+ throw error;
70
+ }
71
+ }
72
+ // Message operations
73
+ async publishMessages(streamName, messages, options) {
74
+ try {
75
+ const multi = options?.transaction ||
76
+ (messages.length > 1 && this.storeClient.multi());
77
+ let response;
78
+ for (const message of messages) {
79
+ response = await (multi || this.storeClient).xadd(streamName, '*', 'message', message);
80
+ }
81
+ if (multi && !options?.transaction) {
82
+ //only exec if we created the multi;
83
+ //otherwise caller is responsible
84
+ return (await multi.exec()).map((result) => result[1]);
85
+ }
86
+ else {
87
+ return [response];
88
+ }
89
+ }
90
+ catch (error) {
91
+ this.logger.error(`ioredis-xadd-error key: ${streamName}`, { error });
92
+ throw error;
93
+ }
94
+ }
95
+ async consumeMessages(streamName, groupName, consumerName, options) {
96
+ try {
97
+ const result = await this.streamClient.xreadgroup('GROUP', groupName, consumerName, 'BLOCK', options?.blockTimeout ?? enums_1.HMSH_BLOCK_TIME_MS, 'STREAMS', streamName, '>');
98
+ const response = [];
99
+ if ((0, utils_1.isStreamMessage)(result)) {
100
+ const [[, messages]] = result;
101
+ for (const [id, message] of messages) {
102
+ response.push({
103
+ id,
104
+ data: (0, utils_1.parseStreamMessage)(message[1]),
105
+ });
106
+ }
107
+ }
108
+ else {
109
+ return [];
110
+ }
111
+ return response;
112
+ }
113
+ catch (error) {
114
+ this.logger.error(`Error consuming messages from ${streamName}`, {
115
+ error,
116
+ });
117
+ throw error;
118
+ }
119
+ }
120
+ async ackAndDelete(stream, group, ids) {
121
+ const multi = this.storeClient.multi();
122
+ this.acknowledgeMessages(stream, group, ids, { multi });
123
+ this.deleteMessages(stream, group, ids, { multi });
124
+ await multi.exec();
125
+ return ids.length;
126
+ }
127
+ async acknowledgeMessages(stream, group, ids, options) {
128
+ try {
129
+ if (options?.multi) {
130
+ options.multi.xack(stream, group, ...ids);
131
+ return options.multi;
132
+ }
133
+ else {
134
+ return await this.streamClient.xack(stream, group, ...ids);
135
+ }
136
+ }
137
+ catch (error) {
138
+ this.logger.error(`Error in acknowledging messages: [${ids}] in group: ${group} for key: ${stream}`, { error });
139
+ throw error;
140
+ }
141
+ }
142
+ async deleteMessages(stream, group, ids, options) {
143
+ try {
144
+ if (options?.multi) {
145
+ options.multi.xdel(stream, ...ids);
146
+ return options.multi;
147
+ }
148
+ else {
149
+ return await this.streamClient.xdel(stream, ...ids);
150
+ }
151
+ }
152
+ catch (error) {
153
+ this.logger.error(`Error in deleting messages: ${ids} for key: ${stream}`, { error });
154
+ throw error;
155
+ }
156
+ }
157
+ async getPendingMessages(stream, group, count, consumer) {
158
+ const start = '-';
159
+ const end = '+';
160
+ try {
161
+ const args = [stream, group];
162
+ if (start)
163
+ args.push(start);
164
+ if (end)
165
+ args.push(end);
166
+ if (count !== undefined)
167
+ args.push(count.toString());
168
+ if (consumer)
169
+ args.push(consumer);
170
+ try {
171
+ return (await this.streamClient.call('XPENDING', ...args));
172
+ }
173
+ catch (error) {
174
+ this.logger.error('err, args', { error }, args);
175
+ }
176
+ }
177
+ catch (error) {
178
+ this.logger.error(`Error in retrieving pending messages for [stream ${stream}], [group ${group}]`, { error });
179
+ throw error;
180
+ }
181
+ }
182
+ // Retry Method
183
+ async retryMessages(streamName, groupName, options) {
184
+ let pendingMessages = [];
185
+ const pendingMessagesInfo = await this.getPendingMessages(streamName, groupName, options?.limit); //[[ '1688768134881-0', 'testConsumer1', 1017, 1 ]]
186
+ for (const pendingMessageInfo of pendingMessagesInfo) {
187
+ if (Array.isArray(pendingMessageInfo)) {
188
+ const [id, , elapsedTimeMs, deliveryCount] = pendingMessageInfo;
189
+ if (elapsedTimeMs > options?.minIdleTime) {
190
+ const reclaimedMessage = await this.claimMessage(streamName, groupName, options?.consumerName, options?.minIdleTime, id);
191
+ pendingMessages = pendingMessages.concat(reclaimedMessage);
192
+ }
193
+ }
194
+ }
195
+ return pendingMessages;
196
+ }
197
+ async claimMessage(streamName, groupName, consumerName, minIdleTime, messageId, ...args) {
198
+ try {
199
+ const message = (await this.streamClient.xclaim(streamName, groupName, consumerName, minIdleTime, messageId, ...args));
200
+ return {
201
+ id: message[0][0],
202
+ data: (0, utils_1.parseStreamMessage)(message[0][1][1]),
203
+ };
204
+ }
205
+ catch (error) {
206
+ this.logger.error(`Error in claiming message with id: ${messageId} in group: ${groupName} for key: ${streamName}`, { error });
207
+ throw error;
208
+ }
209
+ }
210
+ async getStreamStats(streamName) {
211
+ return {
212
+ messageCount: await this.getStreamDepth(streamName),
213
+ };
214
+ }
215
+ async getStreamDepth(streamName, options) {
216
+ try {
217
+ if (options?.multi) {
218
+ options.multi.xlen(streamName);
219
+ return 0;
220
+ }
221
+ const length = await this.streamClient.xlen(streamName);
222
+ return length;
223
+ }
224
+ catch (error) {
225
+ this.logger.error(`Error getting depth for ${streamName}`, { error });
226
+ throw error;
227
+ }
228
+ }
229
+ async getStreamDepths(streamNames) {
230
+ const multi = this.storeClient.multi();
231
+ const uniqueStreams = new Map(); // to store unique streams
232
+ // Add unique streams to the multi command
233
+ streamNames.forEach((profile) => {
234
+ if (!uniqueStreams.has(profile.stream)) {
235
+ uniqueStreams.set(profile.stream, -1); // initialize depth to -1 as a placeholder
236
+ this.getStreamDepth(profile.stream, { multi });
237
+ }
238
+ });
239
+ // Execute all commands
240
+ const streamDepthResults = (await multi.exec());
241
+ // Update the uniqueStreams map with the actual depths from multi.exec() results
242
+ Array.from(uniqueStreams.keys()).forEach((stream, idx) => {
243
+ uniqueStreams.set(stream, streamDepthResults[idx][1]);
244
+ });
245
+ // Map back to the original `streamNames` array with correct depths
246
+ const updatedNames = streamNames.map((profile) => {
247
+ return {
248
+ stream: profile.stream,
249
+ depth: uniqueStreams.get(profile.stream) || 0,
250
+ };
251
+ });
252
+ return updatedNames;
253
+ }
254
+ async trimStream(streamName, options) {
255
+ //no-op for now
256
+ return 0;
257
+ }
258
+ // Provider-specific helpers
259
+ getProviderSpecificFeatures() {
260
+ return {
261
+ supportsBatching: true,
262
+ supportsDeadLetterQueue: false,
263
+ supportsOrdering: true,
264
+ supportsTrimming: true,
265
+ supportsRetry: true,
266
+ supportsNotifications: false,
267
+ maxMessageSize: 512 * 1024 * 1024,
268
+ maxBatchSize: 1000,
269
+ };
270
+ }
271
+ }
272
+ exports.IORedisStreamService = IORedisStreamService;
@@ -53,6 +53,7 @@ declare class RedisStreamService extends StreamService<RedisRedisClientType, Red
53
53
  supportsOrdering: boolean;
54
54
  supportsTrimming: boolean;
55
55
  supportsRetry: boolean;
56
+ supportsNotifications: boolean;
56
57
  maxMessageSize: number;
57
58
  maxBatchSize: number;
58
59
  };
@@ -1 +1,305 @@
1
- 'use strict';const r=b;(function(c,d){const q=b,e=c();while(!![]){try{const f=-parseInt(q(0x1c3))/0x1+parseInt(q(0x1c6))/0x2+parseInt(q(0x1d6))/0x3+-parseInt(q(0x1f2))/0x4*(parseInt(q(0x212))/0x5)+-parseInt(q(0x1c1))/0x6+parseInt(q(0x1cf))/0x7*(parseInt(q(0x20f))/0x8)+parseInt(q(0x203))/0x9;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x45858));function b(c,d){const e=a();return b=function(f,g){f=f-0x1bf;let h=e[f];return h;},b(c,d);}Object[r(0x205)](exports,'__esModule',{'value':!0x0}),exports[r(0x1ed)]=void 0x0;const index_1=require(r(0x1da)),utils_1=require(r(0x1fd)),key_1=require(r(0x1f0)),enums_1=require(r(0x1d7));class RedisStreamService extends index_1['StreamService']{constructor(c,d,f={}){super(c,d,f);}async['init'](c,d,f){const s=r;this[s(0x1e8)]=c,this[s(0x1f8)]=f,this['appId']=d;}[r(0x1c4)](c,d){const t=r;if(!this[t(0x1e8)])throw new Error(t(0x1ee));return key_1[t(0x1fa)]['mintKey'](this[t(0x1e8)],c,{...d,'appId':this[t(0x1c9)]});}[r(0x201)](){const u=r;return this[u(0x1f3)][u(0x1c5)]();}async[r(0x1c2)](c){const v=r;try{const d=await this[v(0x1f3)][v(0x1cd)](c,'*',{'field':'value'});return await this[v(0x1f3)][v(0x1db)](c,d),!0x0;}catch(f){throw this[v(0x1f8)]['error'](v(0x1cc)+c,{'error':f}),f;}}async[r(0x211)](c){const w=r;try{return await this['streamClient']['DEL'](c)>0x0;}catch(d){throw this[w(0x1f8)][w(0x1d3)](w(0x1d8)+c,{'error':d}),d;}}async[r(0x20e)](c,d){const x=r;try{return'OK'===await this[x(0x208)][x(0x1df)](['XGROUP',x(0x1eb),c,d,'$',x(0x1f6)]);}catch(f){const g=x(0x1ef);throw this[x(0x1f8)][x(0x1d4)](x(0x1dc)+g+x(0x1e9)+c+x(0x1e0)+d,{'error':f}),f;}}async['deleteConsumerGroup'](c,d){const y=r;try{return await this['streamClient']['xGroupDestroy'](c,d);}catch(f){throw this[y(0x1f8)][y(0x1d3)](y(0x1e1)+d+y(0x1fb)+c,{'error':f}),f;}}async[r(0x1d2)](c,d,f){const z=r;try{const g=f?.['transaction']||d[z(0x1e2)]>0x1&&this[z(0x208)][z(0x1c5)]();let h;for(const i of d)h=await(g||this[z(0x208)])[z(0x1cd)](c,'*',{'message':i});return g&&!f?.[z(0x20a)]?(await g['exec']())[z(0x1e5)](j=>j[0x1]):[h];}catch(j){throw this[z(0x1f8)][z(0x1d3)](z(0x1f7)+c,{'error':j}),j;}}async[r(0x1d1)](c,d,f,g){const A=r;try{const h=await this[A(0x1f3)][A(0x1df)]([A(0x1ea),'GROUP',d,f,A(0x1c0),g?.[A(0x1d9)]?.[A(0x20d)]()??enums_1['HMSH_BLOCK_TIME_MS'][A(0x20d)](),A(0x1d0),c,'>']),j=[];if(!(0x0,utils_1['isStreamMessage'])(h))return[];{const [[,k]]=h;for(const [l,m]of k)j['push']({'id':l,'data':(0x0,utils_1[A(0x1ec)])(m[0x1])});}return j;}catch(n){throw this[A(0x1f8)][A(0x1d3)](A(0x210)+c,{'error':n}),n;}}async[r(0x1f5)](c,d,f){const B=r,g=this['storeClient']['multi']();return await this['acknowledgeMessages'](c,d,f,{'multi':g}),await this[B(0x20b)](c,d,f,{'multi':g}),await g[B(0x1dd)](),f[B(0x1e2)];}async[r(0x1e4)](c,d,f,g){const C=r;try{return g?.['multi']?(g[C(0x1c5)][C(0x1de)](c,d,f),g[C(0x1c5)]):await this[C(0x1f3)][C(0x1de)](c,d,...f);}catch(h){throw this[C(0x1f8)][C(0x1d3)]('Error\x20in\x20acknowledging\x20messages\x20in\x20group:\x20'+d+'\x20for\x20key:\x20'+c,{'error':h}),h;}}async[r(0x20b)](c,d,f,g){const D=r;try{return g?.[D(0x1c5)]?(g[D(0x1c5)]['xDel'](c,f),g[D(0x1c5)]):await this['streamClient'][D(0x1db)](c,...f);}catch(h){throw this[D(0x1f8)][D(0x1d3)]('Error\x20in\x20deleting\x20messages\x20with\x20ids:\x20'+f['join'](',')+'\x20for\x20key:\x20'+c,{'error':h}),h;}}async[r(0x209)](c,d,f,g){const E=r;try{const h='-',j='+',k=[c,d];h&&k['push'](h),j&&k[E(0x1fe)](j),void 0x0!==f&&k[E(0x1fe)](f[E(0x20d)]()),g&&k[E(0x1fe)](g);try{return await this['streamClient'][E(0x1df)]([E(0x1e7),...k]);}catch(l){this['logger'][E(0x1d3)](E(0x1fc),{'error':l},k);}}catch(m){throw this[E(0x1f8)][E(0x1d3)](E(0x202)+d+'\x20in\x20key:\x20'+c,{'error':m}),m;}}async['retryMessages'](c,d,f){const F=r;let g=[];const h=await this[F(0x209)](c,d,f?.[F(0x200)]);for(const j of h)if(Array[F(0x1cb)](j)){const [k,,l,m]=j;if(l>f?.[F(0x1ff)]){const p=await this[F(0x1f9)](c,d,f?.['consumerName'],f?.[F(0x1ff)],k);g=g[F(0x213)](p);}}return g;}async['claimMessage'](c,d,f,g,h,...j){const G=r;try{const k=await this[G(0x1f3)][G(0x1df)]([G(0x204),c,d,f,g[G(0x20d)](),h,...j]);return{'id':k[0x0][0x0],'data':(0x0,utils_1[G(0x1ec)])(k[0x0][0x1][0x1])};}catch(l){throw this[G(0x1f8)][G(0x1d3)](G(0x1ce)+h+'\x20in\x20group:\x20'+d+G(0x1e9)+c,{'error':l}),l;}}async[r(0x1f4)](c){const H=r;return{'messageCount':await this[H(0x1bf)](c)};}async[r(0x1bf)](c,d){const I=r;try{if(d?.['multi'])return d[I(0x1c5)]['XLEN'](c),0x0;return await this[I(0x1f3)][I(0x1e6)](c);}catch(f){throw this[I(0x1f8)][I(0x1d3)](I(0x1d5)+c,{'error':f}),f;}}async[r(0x1c8)](c){const J=r,d=this['storeClient'][J(0x1c5)](),f=new Map();c[J(0x206)](h=>{const K=J;f[K(0x1e3)](h['stream'])||(f[K(0x1c7)](h[K(0x1ca)],-0x1),this[K(0x1bf)](h[K(0x1ca)],{'multi':d}));});const g=await d[J(0x1dd)]();return Array['from'](f[J(0x1f1)]())[J(0x206)]((h,i)=>{f['set'](h,g[i]);}),c[J(0x1e5)](h=>({'stream':h[J(0x1ca)],'depth':f['get'](h[J(0x1ca)])||0x0}));}async[r(0x20c)](c,d){return 0x0;}[r(0x207)](){return{'supportsBatching':!0x0,'supportsDeadLetterQueue':!0x1,'supportsOrdering':!0x0,'supportsTrimming':!0x0,'supportsRetry':!0x0,'maxMessageSize':0x20000000,'maxBatchSize':0x3e8};}}exports[r(0x1ed)]=RedisStreamService;function a(){const L=['Error\x20creating\x20stream\x20','XADD','Error\x20in\x20claiming\x20message\x20with\x20id:\x20','3767267bTlnBu','STREAMS','consumeMessages','publishMessages','error','debug','Error\x20getting\x20depth\x20for\x20','737049acOUxf','../../../../modules/enums','Error\x20deleting\x20stream\x20','blockTimeout','../../index','XDEL','x-group-error\x20','exec','XACK','sendCommand','\x20and\x20group:\x20','Error\x20deleting\x20consumer\x20group\x20','length','has','acknowledgeMessages','map','XLEN','XPENDING','namespace','\x20for\x20key:\x20','XREADGROUP','CREATE','parseStreamMessage','RedisStreamService','namespace\x20not\x20set','with\x20MKSTREAM','../../../../modules/key','keys','1972FzpBfP','streamClient','getStreamStats','ackAndDelete','MKSTREAM','ioredis-xadd-error\x20key:\x20','logger','claimMessage','KeyService','\x20for\x20stream\x20','error,\x20args','../../../../modules/utils','push','minIdleTime','limit','transact','Error\x20retrieving\x20pending\x20messages\x20for\x20group:\x20','3489453ObZLCa','XCLAIM','defineProperty','forEach','getProviderSpecificFeatures','storeClient','getPendingMessages','transaction','deleteMessages','trimStream','toString','createConsumerGroup','8LNpTeX','Error\x20consuming\x20messages\x20from\x20','deleteStream','3695JuFkLn','concat','getStreamDepth','BLOCK','2414340YMDndn','createStream','200178fiJhHD','mintKey','multi','160148YMmTCf','set','getStreamDepths','appId','stream','isArray'];a=function(){return L;};return a();}
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisStreamService = void 0;
4
+ const index_1 = require("../../index");
5
+ const utils_1 = require("../../../../modules/utils");
6
+ const key_1 = require("../../../../modules/key");
7
+ const enums_1 = require("../../../../modules/enums");
8
+ class RedisStreamService extends index_1.StreamService {
9
+ constructor(streamClient, storeClient, config = {}) {
10
+ super(streamClient, storeClient, config);
11
+ }
12
+ async init(namespace, appId, logger) {
13
+ this.namespace = namespace;
14
+ this.logger = logger;
15
+ this.appId = appId;
16
+ }
17
+ mintKey(type, params) {
18
+ if (!this.namespace)
19
+ throw new Error('namespace not set');
20
+ return key_1.KeyService.mintKey(this.namespace, type, {
21
+ ...params,
22
+ appId: this.appId,
23
+ });
24
+ }
25
+ transact() {
26
+ return this.streamClient.multi();
27
+ }
28
+ // Core streaming operations
29
+ async createStream(streamName) {
30
+ try {
31
+ // streams are created when you add messages.
32
+ // To create an empty stream, we can add and delete a dummy message.
33
+ const dummyId = await this.streamClient.XADD(streamName, '*', {
34
+ field: 'value',
35
+ });
36
+ await this.streamClient.XDEL(streamName, dummyId);
37
+ return true;
38
+ }
39
+ catch (error) {
40
+ this.logger.error(`Error creating stream ${streamName}`, { error });
41
+ throw error;
42
+ }
43
+ }
44
+ async deleteStream(streamName) {
45
+ try {
46
+ const result = await this.streamClient.DEL(streamName);
47
+ return result > 0;
48
+ }
49
+ catch (error) {
50
+ this.logger.error(`Error deleting stream ${streamName}`, { error });
51
+ throw error;
52
+ }
53
+ }
54
+ // Consumer group operations
55
+ async createConsumerGroup(streamName, groupName) {
56
+ try {
57
+ const result = (await this.storeClient.sendCommand([
58
+ 'XGROUP',
59
+ 'CREATE',
60
+ streamName,
61
+ groupName,
62
+ '$',
63
+ 'MKSTREAM',
64
+ ]));
65
+ return result === 'OK';
66
+ }
67
+ catch (error) {
68
+ const streamType = 'with MKSTREAM';
69
+ this.logger.debug(`x-group-error ${streamType} for key: ${streamName} and group: ${groupName}`, { error });
70
+ throw error;
71
+ }
72
+ }
73
+ async deleteConsumerGroup(streamName, groupName) {
74
+ try {
75
+ const result = await this.streamClient.xGroupDestroy(streamName, groupName);
76
+ return result;
77
+ }
78
+ catch (error) {
79
+ this.logger.error(`Error deleting consumer group ${groupName} for stream ${streamName}`, { error });
80
+ throw error;
81
+ }
82
+ }
83
+ async publishMessages(streamName, messages, options) {
84
+ try {
85
+ const multi = options?.transaction ||
86
+ (messages.length > 1 && this.storeClient.multi());
87
+ let response;
88
+ for (const message of messages) {
89
+ response = await (multi || this.storeClient).XADD(streamName, '*', {
90
+ message: message,
91
+ });
92
+ }
93
+ if (multi && !options?.transaction) {
94
+ //only exec if we created the multi;
95
+ //otherwise caller is responsible
96
+ return (await multi.exec()).map((result) => result[1]);
97
+ }
98
+ else {
99
+ return [response];
100
+ }
101
+ }
102
+ catch (error) {
103
+ this.logger.error(`ioredis-xadd-error key: ${streamName}`, { error });
104
+ throw error;
105
+ }
106
+ }
107
+ async consumeMessages(streamName, groupName, consumerName, options) {
108
+ const command = 'GROUP';
109
+ const blockOption = 'BLOCK';
110
+ const streamsOption = 'STREAMS';
111
+ const id = '>';
112
+ try {
113
+ const result = await this.streamClient.sendCommand([
114
+ 'XREADGROUP',
115
+ command,
116
+ groupName,
117
+ consumerName,
118
+ blockOption,
119
+ options?.blockTimeout?.toString() ?? enums_1.HMSH_BLOCK_TIME_MS.toString(),
120
+ streamsOption,
121
+ streamName,
122
+ id,
123
+ ]);
124
+ const response = [];
125
+ if ((0, utils_1.isStreamMessage)(result)) {
126
+ const [[, messages]] = result;
127
+ for (const [id, message] of messages) {
128
+ response.push({
129
+ id,
130
+ data: (0, utils_1.parseStreamMessage)(message[1]),
131
+ });
132
+ }
133
+ }
134
+ else {
135
+ return [];
136
+ }
137
+ return response;
138
+ }
139
+ catch (error) {
140
+ this.logger.error(`Error consuming messages from ${streamName}`, {
141
+ error,
142
+ });
143
+ throw error;
144
+ }
145
+ }
146
+ async ackAndDelete(stream, group, ids) {
147
+ const multi = this.storeClient.multi();
148
+ await this.acknowledgeMessages(stream, group, ids, { multi });
149
+ await this.deleteMessages(stream, group, ids, { multi });
150
+ await multi.exec();
151
+ return ids.length;
152
+ }
153
+ async acknowledgeMessages(stream, group, ids, options) {
154
+ try {
155
+ if (options?.multi) {
156
+ options.multi.XACK(stream, group, ids);
157
+ return options.multi;
158
+ }
159
+ else {
160
+ return await this.streamClient.XACK(stream, group, ...ids);
161
+ }
162
+ }
163
+ catch (error) {
164
+ this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${stream}`, { error });
165
+ throw error;
166
+ }
167
+ }
168
+ async deleteMessages(stream, group, ids, options) {
169
+ try {
170
+ if (options?.multi) {
171
+ options.multi.xDel(stream, ids);
172
+ return options.multi;
173
+ }
174
+ else {
175
+ return await this.streamClient.XDEL(stream, ...ids);
176
+ }
177
+ }
178
+ catch (error) {
179
+ this.logger.error(`Error in deleting messages with ids: ${ids.join(',')} for key: ${stream}`, { error });
180
+ throw error;
181
+ }
182
+ }
183
+ async getPendingMessages(stream, group, count, consumer) {
184
+ try {
185
+ const start = '-';
186
+ const end = '+';
187
+ const args = [stream, group];
188
+ if (start)
189
+ args.push(start);
190
+ if (end)
191
+ args.push(end);
192
+ if (count !== undefined)
193
+ args.push(count.toString());
194
+ if (consumer)
195
+ args.push(consumer);
196
+ try {
197
+ return await this.streamClient.sendCommand(['XPENDING', ...args]);
198
+ }
199
+ catch (error) {
200
+ this.logger.error('error, args', { error }, args);
201
+ }
202
+ }
203
+ catch (error) {
204
+ this.logger.error(`Error retrieving pending messages for group: ${group} in key: ${stream}`, { error });
205
+ throw error;
206
+ }
207
+ }
208
+ // Retry Method
209
+ async retryMessages(streamName, groupName, options) {
210
+ let pendingMessages = [];
211
+ const pendingMessagesInfo = await this.getPendingMessages(streamName, groupName, options?.limit); //[[ '1688768134881-0', 'testConsumer1', 1017, 1 ]]
212
+ for (const pendingMessageInfo of pendingMessagesInfo) {
213
+ if (Array.isArray(pendingMessageInfo)) {
214
+ const [id, , elapsedTimeMs, deliveryCount] = pendingMessageInfo;
215
+ if (elapsedTimeMs > options?.minIdleTime) {
216
+ const reclaimedMessage = await this.claimMessage(streamName, groupName, options?.consumerName, options?.minIdleTime, id);
217
+ pendingMessages = pendingMessages.concat(reclaimedMessage);
218
+ }
219
+ }
220
+ }
221
+ return pendingMessages;
222
+ }
223
+ async claimMessage(stream, group, consumer, minIdleTime, id, ...args) {
224
+ try {
225
+ const message = (await this.streamClient.sendCommand([
226
+ 'XCLAIM',
227
+ stream,
228
+ group,
229
+ consumer,
230
+ minIdleTime.toString(),
231
+ id,
232
+ ...args,
233
+ ]));
234
+ return {
235
+ id: message[0][0],
236
+ data: (0, utils_1.parseStreamMessage)(message[0][1][1]),
237
+ };
238
+ }
239
+ catch (error) {
240
+ this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${stream}`, { error });
241
+ throw error;
242
+ }
243
+ }
244
+ async getStreamStats(streamName) {
245
+ return {
246
+ messageCount: await this.getStreamDepth(streamName),
247
+ };
248
+ }
249
+ async getStreamDepth(streamName, options) {
250
+ try {
251
+ if (options?.multi) {
252
+ options.multi.XLEN(streamName);
253
+ return 0;
254
+ }
255
+ const length = await this.streamClient.XLEN(streamName);
256
+ return length;
257
+ }
258
+ catch (error) {
259
+ this.logger.error(`Error getting depth for ${streamName}`, { error });
260
+ throw error;
261
+ }
262
+ }
263
+ async getStreamDepths(streamNames) {
264
+ const multi = this.storeClient.multi();
265
+ const uniqueStreams = new Map(); // Use a Map to track unique streams
266
+ // Add unique streams to the multi command
267
+ streamNames.forEach((profile) => {
268
+ if (!uniqueStreams.has(profile.stream)) {
269
+ uniqueStreams.set(profile.stream, -1); // Initialize depth to -1 as a placeholder
270
+ this.getStreamDepth(profile.stream, { multi: multi });
271
+ }
272
+ });
273
+ // Execute all commands in multi (ioredis strips null fields)
274
+ const streamDepthResults = (await multi.exec());
275
+ // Update the uniqueStreams map with actual depths from multi.exec() results
276
+ Array.from(uniqueStreams.keys()).forEach((stream, idx) => {
277
+ uniqueStreams.set(stream, streamDepthResults[idx]);
278
+ });
279
+ // Map back to the original `streamNames` array with correct depths
280
+ return streamNames.map((profile) => {
281
+ return {
282
+ stream: profile.stream,
283
+ depth: uniqueStreams.get(profile.stream) || 0,
284
+ };
285
+ });
286
+ }
287
+ async trimStream(streamName, options) {
288
+ //no-op for now
289
+ return 0;
290
+ }
291
+ // Provider-specific helpers
292
+ getProviderSpecificFeatures() {
293
+ return {
294
+ supportsBatching: true,
295
+ supportsDeadLetterQueue: false,
296
+ supportsOrdering: true,
297
+ supportsTrimming: true,
298
+ supportsRetry: true,
299
+ supportsNotifications: false,
300
+ maxMessageSize: 512 * 1024 * 1024,
301
+ maxBatchSize: 1000,
302
+ };
303
+ }
304
+ }
305
+ exports.RedisStreamService = RedisStreamService;
@@ -1 +1,2 @@
1
- 'use strict';var i=b;function a(){var j=['10VsgUWx','1dcwDeL','30AmNJEy','1874758WCkLGs','2011540jVKPpC','2393811bPEUJv','6845289pcjoyX','5141969WizEjS','1056126rHxjHZ','defineProperty','12798864CUnNPC','6ixQSFp','__esModule'];a=function(){return j;};return a();}(function(c,d){var h=b,e=c();while(!![]){try{var f=-parseInt(h(0x16b))/0x1*(-parseInt(h(0x16d))/0x2)+parseInt(h(0x172))/0x3+-parseInt(h(0x16e))/0x4*(parseInt(h(0x16a))/0x5)+-parseInt(h(0x168))/0x6*(-parseInt(h(0x171))/0x7)+-parseInt(h(0x167))/0x8+-parseInt(h(0x16f))/0x9*(-parseInt(h(0x16c))/0xa)+parseInt(h(0x170))/0xb;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0xccbc4));function b(c,d){var e=a();return b=function(f,g){f=f-0x167;var h=e[f];return h;},b(c,d);}Object[i(0x173)](exports,i(0x169),{'value':!0x0});
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });