@hotmeshio/hotmesh 0.0.51 → 0.0.53

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 (126) hide show
  1. package/README.md +13 -9
  2. package/build/index.d.ts +1 -2
  3. package/build/index.js +1 -3
  4. package/build/modules/enums.d.ts +8 -3
  5. package/build/modules/enums.js +16 -8
  6. package/build/modules/errors.d.ts +98 -18
  7. package/build/modules/errors.js +90 -33
  8. package/build/package.json +7 -2
  9. package/build/services/activities/activity.d.ts +8 -0
  10. package/build/services/activities/activity.js +65 -16
  11. package/build/services/activities/await.js +6 -6
  12. package/build/services/activities/cycle.d.ts +2 -2
  13. package/build/services/activities/cycle.js +5 -5
  14. package/build/services/activities/hook.js +4 -4
  15. package/build/services/activities/interrupt.d.ts +3 -3
  16. package/build/services/activities/interrupt.js +15 -6
  17. package/build/services/activities/signal.d.ts +2 -2
  18. package/build/services/activities/signal.js +4 -4
  19. package/build/services/activities/trigger.js +12 -3
  20. package/build/services/activities/worker.js +6 -6
  21. package/build/services/compiler/deployer.js +33 -5
  22. package/build/services/compiler/validator.d.ts +2 -0
  23. package/build/services/compiler/validator.js +5 -1
  24. package/build/services/durable/client.d.ts +7 -1
  25. package/build/services/durable/client.js +56 -30
  26. package/build/services/durable/exporter.d.ts +7 -72
  27. package/build/services/durable/exporter.js +105 -295
  28. package/build/services/durable/handle.d.ts +11 -6
  29. package/build/services/durable/handle.js +59 -46
  30. package/build/services/durable/index.d.ts +0 -2
  31. package/build/services/durable/index.js +0 -2
  32. package/build/services/durable/schemas/factory.d.ts +33 -0
  33. package/build/services/durable/schemas/factory.js +2356 -0
  34. package/build/services/durable/search.js +8 -8
  35. package/build/services/durable/worker.js +117 -25
  36. package/build/services/durable/workflow.d.ts +46 -43
  37. package/build/services/durable/workflow.js +273 -277
  38. package/build/services/engine/index.js +3 -0
  39. package/build/services/exporter/index.d.ts +2 -4
  40. package/build/services/exporter/index.js +4 -5
  41. package/build/services/mapper/index.d.ts +6 -2
  42. package/build/services/mapper/index.js +6 -2
  43. package/build/services/pipe/functions/array.d.ts +2 -10
  44. package/build/services/pipe/functions/array.js +30 -28
  45. package/build/services/pipe/functions/conditional.d.ts +1 -0
  46. package/build/services/pipe/functions/conditional.js +3 -0
  47. package/build/services/pipe/functions/date.d.ts +1 -0
  48. package/build/services/pipe/functions/date.js +4 -0
  49. package/build/services/pipe/functions/index.d.ts +2 -0
  50. package/build/services/pipe/functions/index.js +2 -0
  51. package/build/services/pipe/functions/logical.d.ts +5 -0
  52. package/build/services/pipe/functions/logical.js +12 -0
  53. package/build/services/pipe/functions/object.d.ts +3 -0
  54. package/build/services/pipe/functions/object.js +25 -7
  55. package/build/services/pipe/index.d.ts +20 -3
  56. package/build/services/pipe/index.js +82 -16
  57. package/build/services/router/index.js +14 -3
  58. package/build/services/serializer/index.d.ts +3 -2
  59. package/build/services/serializer/index.js +11 -4
  60. package/build/services/store/clients/ioredis.js +6 -6
  61. package/build/services/store/clients/redis.js +7 -7
  62. package/build/services/store/index.d.ts +2 -0
  63. package/build/services/store/index.js +4 -1
  64. package/build/services/stream/clients/ioredis.js +8 -8
  65. package/build/services/stream/clients/redis.js +1 -1
  66. package/build/types/activity.d.ts +60 -5
  67. package/build/types/durable.d.ts +168 -33
  68. package/build/types/exporter.d.ts +26 -4
  69. package/build/types/index.d.ts +2 -2
  70. package/build/types/job.d.ts +69 -5
  71. package/build/types/pipe.d.ts +81 -3
  72. package/build/types/stream.d.ts +61 -1
  73. package/build/types/stream.js +4 -0
  74. package/index.ts +1 -2
  75. package/modules/enums.ts +16 -8
  76. package/modules/errors.ts +174 -32
  77. package/package.json +7 -2
  78. package/services/activities/activity.ts +67 -18
  79. package/services/activities/await.ts +6 -6
  80. package/services/activities/cycle.ts +7 -6
  81. package/services/activities/hook.ts +4 -4
  82. package/services/activities/interrupt.ts +19 -9
  83. package/services/activities/signal.ts +6 -5
  84. package/services/activities/trigger.ts +16 -4
  85. package/services/activities/worker.ts +7 -7
  86. package/services/compiler/deployer.ts +33 -6
  87. package/services/compiler/validator.ts +7 -3
  88. package/services/durable/client.ts +47 -14
  89. package/services/durable/exporter.ts +110 -318
  90. package/services/durable/handle.ts +63 -50
  91. package/services/durable/index.ts +0 -2
  92. package/services/durable/schemas/factory.ts +2358 -0
  93. package/services/durable/search.ts +8 -8
  94. package/services/durable/worker.ts +128 -29
  95. package/services/durable/workflow.ts +304 -288
  96. package/services/engine/index.ts +4 -0
  97. package/services/exporter/index.ts +10 -12
  98. package/services/mapper/index.ts +6 -2
  99. package/services/pipe/functions/array.ts +24 -37
  100. package/services/pipe/functions/conditional.ts +4 -0
  101. package/services/pipe/functions/date.ts +6 -0
  102. package/services/pipe/functions/index.ts +7 -5
  103. package/services/pipe/functions/logical.ts +11 -0
  104. package/services/pipe/functions/object.ts +26 -7
  105. package/services/pipe/index.ts +99 -21
  106. package/services/quorum/index.ts +1 -3
  107. package/services/router/index.ts +14 -3
  108. package/services/serializer/index.ts +12 -5
  109. package/services/store/clients/ioredis.ts +6 -6
  110. package/services/store/clients/redis.ts +7 -7
  111. package/services/store/index.ts +4 -1
  112. package/services/stream/clients/ioredis.ts +8 -8
  113. package/services/stream/clients/redis.ts +1 -1
  114. package/types/activity.ts +87 -15
  115. package/types/durable.ts +246 -73
  116. package/types/exporter.ts +31 -5
  117. package/types/index.ts +6 -7
  118. package/types/job.ts +130 -36
  119. package/types/pipe.ts +84 -3
  120. package/types/stream.ts +82 -23
  121. package/build/services/durable/factory.d.ts +0 -17
  122. package/build/services/durable/factory.js +0 -817
  123. package/build/services/durable/meshos.d.ts +0 -127
  124. package/build/services/durable/meshos.js +0 -380
  125. package/services/durable/factory.ts +0 -818
  126. package/services/durable/meshos.ts +0 -441
