edgeone-cli 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.js +2 -196
- package/dist/api/client.js.map +1 -1
- package/dist/api/signer.js +2 -100
- package/dist/api/signer.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +2 -265
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/edgeone.js +2 -415
- package/dist/commands/edgeone.js.map +1 -1
- package/dist/edgeone/tasks/prefetch.d.ts +22 -22
- package/dist/edgeone/tasks/prefetch.js +2 -16
- package/dist/edgeone/tasks/prefetch.js.map +1 -1
- package/dist/edgeone/tasks/purge.d.ts +22 -22
- package/dist/edgeone/tasks/purge.js +2 -16
- package/dist/edgeone/tasks/purge.js.map +1 -1
- package/dist/errors/codes.js +2 -134
- package/dist/errors/codes.js.map +1 -1
- package/dist/index.js +1 -27
- package/dist/index.js.map +1 -1
- package/dist/utils/crypto.js +2 -86
- package/dist/utils/crypto.js.map +1 -1
- package/dist/utils/signature.js +2 -48
- package/dist/utils/signature.js.map +1 -1
- package/package.json +3 -1
package/dist/api/client.js
CHANGED
|
@@ -1,196 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
secretId;
|
|
4
|
-
secretKey;
|
|
5
|
-
endpoint;
|
|
6
|
-
region;
|
|
7
|
-
mode;
|
|
8
|
-
constructor(secretId, secretKey, endpoint, region = "ap-guangzhou", mode = "production") {
|
|
9
|
-
this.secretId = secretId;
|
|
10
|
-
this.secretKey = secretKey;
|
|
11
|
-
this.endpoint = endpoint;
|
|
12
|
-
this.region = region;
|
|
13
|
-
this.mode = mode;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* 发送请求
|
|
17
|
-
*/
|
|
18
|
-
async request(action, version, params) {
|
|
19
|
-
const timestamp = Math.floor(Date.now() / 1000).toString();
|
|
20
|
-
// 请求体直接使用传入的参数
|
|
21
|
-
const requestBody = JSON.stringify(params);
|
|
22
|
-
// 计算签名
|
|
23
|
-
const authorization = calculateSignature({
|
|
24
|
-
secretId: this.secretId,
|
|
25
|
-
secretKey: this.secretKey,
|
|
26
|
-
endpoint: this.endpoint,
|
|
27
|
-
action,
|
|
28
|
-
requestBody,
|
|
29
|
-
timestamp,
|
|
30
|
-
});
|
|
31
|
-
const requestHeaders = {
|
|
32
|
-
Authorization: authorization,
|
|
33
|
-
"Content-Type": "application/json; charset=utf-8",
|
|
34
|
-
"X-TC-Action": action,
|
|
35
|
-
"X-TC-Version": version,
|
|
36
|
-
"X-TC-Timestamp": timestamp,
|
|
37
|
-
"X-TC-Language": "zh-CN",
|
|
38
|
-
};
|
|
39
|
-
// 仅在调试模式下显示请求信息
|
|
40
|
-
if (this.mode === "debug") {
|
|
41
|
-
console.log("\n请求信息:");
|
|
42
|
-
console.log(` URL: https://${this.endpoint}`);
|
|
43
|
-
console.log(` Headers: ${JSON.stringify({ ...requestHeaders, Authorization: "***" }, null, 2)}`);
|
|
44
|
-
console.log(` Body: ${requestBody}\n`);
|
|
45
|
-
}
|
|
46
|
-
// 发送请求
|
|
47
|
-
try {
|
|
48
|
-
const response = await fetch(`https://${this.endpoint}`, {
|
|
49
|
-
method: "POST",
|
|
50
|
-
headers: requestHeaders,
|
|
51
|
-
body: requestBody,
|
|
52
|
-
});
|
|
53
|
-
const result = await response.json();
|
|
54
|
-
// 仅在调试模式下显示响应结果
|
|
55
|
-
if (this.mode === "debug") {
|
|
56
|
-
console.log("响应结果:");
|
|
57
|
-
console.log(JSON.stringify(result, null, 2));
|
|
58
|
-
}
|
|
59
|
-
return result;
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
throw error;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* 创建清除缓存任务
|
|
67
|
-
*/
|
|
68
|
-
async createPurgeTask(options) {
|
|
69
|
-
const params = {
|
|
70
|
-
ZoneId: options.zoneId || "*",
|
|
71
|
-
Type: options.type,
|
|
72
|
-
Method: "delete",
|
|
73
|
-
Targets: options.targets || [],
|
|
74
|
-
};
|
|
75
|
-
return await this.request("CreatePurgeTask", "2022-09-01", params);
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* 查询清除缓存任务
|
|
79
|
-
*/
|
|
80
|
-
async describePurgeTasks(zoneIds) {
|
|
81
|
-
const now = new Date();
|
|
82
|
-
const oneMonthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
83
|
-
// 格式化为 ISO 8601 格式,时区为 +08:00
|
|
84
|
-
const toISOStringWithTimezone = (date) => {
|
|
85
|
-
const year = date.getFullYear();
|
|
86
|
-
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
87
|
-
const day = String(date.getDate()).padStart(2, "0");
|
|
88
|
-
const hours = String(date.getHours()).padStart(2, "0");
|
|
89
|
-
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
90
|
-
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
91
|
-
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}+08:00`;
|
|
92
|
-
};
|
|
93
|
-
const baseParams = {
|
|
94
|
-
StartTime: toISOStringWithTimezone(oneMonthAgo),
|
|
95
|
-
EndTime: toISOStringWithTimezone(now),
|
|
96
|
-
};
|
|
97
|
-
// 如果没有指定 zoneIds,直接查询
|
|
98
|
-
if (!zoneIds || zoneIds.length === 0) {
|
|
99
|
-
return await this.request("DescribePurgeTasks", "2022-09-01", baseParams);
|
|
100
|
-
}
|
|
101
|
-
// 如果只有一个 zone,直接查询
|
|
102
|
-
if (zoneIds.length === 1) {
|
|
103
|
-
baseParams.ZoneId = zoneIds[0];
|
|
104
|
-
return await this.request("DescribePurgeTasks", "2022-09-01", baseParams);
|
|
105
|
-
}
|
|
106
|
-
// 多个 zone,并发查询并合并结果
|
|
107
|
-
const requests = zoneIds.map(zoneId => {
|
|
108
|
-
const params = { ...baseParams, ZoneId: zoneId };
|
|
109
|
-
return this.request("DescribePurgeTasks", "2022-09-01", params);
|
|
110
|
-
});
|
|
111
|
-
const results = await Promise.all(requests);
|
|
112
|
-
// 合并结果
|
|
113
|
-
const merged = { Response: {} };
|
|
114
|
-
const allTasks = [];
|
|
115
|
-
for (const result of results) {
|
|
116
|
-
if (result.Response?.Error) {
|
|
117
|
-
// 如果任何一个请求失败,返回第一个错误
|
|
118
|
-
return result;
|
|
119
|
-
}
|
|
120
|
-
if (result.Response?.PurgeTasks) {
|
|
121
|
-
allTasks.push(...result.Response.PurgeTasks);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// 合并成功响应
|
|
125
|
-
merged.Response = {
|
|
126
|
-
...results[0].Response,
|
|
127
|
-
PurgeTasks: allTasks,
|
|
128
|
-
};
|
|
129
|
-
return merged;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* 创建预热任务
|
|
133
|
-
*/
|
|
134
|
-
async createPrefetchTask(options) {
|
|
135
|
-
const params = {
|
|
136
|
-
ZoneId: options.zoneId || "*",
|
|
137
|
-
Targets: options.urls,
|
|
138
|
-
};
|
|
139
|
-
return await this.request("CreatePrefetchTask", "2022-09-01", params);
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* 查询预热任务
|
|
143
|
-
*/
|
|
144
|
-
async describePrefetchTasks(zoneIds) {
|
|
145
|
-
const now = new Date();
|
|
146
|
-
const oneMonthAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
147
|
-
// 格式化为 ISO 8601 格式,时区为 +08:00
|
|
148
|
-
const toISOStringWithTimezone = (date) => {
|
|
149
|
-
const year = date.getFullYear();
|
|
150
|
-
const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
151
|
-
const day = String(date.getDate()).padStart(2, "0");
|
|
152
|
-
const hours = String(date.getHours()).padStart(2, "0");
|
|
153
|
-
const minutes = String(date.getMinutes()).padStart(2, "0");
|
|
154
|
-
const seconds = String(date.getSeconds()).padStart(2, "0");
|
|
155
|
-
return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}+08:00`;
|
|
156
|
-
};
|
|
157
|
-
const baseParams = {
|
|
158
|
-
StartTime: toISOStringWithTimezone(oneMonthAgo),
|
|
159
|
-
EndTime: toISOStringWithTimezone(now),
|
|
160
|
-
};
|
|
161
|
-
// 如果没有指定 zoneIds,直接查询
|
|
162
|
-
if (!zoneIds || zoneIds.length === 0) {
|
|
163
|
-
return await this.request("DescribePrefetchTasks", "2022-09-01", baseParams);
|
|
164
|
-
}
|
|
165
|
-
// 如果只有一个 zone,直接查询
|
|
166
|
-
if (zoneIds.length === 1) {
|
|
167
|
-
baseParams.ZoneId = zoneIds[0];
|
|
168
|
-
return await this.request("DescribePrefetchTasks", "2022-09-01", baseParams);
|
|
169
|
-
}
|
|
170
|
-
// 多个 zone,并发查询并合并结果
|
|
171
|
-
const requests = zoneIds.map(zoneId => {
|
|
172
|
-
const params = { ...baseParams, ZoneId: zoneId };
|
|
173
|
-
return this.request("DescribePrefetchTasks", "2022-09-01", params);
|
|
174
|
-
});
|
|
175
|
-
const results = await Promise.all(requests);
|
|
176
|
-
// 合并结果
|
|
177
|
-
const merged = { Response: {} };
|
|
178
|
-
const allTasks = [];
|
|
179
|
-
for (const result of results) {
|
|
180
|
-
if (result.Response?.Error) {
|
|
181
|
-
// 如果任何一个请求失败,返回第一个错误
|
|
182
|
-
return result;
|
|
183
|
-
}
|
|
184
|
-
if (result.Response?.PrefetchTasks) {
|
|
185
|
-
allTasks.push(...result.Response.PrefetchTasks);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
// 合并成功响应
|
|
189
|
-
merged.Response = {
|
|
190
|
-
...results[0].Response,
|
|
191
|
-
PrefetchTasks: allTasks,
|
|
192
|
-
};
|
|
193
|
-
return merged;
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
//# sourceMappingURL=client.js.map
|
|
1
|
+
import{calculateSignature as e}from"../utils/signature.js";export class EdgeOneClient{secretId;secretKey;endpoint;region;mode;constructor(e,t,s,r="ap-guangzhou",n="production"){this.secretId=e,this.secretKey=t,this.endpoint=s,this.region=r,this.mode=n}async request(t,s,r){const n=Math.floor(Date.now()/1e3).toString(),o=JSON.stringify(r),a={Authorization:e({secretId:this.secretId,secretKey:this.secretKey,endpoint:this.endpoint,action:t,requestBody:o,timestamp:n}),"Content-Type":"application/json; charset=utf-8","X-TC-Action":t,"X-TC-Version":s,"X-TC-Timestamp":n,"X-TC-Language":"zh-CN"};"debug"===this.mode&&(console.log("\n请求信息:"),console.log(` URL: https://${this.endpoint}`),console.log(` Headers: ${JSON.stringify({...a,Authorization:"***"},null,2)}`),console.log(` Body: ${o}\n`));try{const e=await fetch(`https://${this.endpoint}`,{method:"POST",headers:a,body:o}),t=await e.json();return"debug"===this.mode&&(console.log("响应结果:"),console.log(JSON.stringify(t,null,2))),t}catch(e){throw e}}async createPurgeTask(e){const t={ZoneId:e.zoneId||"*",Type:e.type,Method:"delete",Targets:e.targets||[]};return await this.request("CreatePurgeTask","2022-09-01",t)}async describePurgeTasks(e){const t=new Date,s=e=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}T${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}+08:00`,r={StartTime:s(new Date(t.getTime()-2592e6)),EndTime:s(t)};if(!e||0===e.length)return await this.request("DescribePurgeTasks","2022-09-01",r);if(1===e.length)return r.ZoneId=e[0],await this.request("DescribePurgeTasks","2022-09-01",r);const n=e.map(e=>{const t={...r,ZoneId:e};return this.request("DescribePurgeTasks","2022-09-01",t)}),o=await Promise.all(n),a={Response:{}},i=[];for(const e of o){if(e.Response?.Error)return e;e.Response?.PurgeTasks&&i.push(...e.Response.PurgeTasks)}return a.Response={...o[0].Response,PurgeTasks:i},a}async createPrefetchTask(e){const t={ZoneId:e.zoneId||"*",Targets:e.urls};return await this.request("CreatePrefetchTask","2022-09-01",t)}async describePrefetchTasks(e){const t=new Date,s=e=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}T${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}:${String(e.getSeconds()).padStart(2,"0")}+08:00`,r={StartTime:s(new Date(t.getTime()-2592e6)),EndTime:s(t)};if(!e||0===e.length)return await this.request("DescribePrefetchTasks","2022-09-01",r);if(1===e.length)return r.ZoneId=e[0],await this.request("DescribePrefetchTasks","2022-09-01",r);const n=e.map(e=>{const t={...r,ZoneId:e};return this.request("DescribePrefetchTasks","2022-09-01",t)}),o=await Promise.all(n),a={Response:{}},i=[];for(const e of o){if(e.Response?.Error)return e;e.Response?.PrefetchTasks&&i.push(...e.Response.PrefetchTasks)}return a.Response={...o[0].Response,PrefetchTasks:i},a}}
|
|
2
|
+
//# sourceMappingURL=api\client.js.map
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","
|
|
1
|
+
{"version":3,"file":"A:\\edgeone-cli\\dist\\api\\client.js","names":["calculateSignature","EdgeOneClient","secretId","secretKey","endpoint","region","mode","constructor","this","request","action","version","params","timestamp","Math","floor","Date","now","toString","requestBody","JSON","stringify","requestHeaders","Authorization","console","log","response","fetch","method","headers","body","result","json","error","createPurgeTask","options","ZoneId","zoneId","Type","type","Method","Targets","targets","describePurgeTasks","zoneIds","toISOStringWithTimezone","date","getFullYear","String","getMonth","padStart","getDate","getHours","getMinutes","getSeconds","baseParams","StartTime","getTime","EndTime","length","requests","map","results","Promise","all","merged","Response","allTasks","Error","PurgeTasks","push","createPrefetchTask","urls","describePrefetchTasks","PrefetchTasks"],"sources":["../../src/api/client.ts"],"mappings":"6BAISA,MAA0B,+BAyB7B,MAAOC,cACHC,SACAC,UACAC,SACAC,OACAC,KAER,WAAAC,CAAYL,EAAkBC,EAAmBC,EAAkBC,EAAS,eAAgBC,EAAmB,cAC7GE,KAAKN,SAAWA,EAChBM,KAAKL,UAAYA,EACjBK,KAAKJ,SAAWA,EAChBI,KAAKH,OAASA,EACdG,KAAKF,KAAOA,CACd,CAKQ,aAAMG,CAAQC,EAAgBC,EAAiBC,GACrD,MAAMC,EAAYC,KAAKC,MAAMC,KAAKC,MAAQ,KAAMC,WAG1CC,EAAcC,KAAKC,UAAUT,GAY7BU,EAAyC,CAC7CC,cAVoBvB,EAAmB,CACvCE,SAAUM,KAAKN,SACfC,UAAWK,KAAKL,UAChBC,SAAUI,KAAKJ,SACfM,SACAS,cACAN,cAKA,eAAgB,kCAChB,cAAeH,EACf,eAAgBC,EAChB,iBAAkBE,EAClB,gBAAiB,SAID,UAAdL,KAAKF,OACPkB,QAAQC,IAAI,WACZD,QAAQC,IAAI,kBAAkBjB,KAAKJ,YACnCoB,QAAQC,IAAI,cAAcL,KAAKC,UAAU,IAAKC,EAAgBC,cAAe,OAAS,KAAM,MAC5FC,QAAQC,IAAI,WAAWN,QAIzB,IACE,MAAMO,QAAiBC,MAAM,WAAWnB,KAAKJ,WAAY,CACvDwB,OAAQ,OACRC,QAASP,EACTQ,KAAMX,IAGFY,QAAeL,EAASM,OAQ9B,MALkB,UAAdxB,KAAKF,OACPkB,QAAQC,IAAI,SACZD,QAAQC,IAAIL,KAAKC,UAAUU,EAAQ,KAAM,KAGpCA,CACT,CAAE,MAAOE,GACP,MAAMA,CACR,CACF,CAKA,qBAAMC,CAAgBC,GACpB,MAAMvB,EAA8B,CAClCwB,OAAQD,EAAQE,QAAU,IAC1BC,KAAMH,EAAQI,KACdC,OAAQ,SACRC,QAASN,EAAQO,SAAW,IAG9B,aAAalC,KAAKC,QAAQ,kBAAmB,aAAcG,EAC7D,CAKA,wBAAM+B,CAAmBC,GACvB,MAAM3B,EAAM,IAAID,KAIV6B,EAA2BC,GAOxB,GANMA,EAAKC,iBACJC,OAAOF,EAAKG,WAAa,GAAGC,SAAS,EAAG,QAC1CF,OAAOF,EAAKK,WAAWD,SAAS,EAAG,QACjCF,OAAOF,EAAKM,YAAYF,SAAS,EAAG,QAClCF,OAAOF,EAAKO,cAAcH,SAAS,EAAG,QACtCF,OAAOF,EAAKQ,cAAcJ,SAAS,EAAG,aAIlDK,EAAkC,CACtCC,UAAWX,EAdO,IAAI7B,KAAKC,EAAIwC,UAAY,SAe3CC,QAASb,EAAwB5B,IAInC,IAAK2B,GAA8B,IAAnBA,EAAQe,OACtB,aAAanD,KAAKC,QAAQ,qBAAsB,aAAc8C,GAIhE,GAAuB,IAAnBX,EAAQe,OAEV,OADAJ,EAAWnB,OAASQ,EAAQ,SACfpC,KAAKC,QAAQ,qBAAsB,aAAc8C,GAIhE,MAAMK,EAAWhB,EAAQiB,IAAIxB,IAC3B,MAAMzB,EAAS,IAAK2C,EAAYnB,OAAQC,GACxC,OAAO7B,KAAKC,QAAQ,qBAAsB,aAAcG,KAGpDkD,QAAgBC,QAAQC,IAAIJ,GAG5BK,EAAc,CAAEC,SAAU,IAC1BC,EAAkB,GAExB,IAAK,MAAMpC,KAAU+B,EAAS,CAC5B,GAAI/B,EAAOmC,UAAUE,MAEnB,OAAOrC,EAELA,EAAOmC,UAAUG,YACnBF,EAASG,QAAQvC,EAAOmC,SAASG,WAErC,CAQA,OALAJ,EAAOC,SAAW,IACbJ,EAAQ,GAAGI,SACdG,WAAYF,GAGPF,CACT,CAKA,wBAAMM,CAAmBpC,GACvB,MAAMvB,EAA8B,CAClCwB,OAAQD,EAAQE,QAAU,IAC1BI,QAASN,EAAQqC,MAGnB,aAAahE,KAAKC,QAAQ,qBAAsB,aAAcG,EAChE,CAKA,2BAAM6D,CAAsB7B,GAC1B,MAAM3B,EAAM,IAAID,KAIV6B,EAA2BC,GAOxB,GANMA,EAAKC,iBACJC,OAAOF,EAAKG,WAAa,GAAGC,SAAS,EAAG,QAC1CF,OAAOF,EAAKK,WAAWD,SAAS,EAAG,QACjCF,OAAOF,EAAKM,YAAYF,SAAS,EAAG,QAClCF,OAAOF,EAAKO,cAAcH,SAAS,EAAG,QACtCF,OAAOF,EAAKQ,cAAcJ,SAAS,EAAG,aAIlDK,EAAkC,CACtCC,UAAWX,EAdO,IAAI7B,KAAKC,EAAIwC,UAAY,SAe3CC,QAASb,EAAwB5B,IAInC,IAAK2B,GAA8B,IAAnBA,EAAQe,OACtB,aAAanD,KAAKC,QAAQ,wBAAyB,aAAc8C,GAInE,GAAuB,IAAnBX,EAAQe,OAEV,OADAJ,EAAWnB,OAASQ,EAAQ,SACfpC,KAAKC,QAAQ,wBAAyB,aAAc8C,GAInE,MAAMK,EAAWhB,EAAQiB,IAAIxB,IAC3B,MAAMzB,EAAS,IAAK2C,EAAYnB,OAAQC,GACxC,OAAO7B,KAAKC,QAAQ,wBAAyB,aAAcG,KAGvDkD,QAAgBC,QAAQC,IAAIJ,GAG5BK,EAAc,CAAEC,SAAU,IAC1BC,EAAkB,GAExB,IAAK,MAAMpC,KAAU+B,EAAS,CAC5B,GAAI/B,EAAOmC,UAAUE,MAEnB,OAAOrC,EAELA,EAAOmC,UAAUQ,eACnBP,EAASG,QAAQvC,EAAOmC,SAASQ,cAErC,CAQA,OALAT,EAAOC,SAAW,IACbJ,EAAQ,GAAGI,SACdQ,cAAeP,GAGVF,CACT","ignoreList":[]}
|
package/dist/api/signer.js
CHANGED
|
@@ -1,100 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
import crypto from 'crypto';
|
|
5
|
-
export class Signer {
|
|
6
|
-
/**
|
|
7
|
-
* 计算 HMAC-SHA256
|
|
8
|
-
*/
|
|
9
|
-
static hmacSha256(key, message) {
|
|
10
|
-
return crypto.createHmac('sha256', key).update(message).digest();
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* 计算 SHA256
|
|
14
|
-
*/
|
|
15
|
-
static sha256(message) {
|
|
16
|
-
return crypto.createHash('sha256').update(message).digest();
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* 计算 SHA256 hex
|
|
20
|
-
*/
|
|
21
|
-
static sha256Hex(message) {
|
|
22
|
-
return crypto.createHash('sha256').update(message).digest('hex');
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 获取日期
|
|
26
|
-
*/
|
|
27
|
-
static getDate(timestamp) {
|
|
28
|
-
const date = new Date(timestamp * 1000);
|
|
29
|
-
return date.toISOString().substr(0, 10);
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* 构建 Query String
|
|
33
|
-
*/
|
|
34
|
-
static buildQueryString(params) {
|
|
35
|
-
const sortedKeys = Object.keys(params).sort();
|
|
36
|
-
return sortedKeys
|
|
37
|
-
.map((key) => {
|
|
38
|
-
const value = params[key];
|
|
39
|
-
if (Array.isArray(value)) {
|
|
40
|
-
return value
|
|
41
|
-
.map((v) => `${this._encodeURIComponent(key)}=${this._encodeURIComponent(String(v))}`)
|
|
42
|
-
.join('&');
|
|
43
|
-
}
|
|
44
|
-
return `${this._encodeURIComponent(key)}=${this._encodeURIComponent(String(value))}`;
|
|
45
|
-
})
|
|
46
|
-
.join('&');
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* URI 编码(RFC3986)
|
|
50
|
-
*/
|
|
51
|
-
static _encodeURIComponent(str) {
|
|
52
|
-
return encodeURIComponent(str).replace(/[!*'()]/g, (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 签名
|
|
56
|
-
*/
|
|
57
|
-
static sign(options) {
|
|
58
|
-
const { method, host, path, queryParams = {}, bodyParams = {}, secretId, secretKey, service, region = 'ap-guangzhou', } = options;
|
|
59
|
-
// 1. 拼接规范查询字符串
|
|
60
|
-
const queryString = this.buildQueryString(queryParams);
|
|
61
|
-
// 2. 拼接请求体
|
|
62
|
-
const body = bodyParams ? JSON.stringify(bodyParams) : '';
|
|
63
|
-
const contentType = 'application/json';
|
|
64
|
-
// 3. 计算时间戳
|
|
65
|
-
const timestamp = Math.floor(Date.now() / 1000);
|
|
66
|
-
const date = this.getDate(timestamp);
|
|
67
|
-
// 4. 拼接 CanonicalRequest
|
|
68
|
-
const httpRequestMethod = method;
|
|
69
|
-
const canonicalUri = path;
|
|
70
|
-
const canonicalQueryString = queryString;
|
|
71
|
-
const canonicalHeaders = `content-type:${contentType}\nhost:${host}\n`;
|
|
72
|
-
const signedHeaders = 'content-type;host';
|
|
73
|
-
const hashedRequestPayload = this.sha256Hex(body);
|
|
74
|
-
const canonicalRequest = `${httpRequestMethod}\n${canonicalUri}\n${canonicalQueryString}\n${canonicalHeaders}\n${signedHeaders}\n${hashedRequestPayload}`;
|
|
75
|
-
// 5. 拼接 StringToSign
|
|
76
|
-
const algorithm = 'TC3-HMAC-SHA256';
|
|
77
|
-
const credentialScope = `${date}/${service}/request`;
|
|
78
|
-
const hashedCanonicalRequest = this.sha256Hex(canonicalRequest);
|
|
79
|
-
const stringToSign = `${algorithm}\n${timestamp}\n${credentialScope}\n${hashedCanonicalRequest}`;
|
|
80
|
-
// 6. 计算签名
|
|
81
|
-
const secretDate = this.hmacSha256(Buffer.from(`TC3${secretKey}`, 'utf-8'), date);
|
|
82
|
-
const secretService = this.hmacSha256(secretDate, service);
|
|
83
|
-
const secretSigning = this.hmacSha256(secretService, 'request');
|
|
84
|
-
const signature = this.hmacSha256(secretSigning, stringToSign).toString('hex');
|
|
85
|
-
// 7. 拼接 Authorization
|
|
86
|
-
const authorization = `${algorithm} Credential=${secretId}/${credentialScope}, SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
|
87
|
-
// 8. 构造请求头
|
|
88
|
-
const headers = {
|
|
89
|
-
Authorization: authorization,
|
|
90
|
-
'Content-Type': contentType,
|
|
91
|
-
Host: host,
|
|
92
|
-
'X-TC-Action': bodyParams.Action || '',
|
|
93
|
-
'X-TC-Timestamp': timestamp.toString(),
|
|
94
|
-
'X-TC-Version': bodyParams.Version || '',
|
|
95
|
-
'X-TC-Region': region,
|
|
96
|
-
};
|
|
97
|
-
return { headers, body };
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
//# sourceMappingURL=signer.js.map
|
|
1
|
+
import t from"crypto";export class Signer{static hmacSha256(e,n){return t.createHmac("sha256",e).update(n).digest()}static sha256(e){return t.createHash("sha256").update(e).digest()}static sha256Hex(e){return t.createHash("sha256").update(e).digest("hex")}static getDate(t){return new Date(1e3*t).toISOString().substr(0,10)}static buildQueryString(t){return Object.keys(t).sort().map(e=>{const n=t[e];return Array.isArray(n)?n.map(t=>`${this._encodeURIComponent(e)}=${this._encodeURIComponent(String(t))}`).join("&"):`${this._encodeURIComponent(e)}=${this._encodeURIComponent(String(n))}`}).join("&")}static _encodeURIComponent(t){return encodeURIComponent(t).replace(/[!*'()]/g,t=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`)}static sign(t){const{method:e,host:n,path:r,queryParams:a={},bodyParams:s={},secretId:o,secretKey:i,service:h,region:c="ap-guangzhou"}=t,p=this.buildQueryString(a),u=s?JSON.stringify(s):"",$="application/json",d=Math.floor(Date.now()/1e3),g=this.getDate(d),m="content-type;host",S=`${e}\n${r}\n${p}\n${`content-type:${$}\nhost:${n}\n`}\n${m}\n${this.sha256Hex(u)}`,C="TC3-HMAC-SHA256",y=`${g}/${h}/request`,H=`${C}\n${d}\n${y}\n${this.sha256Hex(S)}`,A=this.hmacSha256(Buffer.from(`TC3${i}`,"utf-8"),g),I=this.hmacSha256(A,h),T=this.hmacSha256(I,"request");return{headers:{Authorization:`${C} Credential=${o}/${y}, SignedHeaders=${m}, Signature=${this.hmacSha256(T,H).toString("hex")}`,"Content-Type":$,Host:n,"X-TC-Action":s.Action||"","X-TC-Timestamp":d.toString(),"X-TC-Version":s.Version||"","X-TC-Region":c},body:u}}}
|
|
2
|
+
//# sourceMappingURL=api\signer.js.map
|
package/dist/api/signer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signer.js","
|
|
1
|
+
{"version":3,"file":"A:\\edgeone-cli\\dist\\api\\signer.js","names":["crypto","Signer","hmacSha256","key","message","createHmac","update","digest","sha256","createHash","sha256Hex","getDate","timestamp","Date","toISOString","substr","buildQueryString","params","Object","keys","sort","map","value","Array","isArray","v","this","_encodeURIComponent","String","join","str","encodeURIComponent","replace","c","charCodeAt","toString","toUpperCase","sign","options","method","host","path","queryParams","bodyParams","secretId","secretKey","service","region","queryString","body","JSON","stringify","contentType","Math","floor","now","date","signedHeaders","canonicalRequest","algorithm","credentialScope","stringToSign","secretDate","Buffer","from","secretService","secretSigning","headers","Authorization","Host","Action","Version"],"sources":["../../src/api/signer.ts"],"mappings":"OAGOA,MAAY,gBAeb,MAAOC,OAIH,iBAAOC,CAAWC,EAAaC,GACrC,OAAOJ,EAAOK,WAAW,SAAUF,GAAKG,OAAOF,GAASG,QAC1D,CAKQ,aAAOC,CAAOJ,GACpB,OAAOJ,EAAOS,WAAW,UAAUH,OAAOF,GAASG,QACrD,CAKQ,gBAAOG,CAAUN,GACvB,OAAOJ,EAAOS,WAAW,UAAUH,OAAOF,GAASG,OAAO,MAC5D,CAKQ,cAAOI,CAAQC,GAErB,OADa,IAAIC,KAAiB,IAAZD,GACVE,cAAcC,OAAO,EAAG,GACtC,CAKQ,uBAAOC,CAAiBC,GAE9B,OADmBC,OAAOC,KAAKF,GAAQG,OAEpCC,IAAKlB,IACJ,MAAMmB,EAAQL,EAAOd,GACrB,OAAIoB,MAAMC,QAAQF,GACTA,EACJD,IAAKI,GAAM,GAAGC,KAAKC,oBAAoBxB,MAAQuB,KAAKC,oBAAoBC,OAAOH,OAC/EI,KAAK,KAEH,GAAGH,KAAKC,oBAAoBxB,MAAQuB,KAAKC,oBAAoBC,OAAON,QAE5EO,KAAK,IACV,CAKQ,0BAAOF,CAAoBG,GACjC,OAAOC,mBAAmBD,GAAKE,QAAQ,WAAaC,GAAM,IAAIA,EAAEC,WAAW,GAAGC,SAAS,IAAIC,gBAC7F,CAKA,WAAOC,CAAKC,GACV,MAAMC,OACJA,EAAMC,KACNA,EAAIC,KACJA,EAAIC,YACJA,EAAc,GAAEC,WAChBA,EAAa,GAAEC,SACfA,EAAQC,UACRA,EAASC,QACTA,EAAOC,OACPA,EAAS,gBACPT,EAGEU,EAActB,KAAKV,iBAAiB0B,GAGpCO,EAAON,EAAaO,KAAKC,UAAUR,GAAc,GACjDS,EAAc,mBAGdxC,EAAYyC,KAAKC,MAAMzC,KAAK0C,MAAQ,KACpCC,EAAO9B,KAAKf,QAAQC,GAOpB6C,EAAgB,oBAEhBC,EAAmB,GANCnB,MACLE,MACQO,MACJ,gBAAgBI,WAAqBZ,UAGmDiB,MADpF/B,KAAKhB,UAAUuC,KAItCU,EAAY,kBACZC,EAAkB,GAAGJ,KAAQV,YAE7Be,EAAe,GAAGF,MAAc/C,MAAcgD,MADrBlC,KAAKhB,UAAUgD,KAIxCI,EAAapC,KAAKxB,WAAW6D,OAAOC,KAAK,MAAMnB,IAAa,SAAUW,GACtES,EAAgBvC,KAAKxB,WAAW4D,EAAYhB,GAC5CoB,EAAgBxC,KAAKxB,WAAW+D,EAAe,WAiBrD,MAAO,CAAEE,QAVO,CACdC,cAJoB,GAAGT,gBAAwBf,KAAYgB,oBAAkCH,gBAH7E/B,KAAKxB,WAAWgE,EAAeL,GAAc1B,SAAS,SAQtE,eAAgBiB,EAChBiB,KAAM7B,EACN,cAAeG,EAAW2B,QAAU,GACpC,iBAAkB1D,EAAUuB,WAC5B,eAAgBQ,EAAW4B,SAAW,GACtC,cAAexB,GAGCE,OACpB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,KAAK,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AAWzC,UAAU,MAAM;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAGD,QAAA,MAAM,WAAW,QAAuC,CAAC;AAWzD;;GAEG;AACH,iBAAS,UAAU,IAAI,MAAM,GAAG,IAAI,CAoCnC;AA0DD,QAAA,MAAM,SAAS,SACgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,KAAK,UAAU,GAAG,OAAO,GAAG,YAAY,CAAC;AAWzC,UAAU,MAAM;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAGD,QAAA,MAAM,WAAW,QAAuC,CAAC;AAWzD;;GAEG;AACH,iBAAS,UAAU,IAAI,MAAM,GAAG,IAAI,CAoCnC;AA0DD,QAAA,MAAM,SAAS,SACgB,CAAC;AAoMhC,eAAe,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;AACnC,YAAY,EAAE,UAAU,EAAE,CAAC"}
|