kws-sdk
Version:
142 lines (123 loc) • 3.03 kB
text/typescript
import querystring = require('querystring');
import aws = require('aws4');
import request = require('request-promise');
declare namespace KWS {
interface headers {
[key: string]: string
}
export interface Query {
[key: string]: string;
}
export interface AWSRequest {
host: string;
method: string;
headers: headers;
service: string;
region: string;
path: string;
body?: string;
signQuery?: boolean;
}
export interface AWSCredentials {
accessKeyId: string;
secretAccessKey: string;
}
export interface RequestARGS {
query?: Query;
body?: any;
}
export interface ARGS {
ak: string;
sk: string;
uniqname: string;
app: string;
host?: string;
region?: string;
}
export interface Api {
action: string;
service: string;
version: string;
}
}
function buildBody(body?: any) {
if (!body) {
return '';
}
return JSON.stringify(body);
}
function buildAWSPath(query: KWS.Query = {}): string {
const keys = Object.keys(query);
if (keys.length === 0) {
return '/';
}
return '/?' + querystring.stringify(query);
}
class KWS implements KWS.ARGS {
ak: string;
sk: string;
host: string;
region: string;
uniqname: string;
app: string;
constructor(args: KWS.ARGS) {
Object.assign(this, args);
if (!this.region) {
this.region = 'cn-beijing-6'
}
}
buildHost(service: string) {
return this.host || `${service}.${this.region}.api.ksyun.com`;
}
buildAWSRequest(method: string, service: string, query: KWS.Query, body: any): KWS.AWSRequest {
return {
host: this.buildHost(service),
method,
service,
headers: {},
region: this.region,
path: buildAWSPath(query),
body,
signQuery: true
};
}
buildAWSCredentials(): KWS.AWSCredentials {
return {
accessKeyId: this.ak,
secretAccessKey: this.sk
};
}
buildQuery(action: string, version: string, query: Object): KWS.Query {
return Object.assign({
Action: action,
Version: version,
App: this.app,
UniqName: this.uniqname
}, query);
}
sign(method: string, api: KWS.Api, data: KWS.RequestARGS = {}) {
data.query = data.query || {};
const body = buildBody(data.body);
const query: KWS.Query = this.buildQuery(api.action, api.version, data.query);
const AWSRequest = this.buildAWSRequest(method, api.service, query, body);
const AWSCredentials = this.buildAWSCredentials();
return aws.sign(AWSRequest, AWSCredentials);
}
request(method: string, api: KWS.Api, data: KWS.RequestARGS = {}) {
const sign = this.sign(method, api, data);
const option = {
uri: `https://${sign.host}${sign.path}`,
method: method,
headers: sign.headers,
body: ''
};
if (data.body) {
option.method = 'POST';
option.body = JSON.stringify(data.body);
} else {
delete option.body;
}
return request(option);
}
}
export = KWS;