Socket
Socket
Sign inDemoInstall

@temporalio/client

Package Overview
Dependencies
Maintainers
4
Versions
80
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@temporalio/client - npm Package Compare versions

Comparing version 0.8.0 to 0.11.0

lib/grpc-retry.d.ts

7

lib/connection.d.ts

@@ -37,2 +37,9 @@ import * as grpc from '@grpc/grpc-js';

channelArgs?: Record<string, any>;
/**
* Grpc interceptors which will be applied to every RPC call performed by this connection. By
* default, an interceptor will be included which automatically retries retryable errors. If you
* do not wish to perform automatic retries, set this to an empty list (or a list with your own
* interceptors).
*/
interceptors?: grpc.Interceptor[];
}

@@ -39,0 +46,0 @@ export declare type ConnectionOptionsWithDefaults = Required<Omit<ConnectionOptions, 'tls'>>;

4

lib/connection.js

@@ -26,2 +26,3 @@ "use strict";

const common_1 = require("@temporalio/common");
const grpc_retry_1 = require("./grpc-retry");
exports.WorkflowService = proto_1.temporal.api.workflowservice.v1.WorkflowService;

@@ -34,2 +35,3 @@ exports.LOCAL_DOCKER_TARGET = '127.0.0.1:7233';

channelArgs: {},
interceptors: [(0, grpc_retry_1.makeGrpcRetryInterceptor)((0, grpc_retry_1.defaultGrpcRetryOptions)())],
};

@@ -82,3 +84,3 @@ }

// TODO: allow adding metadata and call options
new grpc.Metadata(), {}, callback);
new grpc.Metadata(), { interceptors: this.options.interceptors }, callback);
};

@@ -85,0 +87,0 @@ this.service = new exports.WorkflowService(rpcImpl, false, false);

import { temporal } from '@temporalio/proto';
import { WorkflowClientInterceptors } from './interceptors';
import { DataConverter, Workflow, WorkflowSignalType, WorkflowQueryType, BaseWorkflowHandle, WorkflowSignalHandlers, WorkflowResultType, WorkflowQueryHandlers } from '@temporalio/common';
import { DataConverter, Workflow, BaseWorkflowHandle, QueryDefinition, SignalDefinition, WorkflowResultType } from '@temporalio/common';
import { WorkflowOptions } from './workflow-options';

@@ -9,25 +9,22 @@ import { WorkflowCancelInput, WorkflowClientCallsInterceptor, WorkflowQueryInput, WorkflowSignalInput, WorkflowSignalWithStartInput, WorkflowStartInput, WorkflowTerminateInput } from './interceptors';

/**
* Transforms a workflow interface `T` into a client interface
* A client side handle to a single Workflow instance.
* It can be used to start, signal, query, wait for completion, terminate and cancel a Workflow execution.
*
* Given a workflow interface such as:
* Given the following Workflow definition:
* ```ts
* export type Counter = () => {
* execute(initialValue?: number): number;
* signals: {
* increment(amount?: number): void;
* };
* queries: {
* get(): number;
* };
* }
* export const incrementSignal = defineSignal('increment');
* export const getValueQuery = defineQuery<number>('getValue');
* export async function counterWorkflow(initialValue: number): Promise<void>;
* ```
*
* Create a workflow client for running and interacting with a single workflow
* Create a handle for running and interacting with a single Workflow:
* ```ts
* const client = new WorkflowClient();
* // `counter` is a registered workflow file, typically found at
* // `lib/workflows/counter.js` after building the typescript project
* const workflow = connection.createWorkflowHandle<Counter>('counter', { taskQueue: 'tutorial' });
* // start workflow `execute` function with initialValue of 2 and await its completion
* await workflow.execute(2);
* const handle = connection.createWorkflowHandle(counterWorkflow, { taskQueue: 'tutorial' });
* // Start the Workflow with initialValue of 2.
* await handle.start(2);
* await handle.signal(incrementSignal, 2);
* await handle.query(getValueQuery); // 4
* await handle.cancel();
* await handle.result(); // throws WorkflowExecutionCancelledError
* ```

@@ -37,17 +34,20 @@ */

/**
* A mapping of the different queries defined by Workflow interface `T` to callable functions.
* Call to query a Workflow after it's been started even if it has already completed.
* Query a running or completed Workflow.
*
* @param def a query definition as returned from {@link defineQuery} or query name (string)
*
* @example
* ```ts
* const value = await workflow.query.get();
* await handle.query(getValueQuery);
* await handle.query<number, []>('getValue');
* ```
*/
query: WorkflowQueryHandlers<T> extends Record<string, WorkflowQueryType> ? {
[P in keyof WorkflowQueryHandlers<T>]: (...args: Parameters<WorkflowQueryHandlers<T>[P]>) => Promise<ReturnType<WorkflowQueryHandlers<T>[P]>>;
} : undefined;
query<Ret, Args extends any[]>(def: QueryDefinition<Ret, Args> | string, ...args: Args): Promise<Ret>;
/**
* Sends a signal to a running Workflow or starts a new one if not already running and immediately signals it.
* Useful when you're unsure of the run state.
* Useful when you're unsure of the Workflows' run state.
*
* @returns the runId of the Workflow
*/
signalWithStart: WorkflowSignalHandlers<T> extends Record<string, WorkflowSignalType> ? <S extends keyof WorkflowSignalHandlers<T>>(signalName: S, signalArgs: Parameters<WorkflowSignalHandlers<T>[S]>, workflowArgs: Parameters<T>) => Promise<string> : never;
signalWithStart<Args extends any[]>(def: SignalDefinition<Args> | string, signalArgs: Args, workflowArgs: Parameters<T>): Promise<string>;
/**

@@ -142,7 +142,7 @@ * Terminate a running Workflow

*/
start<T extends Workflow>(opts: Partial<WorkflowOptions>, name: string, ...args: Parameters<T>): Promise<string>;
start<T extends Workflow>(workflowTypeOrFunc: string | T, opts: Partial<WorkflowOptions>, ...args: Parameters<T>): Promise<string>;
/**
* Starts a new Workflow execution and awaits its completion
*/
execute<T extends Workflow>(opts: Partial<WorkflowOptions>, name: string, ...args: Parameters<T>): Promise<WorkflowResultType<T>>;
execute<T extends Workflow>(workflowTypeOrFunc: string | T, opts: Partial<WorkflowOptions>, ...args: Parameters<T>): Promise<WorkflowResultType<T>>;
/**

@@ -149,0 +149,0 @@ * Gets the result of a Workflow execution.

@@ -61,3 +61,4 @@ "use strict";

*/
async start(opts, name, ...args) {
async start(workflowTypeOrFunc, opts, ...args) {
const workflowType = typeof workflowTypeOrFunc === 'string' ? workflowTypeOrFunc : workflowTypeOrFunc.name;
const mergedOptions = { ...this.options.workflowDefaults, ...opts };

@@ -72,3 +73,3 @@ assertRequiredWorkflowOptions(mergedOptions);

args,
name,
name: workflowType,
});

