Merge pull request #5 from devsapp/wss/support-domain

feat: support domain name
This commit is contained in:
wss-git 2021-07-16 17:15:56 +08:00 committed by GitHub
commit a8d9741e8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 77 additions and 56 deletions

View File

@ -33,6 +33,7 @@
"@alicloud/fc2": "^2.2.2",
"@serverless-devs/core": "^0.0.*",
"fs-extra": "^10.0.0",
"got": "^11.8.2",
"i18n": "^0.13.2",
"lodash.get": "^4.4.2",
"readline": "^1.3.0"

View File

@ -13,13 +13,11 @@ export default [
{
name: 'invocation-type',
description: 'Invocation type: optional value "async"|"sync", default value "sync" (default: "sync")',
alias: 't',
type: String,
},
{
name: 'event',
description: 'Event data (strings) passed to the function during invocation (default: "").Http function format refers to [https://github.com/devsapp/fc-remote-invoke#特别说明]',
alias: 'e',
type: String,
},
{
@ -31,7 +29,6 @@ export default [
{
name: 'event-stdin',
description: 'Read from standard input, to support script pipeline.Http function format refers to [https://github.com/devsapp/fc-remote-invoke#特别说明]',
alias: 's',
type: Boolean,
},
{
@ -49,6 +46,11 @@ export default [
description: 'Specify function name in cli mode',
type: String,
},
{
name: 'domain-name',
description: 'Specify custom domain name in cli mode',
type: String,
},
],
},
{

View File

@ -15,21 +15,17 @@ export default class FcRemoteInvoke {
}
async handlerInputs(inputs: InputProps): Promise<any> {
const credentials: ICredentials = await core.getCredential(inputs?.project?.access);
// 去除 args 的行首以及行尾的空格
const args: string = (inputs?.args || '').replace(/(^\s*)|(\s*$)/g, '');
logger.debug(`input args: ${args}`);
const parsedArgs: {[key: string]: any} = core.commandParse({ args }, {
boolean: ['help', 'event-stdin'],
string: ['invocation-type', 'event', 'event-file', 'region', 'service-name', 'function-name', 'qualifier'],
string: ['invocation-type', 'event', 'event-file', 'region', 'domain-name','service-name', 'function-name', 'qualifier'],
alias: {
'help': 'h',
'event': 'e',
'invocation-type': 't',
'event-file': 'f',
'event-stdin': 's',
}
});
@ -37,18 +33,17 @@ export default class FcRemoteInvoke {
logger.debug(`command parse: ${JSON.stringify(argsData)}`);
if (argsData.help) {
return {
credentials,
credentials: inputs.credentials,
isHelp: true,
};
}
// await StdoutFormatter.initStdout();
const {
e: event,
f: eventFile,
s: eventStdin,
t: invocationType = 'sync',
'event-file': eventStdin,
'invocation-type': invocationType = 'sync',
'domain-name': domainName,
} = argsData;
const eventPayload = { event, eventFile, eventStdin };
// @ts-ignore: 判断三个值有几个真
@ -63,30 +58,27 @@ export default class FcRemoteInvoke {
if (!['sync', 'async'].includes(invocationType)) {
throw new Error('invocation-type enum value sync, async.');
}
if (!domainName && !inputs?.credentials) {
inputs.credentials = await core.getCredential(inputs?.project?.access);
}
logger.debug(`input props: ${JSON.stringify(inputs.props)}`);
let props: IProperties = {
region: argsData.region,
serviceName: argsData['service-name'],
functionName: argsData['function-name'],
const props: IProperties = {
region: argsData.region || inputs.props?.region,
serviceName: argsData['service-name'] || inputs.props?.serviceName,
functionName: argsData['function-name'] || inputs.props?.functionName,
domainName: domainName || inputs.props?.domainName,
qualifier: argsData.qualifier || inputs.props?.qualifier,
};
logger.debug(`input args props: ${JSON.stringify(props)}`);
if (!isProperties(props)) {
props = inputs.props;
}
logger.debug(`props: ${JSON.stringify(props)}`);
if (!isProperties(props)) {
throw new Error('region/serviceName(service-name)/functionName(function-name) can not be empty.');
}
props.qualifier = argsData.qualifier || inputs.props?.qualifier;
return {
props,
credentials,
credentials: inputs.credentials,
eventPayload,
isHelp: false,
invocationType: _.upperFirst(invocationType),
@ -113,7 +105,7 @@ export default class FcRemoteInvoke {
return;
}
const remoteInvoke = new RemoteInvoke(props.region, credentials);
const remoteInvoke = new RemoteInvoke(props.region, credentials, props.domainName);
await remoteInvoke.invoke(props, eventPayload, { invocationType });
}
}

View File

@ -26,9 +26,13 @@ export interface IProperties {
serviceName: string;
functionName: string;
qualifier?: string;
domainName?: string;
}
export function isProperties(args: any): args is IProperties {
return args && args.region && args.serviceName && args.functionName;
if (!args) {
return false;
}
return args.domainName || (args.region && args.serviceName && args.functionName) ;
}
export interface IEventPayload {

View File

@ -1,4 +1,5 @@
import _ from 'lodash';
import got from 'got';
import Client from './client';
import { IProperties, IEventPayload } from '../interface/entity';
import Event from './event';
@ -8,9 +9,11 @@ export default class RemoteInvoke {
fcClient: any;
accountId: string;
constructor(region: string, credentials) {
this.accountId = credentials.AccountID;
this.fcClient = Client.buildFcClient(region, credentials);
constructor(region: string, credentials, domainName) {
if (!domainName) {
this.accountId = credentials.AccountID;
this.fcClient = Client.buildFcClient(region, credentials);
}
}
async invoke (props: IProperties, eventPayload: IEventPayload, { invocationType }) {
@ -21,8 +24,12 @@ export default class RemoteInvoke {
region,
serviceName,
functionName,
domainName,
qualifier,
} = props;
if (domainName) {
return this.requestDomain(domainName, event);
}
const httpTriggers = await this.getHttpTrigger(serviceName, functionName)
const payload: any = { event, serviceName, functionName, qualifier };
@ -32,17 +39,27 @@ export default class RemoteInvoke {
await this.eventInvoke(payload);
} else {
payload.region = region;
try {
payload.event = event ? JSON.parse(event) : {};
} catch (ex) {
logger.debug(ex);
throw new Error('handler event error. Example: https://github.com/devsapp/fc-remote-invoke/blob/master/example/http.json');
}
payload.event = this.getJsonEvent(event);
await this.httpInvoke(payload);
}
}
async requestDomain(url: string, event: string) {
const payload = this.getJsonEvent(event);
if (_.isEmpty(payload.headers)) {
payload.headers = {};
}
payload.headers['X-Fc-Log-Type'] = 'Tail';
const { body, headers } = await got(url, payload);
this.showLog(headers['x-fc-log-result']);
logger.log('\nFC Invoke Result:', 'green');
console.log(body);
logger.log('\n');
}
async getHttpTrigger(serviceName, functionName) {
const { data } = await this.fcClient.listTriggers(serviceName, functionName);
logger.debug(`get listTriggers: ${JSON.stringify(data)}`);
@ -69,18 +86,10 @@ export default class RemoteInvoke {
'X-Fc-Invocation-Type': invocationType
}, qualifier);
const log = rs.headers['x-fc-log-result'];
if (log) {
logger.log('========= FC invoke Logs begin =========', 'yellow');
const decodedLog = Buffer.from(log, 'base64');
logger.log(decodedLog.toString());
logger.log('========= FC invoke Logs end =========', 'yellow');
logger.log('\nFC Invoke Result:', 'green');
console.log(rs.data);
console.log('\n');
}
this.showLog(rs.headers['x-fc-log-result']);
logger.log('\nFC Invoke Result:', 'green');
console.log(rs.data);
console.log('\n');
} else {
const { headers } = await this.fcClient.invokeFunction(serviceName, functionName, event, {
'X-Fc-Invocation-Type': invocationType
@ -137,13 +146,8 @@ export default class RemoteInvoke {
logger.debug(`end invoke.`);
if (resp) {
const log = resp.headers['x-fc-log-result'];
if (log) {
logger.log('\n========= FC invoke Logs begin =========', 'yellow');
const decodedLog = Buffer.from(log, 'base64')
logger.log(decodedLog.toString())
logger.log('========= FC invoke Logs end =========', 'yellow');
}
this.showLog(resp.headers['x-fc-log-result']);
logger.log('\nFC Invoke Result:', 'green');
console.log(resp.data);
console.log('\n');
@ -184,4 +188,22 @@ export default class RemoteInvoke {
body: postBody
}
}
private showLog(log) {
if (log) {
logger.log('========= FC invoke Logs begin =========', 'yellow');
const decodedLog = Buffer.from(log, 'base64');
logger.log(decodedLog.toString());
logger.log('========= FC invoke Logs end =========', 'yellow');
}
}
private getJsonEvent(event: string) {
try {
return event ? JSON.parse(event) : {};
} catch (ex) {
logger.debug(ex);
throw new Error('handler event error. Example: https://github.com/devsapp/fc-remote-invoke/blob/master/example/http.json');
}
}
}