From 60e00f8f207f9040e20495aa50a4e01474f617b7 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Sun, 18 Oct 2026 19:39:19 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ksyun):=20=E9=87=8D=E6=9E=84=E9=87=91?= =?UTF-8?q?=E5=B1=B1=E4=BA=91=E5=AE=A2=E6=88=B7=E7=AB=AF=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=B9=B6=E8=B0=83=E6=95=B4=E8=AF=B7=E6=B1=82=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增金山云 V2 客户端类,优化请求参数处理和 Content-Type 设置,调整 access 配置中 service 和 endpoint 的顺序,移除无用的空行代码 --- packages/ui/certd-server/src/configuration.ts | 1 - .../src/plugins/plugin-ksyun/access.ts | 2 +- .../src/plugins/plugin-ksyun/client.ts | 6 +- .../src/plugins/plugin-ksyun/ksyunclientv2.ts | 80 +++++++++++++++++++ 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 packages/ui/certd-server/src/plugins/plugin-ksyun/ksyunclientv2.ts diff --git a/packages/ui/certd-server/src/configuration.ts b/packages/ui/certd-server/src/configuration.ts index d3e0a0612..55bed8e63 100644 --- a/packages/ui/certd-server/src/configuration.ts +++ b/packages/ui/certd-server/src/configuration.ts @@ -34,7 +34,6 @@ process.on("uncaughtException", error => { } }); - // function startHeapLog() { // function format(bytes: any) { // return (bytes / 1024 / 1024).toFixed(2) + ' MB'; diff --git a/packages/ui/certd-server/src/plugins/plugin-ksyun/access.ts b/packages/ui/certd-server/src/plugins/plugin-ksyun/access.ts index 80375c0bb..174763d5d 100644 --- a/packages/ui/certd-server/src/plugins/plugin-ksyun/access.ts +++ b/packages/ui/certd-server/src/plugins/plugin-ksyun/access.ts @@ -113,9 +113,9 @@ export class KsyunAccess extends BaseAccess { accessKeyId: this.accessKeyId, secretAccessKey: this.accessKeySecret, region: "cn-beijing-6", - service: "cdn", endpoint: "cdn.api.ksyun.com", logger: this.ctx.logger, + service: "cdn", http: this.ctx.http, }); } diff --git a/packages/ui/certd-server/src/plugins/plugin-ksyun/client.ts b/packages/ui/certd-server/src/plugins/plugin-ksyun/client.ts index 73bcff247..5deb150e9 100644 --- a/packages/ui/certd-server/src/plugins/plugin-ksyun/client.ts +++ b/packages/ui/certd-server/src/plugins/plugin-ksyun/client.ts @@ -33,16 +33,14 @@ export class KsyunClient { const query = querystring.stringify(requestData); url = `${url}${url.includes("?") ? "&" : "?"}${query}`; } else { - const query = querystring.stringify({ Action: opts.action, Version: opts.version }); - url = `${url}${url.includes("?") ? "&" : "?"}${query}`; - data = JSON.stringify(opts.data || {}); + data = querystring.stringify(requestData); } const config = this.signRequest({ method, url, baseURL: `https://${this.endpoint}`, params: opts.params, - headers: { "Content-Type": "application/json" }, + headers: { "Content-Type": "application/x-www-form-urlencoded" }, data, }); diff --git a/packages/ui/certd-server/src/plugins/plugin-ksyun/ksyunclientv2.ts b/packages/ui/certd-server/src/plugins/plugin-ksyun/ksyunclientv2.ts new file mode 100644 index 000000000..6c4a81aa3 --- /dev/null +++ b/packages/ui/certd-server/src/plugins/plugin-ksyun/ksyunclientv2.ts @@ -0,0 +1,80 @@ +import { importRuntime } from "@certd/pipeline"; +import { ILogger } from "@certd/basic"; +import { get } from "lodash-es"; + +export class KsyunClientV2 { + private sdkClient: any; + private readonly accessKeyId: string; + private readonly secretAccessKey: string; + private readonly region: string; + private readonly endpoint: string; + private readonly logger: ILogger; + private readonly clientClass: any; + private readonly contentType: string; + private readonly method: string; + private readonly actionMethods: Record; + + constructor(opts: { accessKeyId: string; secretAccessKey: string; region?: string; endpoint: string; logger: ILogger; clientClass?: string; contentType?: string; method?: string; actionMethods?: Record }) { + this.accessKeyId = opts.accessKeyId; + this.secretAccessKey = opts.secretAccessKey; + this.region = opts.region || "cn-beijing-6"; + this.endpoint = opts.endpoint; + this.logger = opts.logger; + this.clientClass = opts.clientClass || "Cdn.v20160901"; + this.contentType = opts.contentType || "application/x-www-form-urlencoded"; + this.method = opts.method || ""; + this.actionMethods = opts.actionMethods || {}; + } + + private async getSdkClient() { + if (!this.sdkClient) { + const sdk = await importRuntime("ksyun-sdk-node", this.logger); + const ClientClass = get(sdk.default, this.clientClass); + if (!ClientClass) { + throw new Error("未找到金山云 SDK 客户端类"); + } + const httpProfile: any = { + timeout: 60, + protocol: "", + endpoint: this.endpoint, + headers: { + "Content-Type": this.contentType, + }, + }; + if (this.method) { + httpProfile.method = this.method; + } + this.sdkClient = new ClientClass({ + credential: { + secretId: this.accessKeyId, + secretKey: this.secretAccessKey, + }, + region: this.region, + httpProfile, + }); + for (const [action, method] of Object.entries(this.actionMethods)) { + if (this.sdkClient._apiList?.[action]) { + this.sdkClient._apiList[action].method = method; + } + } + } + return this.sdkClient; + } + + async doRequest(opts: { action: string; data?: Record; query?: Record }) { + const client = await this.getSdkClient(); + if (opts.query) { + const apiConfig = client._apiList?.[opts.action]; + if (apiConfig) { + apiConfig.config.query = { ...apiConfig.config.query, ...opts.query }; + } + } + const response = await client.request(opts.action, opts.data || {}); + const result = await response.json(); + this.logger.info(JSON.stringify(result)); + if (result?.Error) { + throw new Error(result.Error.Message || `金山云请求失败: ${opts.action}`); + } + return result; + } +}