@temporal-contract/worker 0.1.0 → 1.0.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.
@@ -1,8 +1,40 @@
1
- import { a as ChildWorkflowNotFoundError, c as SignalInputValidationError, d as WorkflowInputValidationError, f as WorkflowOutputValidationError, g as WorkerInferOutput, h as WorkerInferInput, i as ChildWorkflowError, l as UpdateInputValidationError, m as ClientInferOutput, n as ActivityInputValidationError, o as QueryInputValidationError, p as ClientInferInput, r as ActivityOutputValidationError, s as QueryOutputValidationError, u as UpdateOutputValidationError } from "./errors-Vr-sKdW7.mjs";
1
+ import { _ as WorkerInferOutput, a as ChildWorkflowNotFoundError, c as SignalInputValidationError, d as WorkflowCancelledError, f as WorkflowInputValidationError, g as WorkerInferInput, h as ClientInferOutput, i as ChildWorkflowError, l as UpdateInputValidationError, m as ClientInferInput, n as ActivityInputValidationError, o as QueryInputValidationError, p as WorkflowOutputValidationError, r as ActivityOutputValidationError, s as QueryOutputValidationError, u as UpdateOutputValidationError } from "./errors-DZhaNhwr.mjs";
2
+ import { ActivityOptions, ChildWorkflowOptions, ContinueAsNewOptions, WorkflowInfo } from "@temporalio/workflow";
2
3
  import { Future, Result } from "@temporal-contract/boxed";
3
- import { ActivityOptions, ChildWorkflowOptions, WorkflowInfo } from "@temporalio/workflow";
4
4
  import { ActivityDefinition, ContractDefinition, QueryDefinition, SignalDefinition, UpdateDefinition, WorkflowDefinition } from "@temporal-contract/contract";
5
+ import { StandardSchemaV1 } from "@standard-schema/spec";
5
6
 
7
+ //#region src/handlers.d.ts
8
+ /**
9
+ * Signal handler implementation
10
+ *
11
+ * Processes signal input and can optionally perform asynchronous operations.
12
+ * Should not return a value (signals are fire-and-forget).
13
+ */
14
+ type SignalHandlerImplementation<TSignal extends SignalDefinition> = (args: WorkerInferInput<TSignal>) => void | Promise<void>;
15
+ /**
16
+ * Query handler implementation
17
+ *
18
+ * Processes query input and returns a synchronous response.
19
+ * Must be synchronous to satisfy Temporal's query constraints.
20
+ */
21
+ type QueryHandlerImplementation<TQuery extends QueryDefinition> = (args: WorkerInferInput<TQuery>) => WorkerInferOutput<TQuery>;
22
+ /**
23
+ * Update handler implementation
24
+ *
25
+ * Processes update input and returns a validated response after modifying workflow state.
26
+ * Can perform asynchronous operations.
27
+ */
28
+ type UpdateHandlerImplementation<TUpdate extends UpdateDefinition> = (args: WorkerInferInput<TUpdate>) => Promise<WorkerInferOutput<TUpdate>>;
29
+ //#endregion
30
+ //#region src/internal.d.ts
31
+ /**
32
+ * Continue-as-new options the typed wrapper does not own. `workflowType` and
33
+ * `taskQueue` are derived from the contract; everything else is forwarded to
34
+ * Temporal's `makeContinueAsNewFunc`.
35
+ */
36
+ type TypedContinueAsNewOptions = Omit<ContinueAsNewOptions, "workflowType" | "taskQueue">;
37
+ //#endregion
6
38
  //#region src/workflow.d.ts
