@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 CHANGED
@@ -1,5 +1,4 @@
1
- let __temporalio_client = require("@temporalio/client");
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, options) {
105
- return new TypedClient(contract, new __temporalio_client.Client(options));
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 __temporal_contract_boxed.Future.make((resolve) => {
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(__temporal_contract_boxed.Result.Error(new WorkflowValidationError(String(workflowName), "input", inputResult.issues)));
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(__temporal_contract_boxed.Result.Ok(typedHandle));
158
+ resolve(_swan_io_boxed.Result.Ok(typedHandle));
150
159
  } catch (error) {
151
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Failed to start workflow: ${error instanceof Error ? error.message : String(error)}`)));
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 __temporal_contract_boxed.Future.make((resolve) => {
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(__temporal_contract_boxed.Result.Error(new WorkflowValidationError(String(workflowName), "input", inputResult.issues)));
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(__temporal_contract_boxed.Result.Error(new WorkflowValidationError(String(workflowName), "output", outputResult.issues)));
205
+ resolve(_swan_io_boxed.Result.Error(createWorkflowValidationError(workflowName, "output", outputResult.issues)));
197
206
  return;
198
207
  }
199
- resolve(__temporal_contract_boxed.Result.Ok(outputResult.value));
208
+ resolve(_swan_io_boxed.Result.Ok(outputResult.value));
200
209
  } catch (error) {
201
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Failed to execute workflow: ${error instanceof Error ? error.message : String(error)}`)));
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 __temporal_contract_boxed.Future.make((resolve) => {
231
+ return _swan_io_boxed.Future.make((resolve) => {
223
232
  const definition = this.contract.workflows[workflowName];
224
233
  if (!definition) {
225
- resolve(__temporal_contract_boxed.Result.Error(new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows))));
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(__temporal_contract_boxed.Result.Ok(typedHandle));
240
+ resolve(_swan_io_boxed.Result.Ok(typedHandle));
232
241
  } catch (error) {
233
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Failed to get workflow handle: ${error instanceof Error ? error.message : String(error)}`)));
242
+ resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("getHandle", error)));
234
243
  }
235
244
  });
236
245
  }
237
- createTypedHandle(handle, definition) {
246
+ createTypedHandle(workflowHandle, definition) {
238
247
  const queries = {};
239
248
  for (const [queryName, queryDef] of Object.entries(definition.queries ?? {})) queries[queryName] = (args) => {
240
- return __temporal_contract_boxed.Future.make((resolve) => {
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(__temporal_contract_boxed.Result.Error(new QueryValidationError(queryName, "input", inputResult.issues)));
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 handle.query(queryName, inputResult.value);
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(__temporal_contract_boxed.Result.Error(new QueryValidationError(queryName, "output", outputResult.issues)));
260
+ resolve(_swan_io_boxed.Result.Error(new QueryValidationError(queryName, "output", outputResult.issues)));
252
261
  return;
253
262
  }
254
- resolve(__temporal_contract_boxed.Result.Ok(outputResult.value));
263
+ resolve(_swan_io_boxed.Result.Ok(outputResult.value));
255
264
  } catch (error) {
256
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Query failed: ${error instanceof Error ? error.message : String(error)}`)));
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 __temporal_contract_boxed.Future.make((resolve) => {
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(__temporal_contract_boxed.Result.Error(new SignalValidationError(signalName, inputResult.issues)));
276
+ resolve(_swan_io_boxed.Result.Error(new SignalValidationError(signalName, inputResult.issues)));
268
277
  return;
269
278
  }
270
279
  try {
271
- await handle.signal(signalName, inputResult.value);
272
- resolve(__temporal_contract_boxed.Result.Ok(void 0));
280
+ await workflowHandle.signal(signalName, inputResult.value);
281
+ resolve(_swan_io_boxed.Result.Ok(void 0));
273
282
  } catch (error) {
274
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Signal failed: ${error instanceof Error ? error.message : String(error)}`)));
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 __temporal_contract_boxed.Future.make((resolve) => {
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(__temporal_contract_boxed.Result.Error(new UpdateValidationError(updateName, "input", inputResult.issues)));
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 handle.executeUpdate(updateName, { args: [inputResult.value] });
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(__temporal_contract_boxed.Result.Error(new UpdateValidationError(updateName, "output", outputResult.issues)));
301
+ resolve(_swan_io_boxed.Result.Error(new UpdateValidationError(updateName, "output", outputResult.issues)));
293
302
  return;
294
303
  }
295
- resolve(__temporal_contract_boxed.Result.Ok(outputResult.value));
304
+ resolve(_swan_io_boxed.Result.Ok(outputResult.value));
296
305
  } catch (error) {
297
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Update failed: ${error instanceof Error ? error.message : String(error)}`)));
306
+ resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("update", error)));
298
307
  }
299
308
  })();
300
309
  });
301
310
  };