@@ -77,7 +77,7 @@ class IORedisStoreService extends StoreService<RedisClientType, RedisMultiType>
77
77
  try {
78
78
  return await (multi || this.redisClient).xadd(key, id, messageId, messageValue);
79
79
  } catch (error) {
80
- this.logger.error(`Error publishing 'xadd'; key: ${key}`, { error });
80
+ this.logger.error(`Error publishing 'xadd'; key: ${key}`, { ...error });
81
81
  throw error;
82
82
  }
83
83
  }
@@ -93,7 +93,7 @@ class IORedisStoreService extends StoreService<RedisClientType, RedisMultiType>
93
93
  try {
94
94
  return await this.redisClient.xpending(key, group, start, end, count, consumer);
95
95
  } catch (error) {
96
- this.logger.error(`Error in retrieving pending messages for [stream ${key}], [group ${group}]`, { error });
96
+ this.logger.error(`Error in retrieving pending messages for [stream ${key}], [group ${group}]`, { ...error });
97
97
  throw error;
98
98
  }
99
99
  }
@@ -109,7 +109,7 @@ class IORedisStoreService extends StoreService<RedisClientType, RedisMultiType>
109
109
  try {
110
110
  return await this.redisClient.xclaim(key, group, consumer, minIdleTime, id, ...args) as unknown as ReclaimedMessageType;
111
111
  } catch (error) {
112
- this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${key}`, { error });
112
+ this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${key}`, { ...error });
113
113
  throw error;
