update: alicloud-fc support in NetScheduler
This commit is contained in:
parent
3842c63ad1
commit
da47c0ab66
@ -24,7 +24,8 @@ type NetSchedulerErrorCode =
|
|||||||
| "PROXY_RATE_LIMITED"
|
| "PROXY_RATE_LIMITED"
|
||||||
| "PROXY_NOT_FOUND"
|
| "PROXY_NOT_FOUND"
|
||||||
| "FETCH_ERROR"
|
| "FETCH_ERROR"
|
||||||
| "NOT_IMPLEMENTED";
|
| "NOT_IMPLEMENTED"
|
||||||
|
| "ALICLOUD_PROXY_ERR";
|
||||||
|
|
||||||
export class NetSchedulerError extends Error {
|
export class NetSchedulerError extends Error {
|
||||||
public code: NetSchedulerErrorCode;
|
public code: NetSchedulerErrorCode;
|
||||||
@ -186,7 +187,7 @@ class NetScheduler {
|
|||||||
|
|
||||||
if (!force) {
|
if (!force) {
|
||||||
const isAvailable = await this.getProxyAvailability(proxyName, task);
|
const isAvailable = await this.getProxyAvailability(proxyName, task);
|
||||||
const limiter = "proxy-" + proxyName + "-" + task
|
const limiter = "proxy-" + proxyName + "-" + task;
|
||||||
if (!isAvailable) {
|
if (!isAvailable) {
|
||||||
throw new NetSchedulerError(`Proxy "${limiter}" is rate limited`, "PROXY_RATE_LIMITED");
|
throw new NetSchedulerError(`Proxy "${limiter}" is rate limited`, "PROXY_RATE_LIMITED");
|
||||||
}
|
}
|
||||||
@ -201,6 +202,8 @@ class NetScheduler {
|
|||||||
switch (proxy.type) {
|
switch (proxy.type) {
|
||||||
case "native":
|
case "native":
|
||||||
return await this.nativeRequest<R>(url, method);
|
return await this.nativeRequest<R>(url, method);
|
||||||
|
case "alicloud-fc":
|
||||||
|
return await this.alicloudFcRequest<R>(url, proxy.data);
|
||||||
default:
|
default:
|
||||||
throw new NetSchedulerError(`Proxy type ${proxy.type} not supported`, "NOT_IMPLEMENTED");
|
throw new NetSchedulerError(`Proxy type ${proxy.type} not supported`, "NOT_IMPLEMENTED");
|
||||||
}
|
}
|
||||||
@ -248,6 +251,39 @@ class NetScheduler {
|
|||||||
throw new NetSchedulerError("Fetch error", "FETCH_ERROR", e);
|
throw new NetSchedulerError("Fetch error", "FETCH_ERROR", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async alicloudFcRequest<R>(url: string, region: string): Promise<R> {
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
const output = await new Deno.Command("aliyun", {
|
||||||
|
args: [
|
||||||
|
"fc",
|
||||||
|
"POST",
|
||||||
|
`/2023-03-30/functions/proxy-${region}/invocations`,
|
||||||
|
"--qualifier",
|
||||||
|
"LATEST",
|
||||||
|
"--header",
|
||||||
|
"Content-Type=application/json;x-fc-invocation-type=Sync;x-fc-log-type=None;",
|
||||||
|
"--body",
|
||||||
|
JSON.stringify({ url: url }),
|
||||||
|
"--profile",
|
||||||
|
`CVSA-${region}`,
|
||||||
|
],
|
||||||
|
}).output();
|
||||||
|
try {
|
||||||
|
const out = decoder.decode(output.stdout);
|
||||||
|
const rawData = JSON.parse(out);
|
||||||
|
if (rawData.statusCode !== 200) {
|
||||||
|
throw new NetSchedulerError(
|
||||||
|
`Error proxying ${url} to ali-fc region ${region}, code: ${rawData.statusCode}.`,
|
||||||
|
"ALICLOUD_PROXY_ERR",
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return JSON.parse(rawData.body) as R;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
throw new NetSchedulerError(`Unhandled error: Cannot proxy ${url} to ali-fc.`, "ALICLOUD_PROXY_ERR", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const netScheduler = new NetScheduler();
|
const netScheduler = new NetScheduler();
|
||||||
|
Loading…
Reference in New Issue
Block a user