@temporal-contract/client 0.0.5 → 0.0.7
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.cjs +75 -83
- package/dist/index.d.cts +28 -26
- package/dist/index.d.mts +28 -26
- package/dist/index.mjs +57 -64
- package/package.json +14 -10
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
let
|
|
2
|
-
let __temporal_contract_boxed = require("@temporal-contract/boxed");
|
|
1
|
+
let _swan_io_boxed = require("@swan-io/boxed");
|
|
3
2
|
|
|
4
3
|
//#region src/errors.ts
|
|
5
4
|
/**
|
|
@@ -13,6 +12,16 @@ var TypedClientError = class extends Error {
|
|
|
13
12
|
}
|
|
14
13
|
};
|
|
15
14
|
/**
|
|
15
|
+
* Generic runtime failure wrapper when no specific error type applies
|
|
16
|
+
*/
|
|
17
|
+
var RuntimeClientError = class extends TypedClientError {
|
|
18
|
+
constructor(operation, cause) {
|
|
19
|
+
super(`Operation "${operation}" failed: ${cause instanceof Error ? cause.message : String(cause ?? "unknown error")}`);
|
|
20
|
+
this.operation = operation;
|
|
21
|
+
this.cause = cause;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
16
25
|
* Thrown when a workflow is not found in the contract
|
|
17
26
|
*/
|
|
18
27
|
var WorkflowNotFoundError = class extends TypedClientError {
|
|
@@ -101,8 +110,8 @@ var TypedClient = class TypedClient {
|
|
|
101
110
|
* });
|
|
102
111
|
* ```
|
|
103
112
|
*/
|
|
104
|
-
static create(contract,
|
|
105
|
-
return new TypedClient(contract,
|
|
113
|
+
static create(contract, client) {
|
|
114
|
+
return new TypedClient(contract, client);
|
|
106
115
|
}
|
|
107
116
|
/**
|
|
108
117
|
* Start a workflow and return a typed handle with Future pattern
|
|
@@ -126,16 +135,16 @@ var TypedClient = class TypedClient {
|
|
|
126
135
|
* ```
|
|
127
136
|
*/
|
|
128
137
|
startWorkflow(workflowName, { args, ...temporalOptions }) {
|
|
129
|
-
return
|
|
130
|
-
const definition = this.contract.workflows[workflowName];
|
|
131
|
-
if (!definition) {
|
|
132
|
-
resolve(__temporal_contract_boxed.Result.Error(new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows))));
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
138
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
135
139
|
(async () => {
|
|
140
|
+
const definition = this.contract.workflows[workflowName];
|
|
141
|
+
if (!definition) {
|
|
142
|
+
resolve(_swan_io_boxed.Result.Error(createWorkflowNotFoundError(workflowName, this.contract)));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
136
145
|
const inputResult = await definition.input["~standard"].validate(args);
|
|
137
146
|
if (inputResult.issues) {
|
|
138
|
-
resolve(
|
|
147
|
+
resolve(_swan_io_boxed.Result.Error(createWorkflowValidationError(workflowName, "input", inputResult.issues)));
|
|
139
148
|
return;
|
|
140
149
|
}
|
|
141
150
|
const validatedInput = inputResult.value;
|
|
@@ -146,9 +155,9 @@ var TypedClient = class TypedClient {
|
|
|
146
155
|
args: [validatedInput]
|
|
147
156
|
});
|
|
148
157
|
const typedHandle = this.createTypedHandle(handle, definition);
|
|
149
|
-
resolve(
|
|
158
|
+
resolve(_swan_io_boxed.Result.Ok(typedHandle));
|
|
150
159
|
} catch (error) {
|
|
151
|
-
resolve(
|
|
160
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("startWorkflow", error)));
|
|
152
161
|
}
|
|
153
162
|
})();
|
|
154
163
|
});
|
|
@@ -172,16 +181,16 @@ var TypedClient = class TypedClient {
|
|
|
172
181
|
* ```
|
|
173
182
|
*/
|
|
174
183
|
executeWorkflow(workflowName, { args, ...temporalOptions }) {
|
|
175
|
-
return
|
|
176
|
-
const definition = this.contract.workflows[workflowName];
|
|
177
|
-
if (!definition) {
|
|
178
|
-
resolve(__temporal_contract_boxed.Result.Error(new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows))));
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
184
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
181
185
|
(async () => {
|
|
186
|
+
const definition = this.contract.workflows[workflowName];
|
|
187
|
+
if (!definition) {
|
|
188
|
+
resolve(_swan_io_boxed.Result.Error(createWorkflowNotFoundError(workflowName, this.contract)));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
182
191
|
const inputResult = await definition.input["~standard"].validate(args);
|
|
183
192
|
if (inputResult.issues) {
|
|
184
|
-
resolve(
|
|
193
|
+
resolve(_swan_io_boxed.Result.Error(createWorkflowValidationError(workflowName, "input", inputResult.issues)));
|
|
185
194
|
return;
|
|
186
195
|
}
|
|
187
196
|
const validatedInput = inputResult.value;
|
|
@@ -193,12 +202,12 @@ var TypedClient = class TypedClient {
|
|
|
193
202
|
});
|
|
194
203
|
const outputResult = await definition.output["~standard"].validate(result);
|
|
195
204
|
if (outputResult.issues) {
|
|
196
|
-
resolve(
|
|
205
|
+
resolve(_swan_io_boxed.Result.Error(createWorkflowValidationError(workflowName, "output", outputResult.issues)));
|
|
197
206
|
return;
|
|
198
207
|
}
|
|
199
|
-
resolve(
|
|
208
|
+
resolve(_swan_io_boxed.Result.Ok(outputResult.value));
|
|
200
209
|
} catch (error) {
|
|
201
|
-
resolve(
|
|
210
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("executeWorkflow", error)));
|
|
202
211
|
}
|
|
203
212
|
})();
|
|
204
213
|
});
|
|
@@ -219,154 +228,137 @@ var TypedClient = class TypedClient {
|
|
|
219
228
|
* ```
|
|
220
229
|
*/
|
|
221
230
|
getHandle(workflowName, workflowId) {
|
|
222
|
-
return
|
|
231
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
223
232
|
const definition = this.contract.workflows[workflowName];
|
|
224
233
|
if (!definition) {
|
|
225
|
-
resolve(
|
|
234
|
+
resolve(_swan_io_boxed.Result.Error(createWorkflowNotFoundError(workflowName, this.contract)));
|
|
226
235
|
return;
|
|
227
236
|
}
|
|
228
237
|
try {
|
|
229
238
|
const handle = this.client.workflow.getHandle(workflowId);
|
|
230
239
|
const typedHandle = this.createTypedHandle(handle, definition);
|
|
231
|
-
resolve(
|
|
240
|
+
resolve(_swan_io_boxed.Result.Ok(typedHandle));
|
|
232
241
|
} catch (error) {
|
|
233
|
-
resolve(
|
|
242
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("getHandle", error)));
|
|
234
243
|
}
|
|
235
244
|
});
|
|
236
245
|
}
|
|
237
|
-
createTypedHandle(
|
|
246
|
+
createTypedHandle(workflowHandle, definition) {
|
|
238
247
|
const queries = {};
|
|
239
248
|
for (const [queryName, queryDef] of Object.entries(definition.queries ?? {})) queries[queryName] = (args) => {
|
|
240
|
-
return
|
|
249
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
241
250
|
(async () => {
|
|
242
251
|
const inputResult = await queryDef.input["~standard"].validate(args);
|
|
243
252
|
if (inputResult.issues) {
|
|
244
|
-
resolve(
|
|
253
|
+
resolve(_swan_io_boxed.Result.Error(new QueryValidationError(queryName, "input", inputResult.issues)));
|
|
245
254
|
return;
|
|
246
255
|
}
|
|
247
256
|
try {
|
|
248
|
-
const result = await
|
|
257
|
+
const result = await workflowHandle.query(queryName, inputResult.value);
|
|
249
258
|
const outputResult = await queryDef.output["~standard"].validate(result);
|
|
250
259
|
if (outputResult.issues) {
|
|
251
|
-
resolve(
|
|
260
|
+
resolve(_swan_io_boxed.Result.Error(new QueryValidationError(queryName, "output", outputResult.issues)));
|
|
252
261
|
return;
|
|
253
262
|
}
|
|
254
|
-
resolve(
|
|
263
|
+
resolve(_swan_io_boxed.Result.Ok(outputResult.value));
|
|
255
264
|
} catch (error) {
|
|
256
|
-
resolve(
|
|
265
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("query", error)));
|
|
257
266
|
}
|
|
258
267
|
})();
|
|
259
268
|
});
|
|
260
269
|
};
|
|
261
270
|
const signals = {};
|
|
262
271
|
for (const [signalName, signalDef] of Object.entries(definition.signals ?? {})) signals[signalName] = (args) => {
|
|
263
|
-
return
|
|
272
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
264
273
|
(async () => {
|
|
265
274
|
const inputResult = await signalDef.input["~standard"].validate(args);
|
|
266
275
|
if (inputResult.issues) {
|
|
267
|
-
resolve(
|
|
276
|
+
resolve(_swan_io_boxed.Result.Error(new SignalValidationError(signalName, inputResult.issues)));
|
|
268
277
|
return;
|
|
269
278
|
}
|
|
270
279
|
try {
|
|
271
|
-
await
|
|
272
|
-
resolve(
|
|
280
|
+
await workflowHandle.signal(signalName, inputResult.value);
|
|
281
|
+
resolve(_swan_io_boxed.Result.Ok(void 0));
|
|
273
282
|
} catch (error) {
|
|
274
|
-
resolve(
|
|
283
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("signal", error)));
|
|
275
284
|
}
|
|
276
285
|
})();
|
|
277
286
|
});
|
|
278
287
|
};
|
|
279
288
|
const updates = {};
|
|
280
289
|
for (const [updateName, updateDef] of Object.entries(definition.updates ?? {})) updates[updateName] = (args) => {
|
|
281
|
-
return
|
|
290
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
282
291
|
(async () => {
|
|
283
292
|
const inputResult = await updateDef.input["~standard"].validate(args);
|
|
284
293
|
if (inputResult.issues) {
|
|
285
|
-
resolve(
|
|
294
|
+
resolve(_swan_io_boxed.Result.Error(new UpdateValidationError(updateName, "input", inputResult.issues)));
|
|
286
295
|
return;
|
|
287
296
|
}
|
|
288
297
|
try {
|
|
289
|
-
const result = await
|
|
298
|
+
const result = await workflowHandle.executeUpdate(updateName, { args: [inputResult.value] });
|
|
290
299
|
const outputResult = await updateDef.output["~standard"].validate(result);
|
|
291
300
|
if (outputResult.issues) {
|
|
292
|
-
resolve(
|
|
301
|
+
resolve(_swan_io_boxed.Result.Error(new UpdateValidationError(updateName, "output", outputResult.issues)));
|
|
293
302
|
return;
|
|
294
303
|
}
|
|
295
|
-
resolve(
|
|
304
|
+
resolve(_swan_io_boxed.Result.Ok(outputResult.value));
|
|
296
305
|
} catch (error) {
|
|
297
|
-
resolve(
|
|
306
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("update", error)));
|
|
298
307
|
}
|
|
299
308
|
})();
|
|
300
309
|
});
|
|
301
310
|
};
|
|
302
311
|
return {
|
|
303
|
-
workflowId:
|
|
312
|
+
workflowId: workflowHandle.workflowId,
|
|
304
313
|
queries,
|
|
305
314
|
signals,
|
|
306
315
|
updates,
|
|
307
316
|
result: () => {
|
|
308
|
-
return
|
|
317
|
+
return _swan_io_boxed.Future.make((resolve) => {
|
|
309
318
|
(async () => {
|
|
310
319
|
try {
|
|
311
|
-
const result = await
|
|
320
|
+
const result = await workflowHandle.result();
|
|
312
321
|
const outputResult = await definition.output["~standard"].validate(result);
|
|
313
322
|
if (outputResult.issues) {
|
|
314
|
-
resolve(
|
|
323
|
+
resolve(_swan_io_boxed.Result.Error(new WorkflowValidationError(workflowHandle.workflowId, "output", outputResult.issues)));
|
|
315
324
|
return;
|
|
316
325
|
}
|
|
317
|
-
resolve(
|
|
326
|
+
resolve(_swan_io_boxed.Result.Ok(outputResult.value));
|
|
318
327
|
} catch (error) {
|
|
319
|
-
resolve(
|
|
328
|
+
resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("result", error)));
|
|
320
329
|
}
|
|
321
330
|
})();
|
|
322
331
|
});
|
|
323
332
|
},
|
|
324
333
|
terminate: (reason) => {
|
|
325
|
-
return
|
|
326
|
-
(async () => {
|
|
327
|
-
try {
|
|
328
|
-
await handle.terminate(reason);
|
|
329
|
-
resolve(__temporal_contract_boxed.Result.Ok(void 0));
|
|
330
|
-
} catch (error) {
|
|
331
|
-
resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Terminate failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
332
|
-
}
|
|
333
|
-
})();
|
|
334
|
-
});
|
|
334
|
+
return _swan_io_boxed.Future.fromPromise(workflowHandle.terminate(reason)).mapError((error) => createRuntimeClientError("terminate", error)).mapOk(() => void 0);
|
|
335
335
|
},
|
|
336
336
|
cancel: () => {
|
|
337
|
-
return
|
|
338
|
-
(async () => {
|
|
339
|
-
try {
|
|
340
|
-
await handle.cancel();
|
|
341
|
-
resolve(__temporal_contract_boxed.Result.Ok(void 0));
|
|
342
|
-
} catch (error) {
|
|
343
|
-
resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Cancel failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
344
|
-
}
|
|
345
|
-
})();
|
|
346
|
-
});
|
|
337
|
+
return _swan_io_boxed.Future.fromPromise(workflowHandle.cancel()).mapError((error) => createRuntimeClientError("cancel", error)).mapOk(() => void 0);
|
|
347
338
|
},
|
|
348
339
|
describe: () => {
|
|
349
|
-
return
|
|
350
|
-
(async () => {
|
|
351
|
-
try {
|
|
352
|
-
const description = await handle.describe();
|
|
353
|
-
resolve(__temporal_contract_boxed.Result.Ok(description));
|
|
354
|
-
} catch (error) {
|
|
355
|
-
resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Describe failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
356
|
-
}
|
|
357
|
-
})();
|
|
358
|
-
});
|
|
340
|
+
return _swan_io_boxed.Future.fromPromise(workflowHandle.describe()).mapError((error) => createRuntimeClientError("describe", error));
|
|
359
341
|
},
|
|
360
|
-
fetchHistory: () =>
|
|
342
|
+
fetchHistory: () => {
|
|
343
|
+
return _swan_io_boxed.Future.fromPromise(workflowHandle.fetchHistory()).mapError((error) => createRuntimeClientError("fetchHistory", error));
|
|
344
|
+
}
|
|
361
345
|
};
|
|
362
346
|
}
|
|
363
347
|
};
|
|
348
|
+
function createRuntimeClientError(operation, error) {
|
|
349
|
+
return new RuntimeClientError(operation, error);
|
|
350
|
+
}
|
|
351
|
+
function createWorkflowNotFoundError(workflowName, contract) {
|
|
352
|
+
return new WorkflowNotFoundError(String(workflowName), Object.keys(contract.workflows));
|
|
353
|
+
}
|
|
354
|
+
function createWorkflowValidationError(workflowName, direction, issues) {
|
|
355
|
+
return new WorkflowValidationError(String(workflowName), direction, issues);
|
|
356
|
+
}
|
|
364
357
|
|
|
365
358
|
//#endregion
|
|
366
359
|
exports.QueryValidationError = QueryValidationError;
|
|
367
360
|
exports.SignalValidationError = SignalValidationError;
|
|
368
361
|
exports.TypedClient = TypedClient;
|
|
369
|
-
exports.TypedClientError = TypedClientError;
|
|
370
362
|
exports.UpdateValidationError = UpdateValidationError;
|
|
371
363
|
exports.WorkflowNotFoundError = WorkflowNotFoundError;
|
|
372
364
|
exports.WorkflowValidationError = WorkflowValidationError;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Client, WorkflowHandle, WorkflowStartOptions } from "@temporalio/client";
|
|
2
2
|
import { ActivityDefinition, AnySchema, ContractDefinition, QueryDefinition, SignalDefinition, UpdateDefinition, WorkflowDefinition } from "@temporal-contract/contract";
|
|
3
3
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
4
|
-
import { Future, Result } from "@
|
|
4
|
+
import { Future, Result } from "@swan-io/boxed";
|
|
5
5
|
|
|
6
6
|
//#region src/types.d.ts
|
|
7
7
|
|
|
@@ -85,8 +85,16 @@ type ClientInferWorkflowContextActivities<TContract extends ContractDefinition,
|
|
|
85
85
|
/**
|
|
86
86
|
* Base class for all typed client errors with boxed pattern
|
|
87
87
|
*/
|
|
88
|
-
declare class TypedClientError extends Error {
|
|
89
|
-
constructor(message: string);
|
|
88
|
+
declare abstract class TypedClientError extends Error {
|
|
89
|
+
protected constructor(message: string);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generic runtime failure wrapper when no specific error type applies
|
|
93
|
+
*/
|
|
94
|
+
declare class RuntimeClientError extends TypedClientError {
|
|
95
|
+
readonly operation: string;
|
|
96
|
+
readonly cause?: unknown | undefined;
|
|
97
|
+
constructor(operation: string, cause?: unknown | undefined);
|
|
90
98
|
}
|
|
91
99
|
/**
|
|
92
100
|
* Thrown when a workflow is not found in the contract
|
|
@@ -133,11 +141,9 @@ declare class UpdateValidationError extends TypedClientError {
|
|
|
133
141
|
}
|
|
134
142
|
//#endregion
|
|
135
143
|
//#region src/client.d.ts
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
*/
|
|
140
|
-
type TypedWorkflowStartOptions = Pick<WorkflowStartOptions, "workflowId" | "workflowIdReusePolicy" | "workflowExecutionTimeout" | "workflowRunTimeout" | "workflowTaskTimeout" | "retry" | "memo" | "searchAttributes" | "cronSchedule"> & Pick<WorkflowOptions, "workflowId">;
|
|
144
|
+
type TypedWorkflowStartOptions<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = Omit<WorkflowStartOptions, "taskQueue" | "args"> & {
|
|
145
|
+
args: ClientInferInput<TContract["workflows"][TWorkflowName]>;
|
|
146
|
+
};
|
|
141
147
|
/**
|
|
142
148
|
* Typed workflow handle with validated results using Result/Future pattern
|
|
143
149
|
*/
|
|
@@ -147,37 +153,37 @@ interface TypedWorkflowHandle<TWorkflow extends WorkflowDefinition> {
|
|
|
147
153
|
* Type-safe queries based on workflow definition with Result pattern
|
|
148
154
|
* Each query returns Future<Result<T, Error>> instead of Promise<T>
|
|
149
155
|
*/
|
|
150
|
-
queries: { [K in keyof ClientInferWorkflowQueries<TWorkflow>]: ClientInferWorkflowQueries<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R,
|
|
156
|
+
queries: { [K in keyof ClientInferWorkflowQueries<TWorkflow>]: ClientInferWorkflowQueries<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R, QueryValidationError | RuntimeClientError>> : never };
|
|
151
157
|
/**
|
|
152
158
|
* Type-safe signals based on workflow definition with Result pattern
|
|
153
159
|
* Each signal returns Future<Result<void, Error>> instead of Promise<void>
|
|
154
160
|
*/
|
|
155
|
-
signals: { [K in keyof ClientInferWorkflowSignals<TWorkflow>]: ClientInferWorkflowSignals<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<void, Error>>) ? (...args: Args) => Future<Result<void,
|
|
161
|
+
signals: { [K in keyof ClientInferWorkflowSignals<TWorkflow>]: ClientInferWorkflowSignals<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<void, Error>>) ? (...args: Args) => Future<Result<void, SignalValidationError | RuntimeClientError>> : never };
|
|
156
162
|
/**
|
|
157
163
|
* Type-safe updates based on workflow definition with Result pattern
|
|
158
164
|
* Each update returns Future<Result<T, Error>> instead of Promise<T>
|
|
159
165
|
*/
|
|
160
|
-
updates: { [K in keyof ClientInferWorkflowUpdates<TWorkflow>]: ClientInferWorkflowUpdates<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R,
|
|
166
|
+
updates: { [K in keyof ClientInferWorkflowUpdates<TWorkflow>]: ClientInferWorkflowUpdates<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R, UpdateValidationError | RuntimeClientError>> : never };
|
|
161
167
|
/**
|
|
162
168
|
* Get workflow result with Result pattern
|
|
163
169
|
*/
|
|
164
|
-
result: () => Future<Result<ClientInferOutput<TWorkflow>,
|
|
170
|
+
result: () => Future<Result<ClientInferOutput<TWorkflow>, WorkflowValidationError | RuntimeClientError>>;
|
|
165
171
|
/**
|
|
166
172
|
* Terminate workflow with Result pattern
|
|
167
173
|
*/
|
|
168
|
-
terminate: (reason?: string) => Future<Result<void,
|
|
174
|
+
terminate: (reason?: string) => Future<Result<void, RuntimeClientError>>;
|
|
169
175
|
/**
|
|
170
176
|
* Cancel workflow with Result pattern
|
|
171
177
|
*/
|
|
172
|
-
cancel: () => Future<Result<void,
|
|
178
|
+
cancel: () => Future<Result<void, RuntimeClientError>>;
|
|
173
179
|
/**
|
|
174
180
|
* Get workflow execution description including status and metadata
|
|
175
181
|
*/
|
|
176
|
-
describe: () => Future<Result<Awaited<ReturnType<WorkflowHandle["describe"]>>,
|
|
182
|
+
describe: () => Future<Result<Awaited<ReturnType<WorkflowHandle["describe"]>>, RuntimeClientError>>;
|
|
177
183
|
/**
|
|
178
184
|
* Fetch the workflow execution history
|
|
179
185
|
*/
|
|
180
|
-
fetchHistory: () => ReturnType<WorkflowHandle["fetchHistory"]
|
|
186
|
+
fetchHistory: () => Future<Result<Awaited<ReturnType<WorkflowHandle["fetchHistory"]>>, RuntimeClientError>>;
|
|
181
187
|
}
|
|
182
188
|
/**
|
|
183
189
|
* Typed Temporal client with Result/Future pattern based on a contract
|
|
@@ -211,7 +217,7 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
211
217
|
* });
|
|
212
218
|
* ```
|
|
213
219
|
*/
|
|
214
|
-
static create<TContract extends ContractDefinition>(contract: TContract,
|
|
220
|
+
static create<TContract extends ContractDefinition>(contract: TContract, client: Client): TypedClient<TContract>;
|
|
215
221
|
/**
|
|
216
222
|
* Start a workflow and return a typed handle with Future pattern
|
|
217
223
|
*
|
|
@@ -236,9 +242,7 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
236
242
|
startWorkflow<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, {
|
|
237
243
|
args,
|
|
238
244
|
...temporalOptions
|
|
239
|
-
}: TypedWorkflowStartOptions
|
|
240
|
-
args: ClientInferInput<TContract["workflows"][TWorkflowName]>;
|
|
241
|
-
}): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>, TypedClientError>>;
|
|
245
|
+
}: TypedWorkflowStartOptions<TContract, TWorkflowName>): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>, WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError>>;
|
|
242
246
|
/**
|
|
243
247
|
* Execute a workflow (start and wait for result) with Future/Result pattern
|
|
244
248
|
*
|
|
@@ -260,9 +264,7 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
260
264
|
executeWorkflow<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, {
|
|
261
265
|
args,
|
|
262
266
|
...temporalOptions
|
|
263
|
-
}: TypedWorkflowStartOptions
|
|
264
|
-
args: ClientInferInput<TContract["workflows"][TWorkflowName]>;
|
|
265
|
-
}): Future<Result<ClientInferOutput<TContract["workflows"][TWorkflowName]>, TypedClientError>>;
|
|
267
|
+
}: TypedWorkflowStartOptions<TContract, TWorkflowName>): Future<Result<ClientInferOutput<TContract["workflows"][TWorkflowName]>, WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError>>;
|
|
266
268
|
/**
|
|
267
269
|
* Get a handle to an existing workflow with Future/Result pattern
|
|
268
270
|
*
|
|
@@ -278,8 +280,8 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
278
280
|
* });
|
|
279
281
|
* ```
|
|
280
282
|
*/
|
|
281
|
-
getHandle<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, workflowId: string): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>,
|
|
283
|
+
getHandle<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, workflowId: string): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>, WorkflowNotFoundError | RuntimeClientError>>;
|
|
282
284
|
private createTypedHandle;
|
|
283
285
|
}
|
|
284
286
|
//#endregion
|
|
285
|
-
export { type ClientInferActivities, type ClientInferActivity, type ClientInferInput, type ClientInferOutput, type ClientInferQuery, type ClientInferSignal, type ClientInferUpdate, type ClientInferWorkflow, type ClientInferWorkflowActivities, type ClientInferWorkflowContextActivities, type ClientInferWorkflowQueries, type ClientInferWorkflowSignals, type ClientInferWorkflowUpdates, type ClientInferWorkflows, QueryValidationError, SignalValidationError, TypedClient,
|
|
287
|
+
export { type ClientInferActivities, type ClientInferActivity, type ClientInferInput, type ClientInferOutput, type ClientInferQuery, type ClientInferSignal, type ClientInferUpdate, type ClientInferWorkflow, type ClientInferWorkflowActivities, type ClientInferWorkflowContextActivities, type ClientInferWorkflowQueries, type ClientInferWorkflowSignals, type ClientInferWorkflowUpdates, type ClientInferWorkflows, QueryValidationError, SignalValidationError, TypedClient, type TypedWorkflowHandle, type TypedWorkflowStartOptions, UpdateValidationError, WorkflowNotFoundError, WorkflowValidationError };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Future, Result } from "@swan-io/boxed";
|
|
2
|
+
import { Client, WorkflowHandle, WorkflowStartOptions } from "@temporalio/client";
|
|
3
3
|
import { ActivityDefinition, AnySchema, ContractDefinition, QueryDefinition, SignalDefinition, UpdateDefinition, WorkflowDefinition } from "@temporal-contract/contract";
|
|
4
4
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
5
5
|
|
|
@@ -85,8 +85,16 @@ type ClientInferWorkflowContextActivities<TContract extends ContractDefinition,
|
|
|
85
85
|
/**
|
|
86
86
|
* Base class for all typed client errors with boxed pattern
|
|
87
87
|
*/
|
|
88
|
-
declare class TypedClientError extends Error {
|
|
89
|
-
constructor(message: string);
|
|
88
|
+
declare abstract class TypedClientError extends Error {
|
|
89
|
+
protected constructor(message: string);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Generic runtime failure wrapper when no specific error type applies
|
|
93
|
+
*/
|
|
94
|
+
declare class RuntimeClientError extends TypedClientError {
|
|
95
|
+
readonly operation: string;
|
|
96
|
+
readonly cause?: unknown | undefined;
|
|
97
|
+
constructor(operation: string, cause?: unknown | undefined);
|
|
90
98
|
}
|
|
91
99
|
/**
|
|
92
100
|
* Thrown when a workflow is not found in the contract
|
|
@@ -133,11 +141,9 @@ declare class UpdateValidationError extends TypedClientError {
|
|
|
133
141
|
}
|
|
134
142
|
//#endregion
|
|
135
143
|
//#region src/client.d.ts
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
*/
|
|
140
|
-
type TypedWorkflowStartOptions = Pick<WorkflowStartOptions, "workflowId" | "workflowIdReusePolicy" | "workflowExecutionTimeout" | "workflowRunTimeout" | "workflowTaskTimeout" | "retry" | "memo" | "searchAttributes" | "cronSchedule"> & Pick<WorkflowOptions, "workflowId">;
|
|
144
|
+
type TypedWorkflowStartOptions<TContract extends ContractDefinition, TWorkflowName extends keyof TContract["workflows"]> = Omit<WorkflowStartOptions, "taskQueue" | "args"> & {
|
|
145
|
+
args: ClientInferInput<TContract["workflows"][TWorkflowName]>;
|
|
146
|
+
};
|
|
141
147
|
/**
|
|
142
148
|
* Typed workflow handle with validated results using Result/Future pattern
|
|
143
149
|
*/
|
|
@@ -147,37 +153,37 @@ interface TypedWorkflowHandle<TWorkflow extends WorkflowDefinition> {
|
|
|
147
153
|
* Type-safe queries based on workflow definition with Result pattern
|
|
148
154
|
* Each query returns Future<Result<T, Error>> instead of Promise<T>
|
|
149
155
|
*/
|
|
150
|
-
queries: { [K in keyof ClientInferWorkflowQueries<TWorkflow>]: ClientInferWorkflowQueries<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R,
|
|
156
|
+
queries: { [K in keyof ClientInferWorkflowQueries<TWorkflow>]: ClientInferWorkflowQueries<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R, QueryValidationError | RuntimeClientError>> : never };
|
|
151
157
|
/**
|
|
152
158
|
* Type-safe signals based on workflow definition with Result pattern
|
|
153
159
|
* Each signal returns Future<Result<void, Error>> instead of Promise<void>
|
|
154
160
|
*/
|
|
155
|
-
signals: { [K in keyof ClientInferWorkflowSignals<TWorkflow>]: ClientInferWorkflowSignals<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<void, Error>>) ? (...args: Args) => Future<Result<void,
|
|
161
|
+
signals: { [K in keyof ClientInferWorkflowSignals<TWorkflow>]: ClientInferWorkflowSignals<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<void, Error>>) ? (...args: Args) => Future<Result<void, SignalValidationError | RuntimeClientError>> : never };
|
|
156
162
|
/**
|
|
157
163
|
* Type-safe updates based on workflow definition with Result pattern
|
|
158
164
|
* Each update returns Future<Result<T, Error>> instead of Promise<T>
|
|
159
165
|
*/
|
|
160
|
-
updates: { [K in keyof ClientInferWorkflowUpdates<TWorkflow>]: ClientInferWorkflowUpdates<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R,
|
|
166
|
+
updates: { [K in keyof ClientInferWorkflowUpdates<TWorkflow>]: ClientInferWorkflowUpdates<TWorkflow>[K] extends ((...args: infer Args) => Future<Result<infer R, Error>>) ? (...args: Args) => Future<Result<R, UpdateValidationError | RuntimeClientError>> : never };
|
|
161
167
|
/**
|
|
162
168
|
* Get workflow result with Result pattern
|
|
163
169
|
*/
|
|
164
|
-
result: () => Future<Result<ClientInferOutput<TWorkflow>,
|
|
170
|
+
result: () => Future<Result<ClientInferOutput<TWorkflow>, WorkflowValidationError | RuntimeClientError>>;
|
|
165
171
|
/**
|
|
166
172
|
* Terminate workflow with Result pattern
|
|
167
173
|
*/
|
|
168
|
-
terminate: (reason?: string) => Future<Result<void,
|
|
174
|
+
terminate: (reason?: string) => Future<Result<void, RuntimeClientError>>;
|
|
169
175
|
/**
|
|
170
176
|
* Cancel workflow with Result pattern
|
|
171
177
|
*/
|
|
172
|
-
cancel: () => Future<Result<void,
|
|
178
|
+
cancel: () => Future<Result<void, RuntimeClientError>>;
|
|
173
179
|
/**
|
|
174
180
|
* Get workflow execution description including status and metadata
|
|
175
181
|
*/
|
|
176
|
-
describe: () => Future<Result<Awaited<ReturnType<WorkflowHandle["describe"]>>,
|
|
182
|
+
describe: () => Future<Result<Awaited<ReturnType<WorkflowHandle["describe"]>>, RuntimeClientError>>;
|
|
177
183
|
/**
|
|
178
184
|
* Fetch the workflow execution history
|
|
179
185
|
*/
|
|
180
|
-
fetchHistory: () => ReturnType<WorkflowHandle["fetchHistory"]
|
|
186
|
+
fetchHistory: () => Future<Result<Awaited<ReturnType<WorkflowHandle["fetchHistory"]>>, RuntimeClientError>>;
|
|
181
187
|
}
|
|
182
188
|
/**
|
|
183
189
|
* Typed Temporal client with Result/Future pattern based on a contract
|
|
@@ -211,7 +217,7 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
211
217
|
* });
|
|
212
218
|
* ```
|
|
213
219
|
*/
|
|
214
|
-
static create<TContract extends ContractDefinition>(contract: TContract,
|
|
220
|
+
static create<TContract extends ContractDefinition>(contract: TContract, client: Client): TypedClient<TContract>;
|
|
215
221
|
/**
|
|
216
222
|
* Start a workflow and return a typed handle with Future pattern
|
|
217
223
|
*
|
|
@@ -236,9 +242,7 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
236
242
|
startWorkflow<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, {
|
|
237
243
|
args,
|
|
238
244
|
...temporalOptions
|
|
239
|
-
}: TypedWorkflowStartOptions
|
|
240
|
-
args: ClientInferInput<TContract["workflows"][TWorkflowName]>;
|
|
241
|
-
}): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>, TypedClientError>>;
|
|
245
|
+
}: TypedWorkflowStartOptions<TContract, TWorkflowName>): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>, WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError>>;
|
|
242
246
|
/**
|
|
243
247
|
* Execute a workflow (start and wait for result) with Future/Result pattern
|
|
244
248
|
*
|
|
@@ -260,9 +264,7 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
260
264
|
executeWorkflow<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, {
|
|
261
265
|
args,
|
|
262
266
|
...temporalOptions
|
|
263
|
-
}: TypedWorkflowStartOptions
|
|
264
|
-
args: ClientInferInput<TContract["workflows"][TWorkflowName]>;
|
|
265
|
-
}): Future<Result<ClientInferOutput<TContract["workflows"][TWorkflowName]>, TypedClientError>>;
|
|
267
|
+
}: TypedWorkflowStartOptions<TContract, TWorkflowName>): Future<Result<ClientInferOutput<TContract["workflows"][TWorkflowName]>, WorkflowNotFoundError | WorkflowValidationError | RuntimeClientError>>;
|
|
266
268
|
/**
|
|
267
269
|
* Get a handle to an existing workflow with Future/Result pattern
|
|
268
270
|
*
|
|
@@ -278,8 +280,8 @@ declare class TypedClient<TContract extends ContractDefinition> {
|
|
|
278
280
|
* });
|
|
279
281
|
* ```
|
|
280
282
|
*/
|
|
281
|
-
getHandle<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, workflowId: string): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>,
|
|
283
|
+
getHandle<TWorkflowName extends keyof TContract["workflows"]>(workflowName: TWorkflowName, workflowId: string): Future<Result<TypedWorkflowHandle<TContract["workflows"][TWorkflowName]>, WorkflowNotFoundError | RuntimeClientError>>;
|
|
282
284
|
private createTypedHandle;
|
|
283
285
|
}
|
|
284
286
|
//#endregion
|
|
285
|
-
export { type ClientInferActivities, type ClientInferActivity, type ClientInferInput, type ClientInferOutput, type ClientInferQuery, type ClientInferSignal, type ClientInferUpdate, type ClientInferWorkflow, type ClientInferWorkflowActivities, type ClientInferWorkflowContextActivities, type ClientInferWorkflowQueries, type ClientInferWorkflowSignals, type ClientInferWorkflowUpdates, type ClientInferWorkflows, QueryValidationError, SignalValidationError, TypedClient,
|
|
287
|
+
export { type ClientInferActivities, type ClientInferActivity, type ClientInferInput, type ClientInferOutput, type ClientInferQuery, type ClientInferSignal, type ClientInferUpdate, type ClientInferWorkflow, type ClientInferWorkflowActivities, type ClientInferWorkflowContextActivities, type ClientInferWorkflowQueries, type ClientInferWorkflowSignals, type ClientInferWorkflowUpdates, type ClientInferWorkflows, QueryValidationError, SignalValidationError, TypedClient, type TypedWorkflowHandle, type TypedWorkflowStartOptions, UpdateValidationError, WorkflowNotFoundError, WorkflowValidationError };
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Future, Result } from "@temporal-contract/boxed";
|
|
1
|
+
import { Future, Result } from "@swan-io/boxed";
|
|
3
2
|
|
|
4
3
|
//#region src/errors.ts
|
|
5
4
|
/**
|
|
@@ -13,6 +12,16 @@ var TypedClientError = class extends Error {
|
|
|
13
12
|
}
|
|
14
13
|
};
|
|
15
14
|
/**
|
|
15
|
+
* Generic runtime failure wrapper when no specific error type applies
|
|
16
|
+
*/
|
|
17
|
+
var RuntimeClientError = class extends TypedClientError {
|
|
18
|
+
constructor(operation, cause) {
|
|
19
|
+
super(`Operation "${operation}" failed: ${cause instanceof Error ? cause.message : String(cause ?? "unknown error")}`);
|
|
20
|
+
this.operation = operation;
|
|
21
|
+
this.cause = cause;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
16
25
|
* Thrown when a workflow is not found in the contract
|
|
17
26
|
*/
|
|
18
27
|
var WorkflowNotFoundError = class extends TypedClientError {
|
|
@@ -101,8 +110,8 @@ var TypedClient = class TypedClient {
|
|
|
101
110
|
* });
|
|
102
111
|
* ```
|
|
103
112
|
*/
|
|
104
|
-
static create(contract,
|
|
105
|
-
return new TypedClient(contract,
|
|
113
|
+
static create(contract, client) {
|
|
114
|
+
return new TypedClient(contract, client);
|
|
106
115
|
}
|
|
107
116
|
/**
|
|
108
117
|
* Start a workflow and return a typed handle with Future pattern
|
|
@@ -127,15 +136,15 @@ var TypedClient = class TypedClient {
|
|
|
127
136
|
*/
|
|
128
137
|
startWorkflow(workflowName, { args, ...temporalOptions }) {
|
|
129
138
|
return Future.make((resolve) => {
|
|
130
|
-
const definition = this.contract.workflows[workflowName];
|
|
131
|
-
if (!definition) {
|
|
132
|
-
resolve(Result.Error(new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows))));
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
139
|
(async () => {
|
|
140
|
+
const definition = this.contract.workflows[workflowName];
|
|
141
|
+
if (!definition) {
|
|
142
|
+
resolve(Result.Error(createWorkflowNotFoundError(workflowName, this.contract)));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
136
145
|
const inputResult = await definition.input["~standard"].validate(args);
|
|
137
146
|
if (inputResult.issues) {
|
|
138
|
-
resolve(Result.Error(
|
|
147
|
+
resolve(Result.Error(createWorkflowValidationError(workflowName, "input", inputResult.issues)));
|
|
139
148
|
return;
|
|
140
149
|
}
|
|
141
150
|
const validatedInput = inputResult.value;
|
|
@@ -148,7 +157,7 @@ var TypedClient = class TypedClient {
|
|
|
148
157
|
const typedHandle = this.createTypedHandle(handle, definition);
|
|
149
158
|
resolve(Result.Ok(typedHandle));
|
|
150
159
|
} catch (error) {
|
|
151
|
-
resolve(Result.Error(
|
|
160
|
+
resolve(Result.Error(createRuntimeClientError("startWorkflow", error)));
|
|
152
161
|
}
|
|
153
162
|
})();
|
|
154
163
|
});
|
|
@@ -173,15 +182,15 @@ var TypedClient = class TypedClient {
|
|
|
173
182
|
*/
|
|
174
183
|
executeWorkflow(workflowName, { args, ...temporalOptions }) {
|
|
175
184
|
return Future.make((resolve) => {
|
|
176
|
-
const definition = this.contract.workflows[workflowName];
|
|
177
|
-
if (!definition) {
|
|
178
|
-
resolve(Result.Error(new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows))));
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
185
|
(async () => {
|
|
186
|
+
const definition = this.contract.workflows[workflowName];
|
|
187
|
+
if (!definition) {
|
|
188
|
+
resolve(Result.Error(createWorkflowNotFoundError(workflowName, this.contract)));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
182
191
|
const inputResult = await definition.input["~standard"].validate(args);
|
|
183
192
|
if (inputResult.issues) {
|
|
184
|
-
resolve(Result.Error(
|
|
193
|
+
resolve(Result.Error(createWorkflowValidationError(workflowName, "input", inputResult.issues)));
|
|
185
194
|
return;
|
|
186
195
|
}
|
|
187
196
|
const validatedInput = inputResult.value;
|
|
@@ -193,12 +202,12 @@ var TypedClient = class TypedClient {
|
|
|
193
202
|
});
|
|
194
203
|
const outputResult = await definition.output["~standard"].validate(result);
|
|
195
204
|
if (outputResult.issues) {
|
|
196
|
-
resolve(Result.Error(
|
|
205
|
+
resolve(Result.Error(createWorkflowValidationError(workflowName, "output", outputResult.issues)));
|
|
197
206
|
return;
|
|
198
207
|
}
|
|
199
208
|
resolve(Result.Ok(outputResult.value));
|
|
200
209
|
} catch (error) {
|
|
201
|
-
resolve(Result.Error(
|
|
210
|
+
resolve(Result.Error(createRuntimeClientError("executeWorkflow", error)));
|
|
202
211
|
}
|
|
203
212
|
})();
|
|
204
213
|
});
|
|
@@ -222,7 +231,7 @@ var TypedClient = class TypedClient {
|
|
|
222
231
|
return Future.make((resolve) => {
|
|
223
232
|
const definition = this.contract.workflows[workflowName];
|
|
224
233
|
if (!definition) {
|
|
225
|
-
resolve(Result.Error(
|
|
234
|
+
resolve(Result.Error(createWorkflowNotFoundError(workflowName, this.contract)));
|
|
226
235
|
return;
|
|
227
236
|
}
|
|
228
237
|
try {
|
|
@@ -230,11 +239,11 @@ var TypedClient = class TypedClient {
|
|
|
230
239
|
const typedHandle = this.createTypedHandle(handle, definition);
|
|
231
240
|
resolve(Result.Ok(typedHandle));
|
|
232
241
|
} catch (error) {
|
|
233
|
-
resolve(Result.Error(
|
|
242
|
+
resolve(Result.Error(createRuntimeClientError("getHandle", error)));
|
|
234
243
|
}
|
|
235
244
|
});
|
|
236
245
|
}
|
|
237
|
-
createTypedHandle(
|
|
246
|
+
createTypedHandle(workflowHandle, definition) {
|
|
238
247
|
const queries = {};
|
|
239
248
|
for (const [queryName, queryDef] of Object.entries(definition.queries ?? {})) queries[queryName] = (args) => {
|
|
240
249
|
return Future.make((resolve) => {
|
|
@@ -245,7 +254,7 @@ var TypedClient = class TypedClient {
|
|
|
245
254
|
return;
|
|
246
255
|
}
|
|
247
256
|
try {
|
|
248
|
-
const result = await
|
|
257
|
+
const result = await workflowHandle.query(queryName, inputResult.value);
|
|
249
258
|
const outputResult = await queryDef.output["~standard"].validate(result);
|
|
250
259
|
if (outputResult.issues) {
|
|
251
260
|
resolve(Result.Error(new QueryValidationError(queryName, "output", outputResult.issues)));
|
|
@@ -253,7 +262,7 @@ var TypedClient = class TypedClient {
|
|
|
253
262
|
}
|
|
254
263
|
resolve(Result.Ok(outputResult.value));
|
|
255
264
|
} catch (error) {
|
|
256
|
-
resolve(Result.Error(
|
|
265
|
+
resolve(Result.Error(createRuntimeClientError("query", error)));
|
|
257
266
|
}
|
|
258
267
|
})();
|
|
259
268
|
});
|
|
@@ -268,10 +277,10 @@ var TypedClient = class TypedClient {
|
|
|
268
277
|
return;
|
|
269
278
|
}
|
|
270
279
|
try {
|
|
271
|
-
await
|
|
280
|
+
await workflowHandle.signal(signalName, inputResult.value);
|
|
272
281
|
resolve(Result.Ok(void 0));
|
|
273
282
|
} catch (error) {
|
|
274
|
-
resolve(Result.Error(
|
|
283
|
+
resolve(Result.Error(createRuntimeClientError("signal", error)));
|
|
275
284
|
}
|
|
276
285
|
})();
|
|
277
286
|
});
|
|
@@ -286,7 +295,7 @@ var TypedClient = class TypedClient {
|
|
|
286
295
|
return;
|
|
287
296
|
}
|
|
288
297
|
try {
|
|
289
|
-
const result = await
|
|
298
|
+
const result = await workflowHandle.executeUpdate(updateName, { args: [inputResult.value] });
|
|
290
299
|
const outputResult = await updateDef.output["~standard"].validate(result);
|
|
291
300
|
if (outputResult.issues) {
|
|
292
301
|
resolve(Result.Error(new UpdateValidationError(updateName, "output", outputResult.issues)));
|
|
@@ -294,13 +303,13 @@ var TypedClient = class TypedClient {
|
|
|
294
303
|
}
|
|
295
304
|
resolve(Result.Ok(outputResult.value));
|
|
296
305
|
} catch (error) {
|
|
297
|
-
resolve(Result.Error(
|
|
306
|
+
resolve(Result.Error(createRuntimeClientError("update", error)));
|
|
298
307
|
}
|
|
299
308
|
})();
|
|
300
309
|
});
|
|
301
310
|
};
|
|
302
311
|
return {
|
|
303
|
-
workflowId:
|
|
312
|
+
workflowId: workflowHandle.workflowId,
|
|
304
313
|
queries,
|
|
305
314
|
signals,
|
|
306
315
|
updates,
|
|
@@ -308,59 +317,43 @@ var TypedClient = class TypedClient {
|
|
|
308
317
|
return Future.make((resolve) => {
|
|
309
318
|
(async () => {
|
|
310
319
|
try {
|
|
311
|
-
const result = await
|
|
320
|
+
const result = await workflowHandle.result();
|
|
312
321
|
const outputResult = await definition.output["~standard"].validate(result);
|
|
313
322
|
if (outputResult.issues) {
|
|
314
|
-
resolve(Result.Error(new WorkflowValidationError(
|
|
323
|
+
resolve(Result.Error(new WorkflowValidationError(workflowHandle.workflowId, "output", outputResult.issues)));
|
|
315
324
|
return;
|
|
316
325
|
}
|
|
317
326
|
resolve(Result.Ok(outputResult.value));
|
|
318
327
|
} catch (error) {
|
|
319
|
-
resolve(Result.Error(
|
|
328
|
+
resolve(Result.Error(createRuntimeClientError("result", error)));
|
|
320
329
|
}
|
|
321
330
|
})();
|
|
322
331
|
});
|
|
323
332
|
},
|
|
324
333
|
terminate: (reason) => {
|
|
325
|
-
return Future.
|
|
326
|
-
(async () => {
|
|
327
|
-
try {
|
|
328
|
-
await handle.terminate(reason);
|
|
329
|
-
resolve(Result.Ok(void 0));
|
|
330
|
-
} catch (error) {
|
|
331
|
-
resolve(Result.Error(new TypedClientError(`Terminate failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
332
|
-
}
|
|
333
|
-
})();
|
|
334
|
-
});
|
|
334
|
+
return Future.fromPromise(workflowHandle.terminate(reason)).mapError((error) => createRuntimeClientError("terminate", error)).mapOk(() => void 0);
|
|
335
335
|
},
|
|
336
336
|
cancel: () => {
|
|
337
|
-
return Future.
|
|
338
|
-
(async () => {
|
|
339
|
-
try {
|
|
340
|
-
await handle.cancel();
|
|
341
|
-
resolve(Result.Ok(void 0));
|
|
342
|
-
} catch (error) {
|
|
343
|
-
resolve(Result.Error(new TypedClientError(`Cancel failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
344
|
-
}
|
|
345
|
-
})();
|
|
346
|
-
});
|
|
337
|
+
return Future.fromPromise(workflowHandle.cancel()).mapError((error) => createRuntimeClientError("cancel", error)).mapOk(() => void 0);
|
|
347
338
|
},
|
|
348
339
|
describe: () => {
|
|
349
|
-
return Future.
|
|
350
|
-
(async () => {
|
|
351
|
-
try {
|
|
352
|
-
const description = await handle.describe();
|
|
353
|
-
resolve(Result.Ok(description));
|
|
354
|
-
} catch (error) {
|
|
355
|
-
resolve(Result.Error(new TypedClientError(`Describe failed: ${error instanceof Error ? error.message : String(error)}`)));
|
|
356
|
-
}
|
|
357
|
-
})();
|
|
358
|
-
});
|
|
340
|
+
return Future.fromPromise(workflowHandle.describe()).mapError((error) => createRuntimeClientError("describe", error));
|
|
359
341
|
},
|
|
360
|
-
fetchHistory: () =>
|
|
342
|
+
fetchHistory: () => {
|
|
343
|
+
return Future.fromPromise(workflowHandle.fetchHistory()).mapError((error) => createRuntimeClientError("fetchHistory", error));
|
|
344
|
+
}
|
|
361
345
|
};
|
|
362
346
|
}
|
|
363
347
|
};
|
|
348
|
+
function createRuntimeClientError(operation, error) {
|
|
349
|
+
return new RuntimeClientError(operation, error);
|
|
350
|
+
}
|
|
351
|
+
function createWorkflowNotFoundError(workflowName, contract) {
|
|
352
|
+
return new WorkflowNotFoundError(String(workflowName), Object.keys(contract.workflows));
|
|
353
|
+
}
|
|
354
|
+
function createWorkflowValidationError(workflowName, direction, issues) {
|
|
355
|
+
return new WorkflowValidationError(String(workflowName), direction, issues);
|
|
356
|
+
}
|
|
364
357
|
|
|
365
358
|
//#endregion
|
|
366
|
-
export { QueryValidationError, SignalValidationError, TypedClient,
|
|
359
|
+
export { QueryValidationError, SignalValidationError, TypedClient, UpdateValidationError, WorkflowNotFoundError, WorkflowValidationError };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@temporal-contract/client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "Client utilities with Result/Future pattern for consuming temporal-contract workflows",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"client",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"directory": "packages/client"
|
|
21
21
|
},
|
|
22
22
|
"license": "MIT",
|
|
23
|
-
"author": "Benoit TRAVERS <benoit.travers.
|
|
23
|
+
"author": "Benoit TRAVERS <benoit.travers.fr@gmail.com>",
|
|
24
24
|
"type": "module",
|
|
25
25
|
"exports": {
|
|
26
26
|
".": {
|
|
@@ -43,18 +43,21 @@
|
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@standard-schema/spec": "1.1.0",
|
|
46
|
-
"@
|
|
47
|
-
"@temporal-contract/contract": "0.0.
|
|
46
|
+
"@swan-io/boxed": "3.2.1",
|
|
47
|
+
"@temporal-contract/contract": "0.0.7"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@temporalio/client": "1.
|
|
51
|
-
"@
|
|
50
|
+
"@temporalio/client": "1.14.0",
|
|
51
|
+
"@temporalio/worker": "1.14.0",
|
|
52
|
+
"@temporalio/workflow": "1.14.0",
|
|
53
|
+
"@types/node": "25.0.3",
|
|
52
54
|
"@vitest/coverage-v8": "4.0.16",
|
|
53
|
-
"tsdown": "0.18.
|
|
55
|
+
"tsdown": "0.18.1",
|
|
54
56
|
"typescript": "5.9.3",
|
|
55
57
|
"vitest": "4.0.16",
|
|
56
58
|
"zod": "4.2.1",
|
|
57
|
-
"@temporal-contract/
|
|
59
|
+
"@temporal-contract/testing": "0.0.7",
|
|
60
|
+
"@temporal-contract/tsconfig": "0.0.7"
|
|
58
61
|
},
|
|
59
62
|
"peerDependencies": {
|
|
60
63
|
"@temporalio/client": "^1"
|
|
@@ -62,8 +65,9 @@
|
|
|
62
65
|
"scripts": {
|
|
63
66
|
"build": "tsdown src/index.ts --format cjs,esm --dts --clean",
|
|
64
67
|
"dev": "tsdown src/index.ts --format cjs,esm --dts --watch",
|
|
65
|
-
"test": "vitest run",
|
|
66
|
-
"test:
|
|
68
|
+
"test": "vitest run --project unit",
|
|
69
|
+
"test:integration": "vitest run --project integration",
|
|
70
|
+
"test:watch": "vitest --project unit",
|
|
67
71
|
"typecheck": "tsc --noEmit"
|
|
68
72
|
}
|
|
69
73
|
}
|