114
114
  }
115
115
  }
@@ -118,7 +118,7 @@ class IORedisStoreService extends StoreService<RedisClientType, RedisMultiType>
118
118
  try {
119
119
  return await (multi || this.redisClient).xack(key, group, id);
120
120
  } catch (error) {
121
- this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${key}`, { error });
121
+ this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${key}`, { ...error });
122
122
  throw error;
123
123
  }
124
124
  }
@@ -127,7 +127,7 @@ class IORedisStoreService extends StoreService<RedisClientType, RedisMultiType>
127
127
  try {
128
128
  return await (multi || this.redisClient).xdel(key, id);
129
129
  } catch (error) {
130
- this.logger.error(`Error in deleting messages with id: ${id} for key: ${key}`, { error });
130
+ this.logger.error(`Error in deleting messages with id: ${id} for key: ${key}`, { ...error });
131
131
  throw error;
132
132
  }
133
133
  }
@@ -136,7 +136,7 @@ class IORedisStoreService extends StoreService<RedisClientType, RedisMultiType>
136
136
  try {
137
137
  return await (multi || this.redisClient).xlen(key);
138
138
  } catch (error) {
139
- this.logger.error(`Error getting stream depth: ${key}`, { error });
139
+ this.logger.error(`Error getting stream depth: ${key}`, { ...error });
140
140
  throw error;
141
141
  }
142
142
  }
@@ -89,7 +89,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
89
89
  return (await this.redisClient.sendCommand(['XGROUP', 'CREATE', key, groupName, id, ...args])) === 1;
90
90
  } catch (error) {
91
91
  const streamType = mkStream === 'MKSTREAM' ? 'with MKSTREAM' : 'without MKSTREAM';
92
- this.logger.debug(`x-group-error ${streamType} for key: ${key} and group: ${groupName}`, { error });
92
+ this.logger.debug(`x-group-error ${streamType} for key: ${key} and group: ${groupName}`, { ...error });
93
93
  throw error;
94
94
  }
95
95
  }
@@ -102,7 +102,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
102
102
  try {
103
103
  return await (multi || this.redisClient).XADD(key, id, { [args[0]]: args[1] });
104
104
  } catch (error) {
105
- this.logger.error(`Error publishing 'xadd'; key: ${key}`, { error });
105
+ this.logger.error(`Error publishing 'xadd'; key: ${key}`, { ...error });
106
106
  throw error;
107
107
  }
108
108
  }
@@ -123,7 +123,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
123
123
  if (consumer) args.push(consumer);
124
124
  return await this.redisClient.sendCommand(['XPENDING', ...args]);
125
125
  } catch (error) {
126
- this.logger.error(`Error in retrieving pending messages for group: ${group} in key: ${key}`, { error });
126
+ this.logger.error(`Error in retrieving pending messages for group: ${group} in key: ${key}`, { ...error });
127
127
  throw error;
128
128
  }
129
129
  }
@@ -139,7 +139,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
139
139
  try {
140
140
  return await this.redisClient.sendCommand(['XCLAIM', key, group, consumer, minIdleTime.toString(), id, ...args]) as unknown as ReclaimedMessageType;
141
141
  } catch (error) {
142
- this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${key}`, { error });
142
+ this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${key}`, { ...error });
143
143
  throw error;
144
144
  }
145
145
  }
@@ -153,7 +153,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
153
153
  return await this.redisClient[this.commands.xack](key, group, id);
154
154
  }
155
155
  } catch (error) {
156
- this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${key}`, { error });
156
+ this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${key}`, { ...error });
157
157
  throw error;
158
158
  }
159
159
  }
@@ -167,7 +167,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
167
167
  return await this.redisClient[this.commands.xdel](key, id);
168
168
  }
169
169
  } catch (error) {
170
- this.logger.error(`Error in deleting messages with ids: ${id} for key: ${key}`, { error });
170
+ this.logger.error(`Error in deleting messages with ids: ${id} for key: ${key}`, { ...error });
171
171
  throw error;
172
172
  }
173
173
  }
@@ -181,7 +181,7 @@ class RedisStoreService extends StoreService<RedisClientType, RedisMultiType> {
181
181
  return await this.redisClient.XLEN(key);
182
182
  }
183
183
  } catch (error) {
184
- this.logger.error(`Error getting stream depth: ${key}`, { error });
184
+ this.logger.error(`Error getting stream depth: ${key}`, { ...error });
185
185
  throw error;
186
186
  }