7
39
  /**
8
40
  * Create a typed workflow implementation with automatic validation
@@ -18,53 +50,62 @@ import { ActivityDefinition, ContractDefinition, QueryDefinition, SignalDefiniti
18
50
  * @example
19
51
  * ```ts
20
52
  * // workflows/processOrder.ts
21
- * import { declareWorkflow } from '@temporal-contract/worker';
53
+ * import { declareWorkflow } from '@temporal-contract/worker/workflow';
22
54
  * import myContract from '../contract';
23
55
  *
24
56
  * export const processOrder = declareWorkflow({
25
57
  * workflowName: 'processOrder',
26
58
  * contract: myContract,
27
- * implementation: async (context, orderId, customerId) => {
59
+ * activityOptions: {
60
+ * startToCloseTimeout: '1 minute',
61
+ * },
62
+ * // Optional: override `activityOptions` for specific activities. Each
63
+ * // entry shallow-merges over the workflow default — the override wins on
64
+ * // every property it specifies, including the whole `retry` block.
65
+ * activityOptionsByName: {
66
+ * chargePayment: {
67
+ * startToCloseTimeout: '5 minutes',
68
+ * retry: { maximumAttempts: 5 },
69
+ * },
70
+ * },
71
+ * implementation: async (context, args) => {
28
72
  * // context.activities: typed activities (workflow + global)
29
73
  * // context.info: WorkflowInfo
30
74
  *
31
- * const inventory = await context.activities.validateInventory(orderId);
75
+ * const inventory = await context.activities.validateInventory({
76
+ * orderId: args.orderId,
77
+ * });
32
78
  *
33
79
  * if (!inventory.available) {
34
- * throw new Error('Out of stock');
80
+ * return { orderId: args.orderId, status: 'out_of_stock' };
35
81
  * }
36
82
  *
37
- * const payment = await context.activities.chargePayment(customerId, 100);
38
- *
39
- * // Global activity
40
- * await context.activities.sendEmail(
41
- * customerId,
42
- * 'Order processed',
43
- * 'Your order has been processed'
44
- * );
83
+ * const payment = await context.activities.chargePayment({
84
+ * customerId: args.customerId,
85
+ * amount: 100,
86
+ * });
45
87
  *
46
88
  * return {
47
- * orderId,
89
+ * orderId: args.orderId,
48
90
  * status: payment.success ? 'success' : 'failed',
49
91
  * transactionId: payment.transactionId,
50
92
  * };
51
93
  * },
52
- * activityOptions: {
53
- * startToCloseTimeout: '1 minute',
54
- * },
55
94
  * });
56
95
  * ```
57
96
  *
58
97
  * Then in your worker setup:
59
98
  * ```ts
60
99
  * // worker.ts
61
- * import { Worker } from '@temporalio/worker';
62
- * import { activitiesHandler } from './activities';
100
+ * import { createWorker } from '@temporal-contract/worker/worker';
101
+ * import { activities } from './activities';
102
+ * import myContract from './contract';
63
103
  *
64
- * const worker = await Worker.create({
65
- * workflowsPath: require.resolve('./workflows'), // Imports processOrder
66
- * activities: activitiesHandler.activities,
67
- * taskQueue: activitiesHandler.contract.taskQueue,
104
+ * const worker = await createWorker({
105
+ * contract: myContract,
106
+ * connection,
107
+ * workflowsPath: workflowsPathFromURL(import.meta.url, './workflows.js'),
108
+ * activities,
68
109
  * });
69
110
  * ```
70
111
  */
@@ -72,55 +113,65 @@ declare function declareWorkflow<TContract extends ContractDefinition, TWorkflow
72
113
  workflowName,
73
114
  contract,
74
115
  implementation,
75
- activityOptions
116
+ activityOptions,
117
+ activityOptionsByName
76
118
  }: DeclareWorkflowOptions<TContract, TWorkflowName>): (...args: unknown[]) => Promise<WorkerInferOutput<TContract["workflows"][TWorkflowName]>>;
