@cloudbase/manager-node 5.6.7 → 5.7.0-beta.0

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.
Files changed (60) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/lib/cloudApp/index.js +12 -3
  3. package/lib/deploy/DatabaseDeployer.js +238 -0
  4. package/lib/deploy/DeployOrchestrator.js +564 -0
  5. package/lib/deploy/FunctionDeployer.js +611 -0
  6. package/lib/deploy/GatewayDeployer.js +522 -0
  7. package/lib/deploy/StateStore.js +327 -0
  8. package/lib/deploy/StaticDeployer.js +289 -0
  9. package/lib/deploy/domain.js +39 -0
  10. package/lib/deploy/framework.js +105 -0
  11. package/lib/deploy/function/artifact.js +207 -0
  12. package/lib/deploy/function/builders/cloud.js +454 -0
  13. package/lib/deploy/function/cam-preflight.js +157 -0
  14. package/lib/deploy/function/cloud-build-service.js +170 -0
  15. package/lib/deploy/function/config-guard.js +588 -0
  16. package/lib/deploy/function/docker-preflight.js +87 -0
  17. package/lib/deploy/function/image-preflight.js +164 -0
  18. package/lib/deploy/function/local-builder.js +110 -0
  19. package/lib/deploy/function/planner.js +282 -0
  20. package/lib/deploy/function/preflight.js +264 -0
  21. package/lib/deploy/types.js +99 -0
  22. package/lib/environment.js +11 -0
  23. package/lib/hosting/index.js +4 -1
  24. package/lib/index.js +31 -0
  25. package/lib/projectValidator/index.js +375 -0
  26. package/lib/projectValidator/types.js +2 -0
  27. package/lib/storage/index.js +6 -7
  28. package/lib/utils/index.js +41 -1
  29. package/package.json +2 -1
  30. package/types/cloudApp/index.d.ts +4 -0
  31. package/types/cloudApp/types.d.ts +87 -6
  32. package/types/deploy/DatabaseDeployer.d.ts +70 -0
  33. package/types/deploy/DeployOrchestrator.d.ts +150 -0
  34. package/types/deploy/FunctionDeployer.d.ts +158 -0
  35. package/types/deploy/GatewayDeployer.d.ts +175 -0
  36. package/types/deploy/StateStore.d.ts +170 -0
  37. package/types/deploy/StaticDeployer.d.ts +104 -0
  38. package/types/deploy/domain.d.ts +17 -0
  39. package/types/deploy/framework.d.ts +23 -0
  40. package/types/deploy/function/artifact.d.ts +40 -0
  41. package/types/deploy/function/builders/cloud.d.ts +110 -0
  42. package/types/deploy/function/cam-preflight.d.ts +51 -0
  43. package/types/deploy/function/cloud-build-service.d.ts +10 -0
  44. package/types/deploy/function/config-guard.d.ts +41 -0
  45. package/types/deploy/function/docker-preflight.d.ts +17 -0
  46. package/types/deploy/function/image-preflight.d.ts +21 -0
  47. package/types/deploy/function/local-builder.d.ts +26 -0
  48. package/types/deploy/function/planner.d.ts +15 -0
  49. package/types/deploy/function/preflight.d.ts +9 -0
  50. package/types/deploy/types.d.ts +429 -0
  51. package/types/env/type.d.ts +4 -4
  52. package/types/environment.d.ts +7 -0
  53. package/types/function/types.d.ts +15 -0
  54. package/types/hosting/index.d.ts +6 -0
  55. package/types/index.d.ts +18 -0
  56. package/types/interfaces/function.interface.d.ts +1 -1
  57. package/types/projectValidator/index.d.ts +24 -0
  58. package/types/projectValidator/types.d.ts +26 -0
  59. package/types/storage/index.d.ts +6 -0
  60. package/types/utils/index.d.ts +13 -0