187
187
  }
@@ -977,6 +977,8 @@ abstract class StoreService<T, U extends AbstractRedisClient> {
977
977
  * This method is called by the engine and not by an activity and is
978
978
  * followed by a call to execute job completion/cleanup tasks
979
979
  * associated with a job completion event.
980
+ *
981
+ * Todo: move most of this logic to the engine (too much logic for the store)
980
982
  */
981
983
  async interrupt(topic: string, jobId: string, options: JobInterruptOptions = {}): Promise<void> {
982
984
  try {
@@ -1004,8 +1006,9 @@ abstract class StoreService<T, U extends AbstractRedisClient> {
1004
1006
 
1005
1007
  //persists the standard 410 error (job is `gone`)
1006
1008
  const err = JSON.stringify({
1007
- code: HMSH_CODE_INTERRUPT,
1009
+ code: options.code ?? HMSH_CODE_INTERRUPT,
1008
1010
  message: options.reason ?? `job [${jobId}] interrupted`,
1011
+ stack: options.stack ?? '',
1009
1012
  job_id: jobId
1010
1013
  });
1011
1014
 
@@ -51,7 +51,7 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
51
51
  try {
52
52
  return await (multi || this.redisClient).xadd(key, id, messageId, messageValue);
53
53
  } catch (error) {
54
- this.logger.error(`Error publishing 'xadd'; key: ${key}`, { error });
54
+ this.logger.error(`Error publishing 'xadd'; key: ${key}`, { ...error });
55
55
  throw error;
56
56
  }
57
57
  }
@@ -80,7 +80,7 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
80
80
  id
81
81
  );
82
82
  } catch (error) {
83
- this.logger.error(`Error reading stream data [Stream ${streamName}] [Group ${groupName}]`, { error });
83
+ this.logger.error(`Error reading stream data [Stream ${streamName}] [Group ${groupName}]`, { ...error });
84
84
  throw error;
85
85
  }
86
86
  }
@@ -102,10 +102,10 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
102
102
  try {
103
103
  return await this.redisClient.call('XPENDING', ...args) as [string, string, number, number][];
104
104
  } catch (error) {
105
- this.logger.error('err, args', { error }, args);
105
+ this.logger.error('err, args', { ...error }, args);
106
106
  }
107
107
  } catch (error) {
108
- this.logger.error(`Error in retrieving pending messages for [stream ${key}], [group ${group}]`, { error });
108
+ this.logger.error(`Error in retrieving pending messages for [stream ${key}], [group ${group}]`, { ...error });
109
109
  throw error;
110
110
  }
111
111
  }
@@ -121,7 +121,7 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
121
121
  try {
122
122
  return await this.redisClient.xclaim(key, group, consumer, minIdleTime, id, ...args) as unknown as ReclaimedMessageType;
123
123
  } catch (error) {
124
- this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${key}`, { error });
124
+ this.logger.error(`Error in claiming message with id: ${id} in group: ${group} for key: ${key}`, { ...error });
125
125
  throw error;
126
126
  }
127
127
  }
@@ -130,7 +130,7 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
130
130
  try {
131
131
  return await (multi || this.redisClient).xack(key, group, id);
132
132
  } catch (error) {
133
- this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${key}`, { error });
133
+ this.logger.error(`Error in acknowledging messages in group: ${group} for key: ${key}`, { ...error });
134
134
  throw error;
135
135
  }
136
136
  }
@@ -139,7 +139,7 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
139
139
  try {
140
140
  return await (multi || this.redisClient).xdel(key, id);
141
141
  } catch (error) {
142
- this.logger.error(`Error in deleting messages with id: ${id} for key: ${key}`, { error });
142
+ this.logger.error(`Error in deleting messages with id: ${id} for key: ${key}`, { ...error });
143
143
  throw error;
144
144
  }
145
145
  }
@@ -148,7 +148,7 @@ class IORedisStreamService extends StreamService<RedisClientType, RedisMultiType
148
148
  try {
149
149
  return await (multi || this.redisClient).xlen(key);
150
150
  } catch (error) {
151
- this.logger.error(`Error getting stream depth: ${key}`, { error });
151
+ this.logger.error(`Error getting stream depth: ${key}`, { ...error });
152
152
  throw error;
153
153
  }
