@hotmeshio/hotmesh 0.3.28 → 0.3.29

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 (115) hide show
  1. package/build/modules/key.js +1 -1
  2. package/build/modules/utils.js +1 -1
  3. package/build/package.json +1 -1
  4. package/build/services/activities/activity.js +1 -1
  5. package/build/services/activities/await.js +1 -1
  6. package/build/services/activities/cycle.js +1 -1
  7. package/build/services/activities/hook.js +1 -1
  8. package/build/services/activities/index.js +1 -1
  9. package/build/services/activities/interrupt.js +1 -1
  10. package/build/services/activities/signal.js +1 -1
  11. package/build/services/activities/trigger.js +1 -1
  12. package/build/services/activities/worker.js +1 -1
  13. package/build/services/collator/index.js +1 -1
  14. package/build/services/compiler/deployer.js +1 -1
  15. package/build/services/compiler/index.js +1 -1
  16. package/build/services/compiler/validator.js +1 -1
  17. package/build/services/engine/index.js +1 -1
  18. package/build/services/exporter/index.js +1 -1
  19. package/build/services/hotmesh/index.js +3 -0
  20. package/build/services/mapper/index.js +1 -1
  21. package/build/services/meshdata/index.d.ts +10 -10
  22. package/build/services/meshflow/client.js +1 -0
  23. package/build/services/meshflow/exporter.js +1 -1
  24. package/build/services/meshflow/workflow/all.d.ts +1 -0
  25. package/build/services/meshflow/workflow/all.js +8 -0
  26. package/build/services/meshflow/workflow/common.d.ts +18 -0
  27. package/build/services/meshflow/workflow/common.js +45 -0
  28. package/build/services/meshflow/workflow/context.d.ts +2 -0
  29. package/build/services/meshflow/workflow/context.js +41 -0
  30. package/build/services/meshflow/workflow/didRun.d.ts +1 -0
  31. package/build/services/meshflow/workflow/didRun.js +16 -0
  32. package/build/services/meshflow/workflow/emit.d.ts +4 -0
  33. package/build/services/meshflow/workflow/emit.js +22 -0
  34. package/build/services/meshflow/workflow/enrich.d.ts +2 -0
  35. package/build/services/meshflow/workflow/enrich.js +10 -0
  36. package/build/services/meshflow/workflow/execChild.d.ts +4 -0
  37. package/build/services/meshflow/workflow/execChild.js +84 -0
  38. package/build/services/meshflow/workflow/hook.d.ts +2 -0
  39. package/build/services/meshflow/workflow/hook.js +33 -0
  40. package/build/services/meshflow/workflow/index.d.ts +39 -0
  41. package/build/services/meshflow/workflow/index.js +52 -0
  42. package/build/services/meshflow/workflow/interrupt.d.ts +2 -0
  43. package/build/services/meshflow/workflow/interrupt.js +17 -0
  44. package/build/services/meshflow/workflow/isSideEffectAllowed.d.ts +2 -0
  45. package/build/services/meshflow/workflow/isSideEffectAllowed.js +25 -0
  46. package/build/services/meshflow/workflow/proxyActivities.d.ts +6 -0
  47. package/build/services/meshflow/workflow/proxyActivities.js +82 -0
  48. package/build/services/meshflow/workflow/random.d.ts +1 -0
  49. package/build/services/meshflow/workflow/random.js +11 -0
  50. package/build/services/meshflow/workflow/searchMethods.d.ts +2 -0
  51. package/build/services/meshflow/workflow/searchMethods.js +21 -0
  52. package/build/services/meshflow/workflow/signal.d.ts +1 -0
  53. package/build/services/meshflow/workflow/signal.js +22 -0
  54. package/build/services/meshflow/workflow/sleepFor.d.ts +1 -0
  55. package/build/services/meshflow/workflow/sleepFor.js +28 -0
  56. package/build/services/meshflow/workflow/trace.d.ts +4 -0
  57. package/build/services/meshflow/workflow/trace.js +23 -0
  58. package/build/services/meshflow/workflow/waitFor.d.ts +1 -0
  59. package/build/services/meshflow/workflow/waitFor.js +28 -0
  60. package/build/services/meshos/index.d.ts +8 -5
  61. package/build/services/meshos/index.js +31 -10
  62. package/build/services/pipe/functions/array.js +1 -1
  63. package/build/services/pipe/functions/bitwise.js +1 -1
  64. package/build/services/pipe/functions/conditional.js +1 -1
  65. package/build/services/pipe/functions/cron.js +1 -1
  66. package/build/services/pipe/functions/date.js +1 -1
  67. package/build/services/pipe/functions/index.js +1 -1
  68. package/build/services/pipe/functions/json.js +1 -1
  69. package/build/services/pipe/functions/logical.js +1 -1
  70. package/build/services/pipe/functions/math.js +1 -1
  71. package/build/services/pipe/functions/number.js +1 -1
  72. package/build/services/pipe/functions/object.js +1 -1
  73. package/build/services/pipe/functions/string.js +1 -1
  74. package/build/services/pipe/functions/symbol.js +1 -1
  75. package/build/services/pipe/functions/unary.js +1 -1
  76. package/build/services/pipe/index.js +1 -1
  77. package/build/services/quorum/index.js +1 -1
  78. package/build/services/reporter/index.js +1 -1
  79. package/build/services/router/index.js +1 -1
  80. package/build/services/search/providers/postgres/postgres.js +1 -1
  81. package/build/services/search/providers/redis/ioredis.js +1 -1
  82. package/build/services/search/providers/redis/redis.js +1 -1
  83. package/build/services/serializer/index.js +1 -1
  84. package/build/services/store/providers/postgres/kvsql.js +1 -1
  85. package/build/services/store/providers/postgres/kvtables.js +1 -1
  86. package/build/services/store/providers/postgres/kvtransaction.js +1 -1
  87. package/build/services/store/providers/postgres/kvtypes/hash.js +1 -1
  88. package/build/services/store/providers/postgres/kvtypes/list.js +1 -1
  89. package/build/services/store/providers/postgres/kvtypes/string.js +1 -1
  90. package/build/services/store/providers/postgres/kvtypes/zset.js +1 -1
  91. package/build/services/store/providers/postgres/postgres.js +1 -1
  92. package/build/services/store/providers/redis/_base.js +1 -1
  93. package/build/services/store/providers/redis/ioredis.js +1 -1
  94. package/build/services/store/providers/redis/redis.js +1 -1
  95. package/build/services/store/providers/store-initializable.js +1 -1
  96. package/build/services/stream/providers/nats/nats.js +1 -1
  97. package/build/services/stream/providers/postgres/kvtables.js +1 -1
  98. package/build/services/stream/providers/postgres/postgres.js +1 -1
  99. package/build/services/stream/providers/redis/ioredis.js +1 -1
  100. package/build/services/stream/providers/redis/redis.js +1 -1
  101. package/build/services/stream/providers/stream-initializable.js +1 -1
  102. package/build/services/sub/providers/nats/nats.js +1 -1
  103. package/build/services/sub/providers/postgres/postgres.js +1 -1
  104. package/build/services/sub/providers/redis/ioredis.js +1 -1
  105. package/build/services/sub/providers/redis/redis.js +1 -1
  106. package/build/services/task/index.js +1 -1
  107. package/build/services/telemetry/index.js +1 -1
  108. package/build/services/worker/index.js +1 -1
  109. package/build/types/manifest.d.ts +2 -0
  110. package/build/types/provider.d.ts +2 -0
  111. package/package.json +1 -1
  112. package/types/manifest.ts +12 -2
  113. package/types/provider.ts +14 -0
  114. package/build/services/meshflow/workflow.d.ts +0 -35
  115. package/build/services/meshflow/workflow.js +0 -403
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hotmeshio/hotmesh",
3
- "version": "0.3.28",
3
+ "version": "0.3.29",
4
4
  "description": "Serverless Workflow",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