77
119
  /**
78
- * Signal handler implementation
79
- *
80
- * Processes signal input and can optionally perform asynchronous operations.
81
- * Should not return a value (signals are fire-and-forget).
82
- */
83
- type SignalHandlerImplementation<TSignal extends SignalDefinition> = (args: WorkerInferInput<TSignal>) => void | Promise<void>;
84
- /**
85
- * Query handler implementation
86
- *
87
- * Processes query input and returns a synchronous response.
88
- * Must be synchronous to satisfy Temporal's query constraints.
89
- */
90
- type QueryHandlerImplementation<TQuery extends QueryDefinition> = (args: WorkerInferInput<TQuery>) => WorkerInferOutput<TQuery>;
91
- /**
92
- * Update handler implementation
93
- *
94
- * Processes update input and returns a validated response after modifying workflow state.
95
- * Can perform asynchronous operations.
120
+ * Union of all activity names available to a workflow — the workflow-local
121
+ * activities plus the contract's global activities.
96
122
  */
97
- type UpdateHandlerImplementation<TUpdate extends UpdateDefinition> = (args: WorkerInferInput<TUpdate>) => Promise<WorkerInferOutput<TUpdate>>;
123
+ type ActivityNamesFor<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = (TContract["workflows"][TWorkflowName]["activities"] extends Record<string, ActivityDefinition> ? keyof TContract["workflows"][TWorkflowName]["activities"] & string : never) | (TContract["activities"] extends Record<string, ActivityDefinition> ? keyof TContract["activities"] & string : never);
98
124
  /**
99
125
  * Options for declaring a workflow implementation
100
126
  */
101
- interface DeclareWorkflowOptions<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> {
127
+ type DeclareWorkflowOptions<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = {
102
128
  workflowName: TWorkflowName;
103
129
  contract: TContract;
104
130
  implementation: WorkflowImplementation<TContract, TWorkflowName>;
105
131
  /**
106
- * Default activity options applied to all activities in this workflow.
107
- * For more control, you can override specific Temporal ActivityOptions like:
108
- * - startToCloseTimeout: Maximum time for activity execution
109
- * - scheduleToCloseTimeout: End-to-end timeout including queuing
110
- * - scheduleToStartTimeout: Maximum time activity can wait in queue
111
- * - heartbeatTimeout: Time between heartbeats before considering activity dead
112
- * - retry: Retry policy for failed activities
132
+ * Default activity options applied to every activity reachable from this
133
+ * workflow (workflow-local + global) unless overridden in
134
+ * {@link activityOptionsByName}. See Temporal's `ActivityOptions` for the
135
+ * full set of fields:
136
+ * - `startToCloseTimeout`: Maximum time for a single attempt to run
137
+ * - `scheduleToCloseTimeout`: End-to-end timeout including queuing and retries
138
+ * - `scheduleToStartTimeout`: Maximum time the activity can wait in the queue
139
+ * - `heartbeatTimeout`: Time between heartbeats before the activity is considered dead
140
+ * - `retry`: Retry policy for failed activities
113
141
  *
114
142
  * @example
115
143
  * ```ts
116
144
  * activityOptions: {
117
145
  * startToCloseTimeout: '5m',
118
- * retry: { maximumAttempts: 3 }
146
+ * retry: { maximumAttempts: 3 },
119
147
  * }
120
148
  * ```
121
149
  */
122
150
  activityOptions: ActivityOptions;
123
- }
151
+ /**
152
+ * Per-activity `ActivityOptions` overrides. Each entry shallow-merges over
153
+ * {@link activityOptions} for that activity only — the override wins on
154
+ * every property it specifies, replacing the default value (including the
155
+ * entire nested `retry` block when present, matching Temporal's
156
+ * single-options-per-`proxyActivities`-call semantics).
157
+ *
158
+ * Activity names are typed against the contract; typos surface as TypeScript
159
+ * errors rather than running silently with the default options.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * activityOptions: { startToCloseTimeout: '1 minute' }, // default
164
+ * activityOptionsByName: {
165
+ * chargePayment: {
166
+ * startToCloseTimeout: '5 minutes',
167
+ * retry: { maximumAttempts: 5 },
168
+ * },
169
+ * fastValidation: { startToCloseTimeout: '5 seconds' },
170
+ * },
171
+ * ```
172
+ */
173
+ activityOptionsByName?: Partial<Record<ActivityNamesFor<TContract, TWorkflowName>, ActivityOptions>>;
174
+ };
124
175
  /**
125
176
  * Workflow implementation function
126
177
  *
@@ -137,7 +188,7 @@ type WorkflowImplementation<TContract extends ContractDefinition, TWorkflowName
137
188
  * - Signal, query, and update handler registration
138
189
  * - Child workflow execution capabilities
139
190
  */