302
311
  return {
303
- workflowId: handle.workflowId,
312
+ workflowId: workflowHandle.workflowId,
304
313
  queries,
305
314
  signals,
306
315
  updates,
307
316
  result: () => {
308
- return __temporal_contract_boxed.Future.make((resolve) => {
317
+ return _swan_io_boxed.Future.make((resolve) => {
309
318
  (async () => {
310
319
  try {
311
- const result = await handle.result();
320
+ const result = await workflowHandle.result();
312
321
  const outputResult = await definition.output["~standard"].validate(result);
313
322
  if (outputResult.issues) {
314
- resolve(__temporal_contract_boxed.Result.Error(new WorkflowValidationError(handle.workflowId, "output", outputResult.issues)));
323
+ resolve(_swan_io_boxed.Result.Error(new WorkflowValidationError(workflowHandle.workflowId, "output", outputResult.issues)));
315
324
  return;
316
325
  }
317
- resolve(__temporal_contract_boxed.Result.Ok(outputResult.value));
326
+ resolve(_swan_io_boxed.Result.Ok(outputResult.value));
318
327
  } catch (error) {
319
- resolve(__temporal_contract_boxed.Result.Error(new TypedClientError(`Workflow execution failed: ${error instanceof Error ? error.message : String(error)}`)));
328
+ resolve(_swan_io_boxed.Result.Error(createRuntimeClientError("result", error)));
320
329
  }
321
330
  })();
322
331
  });
323
332
  },
324
333
  terminate: (reason) => {
325
- return __temporal_contract_boxed.Future.make((resolve) => {
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 __temporal_contract_boxed.Future.make((resolve) => {
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 __temporal_contract_boxed.Future.make((resolve) => {
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: () => handle.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 { ClientOptions, WorkflowHandle, WorkflowOptions, WorkflowStartOptions } from "@temporalio/client";
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 "@temporal-contract/boxed";
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
- * Extended options for starting workflows with Temporal-specific features
138
- * Combines required workflowId with optional Temporal workflow options
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, TypedClientError>> : never };
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, TypedClientError>> : never };
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, TypedClientError>> : never };
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>, TypedClientError>>;
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, TypedClientError>>;
174
+ terminate: (reason?: string) => Future<Result<void, RuntimeClientError>>;
169
175
  /**
170
176
  * Cancel workflow with Result pattern
171
177
  */
172
- cancel: () => Future<Result<void, TypedClientError>>;
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"]>>, TypedClientError>>;
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, options: ClientOptions): TypedClient<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]>, TypedClientError>>;
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, TypedClientError, type TypedWorkflowHandle, type TypedWorkflowStartOptions, UpdateValidationError, WorkflowNotFoundError, WorkflowValidationError };
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 { ClientOptions, WorkflowHandle, WorkflowOptions, WorkflowStartOptions } from "@temporalio/client";
2
- import { Future, Result } from "@temporal-contract/boxed";
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
- * Extended options for starting workflows with Temporal-specific features
138
- * Combines required workflowId with optional Temporal workflow options
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, TypedClientError>> : never };
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, TypedClientError>> : never };
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, TypedClientError>> : never };
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>, TypedClientError>>;
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, TypedClientError>>;
174
+ terminate: (reason?: string) => Future<Result<void, RuntimeClientError>>;
169
175
  /**
170
176
  * Cancel workflow with Result pattern
171
177
  */
172
- cancel: () => Future<Result<void, TypedClientError>>;
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"]>>, TypedClientError>>;
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, options: ClientOptions): TypedClient<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]>, TypedClientError>>;
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, TypedClientError, type TypedWorkflowHandle, type TypedWorkflowStartOptions, UpdateValidationError, WorkflowNotFoundError, WorkflowValidationError };
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 { Client } from "@temporalio/client";
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, options) {
105
- return new TypedClient(contract, new Client(options));
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(new WorkflowValidationError(String(workflowName), "input", inputResult.issues)));
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(new TypedClientError(`Failed to start workflow: ${error instanceof Error ? error.message : String(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(new WorkflowValidationError(String(workflowName), "input", inputResult.issues)));
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(new WorkflowValidationError(String(workflowName), "output", outputResult.issues)));
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(new TypedClientError(`Failed to execute workflow: ${error instanceof Error ? error.message : String(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(new WorkflowNotFoundError(String(workflowName), Object.keys(this.contract.workflows))));
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(new TypedClientError(`Failed to get workflow handle: ${error instanceof Error ? error.message : String(error)}`)));
242
+ resolve(Result.Error(createRuntimeClientError("getHandle", error)));
234
243
  }
235
244
  });
236
245
  }
237
- createTypedHandle(handle, definition) {
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 handle.query(queryName, inputResult.value);
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(new TypedClientError(`Query failed: ${error instanceof Error ? error.message : String(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 handle.signal(signalName, inputResult.value);
280
+ await workflowHandle.signal(signalName, inputResult.value);
272
281
  resolve(Result.Ok(void 0));
273
282
  } catch (error) {
274
- resolve(Result.Error(new TypedClientError(`Signal failed: ${error instanceof Error ? error.message : String(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 handle.executeUpdate(updateName, { args: [inputResult.value] });
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(new TypedClientError(`Update failed: ${error instanceof Error ? error.message : String(error)}`)));
306
+ resolve(Result.Error(createRuntimeClientError("update", error)));
298
307
  }
299
308
  })();
300
309
  });
301
310
  };
302
311
  return {
303
- workflowId: handle.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 handle.result();
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(handle.workflowId, "output", outputResult.issues)));
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(new TypedClientError(`Workflow execution failed: ${error instanceof Error ? error.message : String(error)}`)));
328
+ resolve(Result.Error(createRuntimeClientError("result", error)));
320
329
  }
321
330
  })();
322
331
  });
323
332
  },
324
333
  terminate: (reason) => {
325
- return Future.make((resolve) => {
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.make((resolve) => {
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.make((resolve) => {
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: () => handle.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, TypedClientError, UpdateValidationError, WorkflowNotFoundError, WorkflowValidationError };
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.5",
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.frgmail.com>",
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
- "@temporal-contract/boxed": "0.0.5",
47
- "@temporal-contract/contract": "0.0.5"
46
+ "@swan-io/boxed": "3.2.1",
47
+ "@temporal-contract/contract": "0.0.7"
48
48
  },
49
49
  "devDependencies": {
50
- "@temporalio/client": "1.13.2",
51
- "@types/node": "25.0.2",
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.0",
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/tsconfig": "0.0.5"
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:watch": "vitest",
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
  }