package/types/manifest.ts CHANGED
@@ -24,16 +24,26 @@ export type EntityInstanceTypes = MeshOS;
24
24
 
25
25
  export type SubclassType<T extends MeshOS = MeshOS> = new (...args: any[]) => T;
26
26
  export type Entity = {
27
- name: string;
27
+ name: string; //can be set via static config
28
28
  label: string;
29
- schema: WorkflowSearchSchema;
29
+ /**
30
+ * A more-specific value for workers when targeting version-specifc
31
+ * or priority-specific task queues.
32
+ * @default default
33
+ */
34
+ taskQueue?: string; //can be set via static config
35
+ schema: WorkflowSearchSchema; //can be st via static config
30
36
  class: SubclassType;
31
37
  };
32
38
 
33
39
  export type Namespace = {
34
40
  name: string;
41
+ /**
42
+ * @deprecated; unused; name is the type; label is human-readable
43
+ */
35
44
  type: string;
36
45
  label: string;
46
+ module: 'hotmesh' | 'meshcall' | 'meshflow' | 'meshdata' | 'meshos';
37
47
  entities: Entity[];
38
48
  };
39
49
 
package/types/provider.ts CHANGED
@@ -69,6 +69,13 @@ export type ProviderConfig = {
69
69
  options: StringAnyType;
70
70
  /* 'redis' (Class) | 'ioredis' (Class) | 'postgres' (Client module) | 'postgres.pool' | 'postgres.poolclient', 'nats' */
71
71
  provider?: string;
72
+ /**
73
+ * If provided and if true, the engine router instance will
74
+ * be initialized as a readonly instance and will not consume
75
+ * messages from the stream channel. An engine in readonly mode
76
+ * can still read/write to the store and can still pub/sub events.
77
+ */
78
+ readonly?: boolean;
72
79
  };