154
154
  }
@@ -149,7 +149,7 @@ class RedisStreamService extends StreamService<RedisClientType, RedisMultiType>
149
149
  return await this.redisClient.XLEN(key);
150
150
  }
151
151
  } catch (error) {
152
- this.logger.error(`Error getting stream depth: ${key}`, { error });
152
+ this.logger.error(`Error getting stream depth: ${key}`, { ...error });
153
153
  throw error;
154
154
  }
155
155
  }
package/types/activity.ts CHANGED
@@ -110,32 +110,104 @@ interface SignalActivity extends BaseActivity {
110
110
 
111
111
  interface InterruptActivity extends BaseActivity {
112
112
  type: 'interrupt';
113
- /** Optional Reason; will be used as the error `message` when thrown; NOTE: 410 is the error `code` */
113
+
114
+ /**
115
+ * Optional Reason; will be used as the error `message` when thrown
116
+ * @default 'Job Interrupted'
117
+ */
114
118
  reason?: string;
115
- /** default is `true` (throw JobInterrupted error upon interrupting) */
119
+
120
+ /**
121
+ * throw JobInterrupted error upon interrupting
122
+ * @default true
123
+ */
116
124
  throw?: boolean;
117
- /** TODO: // default is `false` (do not interrupt child jobs) */
125
+
126
+ /**
127
+ * Interrupt child/descendant jobs
128
+ * @default false
129
+ */
118
130
  descend?: boolean;
119
- /** target job id (if not present the current job will be targeted) */
131
+
132
+ /**
133
+ * Target job id (if not present the current job will be targeted)
134
+ */
120
135
  target?: string;
121
- /** topic to publish the interrupt message (if not present the current job topic will be used) */
136
+
137
+ /**
138
+ * Optional topic to publish the interrupt message (if not present the current job topic will be used
139
+ */
122
140
  topic?: string;
141
+
142
+ /**
143
+ * Optional Error Code; will be used as the error `code` when thrown
144
+ * @default 410
145
+ */
146
+ code?: number;
147
+
148
+ /**
149
+ * Optional stack trace
150
+ */
151
+ stack?: string;
123
152
  }
124
153
 
125
154
  type ActivityType = BaseActivity | TriggerActivity | AwaitActivity | WorkerActivity | InterruptActivity | HookActivity | SignalActivity | CycleActivity;
126
155
 
127
156
  type ActivityData = Record<string, any>;
157
+
158
+ /**
159
+ * Type definition for activity metadata.
160
+ */
128
161
  type ActivityMetadata = {
129
- aid: string; //activity_id
130
- atp: string; //activity_type
131
- stp: string; //activity_subtype
132
- ac: string; //GMT created //activity_created
133
- au: string; //GMT updated //activity_updated
134
- err?: string; //stringified error json: {message: string, code: number, error?}
135
- l1s?: string; //open telemetry span context (leg 1)
136
- l2s?: string; //open telemetry span context (leg 2)
137
- dad?: string; //dimensional address
138
- as?: string; //activity status (e.g., 889000001000001)
162
+ /**
163
+ * Unique identifier for the activity.
164
+ */
165
+ aid: string;
166
+
167
+ /**
168
+ * Type of the activity.
169
+ */
170
+ atp: string;
171
+
172
+ /**
173
+ * Subtype of the activity.
174
+ */
175
+ stp: string;
176
+
177
+ /**
178
+ * Timestamp when the activity was created, in GMT.
179
+ */
180
+ ac: string;
181
+
182
+ /**
183
+ * Timestamp when the activity was last updated, in GMT.
184
+ */
185
+ au: string;
186
+
187
+ /**
188
+ * Optional stringified JSON containing error details such as message, code, and an optional error object.
189
+ */
190
+ err?: string;
191
+
192
+ /**
193
+ * OpenTelemetry span context for the first leg of the activity.
194
+ */
195
+ l1s?: string;
196
+
197
+ /**
198
+ * OpenTelemetry span context for the second leg of the activity.
199
+ */
200
+ l2s?: string;
201
+
202
+ /**
203
+ * Dimensional address, used for additional metadata.
204
+ */
205
+ dad?: string;
206
+
207
+ /**
208
+ * Status of the activity, could be codes representing different states.
209
+ */
210
+ as?: string;
139
211
  };
140
212
 
141
213
  type ActivityContext = {