@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,248 @@
1
- 'use strict';function b(c,d){const e=a();return b=function(f,g){f=f-0xd3;let h=e[f];return h;},b(c,d);}const y=b;(function(c,d){const w=b,e=c();while(!![]){try{const f=parseInt(w(0x129))/0x1+parseInt(w(0x111))/0x2+parseInt(w(0x102))/0x3*(-parseInt(w(0xef))/0x4)+-parseInt(w(0x11b))/0x5*(-parseInt(w(0x11d))/0x6)+-parseInt(w(0x119))/0x7+-parseInt(w(0x10f))/0x8*(-parseInt(w(0xe8))/0x9)+-parseInt(w(0xdb))/0xa*(parseInt(w(0xd8))/0xb);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x96d26));function a(){const a8=['defineProperty','commands','lpush','zrangebyscore','pg-format','hmget','COMMIT;','returnType','query','length','isArray','expire','exec','push','1327560bjIZuK','_hdel','hincrbyfloat\x20error','count','zrangebyscore_withscores','_del','_scan','value','transform','score','setnx','hdel','_expire','3207704LpXWkQ','_hscan','1277682LYiBmp','object','zrem','KVTransaction','params','_hmget','_zrangebyscore_withscores','addCommand','6261465sGfsOm','set','10fNlwYX','rename','1705872OCTGTs','member','hincrbyfloat','_rpush','del','shift','_lpop','_hget','NULL','void','replace','pgClient','1130979uTyxPX','string','kvsql','__esModule','_rename','rank','boolean','toString','map','370128YQTbap','rows','get','340WctIFK','success','array','_zrem','hget','pop','_lmove','_zrange','key','_set','hset','default','_hset','27qFgJRj','_get','BEGIN','hgetall','_lrange','zrange','number','8ErXKiS','hscan','join','_zrangebyscore','field'];a=function(){return a8;};return a();}var __importDefault=this&&this['__importDefault']||function(c){const x=b;return c&&c[x(0x12c)]?c:{'default':c};};Object[y(0xf4)](exports,'__esModule',{'value':!0x0}),exports[y(0x114)]=void 0x0;const pg_format_1=__importDefault(require(y(0xf8)));function formatSqlCommand(c,d){const z=y,e=[],f=c[z(0x127)](/\$(\d+)/g,(g,h)=>{const A=z,i=parseInt(h,0xa)-0x1,j=d[i];if(null==j)return A(0x125);let k;return k='number'==typeof j?'%s':'%L',e['push'](j),k;});return(0x0,pg_format_1[z(0xe6)])(f,...e);}class KVTransaction{constructor(c){const B=y;this[B(0x12b)]=c,this[B(0xf5)]=[];}[y(0x118)](c,d,e,f){const C=y;return this['commands'][C(0x101)]({'sql':c,'params':d,'returnType':e,'transform':f}),this;}[y(0x11a)](c,d,e){const D=y,{sql:f,params:g}=this['kvsql'][D(0xe4)](c,d,e);return this[D(0x118)](f,g,D(0xd5));}[y(0x10c)](c,d){const E=y,{sql:e,params:f}=this['kvsql'][E(0xe4)](c,d,{'nx':!0x0});return this['addCommand'](e,f,E(0xd5));}['setnxex'](c,d,e){const F=y,{sql:f,params:g}=this['kvsql'][F(0xe4)](c,d,{'nx':!0x0,'ex':e});return this[F(0x118)](f,g,F(0xd5));}[y(0xda)](c){const G=y,{sql:d,params:e}=this[G(0x12b)][G(0xe9)](c);return this['addCommand'](d,e,G(0x12a));}[y(0x121)](c){const H=y,{sql:d,params:e}=this[H(0x12b)][H(0x107)](c);return this['addCommand'](d,e,H(0xee));}[y(0xff)](c,d){const I=y,{sql:e,params:f}=this[I(0x12b)][I(0x10e)](c,d);return this['addCommand'](e,f,I(0xd5));}[y(0xe5)](c,d,e){const J=y,{sql:f,params:g}=this[J(0x12b)][J(0xe7)](c,d,e);return this[J(0x118)](f,g,'number');}[y(0xdf)](c,d){const K=y,{sql:e,params:f}=this[K(0x12b)][K(0x124)](c,d);return this['addCommand'](e,f,K(0x12a));}[y(0x10d)](c,d){const L=y,{sql:e,params:f}=this[L(0x12b)][L(0x103)](c,d);return this[L(0x118)](e,f,L(0xee));}[y(0xf9)](c,d){const M=y,{sql:e,params:f}=this['kvsql'][M(0x116)](c,d);return this[M(0x118)](e,f,M(0xdd),g=>{const N=M,h=new Map(g[N(0xd7)](i=>[i['field'],i[N(0x109)]]));return d[N(0xd7)](i=>h[N(0xda)](i)||null);});}[y(0xeb)](c){const O=y;return this[O(0x12b)][O(0xeb)](c,this),this;}[y(0x11f)](c,d,e){const P=y,{sql:f,params:g}=this[P(0x12b)]['_hincrbyfloat'](c,d,e);return this['addCommand'](f,g,P(0xee),h=>{const Q=P;try{return parseFloat(h[0x0][Q(0x109)]);}catch(i){console['error'](Q(0x104),i,f,g,h);}});}[y(0xf0)](c,d,e=0xa){const R=y,{sql:f,params:g}=this[R(0x12b)][R(0x110)](c,d,e);return this[R(0x118)](f,g,R(0x112),h=>{const S=R,i={};for(const j of h)i[j[S(0xf3)]]=j[S(0x109)];return{'cursor':(d+h['length'])[S(0xd6)](),'items':i};});}['lrange'](c,d,e){const T=y,{sql:f,params:g}=this[T(0x12b)][T(0xec)](c,d,e);return this[T(0x118)](f,g,T(0xdd),h=>h[T(0xd7)](i=>i[T(0x109)]));}['rpush'](c,d){const U=y,{sql:e,params:f}=this[U(0x12b)][U(0x120)](c,d);return this[U(0x118)](e,f,U(0xee),g=>g[0x0]?.[U(0x105)]||0x0);}[y(0xf6)](c,d){const V=y,{sql:e,params:f}=this[V(0x12b)]['_lpush'](c,d);return this['addCommand'](e,f,V(0xee),g=>g[0x0]?.[V(0x105)]||0x0);}['lpop'](c){const W=y,{sql:d,params:e}=this[W(0x12b)][W(0x123)](c);return this['addCommand'](d,e,W(0x12a));}['lmove'](c,d,f,g){const X=y,{sql:h,params:i}=this[X(0x12b)][X(0xe1)](c,d,f,g);return this[X(0x118)](h,i,X(0x12a));}['zadd'](c,d,f,g){const Y=y,{sql:h,params:i}=this[Y(0x12b)]['_zadd'](c,d,f,g);return this[Y(0x118)](h,i,Y(0xee),j=>j[0x0]?.[Y(0x105)]||0x0);}[y(0xed)](c,d,e){const Z=y,{sql:f,params:g}=this[Z(0x12b)][Z(0xe2)](c,d,e);return this[Z(0x118)](f,g,'array',h=>h[Z(0xd7)](i=>i[Z(0x11e)]));}[y(0xf7)](c,d,e){const a0=y,{sql:f,params:g}=this['kvsql'][a0(0xf2)](c,d,e);return this[a0(0x118)](f,g,a0(0xdd),h=>h[a0(0xd7)](i=>i[a0(0x11e)]));}[y(0x106)](c,d,e){const a1=y,{sql:f,params:g}=this[a1(0x12b)][a1(0x117)](c,d,e);return this['addCommand'](f,g,a1(0xdd),h=>h[a1(0xd7)](i=>({'member':i['member'],'score':i[a1(0x10b)]})));}[y(0x113)](c,d){const a2=y,{sql:e,params:f}=this[a2(0x12b)][a2(0xde)](c,d);return this[a2(0x118)](e,f,a2(0xee),g=>g[0x0]?.[a2(0x105)]||0x0);}['zrank'](c,d){const a3=y,{sql:e,params:f}=this[a3(0x12b)]['_zrank'](c,d);return this['addCommand'](e,f,a3(0xee),g=>void 0x0!==g[0x0]?.['rank']?parseInt(g[0x0][a3(0xd4)],0xa)-0x1:null);}['scan'](c,d=0xa){const a4=y,{sql:e,params:f}=this['kvsql'][a4(0x108)](c,d);return this[a4(0x118)](e,f,'object',g=>{const a5=a4,h=g[a5(0xd7)](i=>i[a5(0xe3)]);return{'cursor':c+g[a5(0xfd)],'keys':h};});}[y(0x11c)](c,d){const a6=y,{sql:e,params:f}=this['kvsql'][a6(0xd3)](c,d);return this[a6(0x118)](e,f,a6(0x126));}async[y(0x100)](){const a7=y,c=this[a7(0x12b)][a7(0x128)];try{const d=[],f=[a7(0xea)];for(const k of this[a7(0xf5)]){const l=formatSqlCommand(k['sql'],k[a7(0x115)]);f[a7(0x101)](l);}f['push'](a7(0xfa));const g=f[a7(0xf1)](';\x0a'),h=await c[a7(0xfc)](g),i=Array[a7(0xfe)](h)?h:[h];i[a7(0x122)](),i[a7(0xe0)]();let j=0x0;for(const m of this['commands']){const p=i[j++],q=p?.[a7(0xd9)]||[];let u;if(m[a7(0x10a)])u=m[a7(0x10a)](q);else switch(m[a7(0xfb)]){case'string':u=q[0x0]?.[a7(0x109)]||null;break;case a7(0xee):u=q[0x0]?.[a7(0x105)]||0x0;break;case a7(0xd5):u=q[0x0]?.[a7(0xdc)]??q['length']>0x0;break;case a7(0xdd):u=q[a7(0xd7)](v=>v['value']);break;case a7(0x112):u=q[0x0]||{};break;default:u=q;}d[a7(0x101)](u);}return d;}catch(v){throw await c[a7(0xfc)]('ROLLBACK'),v;}}}exports[y(0x114)]=KVTransaction;
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KVTransaction = void 0;
7
+ const pg_format_1 = __importDefault(require("pg-format"));
8
+ /**
9
+ * Utility function to format SQL commands with parameters.
10
+ * Replaces $1, $2, etc., with %L or %s based on parameter types.
11
+ */
12
+ function formatSqlCommand(sql, params) {
13
+ const formatParams = [];
14
+ // Replace $1, $2, etc., with %L or %s and collect parameters
15
+ const formattedSql = sql.replace(/\$(\d+)/g, (match, p1) => {
16
+ const index = parseInt(p1, 10) - 1; // Convert $1 to index 0
17
+ const param = params[index];
18
+ if (param === null || param === undefined) {
19
+ return 'NULL';
20
+ }
21
+ let specifier;
22
+ if (typeof param === 'number') {
23
+ specifier = '%s';
24
+ }
25
+ else if (typeof param === 'string') {
26
+ specifier = '%L';
27
+ }
28
+ else if (typeof param === 'boolean') {
29
+ specifier = '%L';
30
+ }
31
+ else {
32
+ // For other types like arrays or objects, you may need to handle them differently
33
+ specifier = '%L';
34
+ }
35
+ formatParams.push(param);
36
+ return specifier;
37
+ });
38
+ // Use pg-format to safely interpolate parameters into the SQL command
39
+ return (0, pg_format_1.default)(formattedSql, ...formatParams);
40
+ }
41
+ class KVTransaction {
42
+ constructor(kvsql) {
43
+ this.kvsql = kvsql;
44
+ this.commands = [];
45
+ }
46
+ addCommand(sql, params, returnType, transform) {
47
+ this.commands.push({ sql, params, returnType, transform });
48
+ return this;
49
+ }
50
+ // Methods that add SQL commands to the batch
51
+ set(key, value, options) {
52
+ const { sql, params } = this.kvsql._set(key, value, options);
53
+ return this.addCommand(sql, params, 'boolean');
54
+ }
55
+ setnx(key, value) {
56
+ const { sql, params } = this.kvsql._set(key, value, { nx: true });
57
+ return this.addCommand(sql, params, 'boolean');
58
+ }
59
+ setnxex(key, value, expireSeconds) {
60
+ const { sql, params } = this.kvsql._set(key, value, {
61
+ nx: true,
62
+ ex: expireSeconds,
63
+ });
64
+ return this.addCommand(sql, params, 'boolean');
65
+ }
66
+ get(key) {
67
+ const { sql, params } = this.kvsql._get(key);
68
+ return this.addCommand(sql, params, 'string');
69
+ }
70
+ del(key) {
71
+ const { sql, params } = this.kvsql._del(key);
72
+ return this.addCommand(sql, params, 'number');
73
+ }
74
+ expire(key, seconds) {
75
+ const { sql, params } = this.kvsql._expire(key, seconds);
76
+ return this.addCommand(sql, params, 'boolean');
77
+ }
78
+ hset(key, fields, options) {
79
+ const { sql, params } = this.kvsql._hset(key, fields, options);
80
+ return this.addCommand(sql, params, 'number');
81
+ }
82
+ hget(key, field) {
83
+ const { sql, params } = this.kvsql._hget(key, field);
84
+ return this.addCommand(sql, params, 'string');
85
+ }
86
+ hdel(key, fields) {
87
+ const { sql, params } = this.kvsql._hdel(key, fields);
88
+ return this.addCommand(sql, params, 'number');
89
+ }
90
+ hmget(key, fields) {
91
+ const { sql, params } = this.kvsql._hmget(key, fields);
92
+ const transform = (rows) => {
93
+ const fieldValueMap = new Map(rows.map((row) => [row.field, row.value]));
94
+ return fields.map((field) => fieldValueMap.get(field) || null);
95
+ };
96
+ return this.addCommand(sql, params, 'array', transform);
97
+ }
98
+ hgetall(key) {
99
+ this.kvsql.hgetall(key, this);
100
+ const transform = (rows) => {
101
+ const result = {};
102
+ for (const row of rows) {
103
+ result[row.field] = row.value;
104
+ }
105
+ return result;
106
+ };
107
+ return this;
108
+ }
109
+ hincrbyfloat(key, field, increment) {
110
+ const { sql, params } = this.kvsql._hincrbyfloat(key, field, increment);
111
+ return this.addCommand(sql, params, 'number', (rows) => {
112
+ try {
113
+ return parseFloat(rows[0].value);
114
+ }
115
+ catch (err) {
116
+ console.error('hincrbyfloat error', err, sql, params, rows);
117
+ }
118
+ });
119
+ }
120
+ hscan(key, cursor, count = 10) {
121
+ const { sql, params } = this.kvsql._hscan(key, cursor, count);
122
+ const transform = (rows) => {
123
+ const items = {};
124
+ for (const row of rows) {
125
+ items[row.field] = row.value;
126
+ }
127
+ const newCursor = cursor + rows.length;
128
+ return { cursor: newCursor.toString(), items };
129
+ };
130
+ return this.addCommand(sql, params, 'object', transform);
131
+ }
132
+ lrange(key, start, end) {
133
+ const { sql, params } = this.kvsql._lrange(key, start, end);
134
+ return this.addCommand(sql, params, 'array', (rows) => rows.map((row) => row.value));
135
+ }
136
+ rpush(key, value) {
137
+ const { sql, params } = this.kvsql._rpush(key, value);
138
+ return this.addCommand(sql, params, 'number', (rows) => rows[0]?.count || 0);
139
+ }
140
+ lpush(key, value) {
141
+ const { sql, params } = this.kvsql._lpush(key, value);
142
+ return this.addCommand(sql, params, 'number', (rows) => rows[0]?.count || 0);
143
+ }
144
+ lpop(key) {
145
+ const { sql, params } = this.kvsql._lpop(key);
146
+ return this.addCommand(sql, params, 'string');
147
+ }
148
+ lmove(source, destination, srcPosition, destPosition) {
149
+ const { sql, params } = this.kvsql._lmove(source, destination, srcPosition, destPosition);
150
+ return this.addCommand(sql, params, 'string');
151
+ }
152
+ zadd(key, score, member, options) {
153
+ const { sql, params } = this.kvsql._zadd(key, score, member, options);
154
+ return this.addCommand(sql, params, 'number', (rows) => rows[0]?.count || 0);
155
+ }
156
+ zrange(key, start, stop) {
157
+ const { sql, params } = this.kvsql._zrange(key, start, stop);
158
+ return this.addCommand(sql, params, 'array', (rows) => rows.map((row) => row.member));
159
+ }
160
+ zrangebyscore(key, min, max) {
161
+ const { sql, params } = this.kvsql._zrangebyscore(key, min, max);
162
+ return this.addCommand(sql, params, 'array', (rows) => rows.map((row) => row.member));
163
+ }
164
+ zrangebyscore_withscores(key, min, max) {
165
+ const { sql, params } = this.kvsql._zrangebyscore_withscores(key, min, max);
166
+ return this.addCommand(sql, params, 'array', (rows) => rows.map((row) => ({ member: row.member, score: row.score })));
167
+ }
168
+ zrem(key, member) {
169
+ const { sql, params } = this.kvsql._zrem(key, member);
170
+ return this.addCommand(sql, params, 'number', (rows) => rows[0]?.count || 0);
171
+ }
172
+ zrank(key, member) {
173
+ const { sql, params } = this.kvsql._zrank(key, member);
174
+ return this.addCommand(sql, params, 'number', (rows) => rows[0]?.rank !== undefined ? parseInt(rows[0].rank, 10) - 1 : null);
175
+ }
176
+ scan(cursor, count = 10) {
177
+ const { sql, params } = this.kvsql._scan(cursor, count);
178
+ const transform = (rows) => {
179
+ const keys = rows.map((row) => row.key);
180
+ const newCursor = cursor + rows.length;
181
+ return { cursor: newCursor, keys };
182
+ };
183
+ return this.addCommand(sql, params, 'object', transform);
184
+ }
185
+ rename(oldKey, newKey) {
186
+ const { sql, params } = this.kvsql._rename(oldKey, newKey);
187
+ return this.addCommand(sql, params, 'void');
188
+ }
189
+ async exec() {
190
+ const client = this.kvsql.pgClient;
191
+ try {
192
+ const results = [];
193
+ //build the transaction SQL string
194
+ const sqlStatements = ['BEGIN'];
195
+ for (const cmd of this.commands) {
196
+ const formattedSql = formatSqlCommand(cmd.sql, cmd.params);
197
+ sqlStatements.push(formattedSql);
198
+ }
199
+ sqlStatements.push('COMMIT;');
200
+ // Combine into one and execute
201
+ const combinedSql = sqlStatements.join(';\n');
202
+ const res = await client.query(combinedSql);
203
+ // Process the results
204
+ const resultSets = Array.isArray(res) ? res : [res];
205
+ //filter out the BEGIN and COMMIT results
206
+ resultSets.shift();
207
+ resultSets.pop();
208
+ let resIndex = 0;
209
+ //iterate set of cached commands that were just executed to process the results
210
+ for (const cmd of this.commands) {
211
+ const resultSet = resultSets[resIndex++];
212
+ const rows = resultSet?.rows || [];
213
+ let result;
214
+ if (cmd.transform) {
215
+ result = cmd.transform(rows);
216
+ }
217
+ else {
218
+ switch (cmd.returnType) {
219
+ case 'string':
220
+ result = rows[0]?.value || null;
221
+ break;
222
+ case 'number':
223
+ result = rows[0]?.count || 0;
224
+ break;
225
+ case 'boolean':
226
+ result = rows[0]?.success ?? rows.length > 0;
227
+ break;
228
+ case 'array':
229
+ result = rows.map((row) => row.value);
230
+ break;
231
+ case 'object':
232
+ result = rows[0] || {};
233
+ break;
234
+ default:
235
+ result = rows;
236
+ }
237
+ }
238
+ results.push(result);
239
+ }
240
+ return results;
241
+ }
242
+ catch (err) {
243
+ await client.query('ROLLBACK');
244
+ throw err;
245
+ }
246
+ }
247
+ }
248
+ exports.KVTransaction = KVTransaction;
@@ -3,7 +3,7 @@ import { HScanResult, HSetOptions, ProviderTransaction } from '../../../../../ty
3
3
  import type { KVSQL } from '../kvsql';
4
4
  export declare const hashModule: (context: KVSQL) => {
5
5
  hsetnx(key: string, field: string, value: string, multi?: ProviderTransaction): Promise<number>;
6
- hset(key: string, fields: Record<string, string>, options?: HSetOptions, multi?: ProviderTransaction): Promise<number>;
6
+ hset(key: string, fields: Record<string, string>, options?: HSetOptions, multi?: ProviderTransaction): Promise<number | any>;
7
7
  /**
8
8
  * Derives the enumerated `type` value based on the field name when
9
9
  * setting a field in a jobs table (a 'jobshash' table type).