140
- interface WorkflowContext<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> {
191
+ type WorkflowContext<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = {
141
192
  activities: WorkflowInferWorkflowContextActivities<TContract, TWorkflowName>;
142
193
  info: WorkflowInfo;
143
194
  /**
@@ -254,7 +305,79 @@ interface WorkflowContext<TContract extends ContractDefinition, TWorkflowName ex
254
305
  * ```
255
306
  */
256
307
  executeChildWorkflow: <TChildContract extends ContractDefinition, TChildWorkflowName extends keyof TChildContract["workflows"]>(contract: TChildContract, workflowName: TChildWorkflowName, options: TypedChildWorkflowOptions<TChildContract, TChildWorkflowName>) => Future<Result<ClientInferOutput<TChildContract["workflows"][TChildWorkflowName]>, ChildWorkflowError>>;
257
- }
308
+ /**
309
+ * Run `fn` inside a cancellable Temporal scope. If the workflow (or an
310
+ * ancestor scope) is cancelled while `fn` is in flight, the resulting
311
+ * Future resolves to `Result.Error(WorkflowCancelledError)` instead of
312
+ * rejecting — letting callers handle cancellation explicitly, typically
313
+ * to perform a graceful exit from the current step.
314
+ *
315
+ * Non-cancellation errors thrown by `fn` propagate as Future rejections
316
+ * unchanged, preserving their identity for upstream `try/catch` blocks.
317
+ *
318
+ * @example
319
+ * ```ts
320
+ * implementation: async (context, args) => {
321
+ * const result = await context.cancellableScope(async () => {
322
+ * return context.activities.processStep(args);
323
+ * });
324
+ *
325
+ * if (result.isError()) {
326
+ * // workflow was cancelled — perform cleanup that must not be cancelled:
327
+ * await context.nonCancellableScope(async () => {
328
+ * await context.activities.releaseResources(args);
329
+ * });
330
+ * return { status: "cancelled" };
331
+ * }
332
+ *
333
+ * return { status: "ok" };
334
+ * }
335
+ * ```
336
+ */
337
+ cancellableScope: <T>(fn: () => T | Promise<T>) => Future<Result<T, WorkflowCancelledError>>;
338
+ /**
339
+ * Run `fn` inside a non-cancellable Temporal scope. Cancellation requests
340
+ * from outside the scope are ignored for its duration — the idiomatic way
341
+ * to perform cleanup work that must not be interrupted.
342
+ *
343
+ * Returns the same `Future<Result<...>>` shape as
344
+ * {@link WorkflowContext.cancellableScope} for symmetry; the
345
+ * `Result.Error` branch only triggers when cancellation is raised from
346
+ * *inside* the scope, which is rare.
347
+ */
348
+ nonCancellableScope: <T>(fn: () => T | Promise<T>) => Future<Result<T, WorkflowCancelledError>>;
349
+ /**
350
+ * Continue this workflow execution as a new run, optionally with a different
351
+ * workflow type from another contract.
352
+ *
353
+ * Args are validated against the destination workflow's input schema before
354
+ * Temporal's `continueAsNew` is invoked. On validation failure, throws a
355
+ * {@link WorkflowInputValidationError}; on success, Temporal terminates the
356
+ * current execution and starts a fresh one — which is why the function
357
+ * never returns normally (`Promise<never>`).
358
+ *
359
+ * Idiomatic usage:
360
+ *
361
+ * @example
362
+ * ```ts
363
+ * // Same workflow, validated args
364
+ * implementation: async (context, args) => {
365
+ * if (shouldRoll(args)) {
366
+ * return context.continueAsNew({ ...args, retryCount: args.retryCount + 1 });
367
+ * }
368
+ * return ...;
369
+ * }
370
+ *
371
+ * // Cross-contract continueAsNew (less common — taskQueue and workflow type
372
+ * // come from the other contract)
373
+ * return context.continueAsNew(otherContract, "otherWorkflow", { ...newArgs });
374
+ * ```
375
+ */
376
+ continueAsNew: {
377
+ /** Same-workflow continuation — args typed against this workflow's input. */(args: ClientInferInput<TContract["workflows"][TWorkflowName]>, options?: TypedContinueAsNewOptions): Promise<never>; /** Cross-contract continuation — args typed against the destination workflow. */
378
+ <TOtherContract extends ContractDefinition, TOtherWorkflowName extends keyof TOtherContract["workflows"]>(contract: TOtherContract, workflowName: TOtherWorkflowName, args: ClientInferInput<TOtherContract["workflows"][TOtherWorkflowName]>, options?: TypedContinueAsNewOptions): Promise<never>;
379
+ };
380
+ };
258
381
  /**
259
382
  * Options for starting a child workflow
260
383
  */