@@ -80,5 +81,5 @@ return start(...args);

*/
async execute(opts, name, ...args) {
async execute(workflowTypeOrFunc, opts, ...args) {
const workflowId = opts.workflowId ?? (0, uuid_1.v4)();
const runId = await this.start({ ...opts, workflowId }, name, ...args);
const runId = await this.start(workflowTypeOrFunc, { ...opts, workflowId }, ...args);
return this.result({ workflowId, runId });

@@ -330,3 +331,3 @@ }

let startPromise = undefined;
const workflow = {
return {
client: this,

@@ -374,38 +375,23 @@ workflowId,

},
signal: new Proxy({}, {
get: (_, signalName) => {
if (typeof signalName !== 'string') {
throw new TypeError('signalName can only be a string');
}
return async (...args) => {
const next = this._signalWorkflowHandler.bind(this);
const fn = interceptors.length ? (0, common_1.composeInterceptors)(interceptors, 'signal', next) : next;
await fn({
workflowExecution: { workflowId, runId },
signalName,
args,
});
};
},
}),
query: new Proxy({}, {
get: (_, queryType) => {
if (typeof queryType !== 'string') {
throw new TypeError('queryType can only be a string');
}
return async (...args) => {
const next = this._queryWorkflowHandler.bind(this);
const fn = interceptors.length ? (0, common_1.composeInterceptors)(interceptors, 'query', next) : next;
return fn({
workflowExecution: { workflowId, runId },
queryRejectCondition: this.options.queryRejectCondition,
queryType,
args,
});
};
},
}),
async signal(def, ...args) {
const next = this.client._signalWorkflowHandler.bind(this.client);
const fn = interceptors.length ? (0, common_1.composeInterceptors)(interceptors, 'signal', next) : next;
await fn({
workflowExecution: { workflowId, runId },
signalName: typeof def === 'string' ? def : def.name,
args,
});
},
async query(def, ...args) {
const next = this.client._queryWorkflowHandler.bind(this.client);
const fn = interceptors.length ? (0, common_1.composeInterceptors)(interceptors, 'query', next) : next;
return fn({
workflowExecution: { workflowId, runId },
queryRejectCondition: this.client.options.queryRejectCondition,
queryType: typeof def === 'string' ? def : def.name,
args,
});
},
signalWithStart,
};
return workflow;
}

@@ -441,3 +427,3 @@ /**

};
const signalWithStart = (signalName, signalArgs, workflowArgs) => {
const signalWithStart = (def, signalArgs, workflowArgs) => {
const next = (0, common_1.composeInterceptors)(interceptors, 'signalWithStart', this._signalWithStartWorkflowHandler.bind(this));

@@ -449,3 +435,3 @@ return next({

workflowName: name,
signalName,
signalName: typeof def === 'string' ? def : def.name,
signalArgs,

@@ -452,0 +438,0 @@ });

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.addDefaults = exports.compileWorkflowOptions = void 0;
const uuid_1 = require("uuid");
const iface = __importStar(require("@temporalio/proto"));
var workflow_options_1 = require("@temporalio/common/lib/workflow-options");

@@ -34,3 +14,2 @@ Object.defineProperty(exports, "compileWorkflowOptions", { enumerable: true, get: function () { return workflow_options_1.compileWorkflowOptions; } });

workflowId: opts.workflowId ?? (0, uuid_1.v4)(),
workflowIdReusePolicy: iface.temporal.api.enums.v1.WorkflowIdReusePolicy.WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE_FAILED_ONLY,
...opts,

@@ -37,0 +16,0 @@ };

{
"name": "@temporalio/client",
"version": "0.8.0",
"version": "0.11.0",
"description": "Temporal.io SDK Client sub-package",

@@ -17,4 +17,4 @@ "main": "lib/index.js",

"@grpc/grpc-js": "^1.3.7",
"@temporalio/common": "^0.4.0",
"@temporalio/proto": "^0.3.3",
"@temporalio/common": "^0.11.0",
"@temporalio/proto": "^0.11.0",
"ms": "^2.1.3",

@@ -34,3 +34,3 @@ "protobufjs": "^6.11.2",

},
"gitHead": "a46c7b9ce2e78d9f615bfdb1730af0956a25eb61"
"gitHead": "df1ef24e1caff78f2b712e1f82e59d037ae9c2b4"
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc