@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.
- package/README.md +128 -823
- package/build/index.d.ts +9 -9
- package/build/index.js +10 -10
- package/build/modules/enums.d.ts +23 -23
- package/build/modules/enums.js +26 -26
- package/build/modules/errors.d.ts +16 -16
- package/build/modules/errors.js +28 -28
- package/build/modules/key.js +190 -1
- package/build/modules/utils.js +374 -1
- package/build/package.json +22 -21
- package/build/services/activities/activity.js +549 -1
- package/build/services/activities/await.js +114 -1
- package/build/services/activities/cycle.js +112 -1
- package/build/services/activities/hook.js +168 -1
- package/build/services/activities/index.js +20 -1
- package/build/services/activities/interrupt.js +158 -1
- package/build/services/activities/signal.js +134 -1
- package/build/services/activities/trigger.js +246 -1
- package/build/services/activities/worker.js +106 -1
- package/build/services/collator/index.js +293 -1
- package/build/services/compiler/deployer.js +488 -1
- package/build/services/compiler/index.js +112 -1
- package/build/services/compiler/validator.js +147 -1
- package/build/services/engine/index.js +761 -1
- package/build/services/exporter/index.js +126 -1
- package/build/services/hotmesh/index.d.ts +160 -17
- package/build/services/hotmesh/index.js +160 -17
- package/build/services/mapper/index.js +81 -1
- package/build/services/{meshflow → memflow}/client.d.ts +3 -3
- package/build/services/{meshflow → memflow}/client.js +17 -16
- package/build/services/{meshflow → memflow}/connection.d.ts +2 -2
- package/build/services/{meshflow → memflow}/connection.js +1 -1
- package/build/services/memflow/context.d.ts +143 -0
- package/build/services/memflow/context.js +299 -0
- package/build/services/{meshflow → memflow}/exporter.d.ts +6 -6
- package/build/services/memflow/exporter.js +215 -0
- package/build/services/{meshflow → memflow}/handle.d.ts +4 -4
- package/build/services/{meshflow → memflow}/handle.js +2 -2
- package/build/services/{meshflow → memflow}/index.d.ts +18 -13
- package/build/services/{meshflow → memflow}/index.js +26 -21
- package/build/services/{meshflow → memflow}/schemas/factory.d.ts +4 -4
- package/build/services/{meshflow → memflow}/schemas/factory.js +5 -5
- package/build/services/{meshflow → memflow}/search.d.ts +1 -1
- package/build/services/{meshflow → memflow}/search.js +4 -4
- package/build/services/{meshflow → memflow}/worker.d.ts +5 -5
- package/build/services/{meshflow → memflow}/worker.js +24 -24
- package/build/services/memflow/workflow/common.d.ts +20 -0
- package/build/services/memflow/workflow/common.js +47 -0
- package/build/services/memflow/workflow/contextMethods.d.ts +14 -0
- package/build/services/memflow/workflow/contextMethods.js +33 -0
- package/build/services/{meshflow → memflow}/workflow/execChild.js +12 -12
- package/build/services/memflow/workflow/execHook.d.ts +65 -0
- package/build/services/memflow/workflow/execHook.js +73 -0
- package/build/services/{meshflow → memflow}/workflow/hook.js +19 -3
- package/build/services/{meshflow → memflow}/workflow/index.d.ts +7 -3
- package/build/services/{meshflow → memflow}/workflow/index.js +7 -3
- package/build/services/{meshflow → memflow}/workflow/proxyActivities.d.ts +2 -2
- package/build/services/{meshflow → memflow}/workflow/proxyActivities.js +8 -8
- package/build/services/{meshflow → memflow}/workflow/sleepFor.js +2 -2
- package/build/services/{meshflow → memflow}/workflow/waitFor.js +2 -2
- package/build/services/meshdata/index.d.ts +24 -24
- package/build/services/meshdata/index.js +40 -40
- package/build/services/pipe/functions/array.js +74 -1
- package/build/services/pipe/functions/bitwise.js +24 -1
- package/build/services/pipe/functions/conditional.js +36 -1
- package/build/services/pipe/functions/cron.js +40 -1
- package/build/services/pipe/functions/date.js +171 -1
- package/build/services/pipe/functions/index.js +30 -1
- package/build/services/pipe/functions/json.js +12 -1
- package/build/services/pipe/functions/logical.js +12 -1
- package/build/services/pipe/functions/math.js +184 -1
- package/build/services/pipe/functions/number.js +60 -1
- package/build/services/pipe/functions/object.js +81 -1
- package/build/services/pipe/functions/string.js +69 -1
- package/build/services/pipe/functions/symbol.js +33 -1
- package/build/services/pipe/functions/unary.js +18 -1
- package/build/services/pipe/index.js +242 -1
- package/build/services/quorum/index.js +263 -1
- package/build/services/reporter/index.js +348 -1
- package/build/services/router/config/index.d.ts +11 -0
- package/build/services/router/config/index.js +36 -0
- package/build/services/router/consumption/index.d.ts +34 -0
- package/build/services/router/consumption/index.js +395 -0
- package/build/services/router/error-handling/index.d.ts +8 -0
- package/build/services/router/error-handling/index.js +98 -0
- package/build/services/router/index.d.ts +13 -16
- package/build/services/router/index.js +121 -1
- package/build/services/router/lifecycle/index.d.ts +27 -0
- package/build/services/router/lifecycle/index.js +80 -0
- package/build/services/router/telemetry/index.d.ts +11 -0
- package/build/services/router/telemetry/index.js +32 -0
- package/build/services/router/throttling/index.d.ts +23 -0
- package/build/services/router/throttling/index.js +76 -0
- package/build/services/search/index.d.ts +2 -1
- package/build/services/search/providers/postgres/postgres.d.ts +2 -1
- package/build/services/search/providers/postgres/postgres.js +149 -1
- package/build/services/search/providers/redis/ioredis.d.ts +1 -0
- package/build/services/search/providers/redis/ioredis.js +121 -1
- package/build/services/search/providers/redis/redis.d.ts +1 -0
- package/build/services/search/providers/redis/redis.js +134 -1
- package/build/services/serializer/index.js +282 -1
- package/build/services/store/providers/postgres/kvsql.d.ts +1 -1
- package/build/services/store/providers/postgres/kvsql.js +198 -1
- package/build/services/store/providers/postgres/kvtables.js +441 -1
- package/build/services/store/providers/postgres/kvtransaction.js +248 -1
- package/build/services/store/providers/postgres/kvtypes/hash.d.ts +1 -1
- package/build/services/store/providers/postgres/kvtypes/hash.js +1287 -1
- package/build/services/store/providers/postgres/kvtypes/list.js +194 -1
- package/build/services/store/providers/postgres/kvtypes/string.js +115 -1
- package/build/services/store/providers/postgres/kvtypes/zset.js +214 -1
- package/build/services/store/providers/postgres/postgres.js +1036 -1
- package/build/services/store/providers/redis/_base.js +980 -1
- package/build/services/store/providers/redis/ioredis.js +180 -1
- package/build/services/store/providers/redis/redis.js +199 -1
- package/build/services/store/providers/store-initializable.js +2 -1
- package/build/services/stream/index.d.ts +5 -0
- package/build/services/stream/providers/nats/nats.d.ts +1 -0
- package/build/services/stream/providers/nats/nats.js +225 -1
- package/build/services/stream/providers/postgres/kvtables.d.ts +1 -0
- package/build/services/stream/providers/postgres/kvtables.js +146 -1
- package/build/services/stream/providers/postgres/postgres.d.ts +19 -0
- package/build/services/stream/providers/postgres/postgres.js +519 -1
- package/build/services/stream/providers/redis/ioredis.d.ts +1 -0
- package/build/services/stream/providers/redis/ioredis.js +272 -1
- package/build/services/stream/providers/redis/redis.d.ts +1 -0
- package/build/services/stream/providers/redis/redis.js +305 -1
- package/build/services/stream/providers/stream-initializable.js +2 -1
- package/build/services/sub/providers/nats/nats.js +105 -1
- package/build/services/sub/providers/postgres/postgres.js +92 -1
- package/build/services/sub/providers/redis/ioredis.js +81 -1
- package/build/services/sub/providers/redis/redis.js +72 -1
- package/build/services/task/index.js +206 -1
- package/build/services/telemetry/index.js +306 -1
- package/build/services/worker/index.js +197 -1
- package/build/types/error.d.ts +5 -5
- package/build/types/exporter.d.ts +1 -1
- package/build/types/index.d.ts +3 -3
- package/build/types/manifest.d.ts +2 -2
- package/build/types/{meshflow.d.ts → memflow.d.ts} +15 -15
- package/build/types/meshdata.d.ts +3 -3
- package/build/types/postgres.d.ts +7 -0
- package/build/types/stream.d.ts +3 -0
- package/index.ts +11 -11
- package/package.json +22 -21
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -38
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -20
- package/build/services/meshflow/exporter.js +0 -1
- package/build/services/meshflow/workflow/common.d.ts +0 -18
- package/build/services/meshflow/workflow/common.js +0 -45
- package/typedoc.json +0 -46
- package/types/activity.ts +0 -268
- package/types/app.ts +0 -20
- package/types/async.ts +0 -6
- package/types/cache.ts +0 -1
- package/types/collator.ts +0 -9
- package/types/error.ts +0 -56
- package/types/exporter.ts +0 -102
- package/types/hook.ts +0 -44
- package/types/hotmesh.ts +0 -314
- package/types/index.ts +0 -306
- package/types/job.ts +0 -233
- package/types/logger.ts +0 -8
- package/types/manifest.ts +0 -70
- package/types/map.ts +0 -5
- package/types/meshcall.ts +0 -235
- package/types/meshdata.ts +0 -278
- package/types/meshflow.ts +0 -645
- package/types/ms.d.ts +0 -7
- package/types/nats.ts +0 -270
- package/types/pipe.ts +0 -90
- package/types/postgres.ts +0 -105
- package/types/provider.ts +0 -161
- package/types/quorum.ts +0 -167
- package/types/redis.ts +0 -404
- package/types/serializer.ts +0 -40
- package/types/stats.ts +0 -117
- package/types/stream.ts +0 -227
- package/types/task.ts +0 -7
- package/types/telemetry.ts +0 -16
- package/types/transition.ts +0 -20
- /package/build/services/{meshflow → memflow}/workflow/all.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/all.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/context.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/context.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/didRun.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/didRun.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/emit.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/emit.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/enrich.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/enrich.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/execChild.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/hook.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/interrupt.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/interrupt.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/isSideEffectAllowed.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/random.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/random.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/searchMethods.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/searchMethods.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/signal.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/signal.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/sleepFor.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/trace.d.ts +0 -0
- /package/build/services/{meshflow → memflow}/workflow/trace.js +0 -0
- /package/build/services/{meshflow → memflow}/workflow/waitFor.d.ts +0 -0
- /package/build/types/{meshflow.js → memflow.js} +0 -0
|
@@ -16,12 +16,12 @@ const factory_1 = require("./schemas/factory");
|
|
|
16
16
|
*
|
|
17
17
|
* @example
|
|
18
18
|
* ```typescript
|
|
19
|
-
* import {
|
|
19
|
+
* import { MemFlow } from '@hotmeshio/hotmesh';
|
|
20
20
|
* import { Client as Postgres } from 'pg';
|
|
21
21
|
* import * as workflows from './workflows';
|
|
22
22
|
*
|
|
23
23
|
* async function run() {
|
|
24
|
-
* const worker = await
|
|
24
|
+
* const worker = await MemFlow.Worker.create({
|
|
25
25
|
* connection: {
|
|
26
26
|
* class: Postgres,
|
|
27
27
|
* options: { connectionString: 'postgres://user:password@localhost:5432/db' }
|
|
@@ -67,7 +67,7 @@ class WorkerService {
|
|
|
67
67
|
await hotMesh.activate(factory_1.APP_VERSION);
|
|
68
68
|
}
|
|
69
69
|
catch (err) {
|
|
70
|
-
hotMesh.engine.logger.error('
|
|
70
|
+
hotMesh.engine.logger.error('memflow-worker-deploy-activate-err', err);
|
|
71
71
|
throw err;
|
|
72
72
|
}
|
|
73
73
|
}
|
|
@@ -76,7 +76,7 @@ class WorkerService {
|
|
|
76
76
|
await hotMesh.activate(factory_1.APP_VERSION);
|
|
77
77
|
}
|
|
78
78
|
catch (err) {
|
|
79
|
-
hotMesh.engine.logger.error('
|
|
79
|
+
hotMesh.engine.logger.error('memflow-worker-activate-err', err);
|
|
80
80
|
throw err;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
@@ -108,12 +108,12 @@ class WorkerService {
|
|
|
108
108
|
*
|
|
109
109
|
* @example
|
|
110
110
|
* ```typescript
|
|
111
|
-
* import {
|
|
111
|
+
* import { MemFlow } from '@hotmeshio/hotmesh';
|
|
112
112
|
* import { Client as Postgres } from 'pg';
|
|
113
113
|
* import * as workflows from './workflows';
|
|
114
114
|
*
|
|
115
115
|
* async function run() {
|
|
116
|
-
* const worker = await
|
|
116
|
+
* const worker = await MemFlow.Worker.create({
|
|
117
117
|
* connection: {
|
|
118
118
|
* class: Postgres,
|
|
119
119
|
* options: {
|
|
@@ -162,7 +162,7 @@ class WorkerService {
|
|
|
162
162
|
* Run the connected worker; no-op (unnecessary to call)
|
|
163
163
|
*/
|
|
164
164
|
async run() {
|
|
165
|
-
this.workflowRunner.engine.logger.info('
|
|
165
|
+
this.workflowRunner.engine.logger.info('memflow-worker-running');
|
|
166
166
|
}
|
|
167
167
|
/**
|
|
168
168
|
* @private
|
|
@@ -206,19 +206,19 @@ class WorkerService {
|
|
|
206
206
|
};
|
|
207
207
|
}
|
|
208
208
|
catch (err) {
|
|
209
|
-
this.activityRunner.engine.logger.error('
|
|
209
|
+
this.activityRunner.engine.logger.error('memflow-worker-activity-err', {
|
|
210
210
|
name: err.name,
|
|
211
211
|
message: err.message,
|
|
212
212
|
stack: err.stack,
|
|
213
213
|
});
|
|
214
|
-
if (!(err instanceof errors_1.
|
|
215
|
-
!(err instanceof errors_1.
|
|
216
|
-
!(err instanceof errors_1.
|
|
214
|
+
if (!(err instanceof errors_1.MemFlowTimeoutError) &&
|
|
215
|
+
!(err instanceof errors_1.MemFlowMaxedError) &&
|
|
216
|
+
!(err instanceof errors_1.MemFlowFatalError)) {
|
|
217
217
|
//use code 599 as a proxy for all retryable errors
|
|
218
218
|
// (basically anything not 596, 597, 598)
|
|
219
219
|
return {
|
|
220
220
|
status: stream_1.StreamStatus.SUCCESS,
|
|
221
|
-
code: enums_1.
|
|
221
|
+
code: enums_1.HMSH_CODE_MEMFLOW_RETRYABLE,
|
|
222
222
|
metadata: { ...data.metadata },
|
|
223
223
|
data: {
|
|
224
224
|
$error: {
|
|
@@ -230,7 +230,7 @@ class WorkerService {
|
|
|
230
230
|
};
|
|
231
231
|
}
|
|
232
232
|
return {
|
|
233
|
-
//always returrn success (the
|
|
233
|
+
//always returrn success (the MemFlow module is just fine);
|
|
234
234
|
// it's the user's function that has failed
|
|
235
235
|
status: stream_1.StreamStatus.SUCCESS,
|
|
236
236
|
code: err.code,
|
|
@@ -333,7 +333,7 @@ class WorkerService {
|
|
|
333
333
|
if (isProcessing) {
|
|
334
334
|
return;
|
|
335
335
|
}
|
|
336
|
-
if (err instanceof errors_1.
|
|
336
|
+
if (err instanceof errors_1.MemFlowWaitForError ||
|
|
337
337
|
interruptionRegistry.length > 1) {
|
|
338
338
|
isProcessing = true;
|
|
339
339
|
//NOTE: this type is spawned when `Promise.all` is used OR if the interruption is a `waitFor`
|
|
@@ -343,10 +343,10 @@ class WorkerService {
|
|
|
343
343
|
const collatorFlowId = `${(0, utils_1.guid)()}$C`;
|
|
344
344
|
return {
|
|
345
345
|
status: stream_1.StreamStatus.SUCCESS,
|
|
346
|
-
code: enums_1.
|
|
346
|
+
code: enums_1.HMSH_CODE_MEMFLOW_ALL,
|
|
347
347
|
metadata: { ...data.metadata },
|
|
348
348
|
data: {
|
|
349
|
-
code: enums_1.
|
|
349
|
+
code: enums_1.HMSH_CODE_MEMFLOW_ALL,
|
|
350
350
|
items: [...interruptionRegistry],
|
|
351
351
|
size: interruptionRegistry.length,
|
|
352
352
|
workflowDimension: workflowDimension || '',
|
|
@@ -359,7 +359,7 @@ class WorkerService {
|
|
|
359
359
|
},
|
|
360
360
|
};
|
|
361
361
|
}
|
|
362
|
-
else if (err instanceof errors_1.
|
|
362
|
+
else if (err instanceof errors_1.MemFlowSleepError) {
|
|
363
363
|
//return the sleep interruption
|
|
364
364
|
isProcessing = true;
|
|
365
365
|
return {
|
|
@@ -379,7 +379,7 @@ class WorkerService {
|
|
|
379
379
|
},
|
|
380
380
|
};
|
|
381
381
|
}
|
|
382
|
-
else if (err instanceof errors_1.
|
|
382
|
+
else if (err instanceof errors_1.MemFlowProxyError) {
|
|
383
383
|
//return the proxyActivity interruption
|
|
384
384
|
isProcessing = true;
|
|
385
385
|
return {
|
|
@@ -409,7 +409,7 @@ class WorkerService {
|
|
|
409
409
|
},
|
|
410
410
|
};
|
|
411
411
|
}
|
|
412
|
-
else if (err instanceof errors_1.
|
|
412
|
+
else if (err instanceof errors_1.MemFlowChildError) {
|
|
413
413
|
//return the child interruption
|
|
414
414
|
isProcessing = true;
|
|
415
415
|
const msg = {
|
|
@@ -424,12 +424,12 @@ class WorkerService {
|
|
|
424
424
|
data: {
|
|
425
425
|
arguments: err.arguments,
|
|
426
426
|
await: err.await,
|
|
427
|
-
backoffCoefficient: err.backoffCoefficient || enums_1.
|
|
427
|
+
backoffCoefficient: err.backoffCoefficient || enums_1.HMSH_MEMFLOW_EXP_BACKOFF,
|
|
428
428
|
code: err.code,
|
|
429
429
|
index: err.index,
|
|
430
430
|
message: JSON.stringify(msg),
|
|
431
|
-
maximumAttempts: err.maximumAttempts || enums_1.
|
|
432
|
-
maximumInterval: err.maximumInterval || (0, utils_1.s)(enums_1.
|
|
431
|
+
maximumAttempts: err.maximumAttempts || enums_1.HMSH_MEMFLOW_MAX_ATTEMPTS,
|
|
432
|
+
maximumInterval: err.maximumInterval || (0, utils_1.s)(enums_1.HMSH_MEMFLOW_MAX_INTERVAL),
|
|
433
433
|
originJobId: err.originJobId,
|
|
434
434
|
parentWorkflowId: err.parentWorkflowId,
|
|
435
435
|
expire: err.expire,
|
|
@@ -446,7 +446,7 @@ class WorkerService {
|
|
|
446
446
|
isProcessing = true;
|
|
447
447
|
return {
|
|
448
448
|
status: stream_1.StreamStatus.SUCCESS,
|
|
449
|
-
code: err.code || new errors_1.
|
|
449
|
+
code: err.code || new errors_1.MemFlowRetryError(err.message).code,
|
|
450
450
|
metadata: { ...data.metadata },
|
|
451
451
|
data: {
|
|
452
452
|
$error: {
|
|
@@ -454,7 +454,7 @@ class WorkerService {
|
|
|
454
454
|
type: err.name,
|
|
455
455
|
name: err.name,
|
|
456
456
|
stack: err.stack,
|
|
457
|
-
code: err.code || new errors_1.
|
|
457
|
+
code: err.code || new errors_1.MemFlowRetryError(err.message).code,
|
|
458
458
|
},
|
|
459
459
|
},
|
|
460
460
|
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MemFlowChildError, MemFlowFatalError, MemFlowMaxedError, MemFlowProxyError, MemFlowRetryError, MemFlowSleepError, MemFlowTimeoutError, MemFlowWaitForError } from '../../../modules/errors';
|
|
2
|
+
import { KeyService, KeyType } from '../../../modules/key';
|
|
3
|
+
import { asyncLocalStorage } from '../../../modules/storage';
|
|
4
|
+
import { deterministicRandom, guid, s, sleepImmediate } from '../../../modules/utils';
|
|
5
|
+
import { HotMesh } from '../../hotmesh';
|
|
6
|
+
import { SerializerService } from '../../serializer';
|
|
7
|
+
import { ActivityConfig, ChildResponseType, HookOptions, ProxyResponseType, ProxyType, WorkflowContext, WorkflowOptions } from '../../../types/memflow';
|
|
8
|
+
import { JobInterruptOptions } from '../../../types/job';
|
|
9
|
+
import { StreamCode, StreamStatus } from '../../../types/stream';
|
|
10
|
+
import { StringAnyType, StringScalarType, StringStringType } from '../../../types/serializer';
|
|
11
|
+
import { HMSH_CODE_MEMFLOW_CHILD, HMSH_CODE_MEMFLOW_FATAL, HMSH_CODE_MEMFLOW_MAXED, HMSH_CODE_MEMFLOW_PROXY, HMSH_CODE_MEMFLOW_SLEEP, HMSH_CODE_MEMFLOW_TIMEOUT, HMSH_CODE_MEMFLOW_WAIT, HMSH_MEMFLOW_EXP_BACKOFF, HMSH_MEMFLOW_MAX_ATTEMPTS, HMSH_MEMFLOW_MAX_INTERVAL } from '../../../modules/enums';
|
|
12
|
+
import { MemFlowChildErrorType, MemFlowProxyErrorType } from '../../../types/error';
|
|
13
|
+
import { TelemetryService } from '../../telemetry';
|
|
14
|
+
import { QuorumMessage } from '../../../types';
|
|
15
|
+
import { UserMessage } from '../../../types/quorum';
|
|
16
|
+
import { Search } from '../search';
|
|
17
|
+
import { WorkerService } from '../worker';
|
|
18
|
+
import { Context } from '../context';
|
|
19
|
+
import { ExecHookOptions } from './execHook';
|
|
20
|
+
export { MemFlowChildError, MemFlowFatalError, MemFlowMaxedError, MemFlowProxyError, MemFlowRetryError, MemFlowSleepError, MemFlowTimeoutError, MemFlowWaitForError, KeyService, KeyType, asyncLocalStorage, deterministicRandom, guid, s, sleepImmediate, HotMesh, SerializerService, ActivityConfig, ChildResponseType, HookOptions, ExecHookOptions, ProxyResponseType, ProxyType, WorkflowContext, WorkflowOptions, JobInterruptOptions, StreamCode, StreamStatus, StringAnyType, StringScalarType, StringStringType, HMSH_CODE_MEMFLOW_CHILD, HMSH_CODE_MEMFLOW_FATAL, HMSH_CODE_MEMFLOW_MAXED, HMSH_CODE_MEMFLOW_PROXY, HMSH_CODE_MEMFLOW_SLEEP, HMSH_CODE_MEMFLOW_TIMEOUT, HMSH_CODE_MEMFLOW_WAIT, HMSH_MEMFLOW_EXP_BACKOFF, HMSH_MEMFLOW_MAX_ATTEMPTS, HMSH_MEMFLOW_MAX_INTERVAL, MemFlowChildErrorType, MemFlowProxyErrorType, TelemetryService, QuorumMessage, UserMessage, Search, WorkerService, Context, };
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Context = exports.WorkerService = exports.Search = exports.TelemetryService = exports.HMSH_MEMFLOW_MAX_INTERVAL = exports.HMSH_MEMFLOW_MAX_ATTEMPTS = exports.HMSH_MEMFLOW_EXP_BACKOFF = exports.HMSH_CODE_MEMFLOW_WAIT = exports.HMSH_CODE_MEMFLOW_TIMEOUT = exports.HMSH_CODE_MEMFLOW_SLEEP = exports.HMSH_CODE_MEMFLOW_PROXY = exports.HMSH_CODE_MEMFLOW_MAXED = exports.HMSH_CODE_MEMFLOW_FATAL = exports.HMSH_CODE_MEMFLOW_CHILD = exports.StreamStatus = exports.SerializerService = exports.HotMesh = exports.sleepImmediate = exports.s = exports.guid = exports.deterministicRandom = exports.asyncLocalStorage = exports.KeyType = exports.KeyService = exports.MemFlowWaitForError = exports.MemFlowTimeoutError = exports.MemFlowSleepError = exports.MemFlowRetryError = exports.MemFlowProxyError = exports.MemFlowMaxedError = exports.MemFlowFatalError = exports.MemFlowChildError = void 0;
|
|
4
|
+
const errors_1 = require("../../../modules/errors");
|
|
5
|
+
Object.defineProperty(exports, "MemFlowChildError", { enumerable: true, get: function () { return errors_1.MemFlowChildError; } });
|
|
6
|
+
Object.defineProperty(exports, "MemFlowFatalError", { enumerable: true, get: function () { return errors_1.MemFlowFatalError; } });
|
|
7
|
+
Object.defineProperty(exports, "MemFlowMaxedError", { enumerable: true, get: function () { return errors_1.MemFlowMaxedError; } });
|
|
8
|
+
Object.defineProperty(exports, "MemFlowProxyError", { enumerable: true, get: function () { return errors_1.MemFlowProxyError; } });
|
|
9
|
+
Object.defineProperty(exports, "MemFlowRetryError", { enumerable: true, get: function () { return errors_1.MemFlowRetryError; } });
|
|
10
|
+
Object.defineProperty(exports, "MemFlowSleepError", { enumerable: true, get: function () { return errors_1.MemFlowSleepError; } });
|
|
11
|
+
Object.defineProperty(exports, "MemFlowTimeoutError", { enumerable: true, get: function () { return errors_1.MemFlowTimeoutError; } });
|
|
12
|
+
Object.defineProperty(exports, "MemFlowWaitForError", { enumerable: true, get: function () { return errors_1.MemFlowWaitForError; } });
|
|
13
|
+
const key_1 = require("../../../modules/key");
|
|
14
|
+
Object.defineProperty(exports, "KeyService", { enumerable: true, get: function () { return key_1.KeyService; } });
|
|
15
|
+
Object.defineProperty(exports, "KeyType", { enumerable: true, get: function () { return key_1.KeyType; } });
|
|
16
|
+
const storage_1 = require("../../../modules/storage");
|
|
17
|
+
Object.defineProperty(exports, "asyncLocalStorage", { enumerable: true, get: function () { return storage_1.asyncLocalStorage; } });
|
|
18
|
+
const utils_1 = require("../../../modules/utils");
|
|
19
|
+
Object.defineProperty(exports, "deterministicRandom", { enumerable: true, get: function () { return utils_1.deterministicRandom; } });
|
|
20
|
+
Object.defineProperty(exports, "guid", { enumerable: true, get: function () { return utils_1.guid; } });
|
|
21
|
+
Object.defineProperty(exports, "s", { enumerable: true, get: function () { return utils_1.s; } });
|
|
22
|
+
Object.defineProperty(exports, "sleepImmediate", { enumerable: true, get: function () { return utils_1.sleepImmediate; } });
|
|
23
|
+
const hotmesh_1 = require("../../hotmesh");
|
|
24
|
+
Object.defineProperty(exports, "HotMesh", { enumerable: true, get: function () { return hotmesh_1.HotMesh; } });
|
|
25
|
+
const serializer_1 = require("../../serializer");
|
|
26
|
+
Object.defineProperty(exports, "SerializerService", { enumerable: true, get: function () { return serializer_1.SerializerService; } });
|
|
27
|
+
const stream_1 = require("../../../types/stream");
|
|
28
|
+
Object.defineProperty(exports, "StreamStatus", { enumerable: true, get: function () { return stream_1.StreamStatus; } });
|
|
29
|
+
const enums_1 = require("../../../modules/enums");
|
|
30
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_CHILD", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_CHILD; } });
|
|
31
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_FATAL", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_FATAL; } });
|
|
32
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_MAXED", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_MAXED; } });
|
|
33
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_PROXY", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_PROXY; } });
|
|
34
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_SLEEP", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_SLEEP; } });
|
|
35
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_TIMEOUT", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_TIMEOUT; } });
|
|
36
|
+
Object.defineProperty(exports, "HMSH_CODE_MEMFLOW_WAIT", { enumerable: true, get: function () { return enums_1.HMSH_CODE_MEMFLOW_WAIT; } });
|
|
37
|
+
Object.defineProperty(exports, "HMSH_MEMFLOW_EXP_BACKOFF", { enumerable: true, get: function () { return enums_1.HMSH_MEMFLOW_EXP_BACKOFF; } });
|
|
38
|
+
Object.defineProperty(exports, "HMSH_MEMFLOW_MAX_ATTEMPTS", { enumerable: true, get: function () { return enums_1.HMSH_MEMFLOW_MAX_ATTEMPTS; } });
|
|
39
|
+
Object.defineProperty(exports, "HMSH_MEMFLOW_MAX_INTERVAL", { enumerable: true, get: function () { return enums_1.HMSH_MEMFLOW_MAX_INTERVAL; } });
|
|
40
|
+
const telemetry_1 = require("../../telemetry");
|
|
41
|
+
Object.defineProperty(exports, "TelemetryService", { enumerable: true, get: function () { return telemetry_1.TelemetryService; } });
|
|
42
|
+
const search_1 = require("../search");
|
|
43
|
+
Object.defineProperty(exports, "Search", { enumerable: true, get: function () { return search_1.Search; } });
|
|
44
|
+
const worker_1 = require("../worker");
|
|
45
|
+
Object.defineProperty(exports, "WorkerService", { enumerable: true, get: function () { return worker_1.WorkerService; } });
|
|
46
|
+
const context_1 = require("../context");
|
|
47
|
+
Object.defineProperty(exports, "Context", { enumerable: true, get: function () { return context_1.Context; } });
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Context } from './common';
|
|
2
|
+
/**
|
|
3
|
+
* Returns a context session handle for interacting with the workflow's JSONB context storage.
|
|
4
|
+
* @returns {Promise<Context>} A context session for workflow data.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* const context = await workflow.context();
|
|
9
|
+
* await context.set({ user: { id: 123 } });
|
|
10
|
+
* await context.merge({ user: { name: "John" } });
|
|
11
|
+
* const user = await context.get("user");
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function context(): Promise<Context>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.context = void 0;
|
|
4
|
+
const common_1 = require("./common");
|
|
5
|
+
/**
|
|
6
|
+
* Returns a context session handle for interacting with the workflow's JSONB context storage.
|
|
7
|
+
* @returns {Promise<Context>} A context session for workflow data.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const context = await workflow.context();
|
|
12
|
+
* await context.set({ user: { id: 123 } });
|
|
13
|
+
* await context.merge({ user: { name: "John" } });
|
|
14
|
+
* const user = await context.get("user");
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
async function context() {
|
|
18
|
+
const store = common_1.asyncLocalStorage.getStore();
|
|
19
|
+
const workflowId = store.get('workflowId');
|
|
20
|
+
const workflowDimension = store.get('workflowDimension') ?? '';
|
|
21
|
+
const workflowTopic = store.get('workflowTopic');
|
|
22
|
+
const connection = store.get('connection');
|
|
23
|
+
const namespace = store.get('namespace');
|
|
24
|
+
const COUNTER = store.get('counter');
|
|
25
|
+
const execIndex = COUNTER.counter = COUNTER.counter + 1;
|
|
26
|
+
const hotMeshClient = await common_1.WorkerService.getHotMesh(workflowTopic, {
|
|
27
|
+
connection,
|
|
28
|
+
namespace,
|
|
29
|
+
});
|
|
30
|
+
const contextSessionId = `-context${workflowDimension}-${execIndex}`;
|
|
31
|
+
return new common_1.Context(workflowId, hotMeshClient, contextSessionId);
|
|
32
|
+
}
|
|
33
|
+
exports.context = context;
|
|
@@ -27,10 +27,10 @@ function getChildInterruptPayload(context, options, execIndex) {
|
|
|
27
27
|
return {
|
|
28
28
|
arguments: [...(options.args || [])],
|
|
29
29
|
await: options?.await ?? true,
|
|
30
|
-
backoffCoefficient: options?.config?.backoffCoefficient ?? common_1.
|
|
30
|
+
backoffCoefficient: options?.config?.backoffCoefficient ?? common_1.HMSH_MEMFLOW_EXP_BACKOFF,
|
|
31
31
|
index: execIndex,
|
|
32
|
-
maximumAttempts: options?.config?.maximumAttempts ?? common_1.
|
|
33
|
-
maximumInterval: (0, common_1.s)(options?.config?.maximumInterval ?? common_1.
|
|
32
|
+
maximumAttempts: options?.config?.maximumAttempts ?? common_1.HMSH_MEMFLOW_MAX_ATTEMPTS,
|
|
33
|
+
maximumInterval: (0, common_1.s)(options?.config?.maximumInterval ?? common_1.HMSH_MEMFLOW_MAX_INTERVAL),
|
|
34
34
|
originJobId: originJobId ?? workflowId,
|
|
35
35
|
expire: options.expire ?? expire,
|
|
36
36
|
persistent: options.persistent,
|
|
@@ -59,17 +59,17 @@ async function execChild(options) {
|
|
|
59
59
|
const code = result.$error.code;
|
|
60
60
|
const message = result.$error.message;
|
|
61
61
|
const stack = result.$error.stack;
|
|
62
|
-
if (code === common_1.
|
|
63
|
-
throw new common_1.
|
|
62
|
+
if (code === common_1.HMSH_CODE_MEMFLOW_FATAL) {
|
|
63
|
+
throw new common_1.MemFlowFatalError(message, stack);
|
|
64
64
|
}
|
|
65
|
-
else if (code === common_1.
|
|
66
|
-
throw new common_1.
|
|
65
|
+
else if (code === common_1.HMSH_CODE_MEMFLOW_MAXED) {
|
|
66
|
+
throw new common_1.MemFlowMaxedError(message, stack);
|
|
67
67
|
}
|
|
68
|
-
else if (code === common_1.
|
|
69
|
-
throw new common_1.
|
|
68
|
+
else if (code === common_1.HMSH_CODE_MEMFLOW_TIMEOUT) {
|
|
69
|
+
throw new common_1.MemFlowTimeoutError(message, stack);
|
|
70
70
|
}
|
|
71
71
|
else {
|
|
72
|
-
throw new common_1.
|
|
72
|
+
throw new common_1.MemFlowRetryError(message, stack);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
return result.$error;
|
|
@@ -80,11 +80,11 @@ async function execChild(options) {
|
|
|
80
80
|
}
|
|
81
81
|
const interruptionMessage = getChildInterruptPayload(context, options, execIndex);
|
|
82
82
|
interruptionRegistry.push({
|
|
83
|
-
code: common_1.
|
|
83
|
+
code: common_1.HMSH_CODE_MEMFLOW_CHILD,
|
|
84
84
|
...interruptionMessage,
|
|
85
85
|
});
|
|
86
86
|
await (0, common_1.sleepImmediate)();
|
|
87
|
-
throw new common_1.
|
|
87
|
+
throw new common_1.MemFlowChildError(interruptionMessage);
|
|
88
88
|
}
|
|
89
89
|
exports.execChild = execChild;
|
|
90
90
|
/**
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { HookOptions } from './common';
|
|
2
|
+
/**
|
|
3
|
+
* Extended hook options that include signal configuration
|
|
4
|
+
*/
|
|
5
|
+
export interface ExecHookOptions extends HookOptions {
|
|
6
|
+
/** Signal ID to send after hook execution */
|
|
7
|
+
signalId: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Executes a hook function and awaits the signal response.
|
|
11
|
+
* This is a convenience method that combines `hook()` and `waitFor()` operations.
|
|
12
|
+
*
|
|
13
|
+
* **Signal Injection**: The `signalId` is automatically injected as the LAST argument
|
|
14
|
+
* to the hooked function. The hooked function should check for this signal parameter
|
|
15
|
+
* and emit the signal when processing is complete.
|
|
16
|
+
*
|
|
17
|
+
* This behaves like `execChild` but targets the existing workflow instead of
|
|
18
|
+
* spawning a new workflow.
|
|
19
|
+
*
|
|
20
|
+
* @template T
|
|
21
|
+
* @param {ExecHookOptions} options - Hook configuration with signal ID.
|
|
22
|
+
* @returns {Promise<T>} The signal result from the hooked function.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* // Execute a hook and await its signal response
|
|
27
|
+
* const result = await MemFlow.workflow.execHook({
|
|
28
|
+
* taskQueue: 'processing',
|
|
29
|
+
* workflowName: 'processData',
|
|
30
|
+
* args: ['user123', 'batch-process'],
|
|
31
|
+
* signalId: 'processing-complete'
|
|
32
|
+
* });
|
|
33
|
+
*
|
|
34
|
+
* // The hooked function receives the signal as the last argument:
|
|
35
|
+
* export async function processData(userId: string, processType: string, signalInfo?: { signal: string }) {
|
|
36
|
+
* // ... do processing work ...
|
|
37
|
+
* const result = { userId, processType, status: 'completed' };
|
|
38
|
+
*
|
|
39
|
+
* // Check if called via execHook (signalInfo will be present)
|
|
40
|
+
* if (signalInfo?.signal) {
|
|
41
|
+
* await MemFlow.workflow.signal(signalInfo.signal, result);
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* return result;
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Alternative pattern - check if last arg is signal object
|
|
51
|
+
* export async function myHookFunction(arg1: string, arg2: number, ...rest: any[]) {
|
|
52
|
+
* // ... process arg1 and arg2 ...
|
|
53
|
+
* const result = { processed: true, data: [arg1, arg2] };
|
|
54
|
+
*
|
|
55
|
+
* // Check if last argument is a signal object
|
|
56
|
+
* const lastArg = rest[rest.length - 1];
|
|
57
|
+
* if (lastArg && typeof lastArg === 'object' && lastArg.signal) {
|
|
58
|
+
* await MemFlow.workflow.signal(lastArg.signal, result);
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* return result;
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function execHook<T>(options: ExecHookOptions): Promise<T>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.execHook = void 0;
|
|
4
|
+
const hook_1 = require("./hook");
|
|
5
|
+
const waitFor_1 = require("./waitFor");
|
|
6
|
+
/**
|
|
7
|
+
* Executes a hook function and awaits the signal response.
|
|
8
|
+
* This is a convenience method that combines `hook()` and `waitFor()` operations.
|
|
9
|
+
*
|
|
10
|
+
* **Signal Injection**: The `signalId` is automatically injected as the LAST argument
|
|
11
|
+
* to the hooked function. The hooked function should check for this signal parameter
|
|
12
|
+
* and emit the signal when processing is complete.
|
|
13
|
+
*
|
|
14
|
+
* This behaves like `execChild` but targets the existing workflow instead of
|
|
15
|
+
* spawning a new workflow.
|
|
16
|
+
*
|
|
17
|
+
* @template T
|
|
18
|
+
* @param {ExecHookOptions} options - Hook configuration with signal ID.
|
|
19
|
+
* @returns {Promise<T>} The signal result from the hooked function.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Execute a hook and await its signal response
|
|
24
|
+
* const result = await MemFlow.workflow.execHook({
|
|
25
|
+
* taskQueue: 'processing',
|
|
26
|
+
* workflowName: 'processData',
|
|
27
|
+
* args: ['user123', 'batch-process'],
|
|
28
|
+
* signalId: 'processing-complete'
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // The hooked function receives the signal as the last argument:
|
|
32
|
+
* export async function processData(userId: string, processType: string, signalInfo?: { signal: string }) {
|
|
33
|
+
* // ... do processing work ...
|
|
34
|
+
* const result = { userId, processType, status: 'completed' };
|
|
35
|
+
*
|
|
36
|
+
* // Check if called via execHook (signalInfo will be present)
|
|
37
|
+
* if (signalInfo?.signal) {
|
|
38
|
+
* await MemFlow.workflow.signal(signalInfo.signal, result);
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* return result;
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* // Alternative pattern - check if last arg is signal object
|
|
48
|
+
* export async function myHookFunction(arg1: string, arg2: number, ...rest: any[]) {
|
|
49
|
+
* // ... process arg1 and arg2 ...
|
|
50
|
+
* const result = { processed: true, data: [arg1, arg2] };
|
|
51
|
+
*
|
|
52
|
+
* // Check if last argument is a signal object
|
|
53
|
+
* const lastArg = rest[rest.length - 1];
|
|
54
|
+
* if (lastArg && typeof lastArg === 'object' && lastArg.signal) {
|
|
55
|
+
* await MemFlow.workflow.signal(lastArg.signal, result);
|
|
56
|
+
* }
|
|
57
|
+
*
|
|
58
|
+
* return result;
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
async function execHook(options) {
|
|
63
|
+
// Create hook options with signal field added to args
|
|
64
|
+
const hookOptions = {
|
|
65
|
+
...options,
|
|
66
|
+
args: [...options.args, { signal: options.signalId }]
|
|
67
|
+
};
|
|
68
|
+
// Execute the hook with the signal information
|
|
69
|
+
await (0, hook_1.hook)(hookOptions);
|
|
70
|
+
// Wait for the signal response and return it
|
|
71
|
+
return await (0, waitFor_1.waitFor)(options.signalId);
|
|
72
|
+
}
|
|
73
|
+
exports.execHook = execHook;
|
|
@@ -26,13 +26,29 @@ async function hook(options) {
|
|
|
26
26
|
else {
|
|
27
27
|
targetTopic = workflowTopic;
|
|
28
28
|
}
|
|
29
|
+
// DEFENSIVE CHECK: Prevent infinite loops
|
|
30
|
+
if (targetTopic === workflowTopic && !options.entity && !options.taskQueue) {
|
|
31
|
+
throw new Error(`MemFlow Hook Error: Potential infinite loop detected!\n\n` +
|
|
32
|
+
`The hook would target the same workflow topic ('${workflowTopic}') as the current workflow, ` +
|
|
33
|
+
`creating an infinite loop.\n\n` +
|
|
34
|
+
`To fix this, provide either:\n` +
|
|
35
|
+
`1. 'taskQueue' parameter: MemFlow.workflow.hook({ taskQueue: 'your-queue', workflowName: '${options.workflowName}', args: [...] })\n` +
|
|
36
|
+
`2. 'entity' parameter: MemFlow.workflow.hook({ entity: 'your-entity', args: [...] })\n\n` +
|
|
37
|
+
`Current workflow topic: ${workflowTopic}\n` +
|
|
38
|
+
`Target topic would be: ${targetTopic}\n` +
|
|
39
|
+
`Provided options: ${JSON.stringify({
|
|
40
|
+
workflowName: options.workflowName,
|
|
41
|
+
taskQueue: options.taskQueue,
|
|
42
|
+
entity: options.entity
|
|
43
|
+
}, null, 2)}`);
|
|
44
|
+
}
|
|
29
45
|
const payload = {
|
|
30
46
|
arguments: [...options.args],
|
|
31
47
|
id: targetWorkflowId,
|
|
32
48
|
workflowTopic: targetTopic,
|
|
33
|
-
backoffCoefficient: options.config?.backoffCoefficient || common_1.
|
|
34
|
-
maximumAttempts: options.config?.maximumAttempts || common_1.
|
|
35
|
-
maximumInterval: (0, common_1.s)(options?.config?.maximumInterval ?? common_1.
|
|
49
|
+
backoffCoefficient: options.config?.backoffCoefficient || common_1.HMSH_MEMFLOW_EXP_BACKOFF,
|
|
50
|
+
maximumAttempts: options.config?.maximumAttempts || common_1.HMSH_MEMFLOW_MAX_ATTEMPTS,
|
|
51
|
+
maximumInterval: (0, common_1.s)(options?.config?.maximumInterval ?? common_1.HMSH_MEMFLOW_MAX_INTERVAL),
|
|
36
52
|
};
|
|
37
53
|
return await hotMeshClient.hook(`${namespace}.flow.signal`, payload, common_1.StreamStatus.PENDING, 202);
|
|
38
54
|
}
|
|
@@ -5,6 +5,7 @@ import { trace } from './trace';
|
|
|
5
5
|
import { enrich } from './enrich';
|
|
6
6
|
import { emit } from './emit';
|
|
7
7
|
import { execChild, startChild } from './execChild';
|
|
8
|
+
import { execHook } from './execHook';
|
|
8
9
|
import { proxyActivities } from './proxyActivities';
|
|
9
10
|
import { search } from './searchMethods';
|
|
10
11
|
import { random } from './random';
|
|
@@ -15,6 +16,7 @@ import { all } from './all';
|
|
|
15
16
|
import { sleepFor } from './sleepFor';
|
|
16
17
|
import { waitFor } from './waitFor';
|
|
17
18
|
import { HotMesh } from './common';
|
|
19
|
+
import { context } from './contextMethods';
|
|
18
20
|
/**
|
|
19
21
|
* The WorkflowService class provides a set of static methods to be used within a workflow function.
|
|
20
22
|
* These methods ensure deterministic replay, persistence of state, and error handling across
|
|
@@ -26,12 +28,12 @@ import { HotMesh } from './common';
|
|
|
26
28
|
*
|
|
27
29
|
* @example
|
|
28
30
|
* ```typescript
|
|
29
|
-
* import {
|
|
31
|
+
* import { MemFlow } from '@hotmeshio/hotmesh';
|
|
30
32
|
*
|
|
31
33
|
* export async function waitForExample(): Promise<[boolean, number]> {
|
|
32
34
|
* const [s1, s2] = await Promise.all([
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
+
* MemFlow.workflow.waitFor<boolean>('my-sig-nal-1'),
|
|
36
|
+
* MemFlow.workflow.waitFor<number>('my-sig-nal-2')
|
|
35
37
|
* ]);
|
|
36
38
|
* return [s1, s2];
|
|
37
39
|
* }
|
|
@@ -53,8 +55,10 @@ export declare class WorkflowService {
|
|
|
53
55
|
static execChild: typeof execChild;
|
|
54
56
|
static executeChild: typeof execChild;
|
|
55
57
|
static startChild: typeof startChild;
|
|
58
|
+
static execHook: typeof execHook;
|
|
56
59
|
static proxyActivities: typeof proxyActivities;
|
|
57
60
|
static search: typeof search;
|
|
61
|
+
static context: typeof context;
|
|
58
62
|
static random: typeof random;
|
|
59
63
|
static signal: typeof signal;
|
|
60
64
|
static hook: typeof hook;
|
|
@@ -8,6 +8,7 @@ const trace_1 = require("./trace");
|
|
|
8
8
|
const enrich_1 = require("./enrich");
|
|
9
9
|
const emit_1 = require("./emit");
|
|
10
10
|
const execChild_1 = require("./execChild");
|
|
11
|
+
const execHook_1 = require("./execHook");
|
|
11
12
|
const proxyActivities_1 = require("./proxyActivities");
|
|
12
13
|
const searchMethods_1 = require("./searchMethods");
|
|
13
14
|
const random_1 = require("./random");
|
|
@@ -18,6 +19,7 @@ const all_1 = require("./all");
|
|
|
18
19
|
const sleepFor_1 = require("./sleepFor");
|
|
19
20
|
const waitFor_1 = require("./waitFor");
|
|
20
21
|
const common_1 = require("./common");
|
|
22
|
+
const contextMethods_1 = require("./contextMethods");
|
|
21
23
|
/**
|
|
22
24
|
* The WorkflowService class provides a set of static methods to be used within a workflow function.
|
|
23
25
|
* These methods ensure deterministic replay, persistence of state, and error handling across
|
|
@@ -29,12 +31,12 @@ const common_1 = require("./common");
|
|
|
29
31
|
*
|
|
30
32
|
* @example
|
|
31
33
|
* ```typescript
|
|
32
|
-
* import {
|
|
34
|
+
* import { MemFlow } from '@hotmeshio/hotmesh';
|
|
33
35
|
*
|
|
34
36
|
* export async function waitForExample(): Promise<[boolean, number]> {
|
|
35
37
|
* const [s1, s2] = await Promise.all([
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
+
* MemFlow.workflow.waitFor<boolean>('my-sig-nal-1'),
|
|
39
|
+
* MemFlow.workflow.waitFor<number>('my-sig-nal-2')
|
|
38
40
|
* ]);
|
|
39
41
|
* return [s1, s2];
|
|
40
42
|
* }
|
|
@@ -71,8 +73,10 @@ WorkflowService.emit = emit_1.emit;
|
|
|
71
73
|
WorkflowService.execChild = execChild_1.execChild;
|
|
72
74
|
WorkflowService.executeChild = execChild_1.executeChild;
|
|
73
75
|
WorkflowService.startChild = execChild_1.startChild;
|
|
76
|
+
WorkflowService.execHook = execHook_1.execHook;
|
|
74
77
|
WorkflowService.proxyActivities = proxyActivities_1.proxyActivities;
|
|
75
78
|
WorkflowService.search = searchMethods_1.search;
|
|
79
|
+
WorkflowService.context = contextMethods_1.context;
|
|
76
80
|
WorkflowService.random = random_1.random;
|
|
77
81
|
WorkflowService.signal = signal_1.signal;
|
|
78
82
|
WorkflowService.hook = hook_1.hook;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { ActivityConfig, ProxyType,
|
|
1
|
+
import { ActivityConfig, ProxyType, MemFlowProxyErrorType } from './common';
|
|
2
2
|
import { getContext } from './context';
|
|
3
3
|
/**
|
|
4
4
|
* Constructs payload for spawning a proxyActivity job.
|
|
5
5
|
* @private
|
|
6
6
|
*/
|
|
7
|
-
declare function getProxyInterruptPayload(context: ReturnType<typeof getContext>, activityName: string, execIndex: number, args: any[], options?: ActivityConfig):
|
|
7
|
+
declare function getProxyInterruptPayload(context: ReturnType<typeof getContext>, activityName: string, execIndex: number, args: any[], options?: ActivityConfig): MemFlowProxyErrorType;
|
|
8
8
|
/**
|
|
9
9
|
* Wraps a single activity in a proxy, orchestrating its execution and replay.
|
|
10
10
|
* @private
|