@io-orkes/conductor-javascript 1.0.1 → 1.1.0

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/dist/index.d.ts CHANGED
@@ -1893,45 +1893,20 @@ interface ConductorWorker {
1893
1893
  concurrency?: number;
1894
1894
  }
1895
1895
 
1896
- interface TaskManagerOptions {
1896
+ declare type TaskErrorHandler = (error: Error, task?: Task) => void;
1897
+ interface TaskRunnerOptions {
1897
1898
  workerID: string;
1898
1899
  domain: string | undefined;
1899
1900
  pollInterval?: number;
1900
1901
  concurrency?: number;
1901
1902
  }
1902
- interface TaskManagerConfig {
1903
- logger?: ConductorLogger;
1904
- options?: Partial<TaskManagerOptions>;
1905
- onError?: TaskErrorHandler;
1906
- }
1907
- /**
1908
- * Responsible for initializing and managing the runners that poll and work different task queues.
1909
- */
1910
- declare class TaskManager {
1911
- private tasks;
1912
- private readonly client;
1913
- private readonly logger;
1914
- private readonly errorHandler;
1915
- private workers;
1916
- private readonly taskManageOptions;
1917
- constructor(client: ConductorClient, workers: Array<ConductorWorker>, config?: TaskManagerConfig);
1918
- /**
1919
- * Start polling for tasks
1920
- */
1921
- startPolling: () => void;
1922
- /**
1923
- * Stops polling for tasks
1924
- */
1925
- stopPolling: () => void;
1926
- }
1927
-
1928
- declare type TaskErrorHandler = (error: Error, task?: Task) => void;
1929
1903
  interface RunnerArgs {
1930
1904
  worker: ConductorWorker;
1931
1905
  taskResource: TaskResourceService;
1932
- options: Required<TaskManagerOptions>;
1906
+ options: Required<TaskRunnerOptions>;
1933
1907
  logger?: ConductorLogger;
1934
1908
  onError?: TaskErrorHandler;
1909
+ concurrency?: number;
1935
1910
  }
1936
1911
  declare const noopErrorHandler: TaskErrorHandler;
1937
1912
  /**
@@ -1944,27 +1919,62 @@ declare const noopErrorHandler: TaskErrorHandler;
1944
1919
  *
1945
1920
  */
1946
1921
  declare class TaskRunner {
1947
- isPolling: boolean;
1948
1922
  taskResource: TaskResourceService;
1949
1923
  worker: ConductorWorker;
1950
- logger: ConductorLogger;
1951
- options: Required<TaskManagerOptions>;
1924
+ private logger;
1925
+ private options;
1952
1926
  errorHandler: TaskErrorHandler;
1927
+ private poller;
1953
1928
  constructor({ worker, taskResource, options, logger, onError: errorHandler, }: RunnerArgs);
1954
1929
  /**
1955
1930
  * Starts polling for work
1956
1931
  */
1957
- startPolling: () => Promise<void>;
1932
+ startPolling: () => void;
1958
1933
  /**
1959
1934
  * Stops Polling for work
1960
1935
  */
1961
1936
  stopPolling: () => void;
1962
- poll: () => Promise<void>;
1937
+ updateOptions(options: Partial<TaskRunnerOptions>): void;
1938
+ get getOptions(): TaskRunnerOptions;
1939
+ private pollAndExecute;
1963
1940
  updateTaskWithRetry: (task: Task, taskResult: TaskResult) => Promise<void>;
1964
1941
  executeTask: (task: Task) => Promise<void>;
1965
1942
  handleUnknownError: (unknownError: unknown) => void;
1966
1943
  }
1967
1944
 
1945
+ declare type TaskManagerOptions = TaskRunnerOptions;
1946
+ interface TaskManagerConfig {
1947
+ logger?: ConductorLogger;
1948
+ options?: Partial<TaskManagerOptions>;
1949
+ onError?: TaskErrorHandler;
1950
+ }
1951
+ /**
1952
+ * Responsible for initializing and managing the runners that poll and work different task queues.
1953
+ */
1954
+ declare class TaskManager {
1955
+ private tasks;
1956
+ private readonly client;
1957
+ private readonly logger;
1958
+ private readonly errorHandler;
1959
+ private workers;
1960
+ private readonly taskManageOptions;
1961
+ constructor(client: ConductorClient, workers: Array<ConductorWorker>, config?: TaskManagerConfig);
1962
+ private workerManagerWorkerOptions;
1963
+ /**
1964
+ * new options will get merged to existing options
1965
+ * @param options new options to update polling options
1966
+ */
1967
+ updatePollingOptions: (options: Partial<TaskManagerOptions>) => void;
1968
+ /**
1969
+ * Start polling for tasks
1970
+ */
1971
+ startPolling: () => void;
1972
+ /**
1973
+ * Stops polling for tasks
1974
+ */
1975
+ stopPolling: () => void;
1976
+ }
1977
+
1968
1978
  declare class ConductorError extends Error {
1969
1979
  private _trace;
1970
1980
  private __proto__;
@@ -2167,4 +2177,4 @@ declare class HumanExecutor {
2167
2177
  completeTask(taskId: string, requestBody?: Record<string, Record<string, any>>): Promise<void>;
2168
2178
  }
2169
2179
 
2170
- export { Action, ApiError, AssignmentPolicy, BackToAssigment, BaseHttpRequest, CancelError, CancelablePromise, ClearAssigment, CommonTaskDef, ConductorClient, ConductorError, ConductorHttpRequest, ConductorLogLevel, ConductorLogger, ConductorWorker, DefaultLogger, DefaultLoggerConfig, DoWhileTaskDef, Escalate, EventHandler, EventResourceService, EventTaskDef, ExternalStorageLocation, FFAAssignment, Fixed, ForkJoinDynamicDef, ForkJoinTaskDef, GenerateTokenRequest, HTScrollableSearchResultHumanTaskEntry, HealthCheckResourceService, HttpInputParameters, HttpTaskDef, HumanExecutor, HumanTaskActionLogEntry, HumanTaskEntry, HumanTaskLoad, HumanTaskStateLogEntry, HumanTaskTemplate, HumanTaskTemplateEntry, InlineTaskDef, InlineTaskInputParameters, JoinTaskDef, JsonJQTransformTaskDef, KafkaPublishInputParameters, KafkaPublishTaskDef, LeastBusyGroupMemberAssignment, MetadataResourceService, Never, OnCancel, OpenAPIConfig, OrkesApiConfig, PollData, RequestType, RerunWorkflowRequest, Response, RunnerArgs, SaveScheduleRequest, SchedulerResourceService, ScrollableSearchResultWorkflowSummary, SearchResultHumanTaskEntry, SearchResultTask, SearchResultTaskSummary, SearchResultWorkflow, SearchResultWorkflowScheduleExecutionModel, SearchResultWorkflowSummary, SetVariableTaskDef, SimpleTaskDef, SkipTaskRequest, StartWorkflow, StartWorkflowRequest, SubWorkflowParams, SubWorkflowTaskDef, SwitchTaskDef, Task, TaskDef, TaskDefTypes, TaskDetails, TaskErrorHandler, TaskExecLog, TaskManager, TaskManagerConfig, TaskManagerOptions, TaskResourceService, TaskResult, TaskResultStatus, TaskRunner, TaskSummary, TaskType, Terminate, TerminateTaskDef, TimeoutPolicy, TokenResourceService, WaitTaskDef, Workflow, WorkflowBulkResourceService, WorkflowDef, WorkflowExecutor, WorkflowResourceService, WorkflowSchedule, WorkflowScheduleExecutionModel, WorkflowStatus, WorkflowSummary, WorkflowTask, conductorEventTask, doWhileTask, dynamicForkTask, eventTask, forkTask, forkTaskJoin, generate, generateDoWhileTask, generateEventTask, generateForkJoinTask, generateHTTPTask, generateInlineTask, generateJQTransformTask, generateJoinTask, generateKafkaPublishTask, generateSetVariableTask, generateSimpleTask, generateSubWorkflowTask, generateSwitchTask, generateTerminateTask, generateWaitTask, httpTask, inlineTask, joinTask, jsonJqTask, kafkaPublishTask, newLoopTask, noopErrorHandler, orkesConductorClient, setVariableTask, simpleTask, sqsEventTask, subWorkflowTask, switchTask, taskGenMapper, terminateTask, waitTaskDuration, waitTaskUntil, workflow };
2180
+ export { Action, ApiError, AssignmentPolicy, BackToAssigment, BaseHttpRequest, CancelError, CancelablePromise, ClearAssigment, CommonTaskDef, ConductorClient, ConductorError, ConductorHttpRequest, ConductorLogLevel, ConductorLogger, ConductorWorker, DefaultLogger, DefaultLoggerConfig, DoWhileTaskDef, Escalate, EventHandler, EventResourceService, EventTaskDef, ExternalStorageLocation, FFAAssignment, Fixed, ForkJoinDynamicDef, ForkJoinTaskDef, GenerateTokenRequest, HTScrollableSearchResultHumanTaskEntry, HealthCheckResourceService, HttpInputParameters, HttpTaskDef, HumanExecutor, HumanTaskActionLogEntry, HumanTaskEntry, HumanTaskLoad, HumanTaskStateLogEntry, HumanTaskTemplate, HumanTaskTemplateEntry, InlineTaskDef, InlineTaskInputParameters, JoinTaskDef, JsonJQTransformTaskDef, KafkaPublishInputParameters, KafkaPublishTaskDef, LeastBusyGroupMemberAssignment, MetadataResourceService, Never, OnCancel, OpenAPIConfig, OrkesApiConfig, PollData, RequestType, RerunWorkflowRequest, Response, RunnerArgs, SaveScheduleRequest, SchedulerResourceService, ScrollableSearchResultWorkflowSummary, SearchResultHumanTaskEntry, SearchResultTask, SearchResultTaskSummary, SearchResultWorkflow, SearchResultWorkflowScheduleExecutionModel, SearchResultWorkflowSummary, SetVariableTaskDef, SimpleTaskDef, SkipTaskRequest, StartWorkflow, StartWorkflowRequest, SubWorkflowParams, SubWorkflowTaskDef, SwitchTaskDef, Task, TaskDef, TaskDefTypes, TaskDetails, TaskErrorHandler, TaskExecLog, TaskManager, TaskManagerConfig, TaskManagerOptions, TaskResourceService, TaskResult, TaskResultStatus, TaskRunner, TaskRunnerOptions, TaskSummary, TaskType, Terminate, TerminateTaskDef, TimeoutPolicy, TokenResourceService, WaitTaskDef, Workflow, WorkflowBulkResourceService, WorkflowDef, WorkflowExecutor, WorkflowResourceService, WorkflowSchedule, WorkflowScheduleExecutionModel, WorkflowStatus, WorkflowSummary, WorkflowTask, conductorEventTask, doWhileTask, dynamicForkTask, eventTask, forkTask, forkTaskJoin, generate, generateDoWhileTask, generateEventTask, generateForkJoinTask, generateHTTPTask, generateInlineTask, generateJQTransformTask, generateJoinTask, generateKafkaPublishTask, generateSetVariableTask, generateSimpleTask, generateSubWorkflowTask, generateSwitchTask, generateTerminateTask, generateWaitTask, httpTask, inlineTask, joinTask, jsonJqTask, kafkaPublishTask, newLoopTask, noopErrorHandler, orkesConductorClient, setVariableTask, simpleTask, sqsEventTask, subWorkflowTask, switchTask, taskGenMapper, terminateTask, waitTaskDuration, waitTaskUntil, workflow };
package/dist/index.js CHANGED
@@ -101,11 +101,7 @@ __export(conductor_javascript_exports, {
101
101
  });
102
102
  module.exports = __toCommonJS(conductor_javascript_exports);
103
103
 
104
- // src/task/TaskRunner.ts
105
- var DEFAULT_ERROR_MESSAGE = "An unknown error occurred";
106
- var MAX_RETRIES = 3;
107
- var noopErrorHandler = (__error) => {
108
- };
104
+ // src/task/helpers.ts
109
105
  var noopLogger = {
110
106
  debug: (...args) => {
111
107
  },
@@ -114,6 +110,88 @@ var noopLogger = {
114
110
  error: (...args) => {
115
111
  }
116
112
  };
113
+
114
+ // src/task/Poller.ts
115
+ var Poller = class {
116
+ constructor(pollFunction, pollerOptions, logger) {
117
+ this.concurrentCalls = [];
118
+ this.pollFunction = async () => {
119
+ };
120
+ this.isPolling = false;
121
+ this.options = {
122
+ pollInterval: 1e3,
123
+ concurrency: 1
124
+ };
125
+ this.logger = noopLogger;
126
+ this.startPolling = () => {
127
+ if (this.isPolling) {
128
+ throw new Error("Runner is already started");
129
+ }
130
+ return this.poll();
131
+ };
132
+ this.stopPolling = () => {
133
+ this.isPolling = false;
134
+ this.concurrentCalls.forEach((call) => call.stop());
135
+ };
136
+ this.poll = async () => {
137
+ if (!this.isPolling) {
138
+ this.isPolling = true;
139
+ for (let i = 0; i < this.options.concurrency; i++) {
140
+ this.concurrentCalls.push(this.singlePoll());
141
+ }
142
+ }
143
+ };
144
+ this.singlePoll = () => {
145
+ let poll = this.isPolling;
146
+ let timeout;
147
+ const pollingCall = async () => {
148
+ while (poll) {
149
+ await this.pollFunction();
150
+ await new Promise((r) => timeout = setTimeout(() => r(true), this.options.pollInterval));
151
+ }
152
+ };
153
+ return {
154
+ promise: pollingCall(),
155
+ stop: () => {
156
+ clearTimeout(timeout);
157
+ poll = false;
158
+ this.logger.debug("stopping single poll call");
159
+ }
160
+ };
161
+ };
162
+ this.pollFunction = pollFunction;
163
+ this.options = __spreadValues(__spreadValues({}, this.options), pollerOptions);
164
+ this.logger = logger || noopLogger;
165
+ }
166
+ updateConcurrency(concurrency) {
167
+ if (concurrency > 0 && concurrency !== this.options.concurrency) {
168
+ if (concurrency < this.options.concurrency) {
169
+ const result = this.concurrentCalls.splice(0, this.options.concurrency - concurrency);
170
+ result.forEach((call) => {
171
+ call.stop();
172
+ this.logger.debug("stopping some spawned calls");
173
+ });
174
+ } else {
175
+ for (let i = 0; i < concurrency - this.options.concurrency; i++) {
176
+ this.concurrentCalls.push(this.singlePoll());
177
+ this.logger.debug("spawning additional poll calls");
178
+ }
179
+ }
180
+ this.options.concurrency = concurrency;
181
+ }
182
+ }
183
+ updateOptions(options) {
184
+ const newOptions = __spreadValues(__spreadValues({}, this.options), options);
185
+ this.updateConcurrency(newOptions.concurrency);
186
+ this.options = newOptions;
187
+ }
188
+ };
189
+
190
+ // src/task/TaskRunner.ts
191
+ var DEFAULT_ERROR_MESSAGE = "An unknown error occurred";
192
+ var MAX_RETRIES = 3;
193
+ var noopErrorHandler = (__error) => {
194
+ };
117
195
  var TaskRunner = class {
118
196
  constructor({
119
197
  worker,
@@ -122,32 +200,24 @@ var TaskRunner = class {
122
200
  logger = noopLogger,
123
201
  onError: errorHandler = noopErrorHandler
124
202
  }) {
125
- this.isPolling = false;
126
203
  this.startPolling = () => {
127
- if (this.isPolling) {
128
- throw new Error("Runner is already started");
129
- }
130
- this.isPolling = true;
131
- return this.poll();
204
+ this.poller.startPolling();
132
205
  };
133
206
  this.stopPolling = () => {
134
- this.isPolling = false;
207
+ this.poller.stopPolling();
135
208
  };
136
- this.poll = async () => {
137
- while (this.isPolling) {
138
- try {
139
- const { workerID } = this.options;
140
- const task = await this.taskResource.poll(this.worker.taskDefName, workerID, this.options.domain);
141
- if (task && task.taskId) {
142
- await this.executeTask(task);
143
- } else {
144
- this.logger.debug(`No tasks for ${this.worker.taskDefName}`);
145
- }
146
- } catch (unknownError) {
147
- this.handleUnknownError(unknownError);
148
- this.errorHandler(unknownError);
209
+ this.pollAndExecute = async () => {
210
+ try {
211
+ const { workerID } = this.options;
212
+ const task = await this.taskResource.poll(this.worker.taskDefName, workerID, this.worker.domain ?? this.options.domain);
213
+ if (task && task.taskId) {
214
+ await this.executeTask(task);
215
+ } else {
216
+ this.logger.debug(`No tasks for ${this.worker.taskDefName}`);
149
217
  }
150
- await new Promise((r) => setTimeout(() => r(true), this.options.pollInterval));
218
+ } catch (unknownError) {
219
+ this.handleUnknownError(unknownError);
220
+ this.errorHandler(unknownError);
151
221
  }
152
222
  };
153
223
  this.updateTaskWithRetry = async (task, taskResult) => {
@@ -201,6 +271,18 @@ var TaskRunner = class {
201
271
  this.worker = worker;
202
272
  this.options = options;
203
273
  this.errorHandler = errorHandler;
274
+ this.poller = new Poller(this.pollAndExecute, { concurrency: options.concurrency, pollInterval: options.pollInterval }, this.logger);
275
+ }
276
+ updateOptions(options) {
277
+ const newOptions = __spreadValues(__spreadValues({}, this.options), options);
278
+ this.poller.updateOptions({
279
+ concurrency: newOptions.concurrency,
280
+ pollInterval: newOptions.pollInterval
281
+ });
282
+ this.options = newOptions;
283
+ }
284
+ get getOptions() {
285
+ return this.options;
204
286
  }
205
287
  };
206
288
 
@@ -2170,25 +2252,35 @@ function workerId(options) {
2170
2252
  var TaskManager = class {
2171
2253
  constructor(client, workers, config = {}) {
2172
2254
  this.tasks = {};
2255
+ this.workerManagerWorkerOptions = (worker) => {
2256
+ return __spreadProps(__spreadValues({}, this.taskManageOptions), {
2257
+ concurrency: worker.concurrency ?? this.taskManageOptions.concurrency,
2258
+ domain: worker.domain ?? this.taskManageOptions.domain
2259
+ });
2260
+ };
2261
+ this.updatePollingOptions = (options) => {
2262
+ this.workers.forEach((worker) => {
2263
+ const newOptions = __spreadValues(__spreadValues({}, this.workerManagerWorkerOptions(worker)), options);
2264
+ const runners = this.tasks[worker.taskDefName];
2265
+ runners.forEach((runner) => {
2266
+ runner.updateOptions(newOptions);
2267
+ });
2268
+ });
2269
+ };
2173
2270
  this.startPolling = () => {
2174
2271
  this.workers.forEach((worker) => {
2175
2272
  this.tasks[worker.taskDefName] = [];
2176
- const options = __spreadProps(__spreadValues({}, this.taskManageOptions), {
2177
- concurrency: worker.concurrency ?? this.taskManageOptions.concurrency,
2178
- domain: worker.domain ?? this.taskManageOptions.domain
2179
- });
2273
+ const options = this.workerManagerWorkerOptions(worker);
2180
2274
  this.logger.debug(`Starting taskDefName=${worker.taskDefName} concurrency=${options.concurrency} domain=${options.domain}`);
2181
- for (let i = 0; i < options.concurrency; i++) {
2182
- const runner = new TaskRunner({
2183
- worker,
2184
- options,
2185
- taskResource: this.client.taskResource,
2186
- logger: this.logger,
2187
- onError: this.errorHandler
2188
- });
2189
- runner.startPolling();
2190
- this.tasks[worker.taskDefName].push(runner);
2191
- }
2275
+ const runner = new TaskRunner({
2276
+ worker,
2277
+ options,
2278
+ taskResource: this.client.taskResource,
2279
+ logger: this.logger,
2280
+ onError: this.errorHandler
2281
+ });
2282
+ runner.startPolling();
2283
+ this.tasks[worker.taskDefName].push(runner);
2192
2284
  });
2193
2285
  };
2194
2286
  this.stopPolling = () => {