mirror of
https://github.com/woodchen-ink/Edgeone_CleanCache.git
synced 2025-07-18 05:51:57 +08:00
503 lines
17 KiB
JavaScript
503 lines
17 KiB
JavaScript
|
|
let global = globalThis;
|
|
|
|
class MessageChannel {
|
|
constructor() {
|
|
this.port1 = new MessagePort();
|
|
this.port2 = new MessagePort();
|
|
}
|
|
}
|
|
class MessagePort {
|
|
constructor() {
|
|
this.onmessage = null;
|
|
}
|
|
postMessage(data) {
|
|
if (this.onmessage) {
|
|
setTimeout(() => this.onmessage({ data }), 0);
|
|
}
|
|
}
|
|
}
|
|
global.MessageChannel = MessageChannel;
|
|
|
|
async function handleRequest(context){
|
|
let routeParams = {};
|
|
let pagesFunctionResponse = null;
|
|
const request = context.request;
|
|
const urlInfo = new URL(request.url);
|
|
|
|
if (urlInfo.pathname !== '/' && urlInfo.pathname.endsWith('/')) {
|
|
urlInfo.pathname = urlInfo.pathname.slice(0, -1);
|
|
}
|
|
|
|
let matchedFunc = false;
|
|
|
|
if('/api/clean-eo-cache' === urlInfo.pathname) {
|
|
matchedFunc = true;
|
|
(() => {
|
|
// functions/api/clean-eo-cache.js
|
|
async function qcloudV3Post(secretId, secretKey, service, bodyArray, headersArray) {
|
|
const HTTPRequestMethod = "POST";
|
|
const CanonicalURI = "/";
|
|
const CanonicalQueryString = "";
|
|
const sortHeadersArray = Object.keys(headersArray).sort().reduce((obj, key) => {
|
|
obj[key] = headersArray[key];
|
|
return obj;
|
|
}, {});
|
|
let SignedHeaders = "";
|
|
let CanonicalHeaders = "";
|
|
for (const key in sortHeadersArray) {
|
|
SignedHeaders += key.toLowerCase() + ";";
|
|
}
|
|
SignedHeaders = SignedHeaders.slice(0, -1);
|
|
for (const key in sortHeadersArray) {
|
|
CanonicalHeaders += `${key.toLowerCase()}:${sortHeadersArray[key].toLowerCase()}
|
|
`;
|
|
}
|
|
const HashedRequestPayload = await crypto.subtle.digest(
|
|
"SHA-256",
|
|
new TextEncoder().encode(JSON.stringify(bodyArray))
|
|
).then((hash) => Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join(""));
|
|
const CanonicalRequest = `${HTTPRequestMethod}
|
|
${CanonicalURI}
|
|
${CanonicalQueryString}
|
|
${CanonicalHeaders}
|
|
${SignedHeaders}
|
|
${HashedRequestPayload}`;
|
|
const RequestTimestamp = Math.floor(Date.now() / 1e3);
|
|
const formattedDate = new Date(RequestTimestamp * 1e3).toISOString().split("T")[0];
|
|
const Algorithm = "TC3-HMAC-SHA256";
|
|
const CredentialScope = `${formattedDate}/${service}/tc3_request`;
|
|
const HashedCanonicalRequest = await crypto.subtle.digest(
|
|
"SHA-256",
|
|
new TextEncoder().encode(CanonicalRequest)
|
|
).then((hash) => Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join(""));
|
|
const StringToSign = `${Algorithm}
|
|
${RequestTimestamp}
|
|
${CredentialScope}
|
|
${HashedCanonicalRequest}`;
|
|
async function hmac(key, string) {
|
|
const cryptoKey = await crypto.subtle.importKey(
|
|
"raw",
|
|
typeof key === "string" ? new TextEncoder().encode(key) : key,
|
|
{ name: "HMAC", hash: "SHA-256" },
|
|
false,
|
|
["sign"]
|
|
);
|
|
const signature = await crypto.subtle.sign(
|
|
"HMAC",
|
|
cryptoKey,
|
|
new TextEncoder().encode(string)
|
|
);
|
|
return new Uint8Array(signature);
|
|
}
|
|
const SecretDate = await hmac("TC3" + secretKey, formattedDate);
|
|
const SecretService = await hmac(SecretDate, service);
|
|
const SecretSigning = await hmac(SecretService, "tc3_request");
|
|
const Signature = Array.from(
|
|
new Uint8Array(
|
|
await crypto.subtle.sign(
|
|
"HMAC",
|
|
await crypto.subtle.importKey(
|
|
"raw",
|
|
SecretSigning,
|
|
{ name: "HMAC", hash: "SHA-256" },
|
|
false,
|
|
["sign"]
|
|
),
|
|
new TextEncoder().encode(StringToSign)
|
|
)
|
|
)
|
|
).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
const Authorization = `${Algorithm} Credential=${secretId}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;
|
|
headersArray["X-TC-Timestamp"] = RequestTimestamp.toString();
|
|
headersArray["Authorization"] = Authorization;
|
|
return headersArray;
|
|
}
|
|
function onRequestOptions(context) {
|
|
return new Response(null, {
|
|
headers: {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
"Access-Control-Allow-Headers": "Content-Type"
|
|
}
|
|
});
|
|
}
|
|
async function onRequestPost(context) {
|
|
try {
|
|
const data = await context.request.json();
|
|
const { secretId, secretKey, zoneId, type, targets } = data;
|
|
const service = "teo";
|
|
const host = "teo.tencentcloudapi.com";
|
|
const payload = {
|
|
ZoneId: zoneId,
|
|
Type: type,
|
|
Targets: targets
|
|
};
|
|
const headersPending = {
|
|
"Host": host,
|
|
"Content-Type": "application/json",
|
|
"X-TC-Action": "CreatePurgeTask",
|
|
"X-TC-Version": "2022-09-01",
|
|
"X-TC-Region": "ap-guangzhou"
|
|
};
|
|
const headers = await qcloudV3Post(secretId, secretKey, service, payload, headersPending);
|
|
const response = await fetch(`https://${host}`, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(payload)
|
|
});
|
|
const result = await response.json();
|
|
return new Response(JSON.stringify(result), {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
} catch (error) {
|
|
return new Response(JSON.stringify({ error: error.message }), {
|
|
status: 500,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function onRequest(context) {
|
|
return new Response(JSON.stringify({ error: "Only POST method is allowed" }), {
|
|
status: 405,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
}
|
|
|
|
pagesFunctionResponse = onRequest;
|
|
})();
|
|
}
|
|
|
|
if('/api/clean-eo-cache' === urlInfo.pathname && request.method === 'POST') {
|
|
matchedFunc = true;
|
|
(() => {
|
|
// functions/api/clean-eo-cache.js
|
|
async function qcloudV3Post(secretId, secretKey, service, bodyArray, headersArray) {
|
|
const HTTPRequestMethod = "POST";
|
|
const CanonicalURI = "/";
|
|
const CanonicalQueryString = "";
|
|
const sortHeadersArray = Object.keys(headersArray).sort().reduce((obj, key) => {
|
|
obj[key] = headersArray[key];
|
|
return obj;
|
|
}, {});
|
|
let SignedHeaders = "";
|
|
let CanonicalHeaders = "";
|
|
for (const key in sortHeadersArray) {
|
|
SignedHeaders += key.toLowerCase() + ";";
|
|
}
|
|
SignedHeaders = SignedHeaders.slice(0, -1);
|
|
for (const key in sortHeadersArray) {
|
|
CanonicalHeaders += `${key.toLowerCase()}:${sortHeadersArray[key].toLowerCase()}
|
|
`;
|
|
}
|
|
const HashedRequestPayload = await crypto.subtle.digest(
|
|
"SHA-256",
|
|
new TextEncoder().encode(JSON.stringify(bodyArray))
|
|
).then((hash) => Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join(""));
|
|
const CanonicalRequest = `${HTTPRequestMethod}
|
|
${CanonicalURI}
|
|
${CanonicalQueryString}
|
|
${CanonicalHeaders}
|
|
${SignedHeaders}
|
|
${HashedRequestPayload}`;
|
|
const RequestTimestamp = Math.floor(Date.now() / 1e3);
|
|
const formattedDate = new Date(RequestTimestamp * 1e3).toISOString().split("T")[0];
|
|
const Algorithm = "TC3-HMAC-SHA256";
|
|
const CredentialScope = `${formattedDate}/${service}/tc3_request`;
|
|
const HashedCanonicalRequest = await crypto.subtle.digest(
|
|
"SHA-256",
|
|
new TextEncoder().encode(CanonicalRequest)
|
|
).then((hash) => Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join(""));
|
|
const StringToSign = `${Algorithm}
|
|
${RequestTimestamp}
|
|
${CredentialScope}
|
|
${HashedCanonicalRequest}`;
|
|
async function hmac(key, string) {
|
|
const cryptoKey = await crypto.subtle.importKey(
|
|
"raw",
|
|
typeof key === "string" ? new TextEncoder().encode(key) : key,
|
|
{ name: "HMAC", hash: "SHA-256" },
|
|
false,
|
|
["sign"]
|
|
);
|
|
const signature = await crypto.subtle.sign(
|
|
"HMAC",
|
|
cryptoKey,
|
|
new TextEncoder().encode(string)
|
|
);
|
|
return new Uint8Array(signature);
|
|
}
|
|
const SecretDate = await hmac("TC3" + secretKey, formattedDate);
|
|
const SecretService = await hmac(SecretDate, service);
|
|
const SecretSigning = await hmac(SecretService, "tc3_request");
|
|
const Signature = Array.from(
|
|
new Uint8Array(
|
|
await crypto.subtle.sign(
|
|
"HMAC",
|
|
await crypto.subtle.importKey(
|
|
"raw",
|
|
SecretSigning,
|
|
{ name: "HMAC", hash: "SHA-256" },
|
|
false,
|
|
["sign"]
|
|
),
|
|
new TextEncoder().encode(StringToSign)
|
|
)
|
|
)
|
|
).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
const Authorization = `${Algorithm} Credential=${secretId}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;
|
|
headersArray["X-TC-Timestamp"] = RequestTimestamp.toString();
|
|
headersArray["Authorization"] = Authorization;
|
|
return headersArray;
|
|
}
|
|
function onRequestOptions(context) {
|
|
return new Response(null, {
|
|
headers: {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
"Access-Control-Allow-Headers": "Content-Type"
|
|
}
|
|
});
|
|
}
|
|
async function onRequestPost(context) {
|
|
try {
|
|
const data = await context.request.json();
|
|
const { secretId, secretKey, zoneId, type, targets } = data;
|
|
const service = "teo";
|
|
const host = "teo.tencentcloudapi.com";
|
|
const payload = {
|
|
ZoneId: zoneId,
|
|
Type: type,
|
|
Targets: targets
|
|
};
|
|
const headersPending = {
|
|
"Host": host,
|
|
"Content-Type": "application/json",
|
|
"X-TC-Action": "CreatePurgeTask",
|
|
"X-TC-Version": "2022-09-01",
|
|
"X-TC-Region": "ap-guangzhou"
|
|
};
|
|
const headers = await qcloudV3Post(secretId, secretKey, service, payload, headersPending);
|
|
const response = await fetch(`https://${host}`, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(payload)
|
|
});
|
|
const result = await response.json();
|
|
return new Response(JSON.stringify(result), {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
} catch (error) {
|
|
return new Response(JSON.stringify({ error: error.message }), {
|
|
status: 500,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function onRequest(context) {
|
|
return new Response(JSON.stringify({ error: "Only POST method is allowed" }), {
|
|
status: 405,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
}
|
|
|
|
pagesFunctionResponse = onRequestPost;
|
|
})();
|
|
}
|
|
|
|
if('/api/clean-eo-cache' === urlInfo.pathname && request.method === 'OPTIONS') {
|
|
matchedFunc = true;
|
|
(() => {
|
|
// functions/api/clean-eo-cache.js
|
|
async function qcloudV3Post(secretId, secretKey, service, bodyArray, headersArray) {
|
|
const HTTPRequestMethod = "POST";
|
|
const CanonicalURI = "/";
|
|
const CanonicalQueryString = "";
|
|
const sortHeadersArray = Object.keys(headersArray).sort().reduce((obj, key) => {
|
|
obj[key] = headersArray[key];
|
|
return obj;
|
|
}, {});
|
|
let SignedHeaders = "";
|
|
let CanonicalHeaders = "";
|
|
for (const key in sortHeadersArray) {
|
|
SignedHeaders += key.toLowerCase() + ";";
|
|
}
|
|
SignedHeaders = SignedHeaders.slice(0, -1);
|
|
for (const key in sortHeadersArray) {
|
|
CanonicalHeaders += `${key.toLowerCase()}:${sortHeadersArray[key].toLowerCase()}
|
|
`;
|
|
}
|
|
const HashedRequestPayload = await crypto.subtle.digest(
|
|
"SHA-256",
|
|
new TextEncoder().encode(JSON.stringify(bodyArray))
|
|
).then((hash) => Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join(""));
|
|
const CanonicalRequest = `${HTTPRequestMethod}
|
|
${CanonicalURI}
|
|
${CanonicalQueryString}
|
|
${CanonicalHeaders}
|
|
${SignedHeaders}
|
|
${HashedRequestPayload}`;
|
|
const RequestTimestamp = Math.floor(Date.now() / 1e3);
|
|
const formattedDate = new Date(RequestTimestamp * 1e3).toISOString().split("T")[0];
|
|
const Algorithm = "TC3-HMAC-SHA256";
|
|
const CredentialScope = `${formattedDate}/${service}/tc3_request`;
|
|
const HashedCanonicalRequest = await crypto.subtle.digest(
|
|
"SHA-256",
|
|
new TextEncoder().encode(CanonicalRequest)
|
|
).then((hash) => Array.from(new Uint8Array(hash)).map((b) => b.toString(16).padStart(2, "0")).join(""));
|
|
const StringToSign = `${Algorithm}
|
|
${RequestTimestamp}
|
|
${CredentialScope}
|
|
${HashedCanonicalRequest}`;
|
|
async function hmac(key, string) {
|
|
const cryptoKey = await crypto.subtle.importKey(
|
|
"raw",
|
|
typeof key === "string" ? new TextEncoder().encode(key) : key,
|
|
{ name: "HMAC", hash: "SHA-256" },
|
|
false,
|
|
["sign"]
|
|
);
|
|
const signature = await crypto.subtle.sign(
|
|
"HMAC",
|
|
cryptoKey,
|
|
new TextEncoder().encode(string)
|
|
);
|
|
return new Uint8Array(signature);
|
|
}
|
|
const SecretDate = await hmac("TC3" + secretKey, formattedDate);
|
|
const SecretService = await hmac(SecretDate, service);
|
|
const SecretSigning = await hmac(SecretService, "tc3_request");
|
|
const Signature = Array.from(
|
|
new Uint8Array(
|
|
await crypto.subtle.sign(
|
|
"HMAC",
|
|
await crypto.subtle.importKey(
|
|
"raw",
|
|
SecretSigning,
|
|
{ name: "HMAC", hash: "SHA-256" },
|
|
false,
|
|
["sign"]
|
|
),
|
|
new TextEncoder().encode(StringToSign)
|
|
)
|
|
)
|
|
).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
const Authorization = `${Algorithm} Credential=${secretId}/${CredentialScope}, SignedHeaders=${SignedHeaders}, Signature=${Signature}`;
|
|
headersArray["X-TC-Timestamp"] = RequestTimestamp.toString();
|
|
headersArray["Authorization"] = Authorization;
|
|
return headersArray;
|
|
}
|
|
function onRequestOptions(context) {
|
|
return new Response(null, {
|
|
headers: {
|
|
"Access-Control-Allow-Origin": "*",
|
|
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
"Access-Control-Allow-Headers": "Content-Type"
|
|
}
|
|
});
|
|
}
|
|
async function onRequestPost(context) {
|
|
try {
|
|
const data = await context.request.json();
|
|
const { secretId, secretKey, zoneId, type, targets } = data;
|
|
const service = "teo";
|
|
const host = "teo.tencentcloudapi.com";
|
|
const payload = {
|
|
ZoneId: zoneId,
|
|
Type: type,
|
|
Targets: targets
|
|
};
|
|
const headersPending = {
|
|
"Host": host,
|
|
"Content-Type": "application/json",
|
|
"X-TC-Action": "CreatePurgeTask",
|
|
"X-TC-Version": "2022-09-01",
|
|
"X-TC-Region": "ap-guangzhou"
|
|
};
|
|
const headers = await qcloudV3Post(secretId, secretKey, service, payload, headersPending);
|
|
const response = await fetch(`https://${host}`, {
|
|
method: "POST",
|
|
headers,
|
|
body: JSON.stringify(payload)
|
|
});
|
|
const result = await response.json();
|
|
return new Response(JSON.stringify(result), {
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
} catch (error) {
|
|
return new Response(JSON.stringify({ error: error.message }), {
|
|
status: 500,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function onRequest(context) {
|
|
return new Response(JSON.stringify({ error: "Only POST method is allowed" }), {
|
|
status: 405,
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
"Access-Control-Allow-Origin": "*"
|
|
}
|
|
});
|
|
}
|
|
|
|
pagesFunctionResponse = onRequestOptions;
|
|
})();
|
|
}
|
|
|
|
|
|
const params = {};
|
|
if (routeParams.id) {
|
|
if (routeParams.mode === 1) {
|
|
const value = urlInfo.pathname.match(routeParams.left);
|
|
for (let i = 1; i < value.length; i++) {
|
|
params[routeParams.id[i - 1]] = value[i];
|
|
}
|
|
} else {
|
|
const value = urlInfo.pathname.replace(routeParams.left, '');
|
|
const splitedValue = value.split('/');
|
|
if (splitedValue.length === 1) {
|
|
params[routeParams.id] = splitedValue[0];
|
|
} else {
|
|
params[routeParams.id] = splitedValue;
|
|
}
|
|
}
|
|
|
|
}
|
|
if(!matchedFunc){
|
|
pagesFunctionResponse = function() {
|
|
return new Response(null, {
|
|
status: 404,
|
|
headers: {
|
|
"content-type": "text/html; charset=UTF-8",
|
|
"x-edgefunctions-test": "Welcome to use Pages Functions.",
|
|
},
|
|
});
|
|
}
|
|
}
|
|
return pagesFunctionResponse({request, params, env: {} });
|
|
}addEventListener('fetch',event=>{return event.respondWith(handleRequest({request:event.request,params: {}, env: {} }))}); |