73
80
 
74
81
  export type ProvidersConfig = {
@@ -77,6 +84,13 @@ export type ProvidersConfig = {
77
84
  stream: ProviderConfig;
78
85
  pub?: ProviderConfig;
79
86
  search?: ProviderConfig;
87
+ /**
88
+ * If provided and if true, the engine router instance will
89
+ * be initialized as a readonly instance and will not consume
90
+ * messages from the stream channel. An engine in readonly mode
91
+ * can still read/write to the store and can still pub/sub events.
92
+ */
93
+ readonly?: boolean;
80
94
  };
81
95
 
82
96
  export interface SetOptions {
@@ -1,35 +0,0 @@
1
- import { HotMesh } from '../hotmesh';
2
- import { ActivityConfig, HookOptions, ProxyType, WorkflowContext, WorkflowOptions } from '../../types/meshflow';
3
- import { JobInterruptOptions } from '../../types/job';
4
- import { StringAnyType, StringScalarType, StringStringType } from '../../types/serializer';
5
- import { MeshFlowChildErrorType, MeshFlowProxyErrorType } from '../../types/error';
6
- import { Search } from './search';
7
- export declare class WorkflowService {
8
- constructor();
9
- static didRun(prefix: string): Promise<[boolean, number, any]>;
10
- static isSideEffectAllowed(hotMeshClient: HotMesh, prefix: string): Promise<boolean>;
11
- static trace(attributes: StringScalarType, config?: {
12
- once: boolean;
13
- }): Promise<boolean>;
14
- static enrich(fields: StringStringType): Promise<boolean>;
15
- static emit(events: StringAnyType, config?: {
16
- once: boolean;
17
- }): Promise<boolean>;
18
- static getContext(): WorkflowContext;
19
- static getHotMesh(): Promise<HotMesh>;
20
- static execChild<T>(options: WorkflowOptions): Promise<T>;
21
- static executeChild: typeof WorkflowService.execChild;
22
- static getChildInterruptPayload(context: WorkflowContext, options: WorkflowOptions, execIndex: number): MeshFlowChildErrorType;
23
- static startChild(options: WorkflowOptions): Promise<string>;
24
- static proxyActivities<ACT>(options?: ActivityConfig): ProxyType<ACT>;
25
- static wrapActivity<T>(activityName: string, options?: ActivityConfig): T;
26
- static getProxyInterruptPayload(context: WorkflowContext, activityName: string, execIndex: number, args: any[], options?: ActivityConfig): MeshFlowProxyErrorType;
27
- static search(): Promise<Search>;
28
- static random(): number;
29
- static signal(signalId: string, data: Record<any, any>): Promise<string>;
30
- static hook(options: HookOptions): Promise<string>;
31
- static interrupt(jobId: string, options?: JobInterruptOptions): Promise<string | void>;
32
- static all<T>(...promises: Promise<T>[]): Promise<T[]>;
33
- static sleepFor(duration: string): Promise<number>;
34
- static waitFor<T>(signalId: string): Promise<T>;
35
- }
@@ -1,403 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WorkflowService = void 0;
4
- const errors_1 = require("../../modules/errors");
5
- const key_1 = require("../../modules/key");
6
- const storage_1 = require("../../modules/storage");
7
- const utils_1 = require("../../modules/utils");
8
- const serializer_1 = require("../serializer");
9
- const stream_1 = require("../../types/stream");
10
- const enums_1 = require("../../modules/enums");
11
- const telemetry_1 = require("../telemetry");
12
- const search_1 = require("./search");
13
- const worker_1 = require("./worker");
14
- class WorkflowService {
15
- constructor() { }
16
- static async didRun(prefix) {
17
- const { COUNTER, replay, workflowDimension } = WorkflowService.getContext();
18
- const execIndex = COUNTER.counter = COUNTER.counter + 1;
19
- const sessionId = `-${prefix}${workflowDimension}-${execIndex}-`;
20
- if (sessionId in replay) {
21
- const restored = serializer_1.SerializerService.fromString(replay[sessionId]);
22
- return [true, execIndex, restored];
23
- }
24
- return [false, execIndex, null];
25
- }
26
- static async isSideEffectAllowed(hotMeshClient, prefix) {
27
- const store = storage_1.asyncLocalStorage.getStore();
28
- const workflowId = store.get('workflowId');
29
- const workflowDimension = store.get('workflowDimension') ?? '';
30
- const COUNTER = store.get('counter');
31
- const execIndex = COUNTER.counter = COUNTER.counter + 1;
32
- const sessionId = `-${prefix}${workflowDimension}-${execIndex}-`;
33
- const replay = store.get('replay');
34
- if (sessionId in replay) {
35
- return false;
36
- }
37
- const keyParams = {
38
- appId: hotMeshClient.appId,
39
- jobId: workflowId,
40
- };
41
- const workflowGuid = key_1.KeyService.mintKey(hotMeshClient.namespace, key_1.KeyType.JOB_STATE, keyParams);
42
- const searchClient = hotMeshClient.engine.search;
43
- const guidValue = await searchClient.incrementFieldByFloat(workflowGuid, sessionId, 1);
44
- return guidValue === 1;
45
- }
46
- static async trace(attributes, config = { once: true }) {
47
- const store = storage_1.asyncLocalStorage.getStore();
48
- const workflowTopic = store.get('workflowTopic');
49
- const connection = store.get('connection');
50
- const namespace = store.get('namespace');
51
- const hotMeshClient = await worker_1.WorkerService.getHotMesh(workflowTopic, {
52
- connection,
53
- namespace,
54
- });
55
- const { raw, COUNTER } = this.getContext();
56
- const { trc: traceId, spn: spanId, aid: activityId } = raw.metadata;
57
- if (!config.once ||
58
- await WorkflowService.isSideEffectAllowed(hotMeshClient, 'trace')) {
59
- return await telemetry_1.TelemetryService.traceActivity(namespace, attributes, activityId, traceId, spanId, COUNTER.counter);
60
- }
61
- return true;
62
- }
63
- static async enrich(fields) {
64
- const search = await WorkflowService.search();
65
- await search.set(fields);
66
- return true;
67
- }
68
- static async emit(events, config = { once: true }) {
69
- const store = storage_1.asyncLocalStorage.getStore();
70
- const workflowTopic = store.get('workflowTopic');
71
- const connection = store.get('connection');
72
- const namespace = store.get('namespace');
73
- const hotMeshClient = await worker_1.WorkerService.getHotMesh(workflowTopic, {
74
- connection,
75
- namespace,
76
- });
77
- if (!config.once ||
78
- await WorkflowService.isSideEffectAllowed(hotMeshClient, 'emit')) {
79
- for (const [topic, message] of Object.entries(events)) {
80
- await hotMeshClient.quorum.pub({ topic, message });
81
- }
82
- }
83
- return true;
84
- }
85
- static getContext() {
86
- const store = storage_1.asyncLocalStorage.getStore();
87
- const workflowId = store.get('workflowId');
88
- const replay = store.get('replay');
89
- const cursor = store.get('cursor');
90
- const interruptionRegistry = store.get('interruptionRegistry');
91
- const workflowDimension = store.get('workflowDimension') ?? '';
92
- const workflowTopic = store.get('workflowTopic');
93
- const connection = store.get('connection');
94
- const namespace = store.get('namespace');
95
- const originJobId = store.get('originJobId');
96
- const workflowTrace = store.get('workflowTrace');
97
- const canRetry = store.get('canRetry');
98
- const workflowSpan = store.get('workflowSpan');
99
- const expire = store.get('expire');
100
- const COUNTER = store.get('counter');
101
- const raw = store.get('raw');
102
- return {
103
- canRetry,
104
- COUNTER,
105
- counter: COUNTER.counter,
106
- cursor,
107
- interruptionRegistry,
108
- connection,
109
- expire,
110
- namespace,
111
- originJobId,
112
- raw,
113
- replay,
114
- workflowId,
115
- workflowDimension,
116
- workflowTopic,
117
- workflowTrace,
118
- workflowSpan,
119
- };
120
- }
121
- static async getHotMesh() {
122
- const store = storage_1.asyncLocalStorage.getStore();
123
- const workflowTopic = store.get('workflowTopic');
124
- const connection = store.get('connection');
125
- const namespace = store.get('namespace');
126
- return await worker_1.WorkerService.getHotMesh(workflowTopic, {
127
- connection,
128
- namespace,
129
- });
130
- }
131
- static async execChild(options) {
132
- const isStartChild = options.await === false;
133
- const prefix = isStartChild ? 'start' : 'child';
134
- const [didRun, execIndex, result] = await WorkflowService.didRun(prefix);
135
- const context = WorkflowService.getContext();
136
- const { canRetry, interruptionRegistry } = context;
137
- if (didRun) {
138
- if (result?.$error &&
139
- (!result.$error.is_stream_error ||
140
- result.$error.is_stream_error && !canRetry)) {
141
- if (options?.config?.throwOnError !== false) {
142
- const code = result.$error.code;
143
- const message = result.$error.message;
144
- const stack = result.$error.stack;
145
- if (code === enums_1.HMSH_CODE_MESHFLOW_FATAL) {
146
- throw new errors_1.MeshFlowFatalError(message, stack);
147
- }
148
- else if (code == enums_1.HMSH_CODE_MESHFLOW_MAXED) {
149
- throw new errors_1.MeshFlowMaxedError(message, stack);
150
- }
151
- else if (code == enums_1.HMSH_CODE_MESHFLOW_TIMEOUT) {
152
- throw new errors_1.MeshFlowTimeoutError(message, stack);
153
- }
154
- else {
155
- throw new errors_1.MeshFlowRetryError(message, stack);
156
- }
157
- }
158
- return result.$error;
159
- }
160
- else if (!result?.$error) {
161
- return result.data;
162
- }
163
- }
164
- const interruptionMessage = WorkflowService.getChildInterruptPayload(context, options, execIndex);
165
- interruptionRegistry.push({
166
- code: enums_1.HMSH_CODE_MESHFLOW_CHILD,
167
- ...interruptionMessage,
168
- });
169
- await (0, utils_1.sleepImmediate)();
170
- throw new errors_1.MeshFlowChildError(interruptionMessage);
171
- }
172
- static getChildInterruptPayload(context, options, execIndex) {
173
- const { workflowId, originJobId, workflowDimension, expire } = context;
174
- let childJobId;
175
- if (options.workflowId) {
176
- childJobId = options.workflowId;
177
- }
178
- else if (options.entity) {
179
- childJobId = `${options.entity}-${(0, utils_1.guid)()}-${workflowDimension}-${execIndex}`;
180
- }
181
- else {
182
- childJobId = `-${options.workflowName}-${(0, utils_1.guid)()}-${workflowDimension}-${execIndex}`;
183
- }
184
- const parentWorkflowId = workflowId;
185
- const taskQueueName = options.taskQueue ?? options.entity;
186
- const workflowName = options.entity ?? options.workflowName;
187
- const workflowTopic = `${taskQueueName}-${workflowName}`;
188
- return {
189
- arguments: [...(options.args || [])],
190
- await: options?.await ?? true,
191
- backoffCoefficient: options?.config?.backoffCoefficient ?? enums_1.HMSH_MESHFLOW_EXP_BACKOFF,
192
- index: execIndex,
193
- maximumAttempts: options?.config?.maximumAttempts ?? enums_1.HMSH_MESHFLOW_MAX_ATTEMPTS,
194
- maximumInterval: (0, utils_1.s)(options?.config?.maximumInterval ?? enums_1.HMSH_MESHFLOW_MAX_INTERVAL),
195
- originJobId: originJobId ?? workflowId,
196
- expire: options.expire ?? expire,
197
- persistent: options.persistent,
198
- signalIn: options.signalIn,
199
- parentWorkflowId,
200
- workflowDimension: workflowDimension,
201
- workflowId: childJobId,
202
- workflowTopic,
203
- };
204
- }
205
- static async startChild(options) {
206
- return WorkflowService.execChild({ ...options, await: false });
207
- }
208
- static proxyActivities(options) {
209
- if (options.activities) {
210
- worker_1.WorkerService.registerActivities(options.activities);
211
- }
212
- const proxy = {};
213
- const keys = Object.keys(worker_1.WorkerService.activityRegistry);
214
- if (keys.length) {
215
- keys.forEach((key) => {
216
- const activityFunction = worker_1.WorkerService.activityRegistry[key];
217
- proxy[key] = WorkflowService.wrapActivity(key, options);
218
- });
219
- }
220
- return proxy;
221
- }
222
- static wrapActivity(activityName, options) {
223
- return async function () {
224
- const [didRun, execIndex, result] = await WorkflowService.didRun('proxy');
225
- if (didRun) {
226
- if (result?.$error) {
227
- if (options?.retryPolicy?.throwOnError !== false) {
228
- const code = result.$error.code;
229
- const message = result.$error.message;
230
- const stack = result.$error.stack;
231
- if (code === enums_1.HMSH_CODE_MESHFLOW_FATAL) {
232
- throw new errors_1.MeshFlowFatalError(message, stack);
233
- }
234
- else if (code == enums_1.HMSH_CODE_MESHFLOW_MAXED) {
235
- throw new errors_1.MeshFlowMaxedError(message, stack);
236
- }
237
- else if (code == enums_1.HMSH_CODE_MESHFLOW_TIMEOUT) {
238
- throw new errors_1.MeshFlowTimeoutError(message, stack);
239
- }
240
- }
241
- return result.$error;
242
- }
243
- return result.data;
244
- }
245
- const context = WorkflowService.getContext();
246
- const { interruptionRegistry } = context;
247
- const interruptionMessage = WorkflowService.getProxyInterruptPayload(context, activityName, execIndex, Array.from(arguments), options);
248
- interruptionRegistry.push({
249
- code: enums_1.HMSH_CODE_MESHFLOW_PROXY,
250
- ...interruptionMessage,
251
- });
252
- await (0, utils_1.sleepImmediate)();
253
- throw new errors_1.MeshFlowProxyError(interruptionMessage);
254
- };
255
- }
256
- static getProxyInterruptPayload(context, activityName, execIndex, args, options) {
257
- const { workflowDimension, workflowId, originJobId, workflowTopic, expire, } = context;
258
- const activityTopic = `${workflowTopic}-activity`;
259
- const activityJobId = `-${workflowId}-$${activityName}${workflowDimension}-${execIndex}`;
260
- let maximumInterval;
261
- if (options.retryPolicy?.maximumInterval) {
262
- maximumInterval = (0, utils_1.s)(options.retryPolicy.maximumInterval);
263
- }
264
- return {
265
- arguments: args,
266
- workflowDimension: workflowDimension,
267
- index: execIndex,
268
- originJobId: originJobId || workflowId,
269
- parentWorkflowId: workflowId,
270
- workflowId: activityJobId,
271
- workflowTopic: activityTopic,
272
- activityName,
273
- expire: options.expire ?? expire,
274
- backoffCoefficient: options?.retryPolicy?.backoffCoefficient ?? undefined,
275
- maximumAttempts: options?.retryPolicy?.maximumAttempts ?? undefined,
276
- maximumInterval: maximumInterval ?? undefined,
277
- };
278
- }
279
- static async search() {
280
- const store = storage_1.asyncLocalStorage.getStore();
281
- const workflowId = store.get('workflowId');
282
- const workflowDimension = store.get('workflowDimension') ?? '';
283
- const workflowTopic = store.get('workflowTopic');
284
- const connection = store.get('connection');
285
- const namespace = store.get('namespace');
286
- const COUNTER = store.get('counter');
287
- const execIndex = COUNTER.counter = COUNTER.counter + 1;
288
- const hotMeshClient = await worker_1.WorkerService.getHotMesh(workflowTopic, {
289
- connection,
290
- namespace,
291
- });
292
- const searchSessionId = `-search${workflowDimension}-${execIndex}`;
293
- return new search_1.Search(workflowId, hotMeshClient, searchSessionId);
294
- }
295
- static random() {
296
- const store = storage_1.asyncLocalStorage.getStore();
297
- const COUNTER = store.get('counter');
298
- const seed = COUNTER.counter = COUNTER.counter + 1;
299
- return (0, utils_1.deterministicRandom)(seed);
300
- }
301
- static async signal(signalId, data) {
302
- const store = storage_1.asyncLocalStorage.getStore();
303
- const workflowTopic = store.get('workflowTopic');
304
- const connection = store.get('connection');
305
- const namespace = store.get('namespace');
306
- const hotMeshClient = await worker_1.WorkerService.getHotMesh(workflowTopic, {
307
- connection,
308
- namespace,
309
- });
310
- if (await WorkflowService.isSideEffectAllowed(hotMeshClient, 'signal')) {
311
- return await hotMeshClient.hook(`${namespace}.wfs.signal`, {
312
- id: signalId,
313
- data,
314
- });
315
- }
316
- }
317
- static async hook(options) {
318
- const { workflowId, connection, namespace, workflowTopic } = WorkflowService.getContext();
319
- const hotMeshClient = await worker_1.WorkerService.getHotMesh(workflowTopic, {
320
- connection,
321
- namespace,
322
- });
323
- if (await WorkflowService.isSideEffectAllowed(hotMeshClient, 'hook')) {
324
- const targetWorkflowId = options.workflowId ?? workflowId;
325
- let targetTopic;
326
- if (options.entity || (options.taskQueue && options.workflowName)) {
327
- targetTopic = `${options.taskQueue ?? options.entity}-${options.entity ?? options.workflowName}`;
328
- }
329
- else {
330
- targetTopic = workflowTopic;
331
- }
332
- const payload = {
333
- arguments: [...options.args],
334
- id: targetWorkflowId,
335
- workflowTopic: targetTopic,
336
- backoffCoefficient: options.config?.backoffCoefficient || enums_1.HMSH_MESHFLOW_EXP_BACKOFF,
337
- maximumAttempts: options.config?.maximumAttempts || enums_1.HMSH_MESHFLOW_MAX_ATTEMPTS,
338
- maximumInterval: (0, utils_1.s)(options?.config?.maximumInterval ?? enums_1.HMSH_MESHFLOW_MAX_INTERVAL),
339
- };
340
- return await hotMeshClient.hook(`${namespace}.flow.signal`, payload, stream_1.StreamStatus.PENDING, 202);
341
- }
342
- }
343
- static async interrupt(jobId, options = {}) {
344
- const { workflowTopic, connection, namespace } = WorkflowService.getContext();
345
- const hotMeshClient = await worker_1.WorkerService.getHotMesh(workflowTopic, {
346
- connection,
347
- namespace,
348
- });
349
- if (await WorkflowService.isSideEffectAllowed(hotMeshClient, 'interrupt')) {
350
- return await hotMeshClient.interrupt(`${hotMeshClient.appId}.execute`, jobId, options);
351
- }
352
- }
353
- static async all(...promises) {
354
- await new Promise((resolve) => setTimeout(resolve, 1));
355
- return await Promise.all(promises);
356
- }
357
- static async sleepFor(duration) {
358
- const [didRun, execIndex, result] = await WorkflowService.didRun('sleep');
359
- if (didRun) {
360
- return result.duration;
361
- }
362
- const store = storage_1.asyncLocalStorage.getStore();
363
- const interruptionRegistry = store.get('interruptionRegistry');
364
- const workflowId = store.get('workflowId');
365
- const workflowDimension = store.get('workflowDimension') ?? '';
366
- const interruptionMessage = {
367
- workflowId,
368
- duration: (0, utils_1.s)(duration),
369
- index: execIndex,
370
- workflowDimension,
371
- };
372
- interruptionRegistry.push({
373
- code: enums_1.HMSH_CODE_MESHFLOW_SLEEP,
374
- ...interruptionMessage,
375
- });
376
- await (0, utils_1.sleepImmediate)();
377
- throw new errors_1.MeshFlowSleepError(interruptionMessage);
378
- }
379
- static async waitFor(signalId) {
380
- const [didRun, execIndex, result] = await WorkflowService.didRun('wait');
381
- if (didRun) {
382
- return result.data.data;
383
- }
384
- const store = storage_1.asyncLocalStorage.getStore();
385
- const interruptionRegistry = store.get('interruptionRegistry');
386
- const workflowId = store.get('workflowId');
387
- const workflowDimension = store.get('workflowDimension') ?? '';
388
- const interruptionMessage = {
389
- workflowId,
390
- signalId,
391
- index: execIndex,
392
- workflowDimension,
393
- };
394
- interruptionRegistry.push({
395
- code: enums_1.HMSH_CODE_MESHFLOW_WAIT,
396
- ...interruptionMessage,
397
- });
398
- await (0, utils_1.sleepImmediate)();
399
- throw new errors_1.MeshFlowWaitForError(interruptionMessage);
400
- }
401
- }
402
- WorkflowService.executeChild = WorkflowService.execChild;
403
- exports.WorkflowService = WorkflowService;