@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,190 @@
1
- 'use strict';const j=b;function a(){const o=['reconstituteKey','activityId',':transitions','SUBSCRIPTIONS','../types/hotmesh','QUORUM','KeyService','KEYSEP','JOB_STATS_GENERAL','task_schedules','applications','SCHEMAS','JOB_STATE','THROTTLE_RATE','join','jobId','streams','versions','JOB_STATS_MEDIAN',':d:',':signals',':schemas','HOOKS','hmsh','329006gbtvsL','VALSEP','events','stream_topics','KeyType','signal_registry','WEBSEP','JOB_STATS_INDEX','2rDzEvW','unknown_entity','appVersion','sym','TIME_RANGE','resolveEntityType','1323008gyOmcr','jobs','HMNS','throttles','roles','1856430PqADpN','16FiaMig','topic',':sym:vals:','6804686oztzkx','hooks','APP','signal_patterns','resolveAbbreviation','mintKey','SUBSCRIPTION_PATTERNS','task_lists','symbols','SIGNALS',':w:','defineProperty','8466AGVTUS','jobKey','engineId','379341Ggmkby','parseKey',':x:','SYMVALS',':subscriptions',':s:','200829hURCzW',':j:',':v:','dateTime','stats',':sym:keys:','appId'];a=function(){return o;};return a();}(function(c,d){const i=b,e=c();while(!![]){try{const f=-parseInt(i(0x91))/0x1+-parseInt(i(0x99))/0x2*(-parseInt(i(0xbd))/0x3)+parseInt(i(0x9f))/0x4+-parseInt(i(0xa4))/0x5+parseInt(i(0xb4))/0x6+parseInt(i(0xa8))/0x7+parseInt(i(0xa5))/0x8*(-parseInt(i(0xb7))/0x9);if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x8f376));function b(c,d){const e=a();return b=function(f,g){f=f-0x8d;let h=e[f];return h;},b(c,d);}Object[j(0xb3)](exports,'__esModule',{'value':!0x0}),exports[j(0x92)]=exports['WEBSEP']=exports['TYPSEP']=exports[j(0xcb)]=exports[j(0xa1)]=exports[j(0x95)]=exports[j(0xca)]=void 0x0;const hotmesh_1=require(j(0xc8));Object[j(0xb3)](exports,'KeyType',{'enumerable':!0x0,'get':function(){return hotmesh_1['KeyType'];}});const HMNS=j(0x90);exports['HMNS']=HMNS;const KEYSEP=':';exports['KEYSEP']=':';const VALSEP='::';exports[j(0x92)]='::';const WEBSEP='::';exports[j(0x97)]='::';const TYPSEP='::';exports['TYPSEP']='::';class KeyService{static[j(0xad)](c,d,f){const k=j;switch(d){case hotmesh_1[k(0x95)]['HOTMESH']:return c;case hotmesh_1[k(0x95)][k(0xd1)]:return c+':'+f[k(0xc3)]+':r:';case hotmesh_1[k(0x95)]['WORK_ITEMS']:return c+':'+f[k(0xc3)]+k(0xb2)+(f['scoutType']||'');case hotmesh_1[k(0x95)][k(0x9d)]:return c+':'+f[k(0xc3)]+':t:'+(f['timeValue']||'');case hotmesh_1[k(0x95)][k(0xaa)]:return c+':a:'+(f[k(0xc3)]||'');case hotmesh_1[k(0x95)][k(0xc9)]:return c+':'+f[k(0xc3)]+':q:'+(f[k(0xb6)]||'');case hotmesh_1[k(0x95)][k(0xd0)]:return c+':'+f[k(0xc3)]+k(0xbe)+f['jobId'];case hotmesh_1[k(0x95)]['JOB_DEPENDENTS']:return c+':'+f[k(0xc3)]+k(0xd7)+f[k(0xd3)];case hotmesh_1[k(0x95)][k(0xcc)]:return c+':'+f['appId']+k(0xbc)+f[k(0xb5)]+':'+f[k(0xc0)];case hotmesh_1['KeyType'][k(0xd6)]:case hotmesh_1['KeyType'][k(0x98)]:return c+':'+f[k(0xc3)]+':s:'+f['jobKey']+':'+f[k(0xc0)]+':'+f['facet'];case hotmesh_1[k(0x95)][k(0xcf)]:return c+':'+f[k(0xc3)]+k(0xbf)+f[k(0x9b)]+k(0x8e);case hotmesh_1[k(0x95)][k(0xc7)]:return c+':'+f[k(0xc3)]+k(0xbf)+f['appVersion']+k(0xbb);case hotmesh_1['KeyType'][k(0xae)]:return c+':'+f[k(0xc3)]+k(0xbf)+f[k(0x9b)]+k(0xc6);case hotmesh_1['KeyType'][k(0x8f)]:return c+':'+f[k(0xc3)]+':hooks';case hotmesh_1[k(0x95)][k(0xb1)]:return c+':'+f[k(0xc3)]+k(0x8d);case hotmesh_1[k(0x95)]['SYMKEYS']:return c+':'+f[k(0xc3)]+k(0xc2)+(f[k(0xc5)]||'');case hotmesh_1[k(0x95)][k(0xba)]:return c+':'+f[k(0xc3)]+k(0xa7);case hotmesh_1[k(0x95)]['STREAMS']:return c+':'+(f[k(0xc3)]||'')+k(0xb9)+(f[k(0xa6)]||'');default:throw new Error('Invalid\x20key\x20type.');}}static[j(0xb8)](c){const l=j,[d,f,g,...h]=c['split'](':');return{'namespace':d,'app':'a'===g?f:void 0x0,'entity':g,'id':h[l(0xd2)](':')||''};}static[j(0xc4)](c){const {namespace:d,app:f,entity:g,id:h}=c;return d+':'+f+':'+g+':'+(h||'');}static[j(0x9e)](c,d=''){const m=j;switch(c){case'a':return m(0xce);case'r':return m(0xa2);case'w':return''===d?'task_priorities':m(0xa3);case't':return''===d?m(0xcd):m(0xaf);case'q':return m(0x93);case'j':return m(0xa0);case's':return m(0xc1);case'v':return'versions';case'x':return''===d?m(0xd4):m(0x94);case m(0xa9):return m(0xab);case'signals':return'signal_registry';case m(0x9c):return m(0xb0);default:return'unknown_entity';}}static[j(0xac)](c){const n=j;switch(c){case n(0xce):return'a';case n(0xa2):return'r';case n(0xa3):return'w';case n(0xcd):case n(0xaf):return't';case'events':return'q';case'jobs':return'j';case n(0xc1):return's';case n(0xd5):return'v';case n(0xd4):return'x';case n(0xab):return n(0xa9);case n(0x96):return'signals';case'symbols':return n(0x9c);default:return n(0x9a);}}}exports[j(0xca)]=KeyService;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VALSEP = exports.WEBSEP = exports.TYPSEP = exports.KEYSEP = exports.HMNS = exports.KeyType = exports.KeyService = void 0;
4
+ const hotmesh_1 = require("../types/hotmesh");
5
+ Object.defineProperty(exports, "KeyType", { enumerable: true, get: function () { return hotmesh_1.KeyType; } });
6
+ /**
7
+ * Keys
8
+ *
9
+ * hmsh -> {hash} hotmesh config {version: "0.0.1", namespace: "hmsh"}
10
+ * hmsh:a:<appid> -> {hash} app profile { "id": "appid", "version": "2", "versions/1": "GMT", "versions/2": "GMT"}
11
+ * hmsh:<appid>:r: -> {hash} throttle rates {':': '23', 'topic.thing': '555'} => {':i': 'all', 'topic.thing': '555seconds'}
12
+ * hmsh:<appid>:w: -> {zset} work items/tasks an engine must do like garbage collect or hook a set of matching records (hookAll)
13
+ * hmsh:<appid>:t: -> {zset} an ordered set of list (work lists) ids
14
+ * hmsh:<appid>:t:<timeValue?> -> {list} a worklist of `jobId+activityId` items that should be awakened
15
+ * hmsh:<appid>:q: -> {hash} quorum-wide messages
16
+ * hmsh:<appid>:q:<ngnid> -> {hash} engine-targeted messages (targeted quorum-oriented message)
17
+ * hmsh:<appid>:j:<jobid> -> {hash} job data
18
+ * hmsh:<appid>:s:<jobkey>:<dateTime> -> {hash} job stats (general)
19
+ * hmsh:<appid>:s:<jobkey>:<dateTime>:mdn:<field/path>:<fieldvalue> -> {zset} job stats (median)
20
+ * hmsh:<appid>:s:<jobkey>:<dateTime>:index:<field/path>:<fieldvalue> -> {list} job stats (index of jobid[])
21
+ * hmsh:<appid>:v:<version>:activities -> {hash} schemas [cache]
22
+ * hmsh:<appid>:v:<version>:transitions -> {hash} transitions [cache]
23
+ * hmsh:<appid>:v:<version>:subscriptions -> {hash} subscriptions [cache]
24
+ * hmsh:<appid>:x: -> {xstream} when an engine is sent or reads a buffered task (engines read from their custom topic)
25
+ * hmsh:<appid>:x:<topic> -> {xstream} when a worker is sent or reads a buffered task (workers read from their custom topic)
26
+ * hmsh:<appid>:hooks -> {hash} hook patterns/rules; set at compile time
27
+ * hmsh:<appid>:signals -> {string} dynamic hook signals (hget/hdel); expirable
28
+ * hmsh:<appid>:sym:keys: -> {hash} list of symbol ranges and :cursor assigned at version deploy time for job keys
29
+ * hmsh:<appid>:sym:keys:<activityid|$subscribes> -> {hash} list of symbols based upon schema enums (initially) and adaptively optimized (later) during runtime; if '$subscribes' is used as the activityid, it is a top-level `job` symbol set (for job keys)
30
+ * hmsh:<appid>:sym:vals: -> {hash} list of symbols for job values across all app versions
31
+ */
32
+ const HMNS = 'hmsh';
33
+ exports.HMNS = HMNS;
34
+ const KEYSEP = ':'; // default delimiter for keys
35
+ exports.KEYSEP = KEYSEP;
36
+ const VALSEP = '::'; // default delimiter for vals
37
+ exports.VALSEP = VALSEP;
38
+ const WEBSEP = '::'; // default delimiter for webhook vals
39
+ exports.WEBSEP = WEBSEP;
40
+ const TYPSEP = '::'; // delimiter for ZSET task typing (how should a list be used?)
41
+ exports.TYPSEP = TYPSEP;
42
+ class KeyService {
43
+ /**
44
+ * Returns a key that can be used to access a value in the key/value store
45
+ * appropriate for the given key type; the keys have an implicit hierarchy
46
+ * and are used to organize data in the store in a tree-like structure
47
+ * via the use of colons as separators.
48
+ * @param namespace
49
+ * @param keyType
50
+ * @param params
51
+ * @returns {string}
52
+ */
53
+ static mintKey(namespace, keyType, params) {
54
+ switch (keyType) {
55
+ case hotmesh_1.KeyType.HOTMESH:
56
+ return namespace;
57
+ case hotmesh_1.KeyType.THROTTLE_RATE:
58
+ return `${namespace}:${params.appId}:r:`;
59
+ case hotmesh_1.KeyType.WORK_ITEMS:
60
+ return `${namespace}:${params.appId}:w:${params.scoutType || ''}`;
61
+ case hotmesh_1.KeyType.TIME_RANGE:
62
+ return `${namespace}:${params.appId}:t:${params.timeValue || ''}`;
63
+ case hotmesh_1.KeyType.APP:
64
+ return `${namespace}:a:${params.appId || ''}`;
65
+ case hotmesh_1.KeyType.QUORUM:
66
+ return `${namespace}:${params.appId}:q:${params.engineId || ''}`;
67
+ case hotmesh_1.KeyType.JOB_STATE:
68
+ return `${namespace}:${params.appId}:j:${params.jobId}`;
69
+ case hotmesh_1.KeyType.JOB_DEPENDENTS:
70
+ return `${namespace}:${params.appId}:d:${params.jobId}`;
71
+ case hotmesh_1.KeyType.JOB_STATS_GENERAL:
72
+ return `${namespace}:${params.appId}:s:${params.jobKey}:${params.dateTime}`;
73
+ case hotmesh_1.KeyType.JOB_STATS_MEDIAN:
74
+ return `${namespace}:${params.appId}:s:${params.jobKey}:${params.dateTime}:${params.facet}`;
75
+ case hotmesh_1.KeyType.JOB_STATS_INDEX:
76
+ return `${namespace}:${params.appId}:s:${params.jobKey}:${params.dateTime}:${params.facet}`;
77
+ case hotmesh_1.KeyType.SCHEMAS:
78
+ return `${namespace}:${params.appId}:v:${params.appVersion}:schemas`;
79
+ case hotmesh_1.KeyType.SUBSCRIPTIONS:
80
+ return `${namespace}:${params.appId}:v:${params.appVersion}:subscriptions`;
81
+ case hotmesh_1.KeyType.SUBSCRIPTION_PATTERNS:
82
+ return `${namespace}:${params.appId}:v:${params.appVersion}:transitions`;
83
+ case hotmesh_1.KeyType.HOOKS:
84
+ return `${namespace}:${params.appId}:hooks`;
85
+ case hotmesh_1.KeyType.SIGNALS:
86
+ return `${namespace}:${params.appId}:signals`;
87
+ case hotmesh_1.KeyType.SYMKEYS:
88
+ return `${namespace}:${params.appId}:sym:keys:${params.activityId || ''}`;
89
+ case hotmesh_1.KeyType.SYMVALS:
90
+ return `${namespace}:${params.appId}:sym:vals:`;
91
+ case hotmesh_1.KeyType.STREAMS:
92
+ return `${namespace}:${params.appId || ''}:x:${params.topic || ''}`;
93
+ default:
94
+ throw new Error('Invalid key type.');
95
+ }
96
+ }
97
+ /**
98
+ * Extracts the parts of a given key string, safely handling cases where
99
+ * the 'id' portion may contain additional colons.
100
+ * @param key - The key to parse.
101
+ * @returns An object with the parsed key parts.
102
+ */
103
+ static parseKey(key) {
104
+ const [namespace, appId, entity, ...rest] = key.split(KEYSEP);
105
+ const id = rest.join(KEYSEP) || ''; // Join remaining parts to reconstruct the id
106
+ return {
107
+ namespace,
108
+ app: entity === 'a' ? appId : undefined,
109
+ entity,
110
+ id,
111
+ };
112
+ }
113
+ /**
114
+ * Reconstructs a key string from its parts.
115
+ * @param parts - An object with the key parts.
116
+ * @returns The reconstructed key string.
117
+ */
118
+ static reconstituteKey(parts) {
119
+ const { namespace, app, entity, id } = parts;
120
+ return `${namespace}${KEYSEP}${app}${KEYSEP}${entity}${KEYSEP}${id || ''}`;
121
+ }
122
+ /**
123
+ * Resolves an entity type abbreviation to a table-friendly name.
124
+ * @param abbreviation - The abbreviated entity type.
125
+ * @returns The long-form entity name.
126
+ */
127
+ static resolveEntityType(abbreviation, id = '') {
128
+ switch (abbreviation) {
129
+ case 'a':
130
+ return 'applications';
131
+ case 'r':
132
+ return 'throttles';
133
+ case 'w':
134
+ return id === '' ? 'task_priorities' : 'roles';
135
+ case 't':
136
+ return id === '' ? 'task_schedules' : 'task_lists';
137
+ case 'q':
138
+ return 'events';
139
+ case 'j':
140
+ return 'jobs';
141
+ case 's':
142
+ return 'stats';
143
+ case 'v':
144
+ return 'versions';
145
+ case 'x':
146
+ return id === '' ? 'streams' : 'stream_topics';
147
+ case 'hooks':
148
+ return 'signal_patterns';
149
+ case 'signals':
150
+ return 'signal_registry';
151
+ case 'sym':
152
+ return 'symbols';
153
+ default:
154
+ return 'unknown_entity';
155
+ }
156
+ }
157
+ static resolveAbbreviation(entity) {
158
+ switch (entity) {
159
+ case 'applications':
160
+ return 'a';
161
+ case 'throttles':
162
+ return 'r';
163
+ case 'roles':
164
+ return 'w';
165
+ case 'task_schedules':
166
+ return 't';
167
+ case 'task_lists':
168
+ return 't';
169
+ case 'events':
170
+ return 'q';
171
+ case 'jobs':
172
+ return 'j';
173
+ case 'stats':
174
+ return 's';
175
+ case 'versions':
176
+ return 'v';
177
+ case 'streams':
178
+ return 'x';
179
+ case 'signal_patterns':
180
+ return 'hooks';
181
+ case 'signal_registry':
182
+ return 'signals';
183
+ case 'symbols':
184
+ return 'sym';
185
+ default:
186
+ return 'unknown_entity';
187
+ }
188
+ }
189
+ }
190
+ exports.KeyService = KeyService;
@@ -1 +1,374 @@
1
- 'use strict';const n=b;(function(c,d){const m=b,e=c();while(!![]){try{const f=parseInt(m(0x11b))/0x1*(-parseInt(m(0xc2))/0x2)+parseInt(m(0x10f))/0x3+parseInt(m(0xf9))/0x4+-parseInt(m(0xf8))/0x5+parseInt(m(0xef))/0x6*(parseInt(m(0xfe))/0x7)+-parseInt(m(0xe7))/0x8*(parseInt(m(0x119))/0x9)+-parseInt(m(0x104))/0xa;if(f===d)break;else e['push'](e['shift']());}catch(g){e['push'](e['shift']());}}}(a,0x5e07e));var __importDefault=this&&this[n(0xc8)]||function(c){return c&&c['__esModule']?c:{'default':c};};Object['defineProperty'](exports,n(0xfc),{'value':!0x0}),exports[n(0xbb)]=exports[n(0xdc)]=exports[n(0x107)]=exports['s']=exports[n(0xc4)]=exports[n(0x10c)]=exports[n(0xfa)]=exports[n(0xcd)]=exports[n(0x100)]=exports[n(0xd6)]=exports['formatISODate']=exports[n(0x111)]=exports[n(0xc9)]=exports['findSubscriptionForTrigger']=exports[n(0xe5)]=exports['matchesStatus']=exports[n(0x105)]=exports[n(0x11d)]=exports['identifyProvider']=exports[n(0x106)]=exports['sleepImmediate']=exports[n(0xd8)]=exports[n(0xd0)]=exports[n(0xee)]=exports[n(0xf2)]=exports[n(0xbd)]=exports[n(0xd9)]=void 0x0;const os_1=__importDefault(require('os')),crypto_1=require(n(0xdd)),nanoid_1=require(n(0xff)),ms_1=__importDefault(require('ms')),logger_1=require(n(0xc6)),enums_1=require(n(0x115)),logger=new logger_1[(n(0xe0))](n(0x118),n(0xf6)),hashOptions=c=>{const o=n,d=JSON[o(0xed)](c);return(0x0,crypto_1['createHash'])(o(0xba))[o(0xec)](d)[o(0xf1)](o(0xe3));};async function getSystemHealth(){const p=n,c=os_1['default'][p(0xf7)](),d=os_1[p(0x114)][p(0xc0)](),f=c-d;return{'TotalMemoryGB':(c/0x400/0x400/0x400)[p(0x108)](0x2)+p(0x101),'FreeMemoryGB':(d/0x400/0x400/0x400)[p(0x108)](0x2)+p(0x101),'UsedMemoryGB':(f/0x400/0x400/0x400)[p(0x108)](0x2)+'\x20GB','CPULoad':[],'NetworkStats':[]};}function b(c,d){const e=a();return b=function(f,g){f=f-0xb9;let h=e[f];return h;},b(c,d);}function deepCopy(c){const q=n;return JSON['parse'](JSON[q(0xed)](c));}function deterministicRandom(c){const r=n,d=0x2710*Math[r(0xc7)](c);return d-Math[r(0xd7)](d);}function guid(c=enums_1[n(0xe9)]){const t=n;return'H'+(0x0,nanoid_1[t(0xff)])(c);}async function sleepFor(c){return new Promise(d=>setTimeout(d,c));}function sleepImmediate(){return new Promise(c=>setImmediate(c));}function XSleepFor(c){let d;return{'promise':new Promise(f=>{d=setTimeout(f,c);}),'timerId':d};}function identifyProvider(c){const u=n,d=Object[u(0xd3)](c);if(c[u(0x109)]?.['prototype']||Object[u(0xf4)](c)[u(0xc5)](u(0xfd))||'Pool'===d[u(0xc3)])return u(0xd1);if(c[u(0x10a)]()[u(0x11c)]()[u(0xc5)](u(0x116)))return u(0x116);if(u(0xda)in d||Object['keys'](d)[u(0xc5)](u(0xdb)))return u(0xf5);if(Object[u(0xf4)](d)[u(0xc5)]('Multi'))return u(0xe8);if(c[u(0xc1)]){if('Redis'===c[u(0xc1)][u(0xc3)]||'EventEmitter'===c['constructor']['name']){if(u(0x103)in c)return u(0xf5);}else{if((u(0x11e)===c[u(0xc1)][u(0xc3)]||u(0xf0)===c[u(0xc1)][u(0xc3)])&&u(0x117)in c)return u(0xe8);}}let f=null;return Object['keys'](c)['includes'](u(0xb9))||!isNaN(c[u(0x10d)])&&!isNaN(c[u(0x10e)])?f=u(0xd1):Object['keys'](c)[u(0xc5)](u(0xe1))?f=u(0xf5):Object[u(0xf4)](c)[u(0xc5)](u(0xbe))?f=u(0xe8):d[u(0xc1)][u(0x10a)]()[u(0xc5)](u(0x10b))&&(f=u(0x116)),f;}function matchesStatusCode(c,d){const v=n;if(v(0xd4)==typeof d){const f='^'+d['replace'](/\*/g,'\x5cd')+'$';return new RegExp(f)[v(0x110)](c['toString']());}return d[v(0x110)](c[v(0x10a)]());}function matchesStatus(c,d){return c===d;}function findTopKey(c,d){const w=n;for(const [f,g]of Object['entries'](c))if(g[w(0xea)](d))return(findTopKey(c,f[w(0xd2)](/^\./,''))||f)['replace'](/^\./,'');return null;}function findSubscriptionForTrigger(c,d){const x=n;for(const [f,g]of Object[x(0xde)](c))if(g===d)return f;return null;}async function getSubscriptionTopic(c,d,f){const y=n,g=await d['getTransitions'](f);return findSubscriptionForTrigger(await d[y(0xca)](f),findTopKey(g,c));}function getTimeSeries(c){const z=n;if(z(0xcc)===c['toString']())return'0';const d=new Date(),f=c[z(0xe4)](-0x1),g=parseInt(c['slice'](0x0,-0x1),0xa);if('m'===f){const h=Math[z(0xd7)](d['getMinutes']()/g)*g;d[z(0xe6)](h,0x0,0x0);}else'h'===f&&d[z(0xe6)](0x0,0x0,0x0);return d[z(0xbc)]()[z(0xd2)](/:\d\d\..+|-|T/g,'')['replace'](':','');}function formatISODate(c){const A=n;return(c instanceof Date?c:new Date(c))[A(0xbc)]()[A(0xd2)](/[:TZ-]/g,'');}function getSymKey(c){const B=n,d='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';if(c<0x0||c>=Math[B(0xdf)](0x34,0x3))throw new Error(B(0xf3));const [f,g]=divmod(c,0x34),[h,i]=divmod(f,0x34);return d[h]+d[g]+d[i];}function getSymVal(c){const C=n,d=C(0xbf);if(c<0x0||c>=Math['pow'](0x34,0x2))throw new Error(C(0xf3));const [f,g]=divmod(c,0x34);return d[f]+d[g];}function divmod(c,d){const D=n;return[Math[D(0xd7)](c/d),c%d];}function getIndexedHash(c,d){const f=c[d]||0x0,g={...c};return delete g[d],[f,g];}function getValueByPath(c,d){const E=n,f=d[E(0x113)]('/');let g=c;for(const h of f){if(void 0x0===g[h])return;g=g[h];}return g;}function restoreHierarchy(c){const F=n,d={};for(const f in c){if(void 0x0===c[f])continue;const g=f[F(0x113)]('/');let h=d;for(let i=0x0;i<g[F(0xcb)];i++)i===g[F(0xcb)]-0x1?h[g[i]]=c[f]:(h[g[i]]=h[g[i]]||{},h=h[g[i]]);}return d;}function isValidCron(c){return/^(\*|([0-5]?\d)) (\*|([01]?\d|2[0-3])) (\*|([12]?\d|3[01])) (\*|([1-9]|1[0-2])) (\*|([0-6](?:-[0-6])?(?:,[0-6])?))$/['test'](c);}exports[n(0xd9)]=hashOptions,exports[n(0xbd)]=getSystemHealth,exports['deepCopy']=deepCopy,exports['deterministicRandom']=deterministicRandom,exports[n(0xd0)]=guid,exports[n(0xd8)]=sleepFor,exports[n(0xcf)]=sleepImmediate,exports[n(0x106)]=XSleepFor,exports[n(0xce)]=identifyProvider,exports['polyfill']={'providerConfig':c=>c?.[n(0xb9)]??c?.['redis']??c?.[n(0x102)],'meshDataConfig':c=>({...c['connection']})},exports[n(0x105)]=matchesStatusCode,exports[n(0xfb)]=matchesStatus,exports[n(0xe5)]=findTopKey,exports[n(0x11a)]=findSubscriptionForTrigger,exports['getSubscriptionTopic']=getSubscriptionTopic,exports['getTimeSeries']=getTimeSeries,exports[n(0xe2)]=formatISODate,exports['getSymKey']=getSymKey,exports['getSymVal']=getSymVal,exports[n(0xcd)]=getIndexedHash,exports['getValueByPath']=getValueByPath,exports[n(0x10c)]=restoreHierarchy,exports[n(0xc4)]=isValidCron;const s=c=>(0x0,ms_1['default'])(c)/0x3e8;exports['s']=s;const parseStreamMessage=c=>{const G=n;try{return JSON[G(0x112)](c);}catch(d){throw logger['error']('Error\x20parsing\x20Stream\x20message',{'error':d}),d;}};exports[n(0x107)]=parseStreamMessage;const isStreamMessage=c=>Array['isArray'](c)&&Array[n(0xd5)](c[0x0]);exports['isStreamMessage']=isStreamMessage;const arrayToHash=c=>{const H=n,d=[];let f;for(let g=0x1;g<c[H(0xcb)];g++){const h=c[g],i={};if(Array[H(0xd5)](h)){for(let j=0x0;j<h[H(0xcb)];j+=0x2){const k=h[j],l=h[j+0x1];i[k]=l;}f&&(i['$']=f),d[H(0xeb)](i),f=void 0x0;}else f=h;}return d;};function a(){const I=['createClient','abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ','freemem','constructor','341882QnCryu','name','isValidCron','includes','../services/logger','sin','__importDefault','getSubscriptionTopic','getSubscriptions','length','infinity','getIndexedHash','identifyProvider','sleepImmediate','guid','postgres','replace','getPrototypeOf','string','isArray','getSymKey','floor','sleepFor','hashOptions','defineCommand','multi','isStreamMessage','crypto','entries','pow','LoggerService','Pipeline','formatISODate','hex','slice','findTopKey','setUTCMinutes','344aJRgII','redis','HMSH_GUID_SIZE','hasOwnProperty','push','update','stringify','deterministicRandom','6rUyZnP','Commander','digest','deepCopy','Number\x20out\x20of\x20range','keys','ioredis','utils','totalmem','1300550ZGpcMf','107772YYxIRA','getValueByPath','matchesStatus','__esModule','database','4811618MoNCnS','nanoid','getSymVal','\x20GB','connections','hset','1514640NNbQEl','matchesStatusCode','XSleepFor','parseStreamMessage','toFixed','Query','toString','NatsConnectionImpl','restoreHierarchy','totalCount','idleCount','938580nSzHIX','test','getTimeSeries','parse','split','default','./enums','nats','HSET','hotmesh','12456FvklCb','findSubscriptionForTrigger','1CPRObM','toLowerCase','polyfill','ProviderClient','connection','sha256','arrayToHash','toISOString','getSystemHealth'];a=function(){return I;};return a();}exports[n(0xbb)]=arrayToHash;
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.arrayToHash = exports.isStreamMessage = exports.parseStreamMessage = exports.s = exports.isValidCron = exports.restoreHierarchy = exports.getValueByPath = exports.getIndexedHash = exports.getSymVal = exports.getSymKey = exports.formatISODate = exports.getTimeSeries = exports.getSubscriptionTopic = exports.findSubscriptionForTrigger = exports.findTopKey = exports.matchesStatus = exports.matchesStatusCode = exports.polyfill = exports.identifyProvider = exports.XSleepFor = exports.sleepImmediate = exports.sleepFor = exports.guid = exports.deterministicRandom = exports.deepCopy = exports.getSystemHealth = exports.hashOptions = void 0;
7
+ const os_1 = __importDefault(require("os"));
8
+ const crypto_1 = require("crypto");
9
+ const nanoid_1 = require("nanoid");
10
+ const ms_1 = __importDefault(require("ms"));
11
+ const logger_1 = require("../services/logger");
12
+ const enums_1 = require("./enums");
13
+ const logger = new logger_1.LoggerService('hotmesh', 'utils');
14
+ /**
15
+ * @private
16
+ */
17
+ const hashOptions = (options) => {
18
+ const str = JSON.stringify(options);
19
+ return (0, crypto_1.createHash)('sha256').update(str).digest('hex');
20
+ };
21
+ exports.hashOptions = hashOptions;
22
+ async function getSystemHealth() {
23
+ const totalMemory = os_1.default.totalmem();
24
+ const freeMemory = os_1.default.freemem();
25
+ const usedMemory = totalMemory - freeMemory;
26
+ const systemHealth = {
27
+ TotalMemoryGB: `${(totalMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,
28
+ FreeMemoryGB: `${(freeMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,
29
+ UsedMemoryGB: `${(usedMemory / 1024 / 1024 / 1024).toFixed(2)} GB`,
30
+ CPULoad: [],
31
+ NetworkStats: [],
32
+ };
33
+ return systemHealth;
34
+ }
35
+ exports.getSystemHealth = getSystemHealth;
36
+ function deepCopy(obj) {
37
+ return JSON.parse(JSON.stringify(obj));
38
+ }
39
+ exports.deepCopy = deepCopy;
40
+ function deterministicRandom(seed) {
41
+ const x = Math.sin(seed) * 10000;
42
+ return x - Math.floor(x);
43
+ }
44
+ exports.deterministicRandom = deterministicRandom;
45
+ function guid(size = enums_1.HMSH_GUID_SIZE) {
46
+ return `H` + (0, nanoid_1.nanoid)(size);
47
+ }
48
+ exports.guid = guid;
49
+ async function sleepFor(ms) {
50
+ return new Promise((resolve) => setTimeout(resolve, ms));
51
+ }
52
+ exports.sleepFor = sleepFor;
53
+ function sleepImmediate() {
54
+ return new Promise((resolve) => setImmediate(resolve));
55
+ }
56
+ exports.sleepImmediate = sleepImmediate;
57
+ function XSleepFor(ms) {
58
+ //can be interrupted with `clearTimeout`
59
+ let timerId;
60
+ const promise = new Promise((resolve) => {
61
+ timerId = setTimeout(resolve, ms);
62
+ });
63
+ return { promise, timerId };
64
+ }
65
+ exports.XSleepFor = XSleepFor;
66
+ /**
67
+ * Identies the provider type based on the provider object. Customers may
68
+ * explicitly set the provider type in the configuration. But this is a
69
+ * convenience method to automatically identify the provider type.
70
+ * @private
71
+ */
72
+ function identifyProvider(provider) {
73
+ const prototype = Object.getPrototypeOf(provider);
74
+ if (provider.Query?.prototype ||
75
+ Object.keys(provider).includes('database') ||
76
+ prototype.name === 'Pool') {
77
+ return 'postgres';
78
+ }
79
+ else if (provider.toString().toLowerCase().includes('nats')) {
80
+ return 'nats';
81
+ }
82
+ else if ('defineCommand' in prototype ||
83
+ Object.keys(prototype).includes('multi')) {
84
+ return 'ioredis';
85
+ }
86
+ else if (Object.keys(prototype).includes('Multi')) {
87
+ return 'redis';
88
+ }
89
+ if (provider.constructor) {
90
+ if (provider.constructor.name === 'Redis' ||
91
+ provider.constructor.name === 'EventEmitter') {
92
+ if ('hset' in provider) {
93
+ return 'ioredis';
94
+ }
95
+ }
96
+ else if (provider.constructor.name === 'ProviderClient' ||
97
+ provider.constructor.name === 'Commander') {
98
+ if ('HSET' in provider) {
99
+ return 'redis';
100
+ }
101
+ }
102
+ }
103
+ let type = null;
104
+ if (Object.keys(provider).includes('connection') ||
105
+ !isNaN(provider.totalCount) && !isNaN(provider.idleCount)) {
106
+ type = 'postgres';
107
+ }
108
+ else if (Object.keys(provider).includes('Pipeline')) {
109
+ type = 'ioredis';
110
+ }
111
+ else if (Object.keys(provider).includes('createClient')) {
112
+ type = 'redis';
113
+ }
114
+ else if (prototype.constructor.toString().includes('NatsConnectionImpl')) {
115
+ type = 'nats';
116
+ }
117
+ return type;
118
+ }
119
+ exports.identifyProvider = identifyProvider;
120
+ /**
121
+ * @private
122
+ */
123
+ exports.polyfill = {
124
+ /**
125
+ * `redis` is deprecated; `connection` is the generic replacement
126
+ */
127
+ providerConfig(obj) {
128
+ return obj?.connection ?? obj?.redis ?? obj?.connections;
129
+ },
130
+ /**
131
+ * NOTE: `redisClass and redisOptions` input parameters are deprecated; use `connection` for all configuration inputs
132
+ */
133
+ meshDataConfig(obj) {
134
+ return { ...obj.connection };
135
+ },
136
+ };
137
+ /**
138
+ * @private
139
+ */
140
+ function matchesStatusCode(code, pattern) {
141
+ if (typeof pattern === 'string') {
142
+ // Convert '*' wildcard to its regex equivalent (\d)
143
+ const regexPattern = `^${pattern.replace(/\*/g, '\\d')}$`;
144
+ return new RegExp(regexPattern).test(code.toString());
145
+ }
146
+ return pattern.test(code.toString());
147
+ }
148
+ exports.matchesStatusCode = matchesStatusCode;
149
+ /**
150
+ * @private
151
+ */
152
+ function matchesStatus(status, targetStatus) {
153
+ return status === targetStatus;
154
+ }
155
+ exports.matchesStatus = matchesStatus;
156
+ /**
157
+ * @private
158
+ */
159
+ function findTopKey(obj, input) {
160
+ for (const [key, value] of Object.entries(obj)) {
161
+ if (value.hasOwnProperty(input)) {
162
+ const parentKey = findTopKey(obj, key.replace(/^\./, ''));
163
+ return (parentKey || key).replace(/^\./, '');
164
+ }
165
+ }
166
+ return null;
167
+ }
168
+ exports.findTopKey = findTopKey;
169
+ /**
170
+ * @private
171
+ */
172
+ function findSubscriptionForTrigger(obj, value) {
173
+ for (const [key, itemValue] of Object.entries(obj)) {
174
+ if (itemValue === value) {
175
+ return key;
176
+ }
177
+ }
178
+ return null;
179
+ }
180
+ exports.findSubscriptionForTrigger = findSubscriptionForTrigger;
181
+ /**
182
+ * Get the subscription topic for the flow to which activityId belongs.
183
+ * @private
184
+ */
185
+ async function getSubscriptionTopic(activityId, store, appVID) {
186
+ const appTransitions = await store.getTransitions(appVID);
187
+ const appSubscriptions = await store.getSubscriptions(appVID);
188
+ const triggerId = findTopKey(appTransitions, activityId);
189
+ const topic = findSubscriptionForTrigger(appSubscriptions, triggerId);
190
+ return topic;
191
+ }
192
+ exports.getSubscriptionTopic = getSubscriptionTopic;
193
+ /**
194
+ * returns the 12-digit format of the iso timestamp (e.g, 202101010000); returns
195
+ * an empty string if overridden by the user to not segment by time (infinity).
196
+ * @private
197
+ */
198
+ function getTimeSeries(granularity) {
199
+ if (granularity.toString() === 'infinity') {
200
+ return '0';
201
+ }
202
+ const now = new Date();
203
+ const granularityUnit = granularity.slice(-1);
204
+ const granularityValue = parseInt(granularity.slice(0, -1), 10);
205
+ if (granularityUnit === 'm') {
206
+ const minute = Math.floor(now.getMinutes() / granularityValue) * granularityValue;
207
+ now.setUTCMinutes(minute, 0, 0);
208
+ }
209
+ else if (granularityUnit === 'h') {
210
+ now.setUTCMinutes(0, 0, 0);
211
+ }
212
+ return now
213
+ .toISOString()
214
+ .replace(/:\d\d\..+|-|T/g, '')
215
+ .replace(':', '');
216
+ }
217
+ exports.getTimeSeries = getTimeSeries;
218
+ /**
219
+ * @private
220
+ */
221
+ function formatISODate(input) {
222
+ const date = input instanceof Date ? input : new Date(input);
223
+ return date.toISOString().replace(/[:TZ-]/g, '');
224
+ }
225
+ exports.formatISODate = formatISODate;
226
+ /**
227
+ * @private
228
+ */
229
+ function getSymKey(number) {
230
+ const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
231
+ const base = alphabet.length;
232
+ if (number < 0 || number >= Math.pow(base, 3)) {
233
+ throw new Error('Number out of range');
234
+ }
235
+ const [q1, r1] = divmod(number, base);
236
+ const [q2, r2] = divmod(q1, base);
237
+ return alphabet[q2] + alphabet[r1] + alphabet[r2];
238
+ }
239
+ exports.getSymKey = getSymKey;
240
+ /**
241
+ * @private
242
+ */
243
+ function getSymVal(number) {
244
+ const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
245
+ const base = alphabet.length;
246
+ if (number < 0 || number >= Math.pow(base, 2)) {
247
+ throw new Error('Number out of range');
248
+ }
249
+ const [q, r] = divmod(number, base);
250
+ return alphabet[q] + alphabet[r];
251
+ }
252
+ exports.getSymVal = getSymVal;
253
+ /**
254
+ * @private
255
+ */
256
+ function divmod(m, n) {
257
+ return [Math.floor(m / n), m % n];
258
+ }
259
+ /**
260
+ * @private
261
+ */
262
+ function getIndexedHash(hash, target) {
263
+ const index = hash[target] || 0;
264
+ const newHash = { ...hash };
265
+ delete newHash[target];
266
+ return [index, newHash];
267
+ }
268
+ exports.getIndexedHash = getIndexedHash;
269
+ /**
270
+ * @private
271
+ */
272
+ function getValueByPath(obj, path) {
273
+ const pathParts = path.split('/');
274
+ let currentValue = obj;
275
+ for (const part of pathParts) {
276
+ if (currentValue[part] !== undefined) {
277
+ currentValue = currentValue[part];
278
+ }
279
+ else {
280
+ return undefined;
281
+ }
282
+ }
283
+ return currentValue;
284
+ }
285
+ exports.getValueByPath = getValueByPath;
286
+ /**
287
+ * @private
288
+ */
289
+ function restoreHierarchy(obj) {
290
+ const result = {};
291
+ for (const key in obj) {
292
+ if (obj[key] === undefined)
293
+ continue;
294
+ const keys = key.split('/');
295
+ let current = result;
296
+ for (let i = 0; i < keys.length; i++) {
297
+ if (i === keys.length - 1) {
298
+ current[keys[i]] = obj[key];
299
+ }
300
+ else {
301
+ current[keys[i]] = current[keys[i]] || {};
302
+ current = current[keys[i]];
303
+ }
304
+ }
305
+ }
306
+ return result;
307
+ }
308
+ exports.restoreHierarchy = restoreHierarchy;
309
+ /**
310
+ * @private
311
+ */
312
+ function isValidCron(cronExpression) {
313
+ const cronRegex = /^(\*|([0-5]?\d)) (\*|([01]?\d|2[0-3])) (\*|([12]?\d|3[01])) (\*|([1-9]|1[0-2])) (\*|([0-6](?:-[0-6])?(?:,[0-6])?))$/;
314
+ return cronRegex.test(cronExpression);
315
+ }
316
+ exports.isValidCron = isValidCron;
317
+ /**
318
+ * Returns the number of seconds for a string using the milliseconds format
319
+ * used by the `ms` npm package as the input.
320
+ */
321
+ const s = (input) => {
322
+ return (0, ms_1.default)(input) / 1000;
323
+ };
324
+ exports.s = s;
325
+ /**
326
+ * @private
327
+ */
328
+ const parseStreamMessage = (message) => {
329
+ try {
330
+ return JSON.parse(message);
331
+ }
332
+ catch (error) {
333
+ logger.error('Error parsing Stream message', { error });
334
+ throw error;
335
+ }
336
+ };
337
+ exports.parseStreamMessage = parseStreamMessage;
338
+ /**
339
+ * @private
340
+ */
341
+ const isStreamMessage = (result) => {
342
+ return Array.isArray(result) && Array.isArray(result[0]);
343
+ };
344
+ exports.isStreamMessage = isStreamMessage;
345
+ /**
346
+ * Transforms an array of arrays to an array of objects.
347
+ */
348
+ const arrayToHash = (response) => {
349
+ const results = [];
350
+ let key;
351
+ for (let i = 1; i < response.length; i++) {
352
+ // ignore count
353
+ const row = response[i];
354
+ const result = {};
355
+ if (Array.isArray(row)) {
356
+ // Check if row is an array
357
+ for (let j = 0; j < row.length; j += 2) {
358
+ const key = row[j];
359
+ const value = row[j + 1];
360
+ result[key] = value;
361
+ }
362
+ if (key) {
363
+ result.$ = key;
364
+ }
365
+ results.push(result);
366
+ key = undefined;
367
+ }
368
+ else {
369
+ key = row;
370
+ }
371
+ }
372
+ return results;
373
+ };
374
+ exports.arrayToHash = arrayToHash;