@@ -264,7 +387,7 @@ type TypedChildWorkflowOptions<TChildContract extends ContractDefinition, TChild
264
387
  /**
265
388
  * Typed handle for a child workflow with Future/Result pattern
266
389
  */
267
- interface TypedChildWorkflowHandle<TWorkflow extends WorkflowDefinition> {
390
+ type TypedChildWorkflowHandle<TWorkflow extends WorkflowDefinition> = {
268
391
  /**
269
392
  * Get child workflow result with Result pattern
270
393
  */
@@ -273,7 +396,7 @@ interface TypedChildWorkflowHandle<TWorkflow extends WorkflowDefinition> {
273
396
  * Child workflow ID
274
397
  */
275
398
  workflowId: string;
276
- }
399
+ };
277
400
  /**
278
401
  * Activity function signature from workflow execution perspective
279
402
  *
@@ -293,6 +416,7 @@ type WorkflowInferWorkflowActivities<T extends WorkflowDefinition> = T["activiti
293
416
  *
294
417
  * Combines workflow-specific activities with global contract activities
295
418
  */
296
- type WorkflowInferWorkflowContextActivities<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = WorkflowInferWorkflowActivities<TContract["workflows"][TWorkflowName]> & WorkflowInferActivities<TContract>;
419
+ type WorkflowInferWorkflowContextActivities<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = WorkflowInferWorkflowActivities<TContract["workflows"][TWorkflowName]> & WorkflowInferActivities<TContract>; //# sourceMappingURL=workflow.d.ts.map
297
420
  //#endregion
298
- export { ActivityInputValidationError, ActivityOutputValidationError, ChildWorkflowError, ChildWorkflowNotFoundError, QueryInputValidationError, QueryOutputValidationError, SignalInputValidationError, UpdateInputValidationError, UpdateOutputValidationError, WorkflowInputValidationError, WorkflowOutputValidationError, declareWorkflow };
421
+ export { ActivityInputValidationError, ActivityOutputValidationError, ChildWorkflowError, ChildWorkflowNotFoundError, QueryInputValidationError, QueryOutputValidationError, SignalInputValidationError, UpdateInputValidationError, UpdateOutputValidationError, WorkflowCancelledError, WorkflowInputValidationError, WorkflowOutputValidationError, declareWorkflow };
422
+ //# sourceMappingURL=workflow.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.d.mts","names":[],"sources":["../src/handlers.ts","../src/internal.ts","../src/workflow.ts"],"mappings":"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"}