@@ -0,0 +1,70 @@
1
+ import { Environment } from '../environment';
2
+ import { IPGUserMigrationInput } from '../database/type';
3
+ /** 数据库迁移部署配置(对应 cloudbaserc.json 中的 database 块) */
4
+ export interface IDatabaseDeployConfig {
5
+ /** 数据库类型(v2.1 schema: 目前仅支持 postgresql) */
6
+ type: 'postgresql';
7
+ /** migration SQL 文件目录(相对项目根) */
8
+ migrations?: string;
9
+ }
10
+ /** Plan 中单条 migration 的状态 */
11
+ export interface IDatabasePlanItem {
12
+ /** 14位数字时间串 */
13
+ version: string;
14
+ /** migration 名称 */
15
+ name: string;
16
+ /** pending=待执行;applied=已应用;conflict=冲突 */
17
+ status: 'pending' | 'applied' | 'conflict';
18
+ /** 冲突原因(仅 conflict 时有值) */
19
+ reason?: string;
20
+ }
21
+ /** deploy 返回结果 */
22
+ export interface IDatabaseDeployResult {
23
+ /** 异步任务 ID(无pending时为空字符串) */
24
+ taskId: string;
25
+ }
26
+ export declare class DatabaseDeployer {
27
+ private environment;
28
+ constructor(environment: Environment);
29
+ /**
30
+ * 从本地目录解析 migration 文件列表
31
+ *
32
+ * 文件名格式:{14位时间戳}_{小写下划线名称}.sql
33
+ * 例如:20260526000000_create_users.sql
34
+ *
35
+ * 按文件名升序排列(即按版本号从早到晚)
36
+ */
37
+ parseMigrationFiles(migrationsDir: string): IPGUserMigrationInput[];
38
+ /**
39
+ * 生成部署计划
40
+ *
41
+ * 调用 previewPGUserMigrations 获取云端对比结果,
42
+ * 返回每条migration 的状态(pending / applied / conflict)
43
+ */
44
+ plan(config: IDatabaseDeployConfig, cwd: string, envId: string): Promise<IDatabasePlanItem[]>;
45
+ /**
46
+ * 执行数据库迁移
47
+ *
48
+ * 流程:
49
+ * 1. 解析本地 migration 文件
50
+ * 2. 预览确认无冲突(有冲突直接 throw,中断整个部署)
51
+ * 3. 无 pending 则跳过
52
+ * 4. 提交 pushPGUserMigrations
53
+ * 5. 轮询describeTaskResult 等待完成
54
+ */
55
+ deploy(config: IDatabaseDeployConfig, cwd: string, envId: string): Promise<IDatabaseDeployResult>;
56
+ /**
57
+ * 解析 migrations 目录路径
58
+ * - 未配置:默认 ./cloudbase/migrations
59
+ * - 仅允许相对路径(禁止 / 开头)
60
+ */
61
+ private resolveMigrationsDir;
62
+ /**
63
+ * 校验 database.type(当前仅支持 postgresql)
64
+ */
65
+ private assertDatabaseType;
66
+ /**
67
+ * 轮询等待异步任务完成
68
+ */
69
+ private waitForTask;
70
+ }
@@ -0,0 +1,150 @@
1
+ import { Environment } from '../environment';
2
+ /** 可编排的资源类型 */
3
+ export type ResourceType = 'database' | 'functions' | 'app' | 'hosting' | 'gateway';
4
+ /** 声明式部署选项 */
5
+ export interface IDeployOptions {
6
+ /** 解析后的 cloudbaserc 配置(ConfigParser 输出,含 envOverrides 已应用) */
7
+ config: Record<string, any>;
8
+ envId: string;
9
+ /** 只部署指定类型 */
10
+ only?: ResourceType[];
11
+ /** 跳过指定类型 */
12
+ skip?: ResourceType[];
13
+ /** dry-run:只输出计划不实际部署 */
14
+ dryRun?: boolean;
15
+ /** 项目根目录(默认 process.cwd()) */
16
+ cwd?: string;
17
+ /** 已存在资源(函数)的覆盖更新:yes=true 直接放行(AI Agent / CI 场景) */
18
+ yes?: boolean;
19
+ /** 已存在资源(函数)的覆盖更新确认回调:返回 true 部署、false 跳过(CLI 注入 autoConfirm) */
20
+ confirmUpdate?: (item: IDeployPlanItem) => Promise<boolean>;
21
+ /** 强制云端对比(漂移检测):忽略本地 state 快照的 skip 判定,强制重新对比/部署 */
22
+ refresh?: boolean;
23
+ log?: {
24
+ info?: (msg: string) => void;
25
+ success?: (msg: string) => void;
26
+ warn?: (msg: string) => void;
27
+ error?: (msg: string) => void;
28
+ };
29
+ }
30
+ /** 部署计划项(资源级) */
31
+ export interface IDeployPlanItem {
32
+ type: ResourceType;
33
+ name: string;
34
+ /** 动作分类:create=新建;update=覆盖更新已有资源;skip=已存在且配置一致;conflict=检测到冲突(需中断);deploy=直传覆盖(无存在性概念) */
35
+ status: 'create' | 'update' | 'skip' | 'conflict' | 'deploy';
36
+ /** 动作说明(用户可读) */
37
+ action: string;
38
+ /** 变更字段明细(如 database 迁移聚合、gateway 路由差异等) */
39
+ changes?: Array<{
40
+ field: string;
41
+ from?: string;
42
+ to?: string;
43
+ }>;
44
+ /** hosting 文件级 diff(新增/修改/删除,前 N 条 + 统计) */
45
+ fileDiff?: {
46
+ added: string[];
47
+ modified: string[];
48
+ deleted: string[];
49
+ totalChanged: number;
50
+ };
51
+ /** 资源级详情子行(dry-run 树状渲染用):如函数 runtime/构建策略、迁移逐条状态等 */
52
+ details?: Array<{
53
+ label: string;
54
+ value: string;
55
+ }>;
56
+ }
57
+ /** 部署结果 */
58
+ export interface IDeployResult {
59
+ plan: IDeployPlanItem[];
60
+ results: Array<{
61
+ type: ResourceType;
62
+ name: string;
63
+ ok: boolean;
64
+ url?: string;
65
+ error?: string;
66
+ /** 未执行原因:skip=未变更自动跳过;no-confirm=无确认机制保守跳过;skipped-by-user=用户拒绝覆盖 */
67
+ reason?: 'skip' | 'no-confirm' | 'skipped-by-user';
68
+ }>;
69
+ }
70
+ /**
71
+ * 声明式部署编排器
72
+ * 顺序:database → functions → app → hosting → gateway
73
+ * 支持 dry-run / only / skip / 幂等重试(database 失败/冲突会中断后续步骤)
74
+ */
75
+ export declare class DeployOrchestrator {
76
+ private environment;
77
+ private databaseDeployer;
78
+ private functionDeployer;
79
+ private staticDeployer;
80
+ private gatewayDeployer;
81
+ constructor(environment: Environment);
82
+ /**
83
+ * 计算部署计划(dry-run 输出)
84
+ */
85
+ deployPlan(options: IDeployOptions): Promise<IDeployPlanItem[]>;
86
+ /**
87
+ * 执行部署
88
+ */
89
+ deploy(options: IDeployOptions): Promise<IDeployResult>;
90
+ /**
91
+ * 部署成功后写回本地 state 快照
92
+ *
93
+ * - hosting:成功部署/未变更(skip)的项重算产物指纹;失败项保留旧快照
94
+ * - app:成功部署写 buildAppConfig 快照;skip 复用旧快照
95
+ * - gateway:保留旧快照(本轮不做路由级实时快照)
96
+ */
97
+ private persistState;
98
+ /**
99
+ * 构建完整部署计划(按依赖顺序 + only/skip 过滤)
100
+ *
101
+ * 通过查询云端状态判定每个资源的动作:
102
+ * - database:先按迁移文件做 preview,再聚合成单条资源级计划项(pending→create,存在 conflict→conflict,全部 applied→不出现在 plan)
103
+ * - functions:ListFunctions 判断是否已存在 → create / update(不做本地 hash / 字段 diff)
104
+ * - app:describeAppInfo 判断是否已存在 → create / update;本地 state 配置一致 → skip
105
+ * - hosting:本地 state 指纹 diff → 一致 skip(不重新上传)/ 有差异 deploy(带文件级明细)
106
+ * - gateway:planRoutes 对比云端路由 → create / update / skip(含变更字段明细)
107
+ * 云端查询失败时降级为保守判定(全 create),不影响 dry-run 展示。
108
+ */
109
+ private buildPlan;
110
+ /**
111
+ * 按资源类型构建计划(拆分自 buildPlan,控制圈复杂度)
112
+ */
113
+ private buildPlanForType;
114
+ /**
115
+ * database 计划:preview 聚合成单条资源级计划项
116
+ */
117
+ private buildDatabasePlan;
118
+ /**
119
+ * app 计划:本地 state 配置一致 → skip;否则按云端存在性 → create / update
120
+ */
121
+ private buildAppPlan;
122
+ /**
123
+ * hosting 计划:本地 state 指纹 diff → 一致 skip / 有差异 deploy(带文件级明细)
124
+ */
125
+ private buildHostingPlans;
126
+ /**
127
+ * gateway 计划:planRoutes 对比云端路由 → create / update / skip(含变更字段明细)
128
+ */
129
+ private buildGatewayPlans;
130
+ /**
131
+ * 查询环境中已存在的函数名集合(查询失败返回空集,降级为全新建判定)
132
+ */
133
+ private listExistingFunctionNames;
134
+ /**
135
+ * 判断云应用是否已存在(查询失败返回 false,降级为新建判定)
136
+ */
137
+ private appExists;
138
+ /**
139
+ * 执行单个计划步骤
140
+ */
141
+ private executeStep;
142
+ /** 深比较(JSON 快照语义):仅用于 app 配置快照等简单对象 */
143
+ private deepEqual;
144
+ /** app 配置差异明细(from → to) */
145
+ private appConfigChanges;
146
+ /**
147
+ * 轻量 inline 守卫:配置合法 + 目录存在(validateProject 接线点)
148
+ */
149
+ private guardConfig;
150
+ }
@@ -0,0 +1,158 @@
1
+ import { Environment } from '../environment';
2
+ import { ICloudBuildService } from './function/builders/cloud';
3
+ import { IImagePreflightDeps } from './function/image-preflight';
4
+ import { ICheckReport, IFunctionDeployConfig, IFunctionDeployOptions, IFunctionDeployPlan, IFunctionDeployResult, INormalizedDeployConfig } from './types';
5
+ interface ILegacyFunctionDeployResult {
6
+ name: string;
7
+ url?: string;
8
+ }
9
+ /**
10
+ * 函数部署编排器
11
+ *
12
+ * 统一编排 Event 与 HTTP 函数的部署流程,对上层屏蔽以下差异:
13
+ * - Event 与 HTTP 的运行模型
14
+ * - zip、cloud、local、image 四种构建策略
15
+ * - 创建、更新与需要删除重建的场景
16
+ *
17
+ * 已支持代码包、已有镜像、云端构建、本地构建、匿名访问与网关路径收敛;
18
+ * 未实现能力(replace 删除重建、local 企业版 TCR)会显式报错,不会静默跳过。
19
+ */
20
+ export declare class FunctionDeployer {
21
+ private readonly environment;
22
+ private readonly functionService;
23
+ /** 镜像远端校验依赖,默认真实 docker;测试可注入以避免真实网络/命令 */
24
+ private readonly imagePreflightDeps?;
25
+ /**
26
+ * 云端构建能力工厂,默认基于 CloudAppService 构造真实实现;
27
+ * 测试可注入以替换打包/网络/tcb API,避免真实 IO
28
+ */
29
+ private readonly cloudBuildServiceFactory;
30
+ constructor(environment: Environment, deps?: {
31
+ imagePreflightDeps?: IImagePreflightDeps;
32
+ cloudBuildServiceFactory?: () => ICloudBuildService;
33
+ });
34
+ /**
35
+ * 兼容既有声明式部署入口
36
+ *
37
+ * 该方法只负责补齐声明式上下文并委托 deployFunction,避免继续维护第二套
38
+ * cloud/local/image 分发逻辑。force 在旧入口中表示允许覆盖,计划阶段会自行
39
+ * 判断 create/update;涉及删除重建时仍要求显式审批,不将 force 等同 allowReplace。
40
+ */
41
+ deploy(options: {
42
+ func: IFunctionDeployConfig;
43
+ functionRootPath?: string;
44
+ /** 直接指定函数代码目录(优先于 functionRootPath/name 拼接),对齐 CLI resolveFunctionPath 的 dir 语义 */
45
+ functionPath?: string;
46
+ force?: boolean;
47
+ }): Promise<ILegacyFunctionDeployResult>;
48
+ /** 解析最终部署策略:显式 buildStrategy 优先,未配置默认 zip */
49
+ resolveStrategy(config: IFunctionDeployConfig): IFunctionDeployPlan['buildStrategy'];
50
+ /**
51
+ * 配置 HTTP 函数匿名访问(public=true)
52
+ * 通过 OPA Rego 策略追加匿名放通规则,不覆盖用户已有策略
53
+ */
54
+ ensurePublicAccess(functionName: string): Promise<void>;
55
+ /**
56
+ * 收敛 HTTP 函数网关路由(gatewayPath 配置)
57
+ *
58
+ * 幂等:云端不存在该 path → 创建;已存在且一致 → 跳过;不一致 → 更新。
59
+ * 复用 GatewayDeployer 的幂等收敛与默认域名解析逻辑,与 gateway.routes 声明式部署行为一致。
60
+ * 返回该函数网关访问 URL(与 resolveUrl 解析结果一致),无 envId 时返回 undefined。
61
+ */
62
+ ensureGatewayRoute(config: INormalizedDeployConfig): Promise<string | undefined>;
63
+ /** 生成匿名访问 OPA Rego 规则 */
64
+ buildPublicAccessRego(functionName: string): string;
65
+ /** 生成 HTTP 函数可访问 URL */
66
+ resolveUrl(config: IFunctionDeployConfig): Promise<string | undefined>;
67
+ /**
68
+ * 校验部署配置
69
+ *
70
+ * 只做纯函数、无 IO 的配置契约校验,一次返回全部问题
71
+ */
72
+ checkConfig(config: IFunctionDeployConfig): ICheckReport;
73
+ /**
74
+ * 生成部署计划
75
+ *
76
+ * 会查询线上函数状态,用于判断创建、更新或删除重建
77
+ */
78
+ plan(config: IFunctionDeployConfig): Promise<IFunctionDeployPlan>;
79
+ /**
80
+ * 部署前本地环境检查(有 IO)
81
+ *
82
+ * 与 checkConfig 不同,本方法会读取文件系统,目前覆盖 HTTP 代码包所需的
83
+ * scf_bootstrap 等文件条件。先做配置契约校验,再执行本地检查。
84
+ */
85
+ preflight(config: IFunctionDeployConfig): ICheckReport;
86
+ /**
87
+ * 部署函数
88
+ * @param config 部署配置
89
+ * @param options 部署选项,dryRun 时只生成计划不做任何变更
90
+ */
91
+ deployFunction(config: IFunctionDeployConfig, options?: IFunctionDeployOptions): Promise<IFunctionDeployResult>;
92
+ /**
93
+ * 将既有声明式调用补齐为完整部署配置
94
+ */
95
+ private withLegacyDeployContext;
96
+ /**
97
+ * 解析函数部署地域,供镜像远端地域校验使用
98
+ *
99
+ * 地域来源于 environment 的鉴权配置;未显式配置时返回 undefined,
100
+ * 由image-preflight 自动跳过地域校验,不误报。
101
+ */
102
+ private resolveDeployRegion;
103
+ /**
104
+ * 构造镜像拉取授权 Preflight 所需的 CAM 适配器
105
+ *
106
+ * 用 CommonService 走 CAM 通道:ListAttachedRolePolicies 读已绑策略、
107
+ * AttachRolePolicies 按策略名绑定。任何权限/网络错误都原样抛出,
108
+ * 交由 cam-preflight 判定并降级,本层不吞异常。
109
+ */
110
+ private createCamPreflightAdapter;
111
+ /** 查询线上函数详情,不存在时返回 null */
112
+ private getCurrentFunction;
113
+ /** 判断是否为函数不存在错误,其他错误必须继续抛出 */
114
+ private isFunctionNotFoundError;
115
+ /**
116
+ * 校验 Preflight 报告,存在 fail 项时聚合抛错
117
+ */
118
+ private assertPreflightReady;
119
+ /**
120
+ * 判断计划是否可以在当前实现范围内执行
121
+ *
122
+ * 未实现的能力必须显式报错,避免用户误认为访问规则或镜像构建已经生效
123
+ */
124
+ private assertPlanExecutable;
125
+ /**
126
+ * 准备部署物
127
+ *
128
+ * cloud 策略在云端构建容器内build+push,产出镜像部署物(不依赖本地 Docker);
129
+ * local 策略需要先做 Docker 本地能力检查,再本地构建并推送镜像,产出镜像部署物;
130
+ * 其余策略走同步的 pack。
131
+ */
132
+ private prepareArtifact;
133
+ /** 生成部署物 */
134
+ private createArtifact;
135
+ /** 执行部署计划 */
136
+ private applyPlan;
137
+ /** 收敛 HTTP 函数访问配置(匿名访问 + 网关路由) */
138
+ private applyAccessPlan;
139
+ /** 执行单个步骤并记录耗时与进度 */
140
+ private runStep;
141
+ /** 上报进度,回调异常不影响部署流程 */
142
+ private emitProgress;
143
+ /** 汇总部署结果 */
144
+ private buildResult;
145
+ private emitProgressDone;
146
+ }
147
+ export * from './types';
148
+ export { assertDeployConfig, checkDeployConfig, isCustomImageRuntime, normalizeDeployConfig, normalizeGatewayPath, parseImageReference } from './function/config-guard';
149
+ export { createDeployPlan, toCurrentState } from './function/planner';
150
+ export { createCodeArtifact, createImageArtifactFromConfig, toCloudFunction } from './function/artifact';
151
+ export { buildImageOnCloud } from './function/builders/cloud';
152
+ export type { ICloudBuildService, ICloudBuildResult, ICloudCosInfo, ICloudCreateBuildInput, ICloudCreateBuildResult, ICloudVersionStatus } from './function/builders/cloud';
153
+ export { createCloudBuildService } from './function/cloud-build-service';
154
+ export { runLocalPreflight } from './function/preflight';
155
+ export { runImageRemotePreflight } from './function/image-preflight';
156
+ export type { IImagePreflightDeps } from './function/image-preflight';
157
+ export { runImagePullAuthPreflight, isCamPermissionError, SCF_PULL_IMAGE_ROLE, REQUIRED_IMAGE_PULL_POLICY, IMAGE_PULL_GRANT_URL } from './function/cam-preflight';
158
+ export type { ICamPreflightService } from './function/cam-preflight';
@@ -0,0 +1,175 @@
1
+ import { Environment } from '../environment';
2
+ import { HTTPServiceRouteParam } from '../env/type';
3
+ /** 网关路由配置(cloudbaserc.json gateway.routes[]) */
4
+ export interface IGatewayRoute {
5
+ /** 绑定的自定义域名。配置时自动绑定(需 certId);不填则使用环境 HTTP 访问服务的默认域名(如 {envId}-{uin}.{region}.app.tcloudbase.com) */
6
+ domain?: string;
7
+ /** SSL 证书 ID(绑定自定义域名时需要,可先通过 SSL 控制台/API 获取) */
8
+ certId?: string;
9
+ /** 域名接入方式(默认 DIRECT 直接接入):DIRECT/CDN(接入云开发 CDN)/CUSTOM(自定义接入,需 customCname)/EO(接入云开发 EdgeOne) */
10
+ accessType?: 'DIRECT' | 'CDN' | 'CUSTOM' | 'EO';
11
+ /** 自定义接入时配置的 CNAME 记录(accessType=CUSTOM 时必填) */
12
+ customCname?: string;
13
+ /** 域名协议(默认 HTTP_AND_HTTPS):HTTP/HTTPS/HTTP_AND_HTTPS/HTTP_TO_HTTPS/HTTPS_TO_HTTP */
14
+ protocol?: 'HTTP' | 'HTTPS' | 'HTTP_AND_HTTPS' | 'HTTP_TO_HTTPS' | 'HTTPS_TO_HTTP';
15
+ /** 域名启用状态(默认 true) */
16
+ enable?: boolean;
17
+ /** 路径,如 /api 或 /web */
18
+ path: string;
19
+ /** 目标:function:<name> 或 hosting:<name> */
20
+ target: string;
21
+ /** 是否开启路径透传(默认 false) */
22
+ enablePathTransmission?: boolean;
23
+ /** 是否开启身份认证(默认 false) */
24
+ enableAuth?: boolean;
25
+ /** 路径重写配置(prefix/staticStorePrefix 只能填一个)。hosting 路由未配置时自动生成 { Prefix: deployPath };显式配置时透传且不校验 hosting 名称(可引用已部署实例) */
26
+ pathRewrite?: {
27
+ prefix?: string;
28
+ staticStorePrefix?: string;
29
+ };
30
+ /** QPS 限频策略 */
31
+ qpsPolicy?: {
32
+ /** QPS 限额总量(每秒请求次数),100-100000 */
33
+ qpsTotal?: number;
34
+ /** 客户端限频配置 */
35
+ qpsPerClient?: {
36
+ limitBy?: 'UserID' | 'ClientIP';
37
+ limitValue?: number;
38
+ };
39
+ };
40
+ }
41
+ /** 网关部署结果 */
42
+ export interface IGatewayDeployResult {
43
+ domain: string;
44
+ routes: Array<{
45
+ path: string;
46
+ target: string;
47
+ url: string;
48
+ }>;
49
+ }
50
+ /**
51
+ * 网关声明式部署器
52
+ * 支持 function:<name>(SCF 云函数)与 hosting:<name>(STATIC_STORE 静态托管)两种目标
53
+ */
54
+ export declare class GatewayDeployer {
55
+ private environment;
56
+ constructor(environment: Environment);
57
+ /**
58
+ * 部署网关路由
59
+ *
60
+ * 域名规则:
61
+ * - 未配置 domain → 使用环境 HTTP 访问服务的**默认域名**(Domains 中 IsDefault=true,如 {envId}-{uin}.{region}.app.tcloudbase.com),直接创建路由
62
+ * - 配置了 domain(自定义域名)→ **先自动绑定自定义域名**(bindCustomDomain,需 certId),再创建路由
63
+ * 不同域名的路由分组创建。
64
+ */
65
+ deploy(options: {
66
+ routes: IGatewayRoute[];
67
+ envId: string;
68
+ /** hosting 配置列表(用于为 hosting:<name> 路由生成 PathRewrite.Prefix 部署路径) */
69
+ hostings?: Array<{
70
+ name?: string;
71
+ deployPath?: string;
72
+ }>;
73
+ }): Promise<IGatewayDeployResult>;
74
+ /**
75
+ * 解析路由配置:校验 target 格式并映射为 HTTPServiceRouteParam
76
+ *
77
+ * 对齐 tcb routes add 的底层校验(src/commands/routes/add.ts):
78
+ * - path 必须以 / 开头,每段只含字母/数字/./_/-,50 字符内,不支持通配符 *
79
+ * - 静态托管(STATIC_STORE)上游名固定为 staticstore,且只支持一级路径
80
+ */
81
+ parseRoute(route: IGatewayRoute): HTTPServiceRouteParam;
82
+ /**
83
+ * 计算网关路由部署计划(dry-run):每个路由 create/update/skip + 变更字段明细
84
+ *
85
+ * 判定逻辑与 deploy() 完全一致:云端不存在的 path → create;
86
+ * 已存在但显式配置不一致 → update(带 changes);一致 → skip。
87
+ */
88
+ planRoutes(options: {
89
+ routes: IGatewayRoute[];
90
+ envId: string;
91
+ hostings?: Array<{
92
+ name?: string;
93
+ deployPath?: string;
94
+ }>;
95
+ }): Promise<Array<{
96
+ path: string;
97
+ target: string;
98
+ status: 'create' | 'update' | 'skip';
99
+ changes?: Array<{
100
+ field: string;
101
+ from?: string;
102
+ to?: string;
103
+ }>;
104
+ }>>;
105
+ /**
106
+ * 查询指定域名下已存在的路由(幂等收敛用),返回 Map<path, 云端路由详情>
107
+ */
108
+ private getExistingRoutes;
109
+ /**
110
+ * 判断期望路由与云端已存在路由是否一致
111
+ *
112
+ * 只比较**用户显式声明的字段**(enableAuth/enablePathTransmission 显式配置才比较;
113
+ * QPSPolicy/PathRewrite 本地有值才比较),避免覆盖控制台单独配置的字段。
114
+ */
115
+ private routesEqual;
116
+ /**
117
+ * 构建 modifyHttpServiceRoute 的路由参数:只包含基础字段 + 用户显式声明的配置字段
118
+ */
119
+ private buildModifyParam;
120
+ private deepEqual;
121
+ /**
122
+ * 自动绑定自定义域名(幂等,支持证书更新)
123
+ *
124
+ * certId 解析优先级:
125
+ * 1. 显式配置的 certId 优先(未配置时按域名自动匹配已签发证书)
126
+ * 2. 域名已绑定 + 未显式 certId 或与云端一致 → 跳过绑定(幂等)
127
+ * 3. 域名已绑定 + 显式 certId 与云端不一致 → 重新绑定(更新证书)
128
+ * 4. 未绑定且无法确定 certId → 明确报错并给出操作指引
129
+ */
130
+ private ensureDomainBound;
131
+ /**
132
+ * 查询当前环境已绑定的自定义域名列表(含证书 ID,用于幂等跳过与证书更新判断)
133
+ */
134
+ private getBoundDomains;
135
+ /**
136
+ * 按域名自动匹配 SSL 证书 ID(腾讯云 ssl.DescribeCertificates)
137
+ *
138
+ * 匹配规则(按返回顺序取第一个):
139
+ * - 证书状态为已签发(Status === 1)
140
+ * - 证书主域名(Domain)或关联域名(SubjectAltName)包含目标域名
141
+ * - 证书未过期(CertEndTime 晚于当前时间)
142
+ * 查询失败或无匹配返回 null(由调用方给出明确报错)
143
+ */
144
+ private resolveCertIdByDomain;
145
+ /**
146
+ * 解析路由(含异步函数类型判断 + hosting 路径重写)
147
+ *
148
+ * - function 目标:查询函数详情,HTTP 类型函数 → WEB_SCF(Web 云函数),普通函数 → SCF。
149
+ * 与 tcb fn deploy 部署 HTTP 函数后控制台创建路由的行为一致(控制台请求中 UpstreamResourceType=WEB_SCF)。
150
+ * - hosting 目标:自动生成 PathRewrite.Prefix = 对应 hosting 配置的 deployPath(控制台行为:静态托管路由必带
151
+ * PathRewrite.Prefix,将 /路由 前缀重写到静态托管的实际部署路径,否则请求会打到存储根路径导致 404)。
152
+ */
153
+ private parseRouteWithType;
154
+ /**
155
+ * 映射用户 pathRewrite(camelCase)为 API 格式 HTTPServicePathRewrite(PascalCase)
156
+ */
157
+ private mapPathRewrite;
158
+ /**
159
+ * 生成路由变更字段明细(与 routesEqual 的判定字段一致)
160
+ */
161
+ private routeChanges;
162
+ /**
163
+ * 解析环境 HTTP 访问服务的默认域名
164
+ *
165
+ * 域名优先级:
166
+ * 1. Domains 列表中 DomainType=HTTPSERVICE 且 IsDefault=true 的域名(HTTP 网关默认域名)
167
+ * —— 注意:AI_AGENT/CBR 等类型的域名(如 agt-xxx.agent.tcloudbase.com)也可能 IsDefault=true,
168
+ * 但它们不是 HTTP 网关默认域名,必须结合 DomainType 过滤
169
+ * 2. 通过 DescribeEnvInfo 构造的默认域名 `{envId}-{uin}.{region}.app.tcloudbase.com`(兜底,覆盖 Domains 列表为空的场景——实测部分环境下 Domains 列表为空但默认域名仍存在)
170
+ * 3. 首个 DomainType=HTTPSERVICE 的域名
171
+ * 4. OriginDomain —— 回源域名(供自定义 CDN/WAF 回源使用,非对外访问地址),仅作最后兜底
172
+ * 查询失败或域名缺失时**明确报错**,不使用猜测的兜底域名(避免 INVALID_HOST)。
173
+ */
174
+ private resolveDomain;
175
+ }