server/middleware/tchannel-client/index.js (129 lines of code) (raw):
// Copyright (c) 2017-2024 Uber Technologies Inc.
//
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
'use strict';
const TChannel = require('tchannel');
const { combine } = require('../../helpers');
const {
cliTransform,
makeChannels,
makeRequest,
withDomainPaging,
withNextPageTokenBodyTransform,
withWorkflowExecution,
withVerboseWorkflowExecution,
} = require('./helpers');
const tchannelClient = ({ peers, requestConfig }) =>
async function(ctx, next) {
const { authTokenHeaders = {} } = ctx;
const client = TChannel();
const channels = await makeChannels({ client, peers });
const request = makeRequest({
authTokenHeaders,
channels,
ctx,
requestConfig,
});
ctx.cadence = {
archivedWorkflows: request({
method: 'ListArchivedWorkflowExecutions',
requestName: 'list',
bodyTransform: combine(
withDomainPaging(ctx),
withNextPageTokenBodyTransform
),
}),
closedWorkflows: request({
method: 'ListClosedWorkflowExecutions',
requestName: 'list',
bodyTransform: combine(
withDomainPaging(ctx),
withNextPageTokenBodyTransform
),
}),
describeCluster: request({
channelName: 'admin',
method: 'DescribeCluster',
requestName: 'describe',
serviceName: 'AdminService',
}),
describeDomain: request({
method: 'DescribeDomain',
requestName: 'describe',
}),
describeTaskList: request({
method: 'DescribeTaskList',
}),
describeWorkflow: request({
method: 'DescribeWorkflowExecution',
requestName: 'describe',
bodyTransform: withWorkflowExecution(ctx),
}),
exportHistory: request({
method: 'GetWorkflowExecutionHistory',
requestName: 'get',
bodyTransform: combine(
withDomainPaging(ctx),
withWorkflowExecution(ctx),
withNextPageTokenBodyTransform
),
responseTransform: cliTransform,
}),
getHistory: request({
method: 'GetWorkflowExecutionHistory',
requestName: 'get',
bodyTransform: combine(
withDomainPaging(ctx),
withWorkflowExecution(ctx),
withNextPageTokenBodyTransform
),
}),
listDomains: request({
method: 'ListDomains',
requestName: 'list',
}),
listTaskListPartitions: request({
method: 'ListTaskListPartitions',
}),
listWorkflows: request({
method: 'ListWorkflowExecutions',
requestName: 'list',
bodyTransform: combine(
withDomainPaging(ctx),
withNextPageTokenBodyTransform
),
}),
openWorkflows: request({
method: 'ListOpenWorkflowExecutions',
requestName: 'list',
bodyTransform: combine(
withDomainPaging(ctx),
withNextPageTokenBodyTransform
),
}),
queryWorkflow: request({
method: 'QueryWorkflow',
requestName: 'query',
bodyTransform: withWorkflowExecution(ctx),
}),
signalWorkflow: request({
method: 'SignalWorkflowExecution',
requestName: 'signal',
bodyTransform: withVerboseWorkflowExecution(ctx),
}),
startWorkflow: request({
method: 'StartWorkflowExecution',
requestName: 'start',
}),
terminateWorkflow: request({
method: 'TerminateWorkflowExecution',
requestName: 'terminate',
bodyTransform: withVerboseWorkflowExecution(ctx),
}),
};
try {
await next();
client.close();
} catch (e) {
client.close();
throw e;
}
};
module.exports = tchannelClient;