UNPKG

kws-sdk

Version:

142 lines (123 loc) 3.03 kB
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;