aliyun-product-js-sdk
Version:
aliyun third party product
2 lines (1 loc) • 3.81 kB
JavaScript
import t,{parse as e}from"url";import s from"crypto";import a from"uuid";import r from"querystring";function n(t={}){let e={},s=Object.keys(t);for(let a=0;s.length>a;a++){let r=s[a];e[r.toLowerCase()]=t[r]}return e}class i{get(t,s={}){let a=e(t,!0),i=s.query||s.data;return i&&(Object.assign(a.query,i),a.path=a.pathname+"?"+r.stringify(a.query),s.data=null,s.query=null),s.headers=n(s.headers),s.signHeaders=n(s.signHeaders),this.request("GET",a,s)}post(t,s={}){let a=e(t,!0),i=s.query;i&&(Object.assign(a.query,i),a.path=a.pathname+"?"+r.stringify(a.query),s.query=null),s.headers=n(s.headers),s.signHeaders=n(s.signHeaders);let u=s.headers,d=u["content-type"]||u["Content-Type"];d||(u["content-type"]="application/json",d=u["content-type"]);let h=s.data;return d.startsWith("application/x-www-form-urlencoded")?s.data=r.stringify(s.data):d.startsWith("application/json")?s.data=JSON.stringify(s.data):Buffer.isBuffer(s.data)||"string"==typeof s.data||(s.data=JSON.stringify(s.data)),this.request("POST",a,s,h)}put(t,s={}){let a=e(t,!0),i=s.query;i&&(Object.assign(a.query,i),a.path=a.pathname+"?"+r.stringify(a.query),s.query=null),s.headers=n(s.headers),s.signHeaders=n(s.signHeaders);let u=s.headers,d=u["content-type"]||u["Content-Type"];d||(u["content-type"]="application/json",d=u["content-type"]);let h=s.data;return d.startsWith("application/x-www-form-urlencoded")?s.data=r.stringify(s.data):d.startsWith("application/json")?s.data=JSON.stringify(s.data):Buffer.isBuffer(s.data)||"string"==typeof s.data||(s.data=JSON.stringify(s.data)),this.request("PUT",a,s,h)}delete(t,s){let a=e(t,!0),i=s.query||s.data;return i&&(Object.assign(a.query,i),a.path=a.pathname+"?"+r.stringify(a.query),s.data=null,s.query=null),s.headers=n(s.headers),s.signHeaders=n(s.signHeaders),this.request("DELETE",a,s)}}const u=t.parse,d="application/x-www-form-urlencoded",h=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};export default class extends i{constructor(t,e,s="RELEASE"){super(),this.appKey=t,this.appSecret=Buffer.from(e,"utf8"),this.stage=s}buildStringToSign(t,e,s,a,r){const n="\n";let i=[t,n],u=e.accept;u&&i.push(u),i.push(n);let h=e["content-md5"];h&&i.push(h),i.push(n);let p=e["content-type"]||"";p&&i.push(p),i.push(n);let o=e.date;return o&&i.push(o),i.push(n),s&&(i.push(s),i.push(n)),p.startsWith(d)?i.push(this.buildUrl(a,r)):i.push(this.buildUrl(a)),i.join("")}sign(t){return s.createHmac("sha256",this.appSecret).update(t,"utf8").digest("base64")}md5(t){return s.createHash("md5").update(t,"utf8").digest("base64")}getSignHeaderKeys(t,e){let s=Object.keys(t).sort(),a=[];for(let t=0;s.length>t;t++){let r=s[t];(r.startsWith("x-ca-")||h(e,r))&&a.push(r)}return a.sort()}buildUrl(t,e){let s=Object.assign(t.query,e),a=t.pathname;if(Object.keys(s).length){let t=Object.keys(s).sort(),e=Array(t.length);for(let a=0;t.length>a;a++){let r=t[a];e[a]=s[r]&&""+s[r]?`${r}=${s[r]}`:`${r}`}a+="?"+e.join("&")}return a}buildHeaders(t={},e){return Object.assign({"x-ca-timestamp":Date.now(),"x-ca-key":this.appKey,"x-ca-nonce":a.v4(),"x-ca-stage":this.stage,accept:"application/json"},t,e)}getSignedHeadersString(t,e){let s=[];for(let a=0;t.length>a;a++){let r=t[a];s.push(r+":"+e[r])}return s.join("\n")}async request(t,e,s,a){let r=s.signHeaders,n=this.buildHeaders(s.headers,r);"POST"!==t||(n["content-type"]||"").startsWith(d)||(n["content-md5"]=this.md5(s.data));let i=this.getSignHeaderKeys(n,r);n["x-ca-signature-headers"]=i.join(",");let h=this.getSignedHeadersString(i,n),p=u(e,!0),o=this.buildStringToSign(t,n,h,p,a);n["x-ca-signature"]=this.sign(o);const l=new Request(p.href,{method:t,body:s.data,headers:n}),c=new Promise((t,e)=>{fetch(l).then(t=>{if(200!==t.status)throw`${t.status}, ${t.statusText}`;return t.json()}).then(e=>t(e)).catch(t=>e(t))});return await c.then(t=>t)}}