@cloudbase/cloudbase-mcp 2.19.5 → 2.20.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.
- package/dist/508.index.cjs +0 -305
- package/dist/cli.cjs +5 -5
- package/dist/index.cjs +2444 -112
- package/dist/index.d.ts +8 -7
- package/dist/index.js +280 -63
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2458,6 +2458,8 @@ function registerEnvTools(server) {
|
|
|
2458
2458
|
if (action === "status") {
|
|
2459
2459
|
const loginState = await (0, auth_js_1.peekLoginState)();
|
|
2460
2460
|
const authFlowState = await (0, auth_js_1.getAuthProgressState)();
|
|
2461
|
+
// 判断是否为 API Key 模式
|
|
2462
|
+
const isApiKeyMode = !!(process.env.CLOUDBASE_API_KEY && process.env.CLOUDBASE_ENV_ID);
|
|
2461
2463
|
const authStatus = loginState
|
|
2462
2464
|
? "READY"
|
|
2463
2465
|
: authFlowState.status === "PENDING"
|
|
@@ -2482,6 +2484,7 @@ function registerEnvTools(server) {
|
|
|
2482
2484
|
ok: true,
|
|
2483
2485
|
code: "STATUS",
|
|
2484
2486
|
auth_status: authStatus,
|
|
2487
|
+
...(isApiKeyMode ? { auth_mode: "api_key" } : {}),
|
|
2485
2488
|
auth_config: authConfigSummary,
|
|
2486
2489
|
...(envPreparation
|
|
2487
2490
|
? buildAuthEnvSetupPayload(envPreparation)
|
|
@@ -2504,6 +2507,46 @@ function registerEnvTools(server) {
|
|
|
2504
2507
|
});
|
|
2505
2508
|
}
|
|
2506
2509
|
if (action === "start_auth") {
|
|
2510
|
+
// API Key 模式:尝试换取临时密钥
|
|
2511
|
+
if (process.env.CLOUDBASE_API_KEY && process.env.CLOUDBASE_ENV_ID) {
|
|
2512
|
+
try {
|
|
2513
|
+
const existingLoginState = await (0, auth_js_1.peekLoginState)();
|
|
2514
|
+
if (existingLoginState) {
|
|
2515
|
+
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
2516
|
+
ok: true,
|
|
2517
|
+
code: "AUTH_READY",
|
|
2518
|
+
message: "当前使用 API Key 认证模式,已自动完成登录,无需手动授权。",
|
|
2519
|
+
auth_mode: "api_key",
|
|
2520
|
+
envId: process.env.CLOUDBASE_ENV_ID,
|
|
2521
|
+
});
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
catch (e) {
|
|
2525
|
+
// peekLoginState 内部异常,记录后 fall through
|
|
2526
|
+
(0, logger_js_1.debug)("start_auth: peekLoginState threw", { error: e instanceof Error ? e.message : String(e) });
|
|
2527
|
+
}
|
|
2528
|
+
// API Key 换取失败:返回详细诊断信息
|
|
2529
|
+
// 尝试获取更详细的错误信息
|
|
2530
|
+
let diagMessage = "当前配置了 API Key 认证模式,但换取临时密钥失败。";
|
|
2531
|
+
const endpoint = process.env.CLOUDBASE_API_ENDPOINT || `https://${process.env.CLOUDBASE_ENV_ID}.ap-shanghai.tcb-api.tencentcloudapi.com`;
|
|
2532
|
+
diagMessage += `\n\n诊断信息:`;
|
|
2533
|
+
diagMessage += `\n- CLOUDBASE_ENV_ID: ${process.env.CLOUDBASE_ENV_ID}`;
|
|
2534
|
+
diagMessage += `\n- CLOUDBASE_API_KEY: ${process.env.CLOUDBASE_API_KEY.slice(0, 20)}...(已截断)`;
|
|
2535
|
+
diagMessage += `\n- Endpoint: ${endpoint}`;
|
|
2536
|
+
diagMessage += `\n\n可能原因:`;
|
|
2537
|
+
diagMessage += `\n1. API Key 已过期或被删除`;
|
|
2538
|
+
diagMessage += `\n2. Endpoint 不可达(网络/DNS 问题)`;
|
|
2539
|
+
diagMessage += `\n3. CLOUDBASE_ENV_ID 与 API Key 所属环境不匹配`;
|
|
2540
|
+
diagMessage += `\n\n建议:检查 MCP 配置中的 CLOUDBASE_API_KEY 和 CLOUDBASE_ENV_ID 环境变量是否正确。`;
|
|
2541
|
+
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
2542
|
+
ok: false,
|
|
2543
|
+
code: "API_KEY_AUTH_FAILED",
|
|
2544
|
+
message: diagMessage,
|
|
2545
|
+
auth_mode: "api_key",
|
|
2546
|
+
envId: process.env.CLOUDBASE_ENV_ID,
|
|
2547
|
+
endpoint,
|
|
2548
|
+
});
|
|
2549
|
+
}
|
|
2507
2550
|
const region = server.cloudBaseOptions?.region || process.env.TCB_REGION;
|
|
2508
2551
|
const auth = toolbox_1.AuthSupervisor.getInstance({});
|
|
2509
2552
|
const authFlowState = await (0, auth_js_1.getAuthProgressState)();
|
|
@@ -2708,6 +2751,15 @@ function registerEnvTools(server) {
|
|
|
2708
2751
|
});
|
|
2709
2752
|
}
|
|
2710
2753
|
if (action === "logout") {
|
|
2754
|
+
// API Key 模式下不允许 logout
|
|
2755
|
+
if (process.env.CLOUDBASE_API_KEY && process.env.CLOUDBASE_ENV_ID) {
|
|
2756
|
+
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
2757
|
+
ok: false,
|
|
2758
|
+
code: "LOGOUT_NOT_ALLOWED",
|
|
2759
|
+
message: "当前使用 API Key 认证模式,不支持退出登录。如需切换认证方式,请移除 CLOUDBASE_API_KEY 环境变量后重启。",
|
|
2760
|
+
auth_mode: "api_key",
|
|
2761
|
+
});
|
|
2762
|
+
}
|
|
2711
2763
|
if (confirm !== "yes") {
|
|
2712
2764
|
return (0, tool_result_js_1.buildJsonToolResult)({
|
|
2713
2765
|
ok: false,
|
|
@@ -2834,29 +2886,58 @@ function registerEnvTools(server) {
|
|
|
2834
2886
|
requireEnvId: true,
|
|
2835
2887
|
mcpServer: server, // Pass server for IDE detection
|
|
2836
2888
|
});
|
|
2837
|
-
//
|
|
2838
|
-
//
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2889
|
+
// 当环境变量设置了 CLOUDBASE_ENV_ID 时(如 API Key 模式),
|
|
2890
|
+
// 避免调用 DescribeEnvs(临时密钥可能不支持该接口),
|
|
2891
|
+
// 改为通过 DescribeEnvInfo 获取单环境信息
|
|
2892
|
+
const envIdFromEnv = process.env.CLOUDBASE_ENV_ID;
|
|
2893
|
+
if (envIdFromEnv) {
|
|
2894
|
+
try {
|
|
2895
|
+
const envInfo = await cloudbaseList.env.describeEnvInfo({ EnvId: envIdFromEnv });
|
|
2896
|
+
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, envInfo);
|
|
2897
|
+
// DescribeEnvInfo 返回结构: { EnvInfo: { EnvBaseInfo: { EnvId, Alias, ... }, BillingInfo, ... } }
|
|
2898
|
+
// 需要提取 EnvBaseInfo 作为扁平 env 对象以匹配 DescribeEnvs 返回格式
|
|
2899
|
+
const baseInfo = envInfo?.EnvInfo?.EnvBaseInfo;
|
|
2900
|
+
if (baseInfo) {
|
|
2901
|
+
result = { EnvList: [baseInfo] };
|
|
2902
|
+
}
|
|
2903
|
+
else if (envInfo?.EnvInfo) {
|
|
2904
|
+
// 兼容: 如果没有 EnvBaseInfo 但有 EnvInfo,尝试直接使用
|
|
2905
|
+
result = { EnvList: [{ EnvId: envIdFromEnv, ...envInfo.EnvInfo }] };
|
|
2906
|
+
}
|
|
2907
|
+
else {
|
|
2908
|
+
result = { EnvList: [{ EnvId: envIdFromEnv }] };
|
|
2909
|
+
}
|
|
2910
|
+
}
|
|
2911
|
+
catch (envInfoError) {
|
|
2912
|
+
(0, logger_js_1.debug)("DescribeEnvInfo 失败,返回基础环境信息:", envInfoError instanceof Error ? envInfoError : new Error(String(envInfoError)));
|
|
2913
|
+
result = { EnvList: [{ EnvId: envIdFromEnv }] };
|
|
2914
|
+
}
|
|
2854
2915
|
}
|
|
2855
2916
|
else {
|
|
2856
|
-
//
|
|
2857
|
-
|
|
2858
|
-
result = await cloudbaseList.
|
|
2917
|
+
// Use commonService to call DescribeEnvs with filter parameters
|
|
2918
|
+
// Filter parameters match the reference conditions provided by user
|
|
2919
|
+
result = await cloudbaseList.commonService("tcb", "2018-06-08").call({
|
|
2920
|
+
Action: "DescribeEnvs",
|
|
2921
|
+
Param: {
|
|
2922
|
+
EnvTypes: ["weda", "baas"], // Include weda and baas (normal) environments
|
|
2923
|
+
IsVisible: false, // Filter out invisible environments
|
|
2924
|
+
Channels: ["dcloud", "iotenable", "tem", "scene_module"], // Filter special channels
|
|
2925
|
+
},
|
|
2926
|
+
});
|
|
2859
2927
|
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
|
|
2928
|
+
// Transform response format to match original listEnvs() format
|
|
2929
|
+
if (result && result.EnvList) {
|
|
2930
|
+
result = { EnvList: result.EnvList };
|
|
2931
|
+
}
|
|
2932
|
+
else if (result && result.Data && result.Data.EnvList) {
|
|
2933
|
+
result = { EnvList: result.Data.EnvList };
|
|
2934
|
+
}
|
|
2935
|
+
else {
|
|
2936
|
+
// Fallback to original method if format is unexpected
|
|
2937
|
+
(0, logger_js_1.debug)("Unexpected response format, falling back to listEnvs()");
|
|
2938
|
+
result = await cloudbaseList.env.listEnvs();
|
|
2939
|
+
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
|
|
2940
|
+
}
|
|
2860
2941
|
}
|
|
2861
2942
|
}
|
|
2862
2943
|
catch (error) {
|
|
@@ -24609,11 +24690,20 @@ function createManagerFromLoginState(loginState, region) {
|
|
|
24609
24690
|
}
|
|
24610
24691
|
async function listAvailableEnvCandidates(options) {
|
|
24611
24692
|
const { cloudBaseOptions, loginState: providedLoginState } = options ?? {};
|
|
24693
|
+
// 优先使用显式传入的 envId
|
|
24612
24694
|
if (cloudBaseOptions?.envId) {
|
|
24613
24695
|
return [{
|
|
24614
24696
|
envId: cloudBaseOptions.envId,
|
|
24615
24697
|
}];
|
|
24616
24698
|
}
|
|
24699
|
+
// 当环境变量设置了 CLOUDBASE_ENV_ID 且没有显式 credentials 时,直接返回(避免调 DescribeEnvs)
|
|
24700
|
+
// 有显式 credentials 时需要重新查询,因为可能是不同账号
|
|
24701
|
+
const hasExplicitCredentials = !!(cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey);
|
|
24702
|
+
if (process.env.CLOUDBASE_ENV_ID && !hasExplicitCredentials) {
|
|
24703
|
+
return [{
|
|
24704
|
+
envId: process.env.CLOUDBASE_ENV_ID,
|
|
24705
|
+
}];
|
|
24706
|
+
}
|
|
24617
24707
|
let cloudbase;
|
|
24618
24708
|
if (cloudBaseOptions?.secretId && cloudBaseOptions?.secretKey) {
|
|
24619
24709
|
cloudbase = createCloudBaseManagerWithOptions(cloudBaseOptions);
|
|
@@ -24940,6 +25030,7 @@ async function getCloudBaseManager(options = {}) {
|
|
|
24940
25030
|
await throwPendingAuthError();
|
|
24941
25031
|
}
|
|
24942
25032
|
throwAuthRequiredError();
|
|
25033
|
+
return undefined; // unreachable, helps TypeScript narrow
|
|
24943
25034
|
}
|
|
24944
25035
|
const { envId: loginEnvId, secretId, secretKey, token } = loginState;
|
|
24945
25036
|
let finalEnvId = cloudBaseOptions?.envId;
|
|
@@ -35189,6 +35280,25 @@ if (isES5) {
|
|
|
35189
35280
|
}
|
|
35190
35281
|
|
|
35191
35282
|
|
|
35283
|
+
/***/ }),
|
|
35284
|
+
|
|
35285
|
+
/***/ 7598:
|
|
35286
|
+
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
|
|
35287
|
+
|
|
35288
|
+
/*!
|
|
35289
|
+
* mime-db
|
|
35290
|
+
* Copyright(c) 2014 Jonathan Ong
|
|
35291
|
+
* Copyright(c) 2015-2022 Douglas Christopher Wilson
|
|
35292
|
+
* MIT Licensed
|
|
35293
|
+
*/
|
|
35294
|
+
|
|
35295
|
+
/**
|
|
35296
|
+
* Module exports.
|
|
35297
|
+
*/
|
|
35298
|
+
|
|
35299
|
+
module.exports = __webpack_require__(81813)
|
|
35300
|
+
|
|
35301
|
+
|
|
35192
35302
|
/***/ }),
|
|
35193
35303
|
|
|
35194
35304
|
/***/ 7600:
|
|
@@ -38507,10 +38617,11 @@ function normalizeAgentPayload(params) {
|
|
|
38507
38617
|
if (!params) {
|
|
38508
38618
|
return {};
|
|
38509
38619
|
}
|
|
38510
|
-
const { name, agentId, runtime, timeout, memorySize, installDependency, ...rest } = params;
|
|
38620
|
+
const { name, description, agentId, runtime, timeout, memorySize, installDependency, zipFile, cosBucketRegion, tempCosObjectName, sessionConfig, ...rest } = params;
|
|
38511
38621
|
return {
|
|
38512
38622
|
...rest,
|
|
38513
38623
|
...(normalizeString(name) ? { Name: normalizeString(name) } : {}),
|
|
38624
|
+
...(normalizeString(description) ? { Description: normalizeString(description) } : {}),
|
|
38514
38625
|
...(normalizeString(agentId) ? { AgentId: normalizeString(agentId) } : {}),
|
|
38515
38626
|
...(normalizeString(runtime) ? { Runtime: normalizeString(runtime) } : {}),
|
|
38516
38627
|
...(normalizeNumber(timeout) !== undefined ? { Timeout: normalizeNumber(timeout) } : {}),
|
|
@@ -38520,6 +38631,14 @@ function normalizeAgentPayload(params) {
|
|
|
38520
38631
|
...(normalizeBoolean(installDependency) !== undefined
|
|
38521
38632
|
? { InstallDependency: normalizeBoolean(installDependency) }
|
|
38522
38633
|
: {}),
|
|
38634
|
+
...(normalizeString(zipFile) ? { ZipFile: normalizeString(zipFile) } : {}),
|
|
38635
|
+
...(normalizeString(cosBucketRegion)
|
|
38636
|
+
? { CosBucketRegion: normalizeString(cosBucketRegion) }
|
|
38637
|
+
: {}),
|
|
38638
|
+
...(normalizeString(tempCosObjectName)
|
|
38639
|
+
? { TempCosObjectName: normalizeString(tempCosObjectName) }
|
|
38640
|
+
: {}),
|
|
38641
|
+
...(sessionConfig && typeof sessionConfig === "object" ? { SessionConfig: sessionConfig } : {}),
|
|
38523
38642
|
};
|
|
38524
38643
|
}
|
|
38525
38644
|
function registerAgentTools(server) {
|
|
@@ -38594,6 +38713,17 @@ function registerAgentTools(server) {
|
|
|
38594
38713
|
inputSchema: {
|
|
38595
38714
|
action: zod_1.z.enum(MANAGE_AGENT_ACTIONS),
|
|
38596
38715
|
agentId: zod_1.z.string().optional(),
|
|
38716
|
+
name: zod_1.z.string().optional(),
|
|
38717
|
+
description: zod_1.z.string().optional(),
|
|
38718
|
+
runtime: zod_1.z.string().optional(),
|
|
38719
|
+
timeout: zod_1.z.number().optional(),
|
|
38720
|
+
memorySize: zod_1.z.number().optional(),
|
|
38721
|
+
installDependency: zod_1.z.boolean().optional(),
|
|
38722
|
+
zipFile: zod_1.z.string().optional(),
|
|
38723
|
+
cosBucketRegion: zod_1.z.string().optional(),
|
|
38724
|
+
tempCosObjectName: zod_1.z.string().optional(),
|
|
38725
|
+
sessionConfig: zod_1.z.record(zod_1.z.any()).optional(),
|
|
38726
|
+
cwd: zod_1.z.string().optional(),
|
|
38597
38727
|
params: zod_1.z.record(zod_1.z.any()).optional(),
|
|
38598
38728
|
},
|
|
38599
38729
|
annotations: {
|
|
@@ -38603,14 +38733,31 @@ function registerAgentTools(server) {
|
|
|
38603
38733
|
openWorldHint: true,
|
|
38604
38734
|
category: "agents",
|
|
38605
38735
|
},
|
|
38606
|
-
}, async ({ action, agentId, params, }) => {
|
|
38736
|
+
}, async ({ action, agentId, name, description, runtime, timeout, memorySize, installDependency, zipFile, cosBucketRegion, tempCosObjectName, sessionConfig, cwd, params, }) => {
|
|
38607
38737
|
try {
|
|
38608
38738
|
const cloudbase = await getManager();
|
|
38609
|
-
const payload = normalizeAgentPayload(
|
|
38739
|
+
const payload = normalizeAgentPayload({
|
|
38740
|
+
name,
|
|
38741
|
+
description,
|
|
38742
|
+
runtime,
|
|
38743
|
+
timeout,
|
|
38744
|
+
memorySize,
|
|
38745
|
+
installDependency,
|
|
38746
|
+
zipFile,
|
|
38747
|
+
cosBucketRegion,
|
|
38748
|
+
tempCosObjectName,
|
|
38749
|
+
sessionConfig,
|
|
38750
|
+
cwd,
|
|
38751
|
+
...(params ?? {}),
|
|
38752
|
+
});
|
|
38610
38753
|
if (action === "createAgent") {
|
|
38754
|
+
const normalizedName = normalizeString(payload.Name);
|
|
38755
|
+
if (!normalizedName) {
|
|
38756
|
+
throw new Error("action=createAgent 时必须提供 name(可通过顶层 name 或 params.name 传入)");
|
|
38757
|
+
}
|
|
38611
38758
|
const createPayload = {
|
|
38612
38759
|
...payload,
|
|
38613
|
-
Name:
|
|
38760
|
+
Name: normalizedName,
|
|
38614
38761
|
Runtime: normalizeString(payload.Runtime) ?? "Nodejs20.19",
|
|
38615
38762
|
};
|
|
38616
38763
|
const result = await cloudbase.agent.createAgent(createPayload);
|
|
@@ -39945,6 +40092,7 @@ const QUERY_ACTIONS = [
|
|
|
39945
40092
|
"describeCreateResult",
|
|
39946
40093
|
"describeTaskStatus",
|
|
39947
40094
|
"getInstanceInfo",
|
|
40095
|
+
"describeInstance",
|
|
39948
40096
|
];
|
|
39949
40097
|
const MANAGE_ACTIONS = [
|
|
39950
40098
|
"provisionMySQL",
|
|
@@ -40208,7 +40356,9 @@ async function getSqlInstanceInfo({ getManager, cloudBaseOptions, server, }) {
|
|
|
40208
40356
|
}
|
|
40209
40357
|
catch (error) {
|
|
40210
40358
|
const errorCode = extractErrorCode(error);
|
|
40211
|
-
const
|
|
40359
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
40360
|
+
const isNotFound = errorCode === "FailedOperation.DataSourceNotExist"
|
|
40361
|
+
|| /envLink not exist|not exist|not found/i.test(errorMessage);
|
|
40212
40362
|
if (!isNotFound) {
|
|
40213
40363
|
throw error;
|
|
40214
40364
|
}
|
|
@@ -40218,7 +40368,7 @@ async function getSqlInstanceInfo({ getManager, cloudBaseOptions, server, }) {
|
|
|
40218
40368
|
instanceId: "default",
|
|
40219
40369
|
schema: envId,
|
|
40220
40370
|
rawStatus: typeof createRawStatus === "string" ? createRawStatus : null,
|
|
40221
|
-
status: createStatus,
|
|
40371
|
+
status: createStatus === "PENDING" || createStatus === "RUNNING" ? createStatus : "NOT_CREATED",
|
|
40222
40372
|
createResult: createData ?? createResult,
|
|
40223
40373
|
};
|
|
40224
40374
|
}
|
|
@@ -40765,7 +40915,7 @@ function registerSQLDatabaseTools(server) {
|
|
|
40765
40915
|
inputSchema: {
|
|
40766
40916
|
action: zod_1.z
|
|
40767
40917
|
.enum(QUERY_ACTIONS)
|
|
40768
|
-
.describe("runQuery=execute read-only SQL; describeCreateResult=query CreateMySQL result; describeTaskStatus=query MySQL task status; getInstanceInfo=get current SQL instance context"),
|
|
40918
|
+
.describe("runQuery=execute read-only SQL; describeCreateResult=query CreateMySQL result; describeTaskStatus=query MySQL task status; getInstanceInfo=get current SQL instance context; describeInstance=alias of getInstanceInfo"),
|
|
40769
40919
|
sql: zod_1.z
|
|
40770
40920
|
.string()
|
|
40771
40921
|
.optional()
|
|
@@ -40796,6 +40946,7 @@ function registerSQLDatabaseTools(server) {
|
|
|
40796
40946
|
case "describeTaskStatus":
|
|
40797
40947
|
return handleDescribeTaskStatus(args, context);
|
|
40798
40948
|
case "getInstanceInfo":
|
|
40949
|
+
case "describeInstance":
|
|
40799
40950
|
return handleGetInstanceInfo(context);
|
|
40800
40951
|
default:
|
|
40801
40952
|
throw new Error(`Unsupported SQL query action: ${args.action}`);
|
|
@@ -55124,6 +55275,88 @@ const FS = {
|
|
|
55124
55275
|
exports["default"] = FS;
|
|
55125
55276
|
|
|
55126
55277
|
|
|
55278
|
+
/***/ }),
|
|
55279
|
+
|
|
55280
|
+
/***/ 12754:
|
|
55281
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
55282
|
+
|
|
55283
|
+
"use strict";
|
|
55284
|
+
|
|
55285
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
55286
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
55287
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
55288
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
55289
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
55290
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
55291
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
55292
|
+
});
|
|
55293
|
+
};
|
|
55294
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
55295
|
+
exports.exchangeApiKeyForCredential = void 0;
|
|
55296
|
+
const cloud_api_1 = __webpack_require__(2090);
|
|
55297
|
+
const async_1 = __webpack_require__(80854);
|
|
55298
|
+
const system_1 = __webpack_require__(62179);
|
|
55299
|
+
const error_1 = __webpack_require__(64119);
|
|
55300
|
+
/**
|
|
55301
|
+
* 用 CloudBase API Key 换取临时 STS 密钥
|
|
55302
|
+
*
|
|
55303
|
+
* 调用 qbase-service 的 /capi/credential 端点:
|
|
55304
|
+
* POST https://<envId>.<region>.tcb-api.tencentcloudapi.com/capi/credential
|
|
55305
|
+
* Authorization: Bearer <apiKey>
|
|
55306
|
+
* Body: { "env": "<envId>" }
|
|
55307
|
+
*
|
|
55308
|
+
* 返回: { code: 0, data: { TmpSecretId, TmpSecretKey, Token, ExpiredTime } }
|
|
55309
|
+
*/
|
|
55310
|
+
function exchangeApiKeyForCredential(options) {
|
|
55311
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
55312
|
+
const { apiKey, envId, region = 'ap-shanghai', timeout = 15000, proxy, endpoint } = options;
|
|
55313
|
+
if (!apiKey) {
|
|
55314
|
+
throw new error_1.CloudBaseError('API Key 不能为空');
|
|
55315
|
+
}
|
|
55316
|
+
if (!envId) {
|
|
55317
|
+
throw new error_1.CloudBaseError('环境 ID (envId) 不能为空');
|
|
55318
|
+
}
|
|
55319
|
+
// 支持自定义 endpoint,也支持环境变量 CLOUDBASE_API_ENDPOINT 覆盖
|
|
55320
|
+
const baseUrl = endpoint
|
|
55321
|
+
|| process.env.CLOUDBASE_API_ENDPOINT
|
|
55322
|
+
|| `https://${envId}.${region}.tcb-api.tencentcloudapi.com`;
|
|
55323
|
+
const url = `${baseUrl}/capi/credential`;
|
|
55324
|
+
// 使用 AsyncMerge 防止并发请求
|
|
55325
|
+
const res = yield async_1.AsyncMerge.merge(() => (0, cloud_api_1.fetch)(url, {
|
|
55326
|
+
method: 'POST',
|
|
55327
|
+
timeout,
|
|
55328
|
+
body: JSON.stringify({ env: envId }),
|
|
55329
|
+
headers: {
|
|
55330
|
+
'Content-Type': 'application/json',
|
|
55331
|
+
Authorization: `Bearer ${apiKey}`
|
|
55332
|
+
}
|
|
55333
|
+
}, proxy || (0, system_1.getProxy)()), `exchangeApiKey:${envId}`, {
|
|
55334
|
+
maxAge: 5000
|
|
55335
|
+
});
|
|
55336
|
+
if (res.code !== 0) {
|
|
55337
|
+
const message = res.message || res.msg || 'API Key 换取临时密钥失败';
|
|
55338
|
+
throw new error_1.CloudBaseError(message, {
|
|
55339
|
+
action: 'ExchangeApiKeyForCredential',
|
|
55340
|
+
code: res.code
|
|
55341
|
+
});
|
|
55342
|
+
}
|
|
55343
|
+
const { data } = res;
|
|
55344
|
+
if (!data || !data.TmpSecretId || !data.TmpSecretKey || !data.Token) {
|
|
55345
|
+
throw new error_1.CloudBaseError('API Key 换取临时密钥返回数据不完整,请检查 API Key 是否有效');
|
|
55346
|
+
}
|
|
55347
|
+
return {
|
|
55348
|
+
secretId: data.TmpSecretId,
|
|
55349
|
+
secretKey: data.TmpSecretKey,
|
|
55350
|
+
token: data.Token,
|
|
55351
|
+
// ExpiredTime 是秒级时间戳,转换为毫秒
|
|
55352
|
+
accessTokenExpired: data.ExpiredTime * 1000,
|
|
55353
|
+
envId
|
|
55354
|
+
};
|
|
55355
|
+
});
|
|
55356
|
+
}
|
|
55357
|
+
exports.exchangeApiKeyForCredential = exchangeApiKeyForCredential;
|
|
55358
|
+
|
|
55359
|
+
|
|
55127
55360
|
/***/ }),
|
|
55128
55361
|
|
|
55129
55362
|
/***/ 12788:
|
|
@@ -61601,6 +61834,39 @@ class DatabaseService {
|
|
|
61601
61834
|
let { Tag } = this.getDatabaseConfig();
|
|
61602
61835
|
return this.dbOpService.request('RunCommands', Object.assign({ MgoCommands: options.MgoCommands, Tag: options.Tag || Tag, EnvId: options.EnvId || this.envId }, (options.MongoConnector ? { MongoConnector: options.MongoConnector } : {})));
|
|
61603
61836
|
}
|
|
61837
|
+
/**
|
|
61838
|
+
* 在 PostgreSQL 数据库上执行 SQL 语句
|
|
61839
|
+
*
|
|
61840
|
+
* @param options 执行参数
|
|
61841
|
+
* @param options.Sql 要执行的 SQL 语句
|
|
61842
|
+
* @param options.Role 指定 role 执行 SQL(可选)
|
|
61843
|
+
* @param options.EnvId 环境 ID(可选,不传则自动使用当前环境 ID)
|
|
61844
|
+
* @returns 执行结果,包含影响行数、字段列表、数据行及执行耗时
|
|
61845
|
+
*
|
|
61846
|
+
* @example
|
|
61847
|
+
* // 创建表
|
|
61848
|
+
* const res = await database.executePGSql({
|
|
61849
|
+
* Sql: 'CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT NOT NULL)'
|
|
61850
|
+
* })
|
|
61851
|
+
*
|
|
61852
|
+
* @example
|
|
61853
|
+
* // 查询数据
|
|
61854
|
+
* const res = await database.executePGSql({
|
|
61855
|
+
* Sql: "SELECT * FROM users WHERE id = 1"
|
|
61856
|
+
* })
|
|
61857
|
+
* console.log(res.Columns) // ['id', 'name']
|
|
61858
|
+
* console.log(res.Rows) // ['["1","Alice"]']
|
|
61859
|
+
*/
|
|
61860
|
+
async executePGSql(options) {
|
|
61861
|
+
const params = {
|
|
61862
|
+
EnvId: options.EnvId || this.envId,
|
|
61863
|
+
Sql: options.Sql
|
|
61864
|
+
};
|
|
61865
|
+
if (options.Role) {
|
|
61866
|
+
params.Role = options.Role;
|
|
61867
|
+
}
|
|
61868
|
+
return this.dbOpService.request('ExecutePGSql', params);
|
|
61869
|
+
}
|
|
61604
61870
|
}
|
|
61605
61871
|
exports.DatabaseService = DatabaseService;
|
|
61606
61872
|
DatabaseService.tcbServiceVersion = {
|
|
@@ -61641,6 +61907,9 @@ __decorate([
|
|
|
61641
61907
|
__decorate([
|
|
61642
61908
|
preLazy()
|
|
61643
61909
|
], DatabaseService.prototype, "runCommands", null);
|
|
61910
|
+
__decorate([
|
|
61911
|
+
preLazy()
|
|
61912
|
+
], DatabaseService.prototype, "executePGSql", null);
|
|
61644
61913
|
|
|
61645
61914
|
|
|
61646
61915
|
/***/ }),
|
|
@@ -81888,11 +82157,14 @@ const web_auth_1 = __webpack_require__(76097);
|
|
|
81888
82157
|
const oauth_1 = __webpack_require__(92423);
|
|
81889
82158
|
const common_1 = __webpack_require__(96711);
|
|
81890
82159
|
const credential_1 = __webpack_require__(99795);
|
|
82160
|
+
const api_key_1 = __webpack_require__(12754);
|
|
82161
|
+
const project_store_1 = __webpack_require__(65260);
|
|
81891
82162
|
const error_1 = __webpack_require__(64119);
|
|
81892
82163
|
__exportStar(__webpack_require__(96711), exports);
|
|
81893
82164
|
__exportStar(__webpack_require__(99795), exports);
|
|
81894
82165
|
__exportStar(__webpack_require__(76097), exports);
|
|
81895
82166
|
__exportStar(__webpack_require__(92423), exports);
|
|
82167
|
+
__exportStar(__webpack_require__(12754), exports);
|
|
81896
82168
|
class AuthSupervisor {
|
|
81897
82169
|
/**
|
|
81898
82170
|
* 单例模式,全局缓存
|
|
@@ -82042,7 +82314,75 @@ class AuthSupervisor {
|
|
|
82042
82314
|
return credential;
|
|
82043
82315
|
});
|
|
82044
82316
|
}
|
|
82045
|
-
|
|
82317
|
+
/**
|
|
82318
|
+
* 通过 CloudBase API Key 登录
|
|
82319
|
+
*
|
|
82320
|
+
* API Key 是环境级别的长期凭证,通过 /capi/credential 端点换取临时 STS 密钥。
|
|
82321
|
+
* 临时密钥过期后,自动用 API Key 重新换取(无需 refreshToken 机制)。
|
|
82322
|
+
*
|
|
82323
|
+
* @param apiKey CloudBase 环境的 API Key
|
|
82324
|
+
* @param envId CloudBase 环境 ID
|
|
82325
|
+
* @param opts 选项配置
|
|
82326
|
+
*/
|
|
82327
|
+
loginByApiKey(apiKey, envId, opts) {
|
|
82328
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
82329
|
+
const { forceUpdate = false, region, cwd } = opts || {};
|
|
82330
|
+
// 1. 检查内存缓存(envId 匹配 + 未过期)
|
|
82331
|
+
if (this.cacheCredential &&
|
|
82332
|
+
this.needCache &&
|
|
82333
|
+
!this.isCacheExpire() &&
|
|
82334
|
+
!forceUpdate &&
|
|
82335
|
+
this.cacheCredential.envId === envId) {
|
|
82336
|
+
return this.cacheCredential;
|
|
82337
|
+
}
|
|
82338
|
+
// 2. 如果不强制更新,尝试从本地存储读取
|
|
82339
|
+
if (!forceUpdate) {
|
|
82340
|
+
const stored = yield (0, credential_1.checkAndGetCredential)(Object.assign(Object.assign({}, this.requestConfig), { cwd }));
|
|
82341
|
+
if (stored && stored.envId === envId) {
|
|
82342
|
+
if (this.needCache) {
|
|
82343
|
+
this.cacheCredential = stored;
|
|
82344
|
+
this.cacheExpiredTime = stored.accessTokenExpired
|
|
82345
|
+
? Number(stored.accessTokenExpired)
|
|
82346
|
+
: Date.now() + 3600 * 1000;
|
|
82347
|
+
}
|
|
82348
|
+
return stored;
|
|
82349
|
+
}
|
|
82350
|
+
}
|
|
82351
|
+
// 3. 用 API Key 换取临时密钥
|
|
82352
|
+
if (!apiKey) {
|
|
82353
|
+
throw new error_1.CloudBaseError('API Key 不能为空');
|
|
82354
|
+
}
|
|
82355
|
+
if (!envId) {
|
|
82356
|
+
throw new error_1.CloudBaseError('环境 ID (envId) 不能为空');
|
|
82357
|
+
}
|
|
82358
|
+
const exchangeResult = yield (0, api_key_1.exchangeApiKeyForCredential)(Object.assign({ apiKey,
|
|
82359
|
+
envId,
|
|
82360
|
+
region }, this.requestConfig));
|
|
82361
|
+
const credential = Object.assign(Object.assign({}, exchangeResult), { authSource: 'api_key', apiKey });
|
|
82362
|
+
// 4. 跳过 checkAuth(CheckTcbService)校验
|
|
82363
|
+
// API Key 换取的临时密钥由后端 /capi/credential 端点已完成验证,
|
|
82364
|
+
// 且其 policy 可能不包含 CheckTcbService 权限,无需再次校验
|
|
82365
|
+
// 5. 存储凭证
|
|
82366
|
+
if (cwd) {
|
|
82367
|
+
// 项目级存储
|
|
82368
|
+
const store = (0, project_store_1.getProjectStore)(cwd, { _: 'CloudBase API Key 凭据,请勿分享', credential: {} }, 'auth');
|
|
82369
|
+
yield store.set('credential', credential);
|
|
82370
|
+
}
|
|
82371
|
+
else {
|
|
82372
|
+
// 全局存储
|
|
82373
|
+
yield credential_1.authStore.set('credential', credential);
|
|
82374
|
+
}
|
|
82375
|
+
// 6. 更新内存缓存
|
|
82376
|
+
if (this.needCache) {
|
|
82377
|
+
this.cacheCredential = credential;
|
|
82378
|
+
this.cacheExpiredTime = credential.accessTokenExpired
|
|
82379
|
+
? Number(credential.accessTokenExpired)
|
|
82380
|
+
: Date.now() + 3600 * 1000;
|
|
82381
|
+
}
|
|
82382
|
+
return credential;
|
|
82383
|
+
});
|
|
82384
|
+
}
|
|
82385
|
+
logout(opts) {
|
|
82046
82386
|
return __awaiter(this, void 0, void 0, function* () {
|
|
82047
82387
|
if (this.cacheCredential) {
|
|
82048
82388
|
this.cacheCredential = null;
|
|
@@ -82058,6 +82398,17 @@ class AuthSupervisor {
|
|
|
82058
82398
|
catch (e) {
|
|
82059
82399
|
yield credential_1.authStore.delete('credential');
|
|
82060
82400
|
}
|
|
82401
|
+
// 清理项目级凭证
|
|
82402
|
+
const cwd = opts === null || opts === void 0 ? void 0 : opts.cwd;
|
|
82403
|
+
if (cwd) {
|
|
82404
|
+
try {
|
|
82405
|
+
const projectAuthStore = (0, project_store_1.getProjectStore)(cwd, { _: '', credential: {} }, 'auth');
|
|
82406
|
+
yield projectAuthStore.delete('credential');
|
|
82407
|
+
}
|
|
82408
|
+
catch (_a) {
|
|
82409
|
+
// 项目级存储不存在时忽略
|
|
82410
|
+
}
|
|
82411
|
+
}
|
|
82061
82412
|
});
|
|
82062
82413
|
}
|
|
82063
82414
|
isCacheExpire() {
|
|
@@ -88360,6 +88711,7 @@ __exportStar(__webpack_require__(73766), exports);
|
|
|
88360
88711
|
__exportStar(__webpack_require__(51995), exports);
|
|
88361
88712
|
__exportStar(__webpack_require__(80854), exports);
|
|
88362
88713
|
__exportStar(__webpack_require__(40833), exports);
|
|
88714
|
+
__exportStar(__webpack_require__(65260), exports);
|
|
88363
88715
|
__exportStar(__webpack_require__(84587), exports);
|
|
88364
88716
|
__exportStar(__webpack_require__(31153), exports);
|
|
88365
88717
|
__exportStar(__webpack_require__(33283), exports);
|
|
@@ -100251,6 +100603,70 @@ exports.stringifyString = stringifyString;
|
|
|
100251
100603
|
exports.toJSON = toJSON;
|
|
100252
100604
|
|
|
100253
100605
|
|
|
100606
|
+
/***/ }),
|
|
100607
|
+
|
|
100608
|
+
/***/ 30983:
|
|
100609
|
+
/***/ ((module) => {
|
|
100610
|
+
|
|
100611
|
+
// 'mime-score' back-ported to CommonJS
|
|
100612
|
+
|
|
100613
|
+
// Score RFC facets (see https://tools.ietf.org/html/rfc6838#section-3)
|
|
100614
|
+
var FACET_SCORES = {
|
|
100615
|
+
'prs.': 100,
|
|
100616
|
+
'x-': 200,
|
|
100617
|
+
'x.': 300,
|
|
100618
|
+
'vnd.': 400,
|
|
100619
|
+
default: 900
|
|
100620
|
+
}
|
|
100621
|
+
|
|
100622
|
+
// Score mime source (Logic originally from `jshttp/mime-types` module)
|
|
100623
|
+
var SOURCE_SCORES = {
|
|
100624
|
+
nginx: 10,
|
|
100625
|
+
apache: 20,
|
|
100626
|
+
iana: 40,
|
|
100627
|
+
default: 30 // definitions added by `jshttp/mime-db` project?
|
|
100628
|
+
}
|
|
100629
|
+
|
|
100630
|
+
var TYPE_SCORES = {
|
|
100631
|
+
// prefer application/xml over text/xml
|
|
100632
|
+
// prefer application/rtf over text/rtf
|
|
100633
|
+
application: 1,
|
|
100634
|
+
|
|
100635
|
+
// prefer font/woff over application/font-woff
|
|
100636
|
+
font: 2,
|
|
100637
|
+
|
|
100638
|
+
// prefer video/mp4 over audio/mp4 over application/mp4
|
|
100639
|
+
// See https://www.rfc-editor.org/rfc/rfc4337.html#section-2
|
|
100640
|
+
audio: 2,
|
|
100641
|
+
video: 3,
|
|
100642
|
+
|
|
100643
|
+
default: 0
|
|
100644
|
+
}
|
|
100645
|
+
|
|
100646
|
+
/**
|
|
100647
|
+
* Get each component of the score for a mime type. The sum of these is the
|
|
100648
|
+
* total score. The higher the score, the more "official" the type.
|
|
100649
|
+
*/
|
|
100650
|
+
module.exports = function mimeScore (mimeType, source = 'default') {
|
|
100651
|
+
if (mimeType === 'application/octet-stream') {
|
|
100652
|
+
return 0
|
|
100653
|
+
}
|
|
100654
|
+
|
|
100655
|
+
const [type, subtype] = mimeType.split('/')
|
|
100656
|
+
|
|
100657
|
+
const facet = subtype.replace(/(\.|x-).*/, '$1')
|
|
100658
|
+
|
|
100659
|
+
const facetScore = FACET_SCORES[facet] || FACET_SCORES.default
|
|
100660
|
+
const sourceScore = SOURCE_SCORES[source] || SOURCE_SCORES.default
|
|
100661
|
+
const typeScore = TYPE_SCORES[type] || TYPE_SCORES.default
|
|
100662
|
+
|
|
100663
|
+
// All else being equal prefer shorter types
|
|
100664
|
+
const lengthScore = 1 - mimeType.length / 100
|
|
100665
|
+
|
|
100666
|
+
return facetScore + sourceScore + typeScore + lengthScore
|
|
100667
|
+
}
|
|
100668
|
+
|
|
100669
|
+
|
|
100254
100670
|
/***/ }),
|
|
100255
100671
|
|
|
100256
100672
|
/***/ 30989:
|
|
@@ -124901,28 +125317,31 @@ const configDir = homeDir && homeAccessible ? path_1.default.join(homeDir, '.con
|
|
|
124901
125317
|
exports.cloudbaseConfigDir = path_1.default.join(configDir, '.cloudbase');
|
|
124902
125318
|
// 确保目录存在
|
|
124903
125319
|
make_dir_1.default.sync(exports.cloudbaseConfigDir);
|
|
124904
|
-
function getAsyncDB(file) {
|
|
124905
|
-
const
|
|
125320
|
+
function getAsyncDB(file, directory) {
|
|
125321
|
+
const baseDir = directory || exports.cloudbaseConfigDir;
|
|
125322
|
+
const dbPath = path_1.default.join(baseDir, `${file}.json`);
|
|
124906
125323
|
const adapter = new FileAsync_1.default(dbPath);
|
|
124907
125324
|
const db = (0, lowdb_1.default)(adapter);
|
|
124908
125325
|
return db;
|
|
124909
125326
|
}
|
|
124910
125327
|
exports.getAsyncDB = getAsyncDB;
|
|
124911
|
-
function getSyncDB(file) {
|
|
124912
|
-
const
|
|
125328
|
+
function getSyncDB(file, directory) {
|
|
125329
|
+
const baseDir = directory || exports.cloudbaseConfigDir;
|
|
125330
|
+
const dbPath = path_1.default.join(baseDir, `${file}.json`);
|
|
124913
125331
|
const adapter = new FileSync_1.default(dbPath);
|
|
124914
125332
|
const db = (0, lowdb_1.default)(adapter);
|
|
124915
125333
|
return db;
|
|
124916
125334
|
}
|
|
124917
125335
|
exports.getSyncDB = getSyncDB;
|
|
124918
125336
|
class LocalStore {
|
|
124919
|
-
constructor(defaults, dbKey = 'common') {
|
|
125337
|
+
constructor(defaults, dbKey = 'common', options) {
|
|
124920
125338
|
this.defaults = defaults;
|
|
124921
125339
|
this.dbKey = dbKey;
|
|
125340
|
+
this.directory = options === null || options === void 0 ? void 0 : options.directory;
|
|
124922
125341
|
}
|
|
124923
125342
|
getDB() {
|
|
124924
125343
|
return __awaiter(this, void 0, void 0, function* () {
|
|
124925
|
-
const db = this.db || (yield getAsyncDB(this.dbKey));
|
|
125344
|
+
const db = this.db || (yield getAsyncDB(this.dbKey, this.directory));
|
|
124926
125345
|
this.db = db;
|
|
124927
125346
|
return db;
|
|
124928
125347
|
});
|
|
@@ -134489,7 +134908,7 @@ class TelemetryReporter {
|
|
|
134489
134908
|
const nodeVersion = process.version; // Node.js版本
|
|
134490
134909
|
const arch = os_1.default.arch(); // 系统架构
|
|
134491
134910
|
// 从构建时注入的版本号获取MCP版本信息
|
|
134492
|
-
const mcpVersion = process.env.npm_package_version || "2.
|
|
134911
|
+
const mcpVersion = process.env.npm_package_version || "2.20.0-beta.0" || 0;
|
|
134493
134912
|
return {
|
|
134494
134913
|
userAgent: `${osType} ${osRelease} ${arch} ${nodeVersion} CloudBase-MCP/${mcpVersion}`,
|
|
134495
134914
|
deviceId: this.deviceId,
|
|
@@ -184195,6 +184614,144 @@ module.exports = () => {
|
|
|
184195
184614
|
};
|
|
184196
184615
|
|
|
184197
184616
|
|
|
184617
|
+
/***/ }),
|
|
184618
|
+
|
|
184619
|
+
/***/ 65260:
|
|
184620
|
+
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
|
|
184621
|
+
|
|
184622
|
+
"use strict";
|
|
184623
|
+
|
|
184624
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
184625
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
184626
|
+
};
|
|
184627
|
+
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
184628
|
+
exports.getProjectStore = exports.getProjectDir = exports.findProjectRoot = exports.canonicalizePath = exports.sanitizePath = exports.projectsDir = exports.PROJECT_ROOT_MARKERS = void 0;
|
|
184629
|
+
const os_1 = __importDefault(__webpack_require__(21820));
|
|
184630
|
+
const fs_1 = __importDefault(__webpack_require__(29021));
|
|
184631
|
+
const path_1 = __importDefault(__webpack_require__(39902));
|
|
184632
|
+
const crypto_1 = __importDefault(__webpack_require__(55511));
|
|
184633
|
+
const make_dir_1 = __importDefault(__webpack_require__(55589));
|
|
184634
|
+
const localstore_1 = __webpack_require__(40833);
|
|
184635
|
+
/**
|
|
184636
|
+
* 项目根目录标志文件列表(按优先级排序)
|
|
184637
|
+
*/
|
|
184638
|
+
exports.PROJECT_ROOT_MARKERS = [
|
|
184639
|
+
'cloudbaserc.json',
|
|
184640
|
+
'cloudbaserc.js',
|
|
184641
|
+
'.cloudbaserc',
|
|
184642
|
+
'.git'
|
|
184643
|
+
];
|
|
184644
|
+
/**
|
|
184645
|
+
* projects/ 存储根目录
|
|
184646
|
+
*/
|
|
184647
|
+
exports.projectsDir = path_1.default.join(localstore_1.cloudbaseConfigDir, 'projects');
|
|
184648
|
+
/**
|
|
184649
|
+
* 将绝对路径转换为安全的目录名
|
|
184650
|
+
*
|
|
184651
|
+
* 参考 Claude Code sessionStoragePortable.ts 的设计:
|
|
184652
|
+
* - 非字母数字字符替换为连字符 `-`
|
|
184653
|
+
* - 超过 200 字符时截断并附加 sha256 哈希前 16 位确保唯一性
|
|
184654
|
+
*
|
|
184655
|
+
* @example
|
|
184656
|
+
* sanitizePath('/Users/bookerzhao/Projects/myapp')
|
|
184657
|
+
* // → '-Users-bookerzhao-Projects-myapp'
|
|
184658
|
+
*/
|
|
184659
|
+
function sanitizePath(absolutePath) {
|
|
184660
|
+
let sanitized = absolutePath.replace(/[^a-zA-Z0-9]/g, '-');
|
|
184661
|
+
if (sanitized.length > 200) {
|
|
184662
|
+
const hash = crypto_1.default.createHash('sha256').update(absolutePath).digest('hex').slice(0, 16);
|
|
184663
|
+
sanitized = sanitized.slice(0, 200) + '-' + hash;
|
|
184664
|
+
}
|
|
184665
|
+
return sanitized;
|
|
184666
|
+
}
|
|
184667
|
+
exports.sanitizePath = sanitizePath;
|
|
184668
|
+
/**
|
|
184669
|
+
* 解析符号链接,获取规范化的绝对路径
|
|
184670
|
+
* 如果路径不存在则返回 path.resolve() 的结果
|
|
184671
|
+
*/
|
|
184672
|
+
function canonicalizePath(p) {
|
|
184673
|
+
try {
|
|
184674
|
+
return fs_1.default.realpathSync(p);
|
|
184675
|
+
}
|
|
184676
|
+
catch (_a) {
|
|
184677
|
+
return path_1.default.resolve(p);
|
|
184678
|
+
}
|
|
184679
|
+
}
|
|
184680
|
+
exports.canonicalizePath = canonicalizePath;
|
|
184681
|
+
/**
|
|
184682
|
+
* 从 cwd 向上查找项目根目录
|
|
184683
|
+
*
|
|
184684
|
+
* 查找逻辑:
|
|
184685
|
+
* 1. 从 cwd 开始,逐级向上查找 PROJECT_ROOT_MARKERS
|
|
184686
|
+
* 2. 不越过 Home 目录(防止父目录配置污染)
|
|
184687
|
+
* 3. 都找不到时兜底使用 cwd 本身
|
|
184688
|
+
*/
|
|
184689
|
+
function findProjectRoot(cwd) {
|
|
184690
|
+
const resolvedCwd = canonicalizePath(cwd);
|
|
184691
|
+
const homeDir = os_1.default.homedir();
|
|
184692
|
+
let dir = resolvedCwd;
|
|
184693
|
+
while (true) {
|
|
184694
|
+
for (const marker of exports.PROJECT_ROOT_MARKERS) {
|
|
184695
|
+
const markerPath = path_1.default.join(dir, marker);
|
|
184696
|
+
try {
|
|
184697
|
+
fs_1.default.accessSync(markerPath, fs_1.default.constants.F_OK);
|
|
184698
|
+
return dir;
|
|
184699
|
+
}
|
|
184700
|
+
catch (_a) {
|
|
184701
|
+
// marker 不存在,继续
|
|
184702
|
+
}
|
|
184703
|
+
}
|
|
184704
|
+
// 不越过 Home 目录
|
|
184705
|
+
if (dir === homeDir) {
|
|
184706
|
+
break;
|
|
184707
|
+
}
|
|
184708
|
+
const parentDir = path_1.default.dirname(dir);
|
|
184709
|
+
// 已到文件系统根
|
|
184710
|
+
if (parentDir === dir) {
|
|
184711
|
+
break;
|
|
184712
|
+
}
|
|
184713
|
+
dir = parentDir;
|
|
184714
|
+
}
|
|
184715
|
+
// 兜底:使用 cwd 本身
|
|
184716
|
+
return resolvedCwd;
|
|
184717
|
+
}
|
|
184718
|
+
exports.findProjectRoot = findProjectRoot;
|
|
184719
|
+
/**
|
|
184720
|
+
* 获取项目的存储目录路径
|
|
184721
|
+
*
|
|
184722
|
+
* @returns 绝对路径,如 `~/.config/.cloudbase/projects/-Users-bookerzhao-Projects-myapp/`
|
|
184723
|
+
*/
|
|
184724
|
+
function getProjectDir(cwd) {
|
|
184725
|
+
const projectRoot = findProjectRoot(cwd);
|
|
184726
|
+
const dirName = sanitizePath(projectRoot);
|
|
184727
|
+
return path_1.default.join(exports.projectsDir, dirName);
|
|
184728
|
+
}
|
|
184729
|
+
exports.getProjectDir = getProjectDir;
|
|
184730
|
+
/**
|
|
184731
|
+
* 获取项目级 LocalStore 实例(通用工厂函数)
|
|
184732
|
+
*
|
|
184733
|
+
* 存储位置: `~/.config/.cloudbase/projects/<sanitized-root>/<dbKey>.json`
|
|
184734
|
+
*
|
|
184735
|
+
* @param cwd - 项目工作目录(会自动向上查找项目根)
|
|
184736
|
+
* @param defaults - LocalStore 默认值
|
|
184737
|
+
* @param dbKey - 存储文件名(不含 .json 后缀),如 'auth'、'env'
|
|
184738
|
+
*
|
|
184739
|
+
* @example
|
|
184740
|
+
* // 获取项目级 auth 存储
|
|
184741
|
+
* const authStore = getProjectStore(process.cwd(), { credential: {} }, 'auth');
|
|
184742
|
+
*
|
|
184743
|
+
* // 获取项目级 env 配置存储
|
|
184744
|
+
* const envStore = getProjectStore(process.cwd(), { envId: '' }, 'env');
|
|
184745
|
+
*/
|
|
184746
|
+
function getProjectStore(cwd, defaults, dbKey) {
|
|
184747
|
+
const directory = getProjectDir(cwd);
|
|
184748
|
+
// 确保目录存在
|
|
184749
|
+
make_dir_1.default.sync(directory);
|
|
184750
|
+
return new localstore_1.LocalStore(defaults, dbKey, { directory });
|
|
184751
|
+
}
|
|
184752
|
+
exports.getProjectStore = getProjectStore;
|
|
184753
|
+
|
|
184754
|
+
|
|
184198
184755
|
/***/ }),
|
|
184199
184756
|
|
|
184200
184757
|
/***/ 65291:
|
|
@@ -192956,7 +193513,7 @@ ${envIdSection}
|
|
|
192956
193513
|
## 环境信息
|
|
192957
193514
|
- 操作系统: ${os_1.default.type()} ${os_1.default.release()}
|
|
192958
193515
|
- Node.js版本: ${process.version}
|
|
192959
|
-
- MCP 版本:${process.env.npm_package_version || "2.
|
|
193516
|
+
- MCP 版本:${process.env.npm_package_version || "2.20.0-beta.0" || 0}
|
|
192960
193517
|
- 系统架构: ${os_1.default.arch()}
|
|
192961
193518
|
- 时间: ${new Date().toISOString()}
|
|
192962
193519
|
- 请求ID: ${requestId}
|
|
@@ -193004,7 +193561,7 @@ function createWrappedHandler(name, handler, server) {
|
|
|
193004
193561
|
success = true;
|
|
193005
193562
|
requestId = extractRequestIdFromToolResult(result);
|
|
193006
193563
|
const duration = Date.now() - startTime;
|
|
193007
|
-
(0, logger_js_1.debug)(`工具执行成功: ${name}`, { duration });
|
|
193564
|
+
(0, logger_js_1.debug)(`工具执行成功: ${name}`, { duration, requestId: requestId || undefined });
|
|
193008
193565
|
if (!isTestEnvironment) {
|
|
193009
193566
|
server.logger?.({ type: 'afterToolCall', toolName: name, args: sanitizeArgs(args), result: result, duration });
|
|
193010
193567
|
}
|
|
@@ -193016,6 +193573,7 @@ function createWrappedHandler(name, handler, server) {
|
|
|
193016
193573
|
requestId = (typeof error === 'object' && error && 'requestId' in error) ? error.requestId : '';
|
|
193017
193574
|
(0, logger_js_1.debug)(`工具执行失败: ${name}`, {
|
|
193018
193575
|
error: errorMessage,
|
|
193576
|
+
requestId: requestId || undefined,
|
|
193019
193577
|
duration: Date.now() - startTime
|
|
193020
193578
|
});
|
|
193021
193579
|
const isTestEnvironment = false || process.env.VITEST === "true";
|
|
@@ -193036,8 +193594,9 @@ function createWrappedHandler(name, handler, server) {
|
|
|
193036
193594
|
requestId: (typeof error === 'object' && error && 'requestId' in error) ? error.requestId : '',
|
|
193037
193595
|
ide: server.ide || process.env.INTEGRATION_IDE || ''
|
|
193038
193596
|
});
|
|
193039
|
-
const mcpVersion = true ? "2.
|
|
193040
|
-
const
|
|
193597
|
+
const mcpVersion = true ? "2.20.0-beta.0" : 0;
|
|
193598
|
+
const requestIdSuffix = requestId ? `\n🆔 RequestId: ${requestId}` : '';
|
|
193599
|
+
const enhancedErrorMessage = `${errorMessage}${requestIdSuffix}\n\n📦 CloudBase MCP v${mcpVersion}\n🔗 遇到问题?请复制以下链接到浏览器打开\n即可自动携带错误详情快速创建 GitHub Issue:\n${issueLink}`;
|
|
193041
193600
|
// 创建新的错误对象,保持原有的错误类型但更新消息
|
|
193042
193601
|
const enhancedError = error instanceof Error
|
|
193043
193602
|
? new Error(enhancedErrorMessage)
|
|
@@ -195080,6 +195639,7 @@ const path_1 = __importDefault(__webpack_require__(39902));
|
|
|
195080
195639
|
const make_dir_1 = __importDefault(__webpack_require__(55589));
|
|
195081
195640
|
const walkdir_1 = __importDefault(__webpack_require__(25567));
|
|
195082
195641
|
const micromatch_1 = __importDefault(__webpack_require__(90628));
|
|
195642
|
+
const mime_types_1 = __importDefault(__webpack_require__(86049));
|
|
195083
195643
|
const cos_nodejs_sdk_v5_1 = __importDefault(__webpack_require__(93625));
|
|
195084
195644
|
const utils_1 = __webpack_require__(62358);
|
|
195085
195645
|
const error_1 = __webpack_require__(40430);
|
|
@@ -196322,6 +196882,1251 @@ class StorageService {
|
|
|
196322
196882
|
// 限制总数量
|
|
196323
196883
|
return results.slice(0, limit);
|
|
196324
196884
|
}
|
|
196885
|
+
/**
|
|
196886
|
+
* 通过 CloudBase HTTP API 上传对象(Binary 直传)
|
|
196887
|
+
* POST/PUT /v1/storages/object/:bucketId/*objectName
|
|
196888
|
+
*/
|
|
196889
|
+
/* eslint-disable complexity */
|
|
196890
|
+
async uploadObject(options) {
|
|
196891
|
+
const { bucketId, objectName, localPath, body, contentType, contentLength, cacheControl, metadata, xRobotsTag, upsert = false, usePut = false, accessToken, envId: envIdOverride } = options;
|
|
196892
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
196893
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
196894
|
+
}
|
|
196895
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
196896
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
196897
|
+
}
|
|
196898
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
196899
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
196900
|
+
}
|
|
196901
|
+
if (!localPath && !body) {
|
|
196902
|
+
throw new error_1.CloudBaseError('localPath 与 body 至少提供一个');
|
|
196903
|
+
}
|
|
196904
|
+
if (localPath && body) {
|
|
196905
|
+
throw new error_1.CloudBaseError('localPath 与 body 只能二选一');
|
|
196906
|
+
}
|
|
196907
|
+
// env / proxy
|
|
196908
|
+
const authConfig = this.environment.getAuthConfig();
|
|
196909
|
+
const { proxy } = authConfig;
|
|
196910
|
+
const { env } = this.getStorageConfig();
|
|
196911
|
+
const envId = envIdOverride || env;
|
|
196912
|
+
// 路径编码:保留 "/" 层级,仅编码每段
|
|
196913
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
196914
|
+
const encodedObjectName = objectName
|
|
196915
|
+
.split('/')
|
|
196916
|
+
.map(seg => encodeURIComponent(seg))
|
|
196917
|
+
.join('/');
|
|
196918
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}/${encodedObjectName}`;
|
|
196919
|
+
const method = usePut ? 'PUT' : 'POST';
|
|
196920
|
+
// 推断文件大小
|
|
196921
|
+
let fileSize = contentLength;
|
|
196922
|
+
if (localPath) {
|
|
196923
|
+
const resolvedPath = path_1.default.resolve(localPath);
|
|
196924
|
+
(0, utils_1.checkFullAccess)(resolvedPath, true);
|
|
196925
|
+
const stat = fs_1.default.statSync(resolvedPath);
|
|
196926
|
+
if (!stat.isFile()) {
|
|
196927
|
+
throw new error_1.CloudBaseError(`localPath 不是文件: ${localPath}`);
|
|
196928
|
+
}
|
|
196929
|
+
fileSize = stat.size;
|
|
196930
|
+
}
|
|
196931
|
+
else if (Buffer.isBuffer(body) && fileSize === undefined) {
|
|
196932
|
+
fileSize = body.length;
|
|
196933
|
+
}
|
|
196934
|
+
// 文档约束:> 100MB 拒绝
|
|
196935
|
+
const LIMIT_100MB = 100 * 1024 * 1024;
|
|
196936
|
+
if (fileSize !== undefined && fileSize > LIMIT_100MB) {
|
|
196937
|
+
throw new error_1.CloudBaseError('FileSizeLimitExceeded: 文件大小超过 100MB', {
|
|
196938
|
+
code: 'FileSizeLimitExceeded'
|
|
196939
|
+
});
|
|
196940
|
+
}
|
|
196941
|
+
const finalContentType = this.resolveUploadContentType({
|
|
196942
|
+
contentType,
|
|
196943
|
+
localPath,
|
|
196944
|
+
objectName,
|
|
196945
|
+
body
|
|
196946
|
+
});
|
|
196947
|
+
const headers = {
|
|
196948
|
+
Authorization: `Bearer ${accessToken}`
|
|
196949
|
+
};
|
|
196950
|
+
if (finalContentType) {
|
|
196951
|
+
headers['Content-Type'] = finalContentType;
|
|
196952
|
+
}
|
|
196953
|
+
if (fileSize !== undefined) {
|
|
196954
|
+
headers['Content-Length'] = String(fileSize);
|
|
196955
|
+
}
|
|
196956
|
+
if (cacheControl !== undefined && cacheControl !== null) {
|
|
196957
|
+
headers['Cache-Control'] =
|
|
196958
|
+
typeof cacheControl === 'number' ? `max-age=${cacheControl}` : String(cacheControl);
|
|
196959
|
+
}
|
|
196960
|
+
if (metadata) {
|
|
196961
|
+
// X-Metadata 放在 Header 里,具体大小限制由服务端/网关决定
|
|
196962
|
+
headers['X-Metadata'] = Buffer.from(JSON.stringify(metadata), 'utf8').toString('base64');
|
|
196963
|
+
}
|
|
196964
|
+
if (upsert) {
|
|
196965
|
+
headers['x-upsert'] = 'true';
|
|
196966
|
+
}
|
|
196967
|
+
if (xRobotsTag) {
|
|
196968
|
+
headers['X-Robots-Tag'] = xRobotsTag;
|
|
196969
|
+
}
|
|
196970
|
+
// 组装 Body:文件二进制本身
|
|
196971
|
+
const reqBody = localPath ? fs_1.default.createReadStream(path_1.default.resolve(localPath)) : body;
|
|
196972
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
196973
|
+
method,
|
|
196974
|
+
headers,
|
|
196975
|
+
body: reqBody
|
|
196976
|
+
}, proxy);
|
|
196977
|
+
const text = await res.text();
|
|
196978
|
+
let payload = null;
|
|
196979
|
+
if (text) {
|
|
196980
|
+
try {
|
|
196981
|
+
payload = JSON.parse(text);
|
|
196982
|
+
}
|
|
196983
|
+
catch (_a) {
|
|
196984
|
+
if (!res.ok) {
|
|
196985
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
196986
|
+
}
|
|
196987
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
196988
|
+
}
|
|
196989
|
+
}
|
|
196990
|
+
if (!res.ok) {
|
|
196991
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
196992
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '上传失败';
|
|
196993
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
196994
|
+
code,
|
|
196995
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
196996
|
+
});
|
|
196997
|
+
}
|
|
196998
|
+
if (!payload || !payload.Id || !payload.Key) {
|
|
196999
|
+
throw new error_1.CloudBaseError('上传成功但响应格式异常:缺少 Id 或 Key');
|
|
197000
|
+
}
|
|
197001
|
+
return {
|
|
197002
|
+
Id: payload.Id,
|
|
197003
|
+
Key: payload.Key
|
|
197004
|
+
};
|
|
197005
|
+
}
|
|
197006
|
+
/**
|
|
197007
|
+
* 通过 CloudBase HTTP API 删除单个对象
|
|
197008
|
+
* DELETE /v1/storages/object/:bucketId/*objectName
|
|
197009
|
+
*/
|
|
197010
|
+
async deleteObject(options) {
|
|
197011
|
+
const { bucketId, objectName, accessToken, envId: envIdOverride } = options;
|
|
197012
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197013
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197014
|
+
}
|
|
197015
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197016
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197017
|
+
}
|
|
197018
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197019
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197020
|
+
}
|
|
197021
|
+
const { env } = this.getStorageConfig();
|
|
197022
|
+
const envId = envIdOverride || env;
|
|
197023
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197024
|
+
const encodedObjectName = objectName
|
|
197025
|
+
.split('/')
|
|
197026
|
+
.map(seg => encodeURIComponent(seg))
|
|
197027
|
+
.join('/');
|
|
197028
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}/${encodedObjectName}`;
|
|
197029
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197030
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197031
|
+
method: 'DELETE',
|
|
197032
|
+
headers: {
|
|
197033
|
+
Authorization: `Bearer ${accessToken}`
|
|
197034
|
+
}
|
|
197035
|
+
}, proxy);
|
|
197036
|
+
const text = await res.text();
|
|
197037
|
+
let payload = null;
|
|
197038
|
+
if (text) {
|
|
197039
|
+
try {
|
|
197040
|
+
payload = JSON.parse(text);
|
|
197041
|
+
}
|
|
197042
|
+
catch (_a) {
|
|
197043
|
+
if (!res.ok) {
|
|
197044
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197045
|
+
}
|
|
197046
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197047
|
+
}
|
|
197048
|
+
}
|
|
197049
|
+
if (!res.ok) {
|
|
197050
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197051
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '删除失败';
|
|
197052
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197053
|
+
code,
|
|
197054
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197055
|
+
});
|
|
197056
|
+
}
|
|
197057
|
+
// 网关成功时返回 { message: 'Successfully deleted' }
|
|
197058
|
+
return {
|
|
197059
|
+
message: (payload === null || payload === void 0 ? void 0 : payload.message) || 'Successfully deleted'
|
|
197060
|
+
};
|
|
197061
|
+
}
|
|
197062
|
+
/**
|
|
197063
|
+
* 通过 CloudBase HTTP API 批量删除对象(单次最多 20 个)
|
|
197064
|
+
* DELETE /v1/storages/object/:bucketId
|
|
197065
|
+
*/
|
|
197066
|
+
async deleteObjects(options) {
|
|
197067
|
+
const { bucketId, prefixes, accessToken, envId: envIdOverride } = options;
|
|
197068
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197069
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197070
|
+
}
|
|
197071
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197072
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197073
|
+
}
|
|
197074
|
+
if (!Array.isArray(prefixes) || prefixes.length === 0) {
|
|
197075
|
+
throw new error_1.CloudBaseError('prefixes 必须是非空数组');
|
|
197076
|
+
}
|
|
197077
|
+
if (prefixes.length > 20) {
|
|
197078
|
+
throw new error_1.CloudBaseError('prefixes 最多 20 个');
|
|
197079
|
+
}
|
|
197080
|
+
for (const name of prefixes) {
|
|
197081
|
+
if (!name || typeof name !== 'string') {
|
|
197082
|
+
throw new error_1.CloudBaseError('prefixes 中的每一项必须是非空字符串');
|
|
197083
|
+
}
|
|
197084
|
+
}
|
|
197085
|
+
const { env } = this.getStorageConfig();
|
|
197086
|
+
const envId = envIdOverride || env;
|
|
197087
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197088
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}`;
|
|
197089
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197090
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197091
|
+
method: 'DELETE',
|
|
197092
|
+
headers: {
|
|
197093
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197094
|
+
'Content-Type': 'application/json'
|
|
197095
|
+
},
|
|
197096
|
+
body: JSON.stringify({ prefixes })
|
|
197097
|
+
}, proxy);
|
|
197098
|
+
const text = await res.text();
|
|
197099
|
+
let payload = null;
|
|
197100
|
+
if (text) {
|
|
197101
|
+
try {
|
|
197102
|
+
payload = JSON.parse(text);
|
|
197103
|
+
}
|
|
197104
|
+
catch (_a) {
|
|
197105
|
+
if (!res.ok) {
|
|
197106
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197107
|
+
}
|
|
197108
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197109
|
+
}
|
|
197110
|
+
}
|
|
197111
|
+
if (!res.ok) {
|
|
197112
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197113
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '批量删除失败';
|
|
197114
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197115
|
+
code,
|
|
197116
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197117
|
+
});
|
|
197118
|
+
}
|
|
197119
|
+
if (!Array.isArray(payload)) {
|
|
197120
|
+
throw new error_1.CloudBaseError('批量删除响应格式异常:期望数组');
|
|
197121
|
+
}
|
|
197122
|
+
return payload;
|
|
197123
|
+
}
|
|
197124
|
+
/**
|
|
197125
|
+
* 通过 CloudBase HTTP API 复制对象
|
|
197126
|
+
* POST /v1/storages/object/copy
|
|
197127
|
+
*/
|
|
197128
|
+
/* eslint-disable complexity */
|
|
197129
|
+
async copyObject(options) {
|
|
197130
|
+
const { bucketId, sourceKey, destinationKey, destinationBucket, metadata, userMetadata, copyMetadata, upsert, accessToken, envId: envIdOverride } = options;
|
|
197131
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197132
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197133
|
+
}
|
|
197134
|
+
if (!sourceKey || typeof sourceKey !== 'string') {
|
|
197135
|
+
throw new error_1.CloudBaseError('sourceKey 必须是非空字符串');
|
|
197136
|
+
}
|
|
197137
|
+
if (!destinationKey || typeof destinationKey !== 'string') {
|
|
197138
|
+
throw new error_1.CloudBaseError('destinationKey 必须是非空字符串');
|
|
197139
|
+
}
|
|
197140
|
+
if (destinationBucket !== undefined &&
|
|
197141
|
+
(typeof destinationBucket !== 'string' || !destinationBucket)) {
|
|
197142
|
+
throw new error_1.CloudBaseError('destinationBucket 必须是非空字符串');
|
|
197143
|
+
}
|
|
197144
|
+
if (metadata !== undefined && (typeof metadata !== 'object' || metadata === null || Array.isArray(metadata))) {
|
|
197145
|
+
throw new error_1.CloudBaseError('metadata 必须是对象');
|
|
197146
|
+
}
|
|
197147
|
+
if (userMetadata !== undefined && (typeof userMetadata !== 'object' || userMetadata === null || Array.isArray(userMetadata))) {
|
|
197148
|
+
throw new error_1.CloudBaseError('userMetadata 必须是对象');
|
|
197149
|
+
}
|
|
197150
|
+
if (copyMetadata !== undefined && typeof copyMetadata !== 'boolean') {
|
|
197151
|
+
throw new error_1.CloudBaseError('copyMetadata 必须是布尔值');
|
|
197152
|
+
}
|
|
197153
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197154
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197155
|
+
}
|
|
197156
|
+
const { env } = this.getStorageConfig();
|
|
197157
|
+
const envId = envIdOverride || env;
|
|
197158
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/copy`;
|
|
197159
|
+
const headers = {
|
|
197160
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197161
|
+
'Content-Type': 'application/json'
|
|
197162
|
+
};
|
|
197163
|
+
if (upsert) {
|
|
197164
|
+
headers['x-upsert'] = 'true';
|
|
197165
|
+
}
|
|
197166
|
+
// copyMetadata=false 时,userMetadata 通过 x-metadata 头整体替换目标对象的 user_metadata
|
|
197167
|
+
if (copyMetadata === false && userMetadata) {
|
|
197168
|
+
headers['x-metadata'] = Buffer.from(JSON.stringify(userMetadata)).toString('base64');
|
|
197169
|
+
}
|
|
197170
|
+
const body = {
|
|
197171
|
+
bucketId,
|
|
197172
|
+
sourceKey,
|
|
197173
|
+
destinationKey
|
|
197174
|
+
};
|
|
197175
|
+
if (destinationBucket !== undefined)
|
|
197176
|
+
body.destinationBucket = destinationBucket;
|
|
197177
|
+
if (metadata !== undefined)
|
|
197178
|
+
body.metadata = metadata;
|
|
197179
|
+
if (copyMetadata !== undefined)
|
|
197180
|
+
body.copyMetadata = copyMetadata;
|
|
197181
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197182
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197183
|
+
method: 'POST',
|
|
197184
|
+
headers,
|
|
197185
|
+
body: JSON.stringify(body)
|
|
197186
|
+
}, proxy);
|
|
197187
|
+
const text = await res.text();
|
|
197188
|
+
let payload = null;
|
|
197189
|
+
if (text) {
|
|
197190
|
+
try {
|
|
197191
|
+
payload = JSON.parse(text);
|
|
197192
|
+
}
|
|
197193
|
+
catch (_a) {
|
|
197194
|
+
if (!res.ok) {
|
|
197195
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197196
|
+
}
|
|
197197
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197198
|
+
}
|
|
197199
|
+
}
|
|
197200
|
+
if (!res.ok) {
|
|
197201
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197202
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '复制失败';
|
|
197203
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197204
|
+
code,
|
|
197205
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197206
|
+
});
|
|
197207
|
+
}
|
|
197208
|
+
if (!payload || !payload.Id || !payload.Key) {
|
|
197209
|
+
throw new error_1.CloudBaseError('复制成功但响应格式异常:缺少 Id 或 Key');
|
|
197210
|
+
}
|
|
197211
|
+
return payload;
|
|
197212
|
+
}
|
|
197213
|
+
/**
|
|
197214
|
+
* 通过 CloudBase HTTP API 移动对象(复制后删除源对象,由服务端一次性完成)
|
|
197215
|
+
* POST /v1/storages/object/move
|
|
197216
|
+
*/
|
|
197217
|
+
async moveObject(options) {
|
|
197218
|
+
const { bucketId, sourceKey, destinationKey, destinationBucket, accessToken, envId: envIdOverride } = options;
|
|
197219
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197220
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197221
|
+
}
|
|
197222
|
+
if (!sourceKey || typeof sourceKey !== 'string') {
|
|
197223
|
+
throw new error_1.CloudBaseError('sourceKey 必须是非空字符串');
|
|
197224
|
+
}
|
|
197225
|
+
if (!destinationKey || typeof destinationKey !== 'string') {
|
|
197226
|
+
throw new error_1.CloudBaseError('destinationKey 必须是非空字符串');
|
|
197227
|
+
}
|
|
197228
|
+
if (destinationBucket !== undefined &&
|
|
197229
|
+
(typeof destinationBucket !== 'string' || !destinationBucket)) {
|
|
197230
|
+
throw new error_1.CloudBaseError('destinationBucket 必须是非空字符串');
|
|
197231
|
+
}
|
|
197232
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197233
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197234
|
+
}
|
|
197235
|
+
const { env } = this.getStorageConfig();
|
|
197236
|
+
const envId = envIdOverride || env;
|
|
197237
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/move`;
|
|
197238
|
+
const body = {
|
|
197239
|
+
bucketId,
|
|
197240
|
+
sourceKey,
|
|
197241
|
+
destinationKey
|
|
197242
|
+
};
|
|
197243
|
+
if (destinationBucket !== undefined)
|
|
197244
|
+
body.destinationBucket = destinationBucket;
|
|
197245
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197246
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197247
|
+
method: 'POST',
|
|
197248
|
+
headers: {
|
|
197249
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197250
|
+
'Content-Type': 'application/json'
|
|
197251
|
+
},
|
|
197252
|
+
body: JSON.stringify(body)
|
|
197253
|
+
}, proxy);
|
|
197254
|
+
const text = await res.text();
|
|
197255
|
+
let payload = null;
|
|
197256
|
+
if (text) {
|
|
197257
|
+
try {
|
|
197258
|
+
payload = JSON.parse(text);
|
|
197259
|
+
}
|
|
197260
|
+
catch (_a) {
|
|
197261
|
+
if (!res.ok) {
|
|
197262
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197263
|
+
}
|
|
197264
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197265
|
+
}
|
|
197266
|
+
}
|
|
197267
|
+
if (!res.ok) {
|
|
197268
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197269
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '移动失败';
|
|
197270
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197271
|
+
code,
|
|
197272
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197273
|
+
});
|
|
197274
|
+
}
|
|
197275
|
+
if (!payload || !payload.Id || !payload.Key) {
|
|
197276
|
+
throw new error_1.CloudBaseError('移动成功但响应格式异常:缺少 Id 或 Key');
|
|
197277
|
+
}
|
|
197278
|
+
return {
|
|
197279
|
+
message: payload.message || 'Successfully moved',
|
|
197280
|
+
Id: payload.Id,
|
|
197281
|
+
Key: payload.Key
|
|
197282
|
+
};
|
|
197283
|
+
}
|
|
197284
|
+
/**
|
|
197285
|
+
* 通过 CloudBase HTTP API 列出对象
|
|
197286
|
+
* POST /v1/storages/object/list/:bucketId
|
|
197287
|
+
*/
|
|
197288
|
+
/* eslint-disable complexity */
|
|
197289
|
+
async listObjects(options) {
|
|
197290
|
+
const { bucketId, prefix, limit, cursor, withDelimiter, sortBy, accessToken, envId: envIdOverride } = options;
|
|
197291
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197292
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197293
|
+
}
|
|
197294
|
+
if (prefix !== undefined && typeof prefix !== 'string') {
|
|
197295
|
+
throw new error_1.CloudBaseError('prefix 必须是字符串');
|
|
197296
|
+
}
|
|
197297
|
+
if (limit !== undefined) {
|
|
197298
|
+
if (!Number.isInteger(limit)) {
|
|
197299
|
+
throw new error_1.CloudBaseError('limit 必须是整数');
|
|
197300
|
+
}
|
|
197301
|
+
if (limit < 1 || limit > 1000) {
|
|
197302
|
+
throw new error_1.CloudBaseError('limit 必须在 1 ~ 1000 之间');
|
|
197303
|
+
}
|
|
197304
|
+
}
|
|
197305
|
+
if (cursor !== undefined && typeof cursor !== 'string') {
|
|
197306
|
+
throw new error_1.CloudBaseError('cursor 必须是字符串');
|
|
197307
|
+
}
|
|
197308
|
+
if (withDelimiter !== undefined && typeof withDelimiter !== 'boolean') {
|
|
197309
|
+
throw new error_1.CloudBaseError('withDelimiter 必须是布尔值');
|
|
197310
|
+
}
|
|
197311
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197312
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197313
|
+
}
|
|
197314
|
+
if (sortBy !== undefined) {
|
|
197315
|
+
if (typeof sortBy !== 'object' || sortBy === null || Array.isArray(sortBy)) {
|
|
197316
|
+
throw new error_1.CloudBaseError('sortBy 必须是对象');
|
|
197317
|
+
}
|
|
197318
|
+
const allowedColumns = ['name', 'created_at', 'updated_at'];
|
|
197319
|
+
const allowedOrders = ['asc', 'desc'];
|
|
197320
|
+
if (sortBy.column !== undefined && !allowedColumns.includes(sortBy.column)) {
|
|
197321
|
+
throw new error_1.CloudBaseError(`sortBy.column 非法,允许值:${allowedColumns.join('、')}`);
|
|
197322
|
+
}
|
|
197323
|
+
if (sortBy.order !== undefined) {
|
|
197324
|
+
const normalizedOrder = String(sortBy.order).toLowerCase();
|
|
197325
|
+
if (!allowedOrders.includes(normalizedOrder)) {
|
|
197326
|
+
throw new error_1.CloudBaseError(`sortBy.order 非法,允许值:${allowedOrders.join('、')}`);
|
|
197327
|
+
}
|
|
197328
|
+
sortBy.order = normalizedOrder;
|
|
197329
|
+
}
|
|
197330
|
+
}
|
|
197331
|
+
const { env } = this.getStorageConfig();
|
|
197332
|
+
const envId = envIdOverride || env;
|
|
197333
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197334
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/list/${encodedBucketId}`;
|
|
197335
|
+
const body = {};
|
|
197336
|
+
if (prefix !== undefined)
|
|
197337
|
+
body.prefix = prefix;
|
|
197338
|
+
if (limit !== undefined)
|
|
197339
|
+
body.limit = limit;
|
|
197340
|
+
if (cursor !== undefined)
|
|
197341
|
+
body.cursor = cursor;
|
|
197342
|
+
if (withDelimiter !== undefined)
|
|
197343
|
+
body.with_delimiter = withDelimiter;
|
|
197344
|
+
if (sortBy !== undefined)
|
|
197345
|
+
body.sortBy = sortBy;
|
|
197346
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197347
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197348
|
+
method: 'POST',
|
|
197349
|
+
headers: {
|
|
197350
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197351
|
+
'Content-Type': 'application/json'
|
|
197352
|
+
},
|
|
197353
|
+
body: JSON.stringify(body)
|
|
197354
|
+
}, proxy);
|
|
197355
|
+
const text = await res.text();
|
|
197356
|
+
let payload = null;
|
|
197357
|
+
if (text) {
|
|
197358
|
+
try {
|
|
197359
|
+
payload = JSON.parse(text);
|
|
197360
|
+
}
|
|
197361
|
+
catch (_a) {
|
|
197362
|
+
if (!res.ok) {
|
|
197363
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197364
|
+
}
|
|
197365
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197366
|
+
}
|
|
197367
|
+
}
|
|
197368
|
+
if (!res.ok) {
|
|
197369
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197370
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '列出对象失败';
|
|
197371
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197372
|
+
code,
|
|
197373
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197374
|
+
});
|
|
197375
|
+
}
|
|
197376
|
+
if (!payload || !Array.isArray(payload.objects) || !Array.isArray(payload.folders)) {
|
|
197377
|
+
throw new error_1.CloudBaseError('列出对象成功但响应格式异常:缺少 folders 或 objects 数组');
|
|
197378
|
+
}
|
|
197379
|
+
const result = Object.assign({ folders: payload.folders, objects: payload.objects, hasNext: Boolean(payload.hasNext), nextCursor: payload.nextCursor, nextCursorKey: payload.nextCursorKey }, payload);
|
|
197380
|
+
return result;
|
|
197381
|
+
}
|
|
197382
|
+
/**
|
|
197383
|
+
* 通过 CloudBase HTTP API 生成签名下载 URL
|
|
197384
|
+
* POST /v1/storages/object/sign/:bucketId/*objectName
|
|
197385
|
+
*/
|
|
197386
|
+
async signObject(options) {
|
|
197387
|
+
const { bucketId, objectName, expiresIn, accessToken, envId: envIdOverride } = options;
|
|
197388
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197389
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197390
|
+
}
|
|
197391
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197392
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197393
|
+
}
|
|
197394
|
+
if (!Number.isInteger(expiresIn)) {
|
|
197395
|
+
throw new error_1.CloudBaseError('expiresIn 必须是整数');
|
|
197396
|
+
}
|
|
197397
|
+
if (expiresIn < 1) {
|
|
197398
|
+
throw new error_1.CloudBaseError('expiresIn 必须 >= 1');
|
|
197399
|
+
}
|
|
197400
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197401
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197402
|
+
}
|
|
197403
|
+
const { env } = this.getStorageConfig();
|
|
197404
|
+
const envId = envIdOverride || env;
|
|
197405
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197406
|
+
const encodedObjectName = objectName
|
|
197407
|
+
.split('/')
|
|
197408
|
+
.map(seg => encodeURIComponent(seg))
|
|
197409
|
+
.join('/');
|
|
197410
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/sign/${encodedBucketId}/${encodedObjectName}`;
|
|
197411
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197412
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197413
|
+
method: 'POST',
|
|
197414
|
+
headers: {
|
|
197415
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197416
|
+
'Content-Type': 'application/json'
|
|
197417
|
+
},
|
|
197418
|
+
body: JSON.stringify({ expiresIn })
|
|
197419
|
+
}, proxy);
|
|
197420
|
+
const text = await res.text();
|
|
197421
|
+
let payload = null;
|
|
197422
|
+
if (text) {
|
|
197423
|
+
try {
|
|
197424
|
+
payload = JSON.parse(text);
|
|
197425
|
+
}
|
|
197426
|
+
catch (_a) {
|
|
197427
|
+
if (!res.ok) {
|
|
197428
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197429
|
+
}
|
|
197430
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197431
|
+
}
|
|
197432
|
+
}
|
|
197433
|
+
if (!res.ok) {
|
|
197434
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197435
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '生成签名 URL 失败';
|
|
197436
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197437
|
+
code,
|
|
197438
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197439
|
+
});
|
|
197440
|
+
}
|
|
197441
|
+
if (!payload || typeof payload.signedURL !== 'string' || !payload.signedURL) {
|
|
197442
|
+
throw new error_1.CloudBaseError('生成签名 URL 成功但响应格式异常:缺少 signedURL');
|
|
197443
|
+
}
|
|
197444
|
+
return {
|
|
197445
|
+
signedURL: payload.signedURL
|
|
197446
|
+
};
|
|
197447
|
+
}
|
|
197448
|
+
/**
|
|
197449
|
+
* 通过 CloudBase HTTP API 批量生成签名下载 URL
|
|
197450
|
+
* POST /v1/storages/object/sign/:bucketId
|
|
197451
|
+
*/
|
|
197452
|
+
async signObjects(options) {
|
|
197453
|
+
const { bucketId, expiresIn, paths, accessToken, envId: envIdOverride } = options;
|
|
197454
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197455
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197456
|
+
}
|
|
197457
|
+
if (!Number.isInteger(expiresIn)) {
|
|
197458
|
+
throw new error_1.CloudBaseError('expiresIn 必须是整数');
|
|
197459
|
+
}
|
|
197460
|
+
if (expiresIn < 1) {
|
|
197461
|
+
throw new error_1.CloudBaseError('expiresIn 必须 >= 1');
|
|
197462
|
+
}
|
|
197463
|
+
if (!Array.isArray(paths) || paths.length === 0) {
|
|
197464
|
+
throw new error_1.CloudBaseError('paths 必须是非空数组');
|
|
197465
|
+
}
|
|
197466
|
+
if (paths.length > 500) {
|
|
197467
|
+
throw new error_1.CloudBaseError('paths 最多 500 个');
|
|
197468
|
+
}
|
|
197469
|
+
for (const pathItem of paths) {
|
|
197470
|
+
if (!pathItem || typeof pathItem !== 'string') {
|
|
197471
|
+
throw new error_1.CloudBaseError('paths 中每一项必须是非空字符串');
|
|
197472
|
+
}
|
|
197473
|
+
}
|
|
197474
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197475
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197476
|
+
}
|
|
197477
|
+
const { env } = this.getStorageConfig();
|
|
197478
|
+
const envId = envIdOverride || env;
|
|
197479
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197480
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/sign/${encodedBucketId}`;
|
|
197481
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197482
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197483
|
+
method: 'POST',
|
|
197484
|
+
headers: {
|
|
197485
|
+
Authorization: `Bearer ${accessToken}`,
|
|
197486
|
+
'Content-Type': 'application/json'
|
|
197487
|
+
},
|
|
197488
|
+
body: JSON.stringify({
|
|
197489
|
+
expiresIn,
|
|
197490
|
+
paths
|
|
197491
|
+
})
|
|
197492
|
+
}, proxy);
|
|
197493
|
+
const text = await res.text();
|
|
197494
|
+
let payload = null;
|
|
197495
|
+
if (text) {
|
|
197496
|
+
try {
|
|
197497
|
+
payload = JSON.parse(text);
|
|
197498
|
+
}
|
|
197499
|
+
catch (_a) {
|
|
197500
|
+
if (!res.ok) {
|
|
197501
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197502
|
+
}
|
|
197503
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197504
|
+
}
|
|
197505
|
+
}
|
|
197506
|
+
if (!res.ok) {
|
|
197507
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197508
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '批量生成签名 URL 失败';
|
|
197509
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197510
|
+
code,
|
|
197511
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197512
|
+
});
|
|
197513
|
+
}
|
|
197514
|
+
if (!Array.isArray(payload)) {
|
|
197515
|
+
throw new error_1.CloudBaseError('批量生成签名 URL 成功但响应格式异常:期望数组');
|
|
197516
|
+
}
|
|
197517
|
+
return payload;
|
|
197518
|
+
}
|
|
197519
|
+
/**
|
|
197520
|
+
* 通过 CloudBase HTTP API 生成签名上传 URL
|
|
197521
|
+
* POST /v1/storages/object/upload/sign/:bucketId/*objectName
|
|
197522
|
+
*/
|
|
197523
|
+
async signUploadObject(options) {
|
|
197524
|
+
const { bucketId, objectName, upsert = false, accessToken, envId: envIdOverride } = options;
|
|
197525
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197526
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197527
|
+
}
|
|
197528
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197529
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197530
|
+
}
|
|
197531
|
+
if (typeof upsert !== 'boolean') {
|
|
197532
|
+
throw new error_1.CloudBaseError('upsert 必须是布尔值');
|
|
197533
|
+
}
|
|
197534
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197535
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197536
|
+
}
|
|
197537
|
+
const { env } = this.getStorageConfig();
|
|
197538
|
+
const envId = envIdOverride || env;
|
|
197539
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197540
|
+
const encodedObjectName = objectName
|
|
197541
|
+
.split('/')
|
|
197542
|
+
.map(seg => encodeURIComponent(seg))
|
|
197543
|
+
.join('/');
|
|
197544
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/upload/sign/${encodedBucketId}/${encodedObjectName}`;
|
|
197545
|
+
const headers = {
|
|
197546
|
+
Authorization: `Bearer ${accessToken}`
|
|
197547
|
+
};
|
|
197548
|
+
if (upsert) {
|
|
197549
|
+
headers['x-upsert'] = 'true';
|
|
197550
|
+
}
|
|
197551
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197552
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197553
|
+
method: 'POST',
|
|
197554
|
+
headers
|
|
197555
|
+
}, proxy);
|
|
197556
|
+
const text = await res.text();
|
|
197557
|
+
let payload = null;
|
|
197558
|
+
if (text) {
|
|
197559
|
+
try {
|
|
197560
|
+
payload = JSON.parse(text);
|
|
197561
|
+
}
|
|
197562
|
+
catch (_a) {
|
|
197563
|
+
if (!res.ok) {
|
|
197564
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197565
|
+
}
|
|
197566
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197567
|
+
}
|
|
197568
|
+
}
|
|
197569
|
+
if (!res.ok) {
|
|
197570
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197571
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '生成签名上传 URL 失败';
|
|
197572
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197573
|
+
code,
|
|
197574
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197575
|
+
});
|
|
197576
|
+
}
|
|
197577
|
+
if (!payload || typeof payload.url !== 'string' || typeof payload.token !== 'string') {
|
|
197578
|
+
throw new error_1.CloudBaseError('生成签名上传 URL 成功但响应格式异常:缺少 url 或 token');
|
|
197579
|
+
}
|
|
197580
|
+
return {
|
|
197581
|
+
url: payload.url,
|
|
197582
|
+
token: payload.token
|
|
197583
|
+
};
|
|
197584
|
+
}
|
|
197585
|
+
/**
|
|
197586
|
+
* 通过 CloudBase HTTP API 使用签名 URL 上传对象(无需 Authorization)
|
|
197587
|
+
* PUT /v1/storages/object/upload/sign/:bucketId/*objectName?token=xxx
|
|
197588
|
+
*/
|
|
197589
|
+
async uploadObjectBySign(options) {
|
|
197590
|
+
const { bucketId, objectName, token, localPath, body, contentType, contentLength, envId: envIdOverride } = options;
|
|
197591
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197592
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197593
|
+
}
|
|
197594
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197595
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197596
|
+
}
|
|
197597
|
+
if (!token || typeof token !== 'string') {
|
|
197598
|
+
throw new error_1.CloudBaseError('token 必须是非空字符串');
|
|
197599
|
+
}
|
|
197600
|
+
if (!localPath && !body) {
|
|
197601
|
+
throw new error_1.CloudBaseError('localPath 与 body 至少提供一个');
|
|
197602
|
+
}
|
|
197603
|
+
if (localPath && body) {
|
|
197604
|
+
throw new error_1.CloudBaseError('localPath 与 body 只能二选一');
|
|
197605
|
+
}
|
|
197606
|
+
const { env } = this.getStorageConfig();
|
|
197607
|
+
const envId = envIdOverride || env;
|
|
197608
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197609
|
+
const encodedObjectName = objectName
|
|
197610
|
+
.split('/')
|
|
197611
|
+
.map(seg => encodeURIComponent(seg))
|
|
197612
|
+
.join('/');
|
|
197613
|
+
const encodedToken = encodeURIComponent(token);
|
|
197614
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/upload/sign/${encodedBucketId}/${encodedObjectName}?token=${encodedToken}`;
|
|
197615
|
+
let fileSize = contentLength;
|
|
197616
|
+
if (localPath) {
|
|
197617
|
+
const resolvedPath = path_1.default.resolve(localPath);
|
|
197618
|
+
(0, utils_1.checkFullAccess)(resolvedPath, true);
|
|
197619
|
+
const stat = fs_1.default.statSync(resolvedPath);
|
|
197620
|
+
if (!stat.isFile()) {
|
|
197621
|
+
throw new error_1.CloudBaseError(`localPath 不是文件: ${localPath}`);
|
|
197622
|
+
}
|
|
197623
|
+
fileSize = stat.size;
|
|
197624
|
+
}
|
|
197625
|
+
else if (Buffer.isBuffer(body) && fileSize === undefined) {
|
|
197626
|
+
fileSize = body.length;
|
|
197627
|
+
}
|
|
197628
|
+
const finalContentType = this.resolveUploadContentType({
|
|
197629
|
+
contentType,
|
|
197630
|
+
localPath,
|
|
197631
|
+
objectName,
|
|
197632
|
+
body
|
|
197633
|
+
});
|
|
197634
|
+
const headers = {};
|
|
197635
|
+
if (finalContentType) {
|
|
197636
|
+
headers['Content-Type'] = finalContentType;
|
|
197637
|
+
}
|
|
197638
|
+
if (fileSize !== undefined) {
|
|
197639
|
+
headers['Content-Length'] = String(fileSize);
|
|
197640
|
+
}
|
|
197641
|
+
const reqBody = localPath ? fs_1.default.createReadStream(path_1.default.resolve(localPath)) : body;
|
|
197642
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197643
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197644
|
+
method: 'PUT',
|
|
197645
|
+
headers,
|
|
197646
|
+
body: reqBody
|
|
197647
|
+
}, proxy);
|
|
197648
|
+
const text = await res.text();
|
|
197649
|
+
let payload = null;
|
|
197650
|
+
if (text) {
|
|
197651
|
+
try {
|
|
197652
|
+
payload = JSON.parse(text);
|
|
197653
|
+
}
|
|
197654
|
+
catch (_a) {
|
|
197655
|
+
if (!res.ok) {
|
|
197656
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197657
|
+
}
|
|
197658
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
197659
|
+
}
|
|
197660
|
+
}
|
|
197661
|
+
if (!res.ok) {
|
|
197662
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197663
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '签名上传失败';
|
|
197664
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197665
|
+
code,
|
|
197666
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197667
|
+
});
|
|
197668
|
+
}
|
|
197669
|
+
if (!payload || typeof payload.Key !== 'string' || !payload.Key) {
|
|
197670
|
+
throw new error_1.CloudBaseError('签名上传成功但响应格式异常:缺少 Key');
|
|
197671
|
+
}
|
|
197672
|
+
return {
|
|
197673
|
+
Key: payload.Key
|
|
197674
|
+
};
|
|
197675
|
+
}
|
|
197676
|
+
/**
|
|
197677
|
+
* 通过 CloudBase HTTP API 下载对象(需认证)
|
|
197678
|
+
* GET/HEAD /v1/storages/object/authenticated/:bucketId/*objectName
|
|
197679
|
+
*/
|
|
197680
|
+
async downloadAuthenticatedObject(options) {
|
|
197681
|
+
const { bucketId, objectName, method = 'GET', download, ifNoneMatch, ifModifiedSince, range, accessToken, envId: envIdOverride } = options;
|
|
197682
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197683
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197684
|
+
}
|
|
197685
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197686
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197687
|
+
}
|
|
197688
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197689
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197690
|
+
}
|
|
197691
|
+
const normalizedMethod = String(method).toUpperCase();
|
|
197692
|
+
const allowedMethods = ['GET', 'HEAD'];
|
|
197693
|
+
if (!allowedMethods.includes(normalizedMethod)) {
|
|
197694
|
+
throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
|
|
197695
|
+
}
|
|
197696
|
+
const { env } = this.getStorageConfig();
|
|
197697
|
+
const envId = envIdOverride || env;
|
|
197698
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197699
|
+
const encodedObjectName = objectName
|
|
197700
|
+
.split('/')
|
|
197701
|
+
.map(seg => encodeURIComponent(seg))
|
|
197702
|
+
.join('/');
|
|
197703
|
+
let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/authenticated/${encodedBucketId}/${encodedObjectName}`;
|
|
197704
|
+
if (download !== undefined) {
|
|
197705
|
+
if (typeof download !== 'string') {
|
|
197706
|
+
throw new error_1.CloudBaseError('download 必须是字符串');
|
|
197707
|
+
}
|
|
197708
|
+
url += `?download=${encodeURIComponent(download)}`;
|
|
197709
|
+
}
|
|
197710
|
+
const headers = {
|
|
197711
|
+
Authorization: `Bearer ${accessToken}`
|
|
197712
|
+
};
|
|
197713
|
+
if (ifNoneMatch !== undefined) {
|
|
197714
|
+
if (typeof ifNoneMatch !== 'string') {
|
|
197715
|
+
throw new error_1.CloudBaseError('ifNoneMatch 必须是字符串');
|
|
197716
|
+
}
|
|
197717
|
+
headers['If-None-Match'] = ifNoneMatch;
|
|
197718
|
+
}
|
|
197719
|
+
if (ifModifiedSince !== undefined) {
|
|
197720
|
+
if (typeof ifModifiedSince !== 'string') {
|
|
197721
|
+
throw new error_1.CloudBaseError('ifModifiedSince 必须是字符串');
|
|
197722
|
+
}
|
|
197723
|
+
headers['If-Modified-Since'] = ifModifiedSince;
|
|
197724
|
+
}
|
|
197725
|
+
if (range !== undefined) {
|
|
197726
|
+
if (typeof range !== 'string') {
|
|
197727
|
+
throw new error_1.CloudBaseError('range 必须是字符串');
|
|
197728
|
+
}
|
|
197729
|
+
headers.Range = range;
|
|
197730
|
+
}
|
|
197731
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197732
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197733
|
+
method: normalizedMethod,
|
|
197734
|
+
headers
|
|
197735
|
+
}, proxy);
|
|
197736
|
+
if (!res.ok) {
|
|
197737
|
+
const text = await res.text();
|
|
197738
|
+
let payload = null;
|
|
197739
|
+
if (text) {
|
|
197740
|
+
try {
|
|
197741
|
+
payload = JSON.parse(text);
|
|
197742
|
+
}
|
|
197743
|
+
catch (_a) {
|
|
197744
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197745
|
+
}
|
|
197746
|
+
}
|
|
197747
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197748
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '下载对象失败';
|
|
197749
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197750
|
+
code,
|
|
197751
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197752
|
+
});
|
|
197753
|
+
}
|
|
197754
|
+
const responseHeaders = {};
|
|
197755
|
+
res.headers.forEach((value, key) => {
|
|
197756
|
+
responseHeaders[key] = value;
|
|
197757
|
+
});
|
|
197758
|
+
return {
|
|
197759
|
+
status: res.status,
|
|
197760
|
+
headers: responseHeaders,
|
|
197761
|
+
body: normalizedMethod === 'HEAD' ? null : res.body
|
|
197762
|
+
};
|
|
197763
|
+
}
|
|
197764
|
+
/**
|
|
197765
|
+
* 通过 CloudBase HTTP API 下载对象(可选认证)
|
|
197766
|
+
* GET/HEAD /v1/storages/object/:bucketId/*objectName
|
|
197767
|
+
*/
|
|
197768
|
+
async downloadObject(options) {
|
|
197769
|
+
const { bucketId, objectName, method = 'GET', download, ifNoneMatch, ifModifiedSince, range, accessToken, envId: envIdOverride } = options;
|
|
197770
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197771
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197772
|
+
}
|
|
197773
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197774
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197775
|
+
}
|
|
197776
|
+
if (accessToken !== undefined && typeof accessToken !== 'string') {
|
|
197777
|
+
throw new error_1.CloudBaseError('accessToken 必须是字符串');
|
|
197778
|
+
}
|
|
197779
|
+
const normalizedMethod = String(method).toUpperCase();
|
|
197780
|
+
const allowedMethods = ['GET', 'HEAD'];
|
|
197781
|
+
if (!allowedMethods.includes(normalizedMethod)) {
|
|
197782
|
+
throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
|
|
197783
|
+
}
|
|
197784
|
+
const { env } = this.getStorageConfig();
|
|
197785
|
+
const envId = envIdOverride || env;
|
|
197786
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197787
|
+
const encodedObjectName = objectName
|
|
197788
|
+
.split('/')
|
|
197789
|
+
.map(seg => encodeURIComponent(seg))
|
|
197790
|
+
.join('/');
|
|
197791
|
+
let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/${encodedBucketId}/${encodedObjectName}`;
|
|
197792
|
+
if (download !== undefined) {
|
|
197793
|
+
if (typeof download !== 'string') {
|
|
197794
|
+
throw new error_1.CloudBaseError('download 必须是字符串');
|
|
197795
|
+
}
|
|
197796
|
+
url += `?download=${encodeURIComponent(download)}`;
|
|
197797
|
+
}
|
|
197798
|
+
const headers = {};
|
|
197799
|
+
if (accessToken) {
|
|
197800
|
+
headers.Authorization = `Bearer ${accessToken}`;
|
|
197801
|
+
}
|
|
197802
|
+
if (ifNoneMatch !== undefined) {
|
|
197803
|
+
if (typeof ifNoneMatch !== 'string') {
|
|
197804
|
+
throw new error_1.CloudBaseError('ifNoneMatch 必须是字符串');
|
|
197805
|
+
}
|
|
197806
|
+
headers['If-None-Match'] = ifNoneMatch;
|
|
197807
|
+
}
|
|
197808
|
+
if (ifModifiedSince !== undefined) {
|
|
197809
|
+
if (typeof ifModifiedSince !== 'string') {
|
|
197810
|
+
throw new error_1.CloudBaseError('ifModifiedSince 必须是字符串');
|
|
197811
|
+
}
|
|
197812
|
+
headers['If-Modified-Since'] = ifModifiedSince;
|
|
197813
|
+
}
|
|
197814
|
+
if (range !== undefined) {
|
|
197815
|
+
if (typeof range !== 'string') {
|
|
197816
|
+
throw new error_1.CloudBaseError('range 必须是字符串');
|
|
197817
|
+
}
|
|
197818
|
+
headers.Range = range;
|
|
197819
|
+
}
|
|
197820
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197821
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197822
|
+
method: normalizedMethod,
|
|
197823
|
+
headers
|
|
197824
|
+
}, proxy);
|
|
197825
|
+
if (!res.ok) {
|
|
197826
|
+
const text = await res.text();
|
|
197827
|
+
let payload = null;
|
|
197828
|
+
if (text) {
|
|
197829
|
+
try {
|
|
197830
|
+
payload = JSON.parse(text);
|
|
197831
|
+
}
|
|
197832
|
+
catch (_a) {
|
|
197833
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197834
|
+
}
|
|
197835
|
+
}
|
|
197836
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197837
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '下载对象失败';
|
|
197838
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197839
|
+
code,
|
|
197840
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197841
|
+
});
|
|
197842
|
+
}
|
|
197843
|
+
const responseHeaders = {};
|
|
197844
|
+
res.headers.forEach((value, key) => {
|
|
197845
|
+
responseHeaders[key] = value;
|
|
197846
|
+
});
|
|
197847
|
+
return {
|
|
197848
|
+
status: res.status,
|
|
197849
|
+
headers: responseHeaders,
|
|
197850
|
+
body: normalizedMethod === 'HEAD' ? null : res.body
|
|
197851
|
+
};
|
|
197852
|
+
}
|
|
197853
|
+
/**
|
|
197854
|
+
* 通过 CloudBase HTTP API 下载公开对象(无需认证)
|
|
197855
|
+
* GET/HEAD /v1/storages/object/public/:bucketId/*objectName
|
|
197856
|
+
*/
|
|
197857
|
+
async downloadPublicObject(options) {
|
|
197858
|
+
const { bucketId, objectName, method = 'GET', download, envId: envIdOverride } = options;
|
|
197859
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197860
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197861
|
+
}
|
|
197862
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197863
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197864
|
+
}
|
|
197865
|
+
const normalizedMethod = String(method).toUpperCase();
|
|
197866
|
+
const allowedMethods = ['GET', 'HEAD'];
|
|
197867
|
+
if (!allowedMethods.includes(normalizedMethod)) {
|
|
197868
|
+
throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
|
|
197869
|
+
}
|
|
197870
|
+
const { env } = this.getStorageConfig();
|
|
197871
|
+
const envId = envIdOverride || env;
|
|
197872
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197873
|
+
const encodedObjectName = objectName
|
|
197874
|
+
.split('/')
|
|
197875
|
+
.map(seg => encodeURIComponent(seg))
|
|
197876
|
+
.join('/');
|
|
197877
|
+
let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/public/${encodedBucketId}/${encodedObjectName}`;
|
|
197878
|
+
if (download !== undefined) {
|
|
197879
|
+
if (typeof download !== 'string') {
|
|
197880
|
+
throw new error_1.CloudBaseError('download 必须是字符串');
|
|
197881
|
+
}
|
|
197882
|
+
url += `?download=${encodeURIComponent(download)}`;
|
|
197883
|
+
}
|
|
197884
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197885
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197886
|
+
method: normalizedMethod
|
|
197887
|
+
}, proxy);
|
|
197888
|
+
if (!res.ok) {
|
|
197889
|
+
const text = await res.text();
|
|
197890
|
+
let payload = null;
|
|
197891
|
+
if (text) {
|
|
197892
|
+
try {
|
|
197893
|
+
payload = JSON.parse(text);
|
|
197894
|
+
}
|
|
197895
|
+
catch (_a) {
|
|
197896
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197897
|
+
}
|
|
197898
|
+
}
|
|
197899
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197900
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '下载公开对象失败';
|
|
197901
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197902
|
+
code,
|
|
197903
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197904
|
+
});
|
|
197905
|
+
}
|
|
197906
|
+
const responseHeaders = {};
|
|
197907
|
+
res.headers.forEach((value, key) => {
|
|
197908
|
+
responseHeaders[key] = value;
|
|
197909
|
+
});
|
|
197910
|
+
return {
|
|
197911
|
+
status: res.status,
|
|
197912
|
+
headers: responseHeaders,
|
|
197913
|
+
body: normalizedMethod === 'HEAD' ? null : res.body
|
|
197914
|
+
};
|
|
197915
|
+
}
|
|
197916
|
+
/**
|
|
197917
|
+
* 通过 CloudBase HTTP API 使用签名 URL 下载对象(无需 Authorization)
|
|
197918
|
+
* GET/HEAD /v1/storages/object/sign/:bucketId/*objectName?token=xxx
|
|
197919
|
+
*/
|
|
197920
|
+
async downloadObjectBySign(options) {
|
|
197921
|
+
const { bucketId, objectName, token, method = 'GET', download, envId: envIdOverride } = options;
|
|
197922
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197923
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197924
|
+
}
|
|
197925
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197926
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197927
|
+
}
|
|
197928
|
+
if (!token || typeof token !== 'string') {
|
|
197929
|
+
throw new error_1.CloudBaseError('token 必须是非空字符串');
|
|
197930
|
+
}
|
|
197931
|
+
const normalizedMethod = String(method).toUpperCase();
|
|
197932
|
+
const allowedMethods = ['GET', 'HEAD'];
|
|
197933
|
+
if (!allowedMethods.includes(normalizedMethod)) {
|
|
197934
|
+
throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
|
|
197935
|
+
}
|
|
197936
|
+
const { env } = this.getStorageConfig();
|
|
197937
|
+
const envId = envIdOverride || env;
|
|
197938
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
197939
|
+
const encodedObjectName = objectName
|
|
197940
|
+
.split('/')
|
|
197941
|
+
.map(seg => encodeURIComponent(seg))
|
|
197942
|
+
.join('/');
|
|
197943
|
+
let url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/sign/${encodedBucketId}/${encodedObjectName}?token=${encodeURIComponent(token)}`;
|
|
197944
|
+
if (download !== undefined) {
|
|
197945
|
+
if (typeof download !== 'string') {
|
|
197946
|
+
throw new error_1.CloudBaseError('download 必须是字符串');
|
|
197947
|
+
}
|
|
197948
|
+
url += `&download=${encodeURIComponent(download)}`;
|
|
197949
|
+
}
|
|
197950
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
197951
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
197952
|
+
method: normalizedMethod
|
|
197953
|
+
}, proxy);
|
|
197954
|
+
if (!res.ok) {
|
|
197955
|
+
const text = await res.text();
|
|
197956
|
+
let payload = null;
|
|
197957
|
+
if (text) {
|
|
197958
|
+
try {
|
|
197959
|
+
payload = JSON.parse(text);
|
|
197960
|
+
}
|
|
197961
|
+
catch (_a) {
|
|
197962
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
197963
|
+
}
|
|
197964
|
+
}
|
|
197965
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
197966
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '通过签名 URL 下载对象失败';
|
|
197967
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
197968
|
+
code,
|
|
197969
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
197970
|
+
});
|
|
197971
|
+
}
|
|
197972
|
+
const responseHeaders = {};
|
|
197973
|
+
res.headers.forEach((value, key) => {
|
|
197974
|
+
responseHeaders[key] = value;
|
|
197975
|
+
});
|
|
197976
|
+
return {
|
|
197977
|
+
status: res.status,
|
|
197978
|
+
headers: responseHeaders,
|
|
197979
|
+
body: normalizedMethod === 'HEAD' ? null : res.body
|
|
197980
|
+
};
|
|
197981
|
+
}
|
|
197982
|
+
/**
|
|
197983
|
+
* 通过 CloudBase HTTP API 获取对象元信息(需认证)
|
|
197984
|
+
* GET/HEAD /v1/storages/object/info/authenticated/:bucketId/*objectName
|
|
197985
|
+
*/
|
|
197986
|
+
async getObjectInfoAuthenticated(options) {
|
|
197987
|
+
const { bucketId, objectName, method = 'GET', accessToken, envId: envIdOverride } = options;
|
|
197988
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
197989
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
197990
|
+
}
|
|
197991
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
197992
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
197993
|
+
}
|
|
197994
|
+
if (!accessToken || typeof accessToken !== 'string') {
|
|
197995
|
+
throw new error_1.CloudBaseError('accessToken 必须是非空字符串');
|
|
197996
|
+
}
|
|
197997
|
+
const normalizedMethod = String(method).toUpperCase();
|
|
197998
|
+
const allowedMethods = ['GET', 'HEAD'];
|
|
197999
|
+
if (!allowedMethods.includes(normalizedMethod)) {
|
|
198000
|
+
throw new error_1.CloudBaseError('method 仅支持 GET 或 HEAD');
|
|
198001
|
+
}
|
|
198002
|
+
const { env } = this.getStorageConfig();
|
|
198003
|
+
const envId = envIdOverride || env;
|
|
198004
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
198005
|
+
const encodedObjectName = objectName
|
|
198006
|
+
.split('/')
|
|
198007
|
+
.map(seg => encodeURIComponent(seg))
|
|
198008
|
+
.join('/');
|
|
198009
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/info/authenticated/${encodedBucketId}/${encodedObjectName}`;
|
|
198010
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
198011
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
198012
|
+
method: normalizedMethod,
|
|
198013
|
+
headers: {
|
|
198014
|
+
Authorization: `Bearer ${accessToken}`
|
|
198015
|
+
}
|
|
198016
|
+
}, proxy);
|
|
198017
|
+
if (!res.ok) {
|
|
198018
|
+
const text = await res.text();
|
|
198019
|
+
let payload = null;
|
|
198020
|
+
if (text) {
|
|
198021
|
+
try {
|
|
198022
|
+
payload = JSON.parse(text);
|
|
198023
|
+
}
|
|
198024
|
+
catch (_a) {
|
|
198025
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
198026
|
+
}
|
|
198027
|
+
}
|
|
198028
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
198029
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '获取对象元信息失败';
|
|
198030
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
198031
|
+
code,
|
|
198032
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
198033
|
+
});
|
|
198034
|
+
}
|
|
198035
|
+
const responseHeaders = {};
|
|
198036
|
+
res.headers.forEach((value, key) => {
|
|
198037
|
+
responseHeaders[key] = value;
|
|
198038
|
+
});
|
|
198039
|
+
if (normalizedMethod === 'HEAD') {
|
|
198040
|
+
return {
|
|
198041
|
+
status: res.status,
|
|
198042
|
+
headers: responseHeaders,
|
|
198043
|
+
body: null
|
|
198044
|
+
};
|
|
198045
|
+
}
|
|
198046
|
+
const text = await res.text();
|
|
198047
|
+
let payload = null;
|
|
198048
|
+
if (text) {
|
|
198049
|
+
try {
|
|
198050
|
+
payload = JSON.parse(text);
|
|
198051
|
+
}
|
|
198052
|
+
catch (_b) {
|
|
198053
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
198054
|
+
}
|
|
198055
|
+
}
|
|
198056
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
198057
|
+
throw new error_1.CloudBaseError('获取对象元信息成功但响应格式异常:期望 JSON 对象');
|
|
198058
|
+
}
|
|
198059
|
+
return {
|
|
198060
|
+
status: res.status,
|
|
198061
|
+
headers: responseHeaders,
|
|
198062
|
+
body: payload
|
|
198063
|
+
};
|
|
198064
|
+
}
|
|
198065
|
+
/**
|
|
198066
|
+
* 通过 CloudBase HTTP API 获取公开对象元信息(无需认证)
|
|
198067
|
+
* GET /v1/storages/object/info/public/:bucketId/*objectName
|
|
198068
|
+
*/
|
|
198069
|
+
async getObjectInfoPublic(options) {
|
|
198070
|
+
const { bucketId, objectName, envId: envIdOverride } = options;
|
|
198071
|
+
if (!bucketId || typeof bucketId !== 'string') {
|
|
198072
|
+
throw new error_1.CloudBaseError('bucketId 必须是非空字符串');
|
|
198073
|
+
}
|
|
198074
|
+
if (!objectName || typeof objectName !== 'string') {
|
|
198075
|
+
throw new error_1.CloudBaseError('objectName 必须是非空字符串');
|
|
198076
|
+
}
|
|
198077
|
+
const { env } = this.getStorageConfig();
|
|
198078
|
+
const envId = envIdOverride || env;
|
|
198079
|
+
const encodedBucketId = encodeURIComponent(bucketId);
|
|
198080
|
+
const encodedObjectName = objectName
|
|
198081
|
+
.split('/')
|
|
198082
|
+
.map(seg => encodeURIComponent(seg))
|
|
198083
|
+
.join('/');
|
|
198084
|
+
const url = `https://${envId}.api.tcloudbasegateway.com/v1/storages/object/info/public/${encodedBucketId}/${encodedObjectName}`;
|
|
198085
|
+
const { proxy } = this.environment.getAuthConfig();
|
|
198086
|
+
const res = await (0, utils_1.fetchStream)(url, {
|
|
198087
|
+
method: 'GET'
|
|
198088
|
+
}, proxy);
|
|
198089
|
+
if (!res.ok) {
|
|
198090
|
+
const text = await res.text();
|
|
198091
|
+
let payload = null;
|
|
198092
|
+
if (text) {
|
|
198093
|
+
try {
|
|
198094
|
+
payload = JSON.parse(text);
|
|
198095
|
+
}
|
|
198096
|
+
catch (_a) {
|
|
198097
|
+
throw new error_1.CloudBaseError(`HTTP_${res.status}: ${text}`);
|
|
198098
|
+
}
|
|
198099
|
+
}
|
|
198100
|
+
const code = (payload === null || payload === void 0 ? void 0 : payload.Code) || (payload === null || payload === void 0 ? void 0 : payload.code) || `HTTP_${res.status}`;
|
|
198101
|
+
const message = (payload === null || payload === void 0 ? void 0 : payload.Message) || (payload === null || payload === void 0 ? void 0 : payload.message) || res.statusText || '获取公开对象元信息失败';
|
|
198102
|
+
throw new error_1.CloudBaseError(`${code}: ${message}`, {
|
|
198103
|
+
code,
|
|
198104
|
+
requestId: (payload === null || payload === void 0 ? void 0 : payload.RequestId) || (payload === null || payload === void 0 ? void 0 : payload.requestId)
|
|
198105
|
+
});
|
|
198106
|
+
}
|
|
198107
|
+
const responseHeaders = {};
|
|
198108
|
+
res.headers.forEach((value, key) => {
|
|
198109
|
+
responseHeaders[key] = value;
|
|
198110
|
+
});
|
|
198111
|
+
const text = await res.text();
|
|
198112
|
+
let payload = null;
|
|
198113
|
+
if (text) {
|
|
198114
|
+
try {
|
|
198115
|
+
payload = JSON.parse(text);
|
|
198116
|
+
}
|
|
198117
|
+
catch (_b) {
|
|
198118
|
+
throw new error_1.CloudBaseError(`响应不是合法 JSON: ${text}`);
|
|
198119
|
+
}
|
|
198120
|
+
}
|
|
198121
|
+
if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
|
|
198122
|
+
throw new error_1.CloudBaseError('获取公开对象元信息成功但响应格式异常:期望 JSON 对象');
|
|
198123
|
+
}
|
|
198124
|
+
return {
|
|
198125
|
+
status: res.status,
|
|
198126
|
+
headers: responseHeaders,
|
|
198127
|
+
body: payload
|
|
198128
|
+
};
|
|
198129
|
+
}
|
|
196325
198130
|
/**
|
|
196326
198131
|
* 获取 COS 配置
|
|
196327
198132
|
*/
|
|
@@ -196469,6 +198274,87 @@ class StorageService {
|
|
|
196469
198274
|
res.map(item => /Error/gi.test(Object.prototype.toString.call(item)) && resultErrorArr.push(item));
|
|
196470
198275
|
return resultErrorArr;
|
|
196471
198276
|
}
|
|
198277
|
+
resolveUploadContentType(params) {
|
|
198278
|
+
const { contentType, localPath, objectName, body } = params;
|
|
198279
|
+
// 0. 用户显式指定优先
|
|
198280
|
+
const trimmedContentType = contentType === null || contentType === void 0 ? void 0 : contentType.trim();
|
|
198281
|
+
if (trimmedContentType) {
|
|
198282
|
+
return this.assertValidContentType(trimmedContentType);
|
|
198283
|
+
}
|
|
198284
|
+
// 1. 扩展名推断(优先)
|
|
198285
|
+
const byExt = this.inferMimeByExtension(localPath || objectName);
|
|
198286
|
+
if (byExt)
|
|
198287
|
+
return byExt;
|
|
198288
|
+
// 2. magic bytes 二次识别
|
|
198289
|
+
const byMagic = this.inferMimeByMagicBytes(localPath, body);
|
|
198290
|
+
if (byMagic)
|
|
198291
|
+
return byMagic;
|
|
198292
|
+
return undefined;
|
|
198293
|
+
}
|
|
198294
|
+
inferMimeByExtension(filePathOrName) {
|
|
198295
|
+
if (!filePathOrName)
|
|
198296
|
+
return undefined;
|
|
198297
|
+
const result = mime_types_1.default.lookup(filePathOrName);
|
|
198298
|
+
return typeof result === 'string' ? result : undefined;
|
|
198299
|
+
}
|
|
198300
|
+
inferMimeByMagicBytes(localPath, body) {
|
|
198301
|
+
let head;
|
|
198302
|
+
try {
|
|
198303
|
+
if (localPath) {
|
|
198304
|
+
const fd = fs_1.default.openSync(path_1.default.resolve(localPath), 'r');
|
|
198305
|
+
try {
|
|
198306
|
+
const buf = Buffer.alloc(512);
|
|
198307
|
+
const n = fs_1.default.readSync(fd, buf, 0, 512, 0);
|
|
198308
|
+
head = buf.slice(0, n);
|
|
198309
|
+
}
|
|
198310
|
+
finally {
|
|
198311
|
+
fs_1.default.closeSync(fd);
|
|
198312
|
+
}
|
|
198313
|
+
}
|
|
198314
|
+
else if (Buffer.isBuffer(body)) {
|
|
198315
|
+
head = body.slice(0, 512);
|
|
198316
|
+
}
|
|
198317
|
+
}
|
|
198318
|
+
catch (_a) {
|
|
198319
|
+
return undefined;
|
|
198320
|
+
}
|
|
198321
|
+
if (!head || head.length === 0)
|
|
198322
|
+
return undefined;
|
|
198323
|
+
const startsWith = (sig) => head.length >= sig.length && sig.every((b, i) => head[i] === b);
|
|
198324
|
+
if (startsWith([0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]))
|
|
198325
|
+
return 'image/png';
|
|
198326
|
+
if (startsWith([0xFF, 0xD8, 0xFF]))
|
|
198327
|
+
return 'image/jpeg';
|
|
198328
|
+
if (head.slice(0, 6).toString('ascii') === 'GIF87a' || head.slice(0, 6).toString('ascii') === 'GIF89a')
|
|
198329
|
+
return 'image/gif';
|
|
198330
|
+
if (head.slice(0, 4).toString('ascii') === 'RIFF' && head.slice(8, 12).toString('ascii') === 'WEBP')
|
|
198331
|
+
return 'image/webp';
|
|
198332
|
+
if (head.slice(0, 4).toString('ascii') === '%PDF')
|
|
198333
|
+
return 'application/pdf';
|
|
198334
|
+
if (startsWith([0x50, 0x4B, 0x03, 0x04]))
|
|
198335
|
+
return 'application/zip';
|
|
198336
|
+
if (startsWith([0x1F, 0x8B]))
|
|
198337
|
+
return 'application/gzip';
|
|
198338
|
+
if (head.length >= 262 && head.slice(257, 262).toString('ascii') === 'ustar')
|
|
198339
|
+
return 'application/x-tar';
|
|
198340
|
+
return undefined;
|
|
198341
|
+
}
|
|
198342
|
+
assertValidContentType(input) {
|
|
198343
|
+
const ct = input.trim();
|
|
198344
|
+
if (!ct)
|
|
198345
|
+
throw new error_1.CloudBaseError('contentType 不能为空');
|
|
198346
|
+
// 防 header 注入 / 控制字符
|
|
198347
|
+
if (/[\u0000-\u001F\u007F]/.test(ct)) {
|
|
198348
|
+
throw new error_1.CloudBaseError('contentType 非法:包含控制字符');
|
|
198349
|
+
}
|
|
198350
|
+
// 只校验主类型(; 后参数放宽)
|
|
198351
|
+
const base = ct.split(';', 1)[0].trim();
|
|
198352
|
+
const typeSubtypeRe = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+\/[!#$%&'*+.^_`|~0-9A-Za-z-]+$/;
|
|
198353
|
+
if (!typeSubtypeRe.test(base)) {
|
|
198354
|
+
throw new error_1.CloudBaseError('contentType 非法:主类型格式不正确');
|
|
198355
|
+
}
|
|
198356
|
+
return ct;
|
|
198357
|
+
}
|
|
196472
198358
|
}
|
|
196473
198359
|
exports.StorageService = StorageService;
|
|
196474
198360
|
__decorate([
|
|
@@ -196558,6 +198444,54 @@ __decorate([
|
|
|
196558
198444
|
__decorate([
|
|
196559
198445
|
(0, utils_1.preLazy)()
|
|
196560
198446
|
], StorageService.prototype, "searchFiles", null);
|
|
198447
|
+
__decorate([
|
|
198448
|
+
(0, utils_1.preLazy)()
|
|
198449
|
+
], StorageService.prototype, "uploadObject", null);
|
|
198450
|
+
__decorate([
|
|
198451
|
+
(0, utils_1.preLazy)()
|
|
198452
|
+
], StorageService.prototype, "deleteObject", null);
|
|
198453
|
+
__decorate([
|
|
198454
|
+
(0, utils_1.preLazy)()
|
|
198455
|
+
], StorageService.prototype, "deleteObjects", null);
|
|
198456
|
+
__decorate([
|
|
198457
|
+
(0, utils_1.preLazy)()
|
|
198458
|
+
], StorageService.prototype, "copyObject", null);
|
|
198459
|
+
__decorate([
|
|
198460
|
+
(0, utils_1.preLazy)()
|
|
198461
|
+
], StorageService.prototype, "moveObject", null);
|
|
198462
|
+
__decorate([
|
|
198463
|
+
(0, utils_1.preLazy)()
|
|
198464
|
+
], StorageService.prototype, "listObjects", null);
|
|
198465
|
+
__decorate([
|
|
198466
|
+
(0, utils_1.preLazy)()
|
|
198467
|
+
], StorageService.prototype, "signObject", null);
|
|
198468
|
+
__decorate([
|
|
198469
|
+
(0, utils_1.preLazy)()
|
|
198470
|
+
], StorageService.prototype, "signObjects", null);
|
|
198471
|
+
__decorate([
|
|
198472
|
+
(0, utils_1.preLazy)()
|
|
198473
|
+
], StorageService.prototype, "signUploadObject", null);
|
|
198474
|
+
__decorate([
|
|
198475
|
+
(0, utils_1.preLazy)()
|
|
198476
|
+
], StorageService.prototype, "uploadObjectBySign", null);
|
|
198477
|
+
__decorate([
|
|
198478
|
+
(0, utils_1.preLazy)()
|
|
198479
|
+
], StorageService.prototype, "downloadAuthenticatedObject", null);
|
|
198480
|
+
__decorate([
|
|
198481
|
+
(0, utils_1.preLazy)()
|
|
198482
|
+
], StorageService.prototype, "downloadObject", null);
|
|
198483
|
+
__decorate([
|
|
198484
|
+
(0, utils_1.preLazy)()
|
|
198485
|
+
], StorageService.prototype, "downloadPublicObject", null);
|
|
198486
|
+
__decorate([
|
|
198487
|
+
(0, utils_1.preLazy)()
|
|
198488
|
+
], StorageService.prototype, "downloadObjectBySign", null);
|
|
198489
|
+
__decorate([
|
|
198490
|
+
(0, utils_1.preLazy)()
|
|
198491
|
+
], StorageService.prototype, "getObjectInfoAuthenticated", null);
|
|
198492
|
+
__decorate([
|
|
198493
|
+
(0, utils_1.preLazy)()
|
|
198494
|
+
], StorageService.prototype, "getObjectInfoPublic", null);
|
|
196561
198495
|
|
|
196562
198496
|
|
|
196563
198497
|
/***/ }),
|
|
@@ -201363,7 +203297,11 @@ checkIndex: 检查指定索引是否存在`),
|
|
|
201363
203297
|
]).describe(`createCollection: 创建集合
|
|
201364
203298
|
updateCollection: 更新集合配置;添加索引请传 updateOptions.CreateIndexes,删除索引请传 updateOptions.DropIndexes
|
|
201365
203299
|
deleteCollection: 删除集合`),
|
|
201366
|
-
collectionName: zod_1.z
|
|
203300
|
+
collectionName: zod_1.z
|
|
203301
|
+
.string()
|
|
203302
|
+
.trim()
|
|
203303
|
+
.min(1, "collectionName 不能为空")
|
|
203304
|
+
.describe("集合名称"),
|
|
201367
203305
|
updateOptions: zod_1.z
|
|
201368
203306
|
.object({
|
|
201369
203307
|
CreateIndexes: zod_1.z
|
|
@@ -201487,31 +203425,40 @@ deleteCollection: 删除集合`),
|
|
|
201487
203425
|
};
|
|
201488
203426
|
}
|
|
201489
203427
|
if (action === "deleteCollection") {
|
|
201490
|
-
|
|
201491
|
-
|
|
201492
|
-
|
|
201493
|
-
|
|
201494
|
-
|
|
201495
|
-
|
|
201496
|
-
});
|
|
201497
|
-
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
|
|
201498
|
-
const body = withCollectionName(collectionName, {
|
|
201499
|
-
success: true,
|
|
201500
|
-
requestId: result.RequestId,
|
|
201501
|
-
action,
|
|
201502
|
-
message: result.Exists === false ? "集合不存在" : "云开发数据库集合删除成功",
|
|
201503
|
-
});
|
|
201504
|
-
if (result.Exists === false) {
|
|
201505
|
-
body.exists = false;
|
|
201506
|
-
}
|
|
201507
|
-
return {
|
|
201508
|
-
content: [
|
|
201509
|
-
{
|
|
201510
|
-
type: "text",
|
|
201511
|
-
text: JSON.stringify(body, null, 2),
|
|
203428
|
+
try {
|
|
203429
|
+
const result = await cloudbase.commonService("tcb", "2018-06-08").call({
|
|
203430
|
+
Action: "DeleteTable",
|
|
203431
|
+
Param: {
|
|
203432
|
+
EnvId: await (0, cloudbase_manager_js_1.getEnvId)(server.cloudBaseOptions),
|
|
203433
|
+
TableName: collectionName,
|
|
201512
203434
|
},
|
|
201513
|
-
|
|
201514
|
-
|
|
203435
|
+
});
|
|
203436
|
+
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
|
|
203437
|
+
const body = withCollectionName(collectionName, {
|
|
203438
|
+
success: true,
|
|
203439
|
+
requestId: result.RequestId,
|
|
203440
|
+
action,
|
|
203441
|
+
message: result.Exists === false ? "集合不存在" : "云开发数据库集合删除成功",
|
|
203442
|
+
});
|
|
203443
|
+
if (result.Exists === false) {
|
|
203444
|
+
body.exists = false;
|
|
203445
|
+
}
|
|
203446
|
+
return {
|
|
203447
|
+
content: [
|
|
203448
|
+
{
|
|
203449
|
+
type: "text",
|
|
203450
|
+
text: JSON.stringify(body, null, 2),
|
|
203451
|
+
},
|
|
203452
|
+
],
|
|
203453
|
+
};
|
|
203454
|
+
}
|
|
203455
|
+
catch (error) {
|
|
203456
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
203457
|
+
if (/parameter invalid|invalid parameter|param(eter)?\s+invalid/i.test(message)) {
|
|
203458
|
+
throw new Error(`deleteCollection 参数校验失败,请确认 collectionName 合法且已存在。当前 collectionName=\"${collectionName}\"。原始错误:${message}`);
|
|
203459
|
+
}
|
|
203460
|
+
throw error;
|
|
203461
|
+
}
|
|
201515
203462
|
}
|
|
201516
203463
|
throw new Error(`不支持的操作类型: ${action}`);
|
|
201517
203464
|
});
|
|
@@ -206833,10 +208780,11 @@ function registerPermissionTools(server) {
|
|
|
206833
208780
|
roleId: zod_1.z.string().optional(),
|
|
206834
208781
|
roleIds: zod_1.z.array(zod_1.z.string()).optional(),
|
|
206835
208782
|
roleName: zod_1.z.string().optional(),
|
|
206836
|
-
roleIdentity: zod_1.z.string().optional(),
|
|
208783
|
+
roleIdentity: zod_1.z.string().optional().describe("角色标识符(字母/数字/_-:@.),action=createRole 时必填,用于程序化引用角色"),
|
|
206837
208784
|
description: zod_1.z.string().optional(),
|
|
206838
208785
|
memberUids: zod_1.z.array(zod_1.z.string()).optional(),
|
|
206839
208786
|
policies: zod_1.z.array(zod_1.z.record(zod_1.z.any())).optional(),
|
|
208787
|
+
policyIds: zod_1.z.array(zod_1.z.string()).optional().describe("策略 ID 列表(当前不支持直接按 ID 绑定,请改传 policies 详情对象)"),
|
|
206840
208788
|
uid: zod_1.z.string().optional(),
|
|
206841
208789
|
uids: zod_1.z.array(zod_1.z.string()).optional(),
|
|
206842
208790
|
username: zod_1.z.string().optional(),
|
|
@@ -206850,7 +208798,7 @@ function registerPermissionTools(server) {
|
|
|
206850
208798
|
openWorldHint: true,
|
|
206851
208799
|
category: "permissions",
|
|
206852
208800
|
},
|
|
206853
|
-
}, async ({ action, resourceType, resourceId, permission, securityRule, roleId, roleIds, roleName, roleIdentity, description, memberUids, policies, uid, uids, username, password, userStatus, }) => withEnvelope(async () => {
|
|
208801
|
+
}, async ({ action, resourceType, resourceId, permission, securityRule, roleId, roleIds, roleName, roleIdentity, description, memberUids, policies, policyIds, uid, uids, username, password, userStatus, }) => withEnvelope(async () => {
|
|
206854
208802
|
const envId = await (0, cloudbase_manager_js_1.getEnvId)(cloudBaseOptions);
|
|
206855
208803
|
const cloudbase = await getManager();
|
|
206856
208804
|
const normalizedPolicies = normalizeRecordArray(policies, "policies");
|
|
@@ -206910,6 +208858,14 @@ function registerPermissionTools(server) {
|
|
|
206910
208858
|
if (!roleId) {
|
|
206911
208859
|
throw new Error(`action=${action} 时必须提供 roleId`);
|
|
206912
208860
|
}
|
|
208861
|
+
if (action === "addRolePolicies" || action === "removeRolePolicies") {
|
|
208862
|
+
if (policyIds?.length) {
|
|
208863
|
+
throw new Error(`action=${action} 暂不支持 policyIds。请改传 policies,且每项至少包含 ResourceType 和 Resource。`);
|
|
208864
|
+
}
|
|
208865
|
+
if (!normalizedPolicies?.length) {
|
|
208866
|
+
throw new Error(`action=${action} 时必须提供 policies,且每项至少包含 ResourceType 和 Resource。`);
|
|
208867
|
+
}
|
|
208868
|
+
}
|
|
206913
208869
|
const result = await cloudbase.permission.modifyRole({
|
|
206914
208870
|
roleId,
|
|
206915
208871
|
...(action === "updateRole"
|
|
@@ -207597,7 +209553,7 @@ function registerSetupTools(server) {
|
|
|
207597
209553
|
server.registerTool("downloadTemplate", {
|
|
207598
209554
|
title: "下载项目模板",
|
|
207599
209555
|
description: `自动下载并部署CloudBase项目模板。
|
|
207600
|
-
**Note**: Call this tool when the user requests to create a new project using a CloudBase template.\n\n支持的模板:\n- react: React + CloudBase 全栈应用模板\n- vue: Vue + CloudBase 全栈应用模板\n- miniprogram: 微信小程序 + 云开发模板 \n- uniapp: UniApp + CloudBase 跨端应用模板\n- rules: 只包含AI编辑器配置文件(包含Cursor、WindSurf、CodeBuddy等所有主流编辑器配置),适合在已有项目中补充AI编辑器配置\n\n支持的IDE类型:\n- all: 下载所有IDE配置\n- cursor: Cursor AI编辑器\n- 其他IDE类型见下方列表\n\n注意:如果未传入 ide 参数且无法从环境变量检测到 IDE,将提示错误并要求传入 ide 参数\n- windsurf: WindSurf AI编辑器\n- codebuddy: CodeBuddy AI编辑器\n- claude-code: Claude Code AI编辑器\n- cline: Cline AI编辑器\n- gemini-cli: Gemini CLI\n- opencode: OpenCode AI编辑器\n- qwen-code: 通义灵码\n- baidu-comate: 百度Comate\n- openai-codex-cli: OpenAI Codex CLI\n- augment-code: Augment Code\n- github-copilot: GitHub Copilot\n- roocode: RooCode AI编辑器\n- tongyi-lingma: 通义灵码\n- trae: Trae AI编辑器\n- qoder: Qoder AI编辑器\n- antigravity: Google Antigravity AI编辑器\n- vscode: Visual Studio Code\n- kiro: Kiro AI编辑器\n- aider: Aider AI编辑器\n\n特别说明:\n- rules 模板会自动包含当前 mcp 版本号信息(版本号:${ true ? "2.
|
|
209556
|
+
**Note**: Call this tool when the user requests to create a new project using a CloudBase template.\n\n支持的模板:\n- react: React + CloudBase 全栈应用模板\n- vue: Vue + CloudBase 全栈应用模板\n- miniprogram: 微信小程序 + 云开发模板 \n- uniapp: UniApp + CloudBase 跨端应用模板\n- rules: 只包含AI编辑器配置文件(包含Cursor、WindSurf、CodeBuddy等所有主流编辑器配置),适合在已有项目中补充AI编辑器配置\n\n支持的IDE类型:\n- all: 下载所有IDE配置\n- cursor: Cursor AI编辑器\n- 其他IDE类型见下方列表\n\n注意:如果未传入 ide 参数且无法从环境变量检测到 IDE,将提示错误并要求传入 ide 参数\n- windsurf: WindSurf AI编辑器\n- codebuddy: CodeBuddy AI编辑器\n- claude-code: Claude Code AI编辑器\n- cline: Cline AI编辑器\n- gemini-cli: Gemini CLI\n- opencode: OpenCode AI编辑器\n- qwen-code: 通义灵码\n- baidu-comate: 百度Comate\n- openai-codex-cli: OpenAI Codex CLI\n- augment-code: Augment Code\n- github-copilot: GitHub Copilot\n- roocode: RooCode AI编辑器\n- tongyi-lingma: 通义灵码\n- trae: Trae AI编辑器\n- qoder: Qoder AI编辑器\n- antigravity: Google Antigravity AI编辑器\n- vscode: Visual Studio Code\n- kiro: Kiro AI编辑器\n- aider: Aider AI编辑器\n\n特别说明:\n- rules 模板会自动包含当前 mcp 版本号信息(版本号:${ true ? "2.20.0-beta.0" : 0}),便于后续维护和版本追踪\n- 下载 rules 模板时,如果项目中已存在 README.md 文件,系统会自动保护该文件不被覆盖(除非设置 overwrite=true)`,
|
|
207601
209557
|
inputSchema: {
|
|
207602
209558
|
template: zod_1.z
|
|
207603
209559
|
.enum(["react", "vue", "miniprogram", "uniapp", "rules"])
|
|
@@ -208993,8 +210949,21 @@ function updateAuthProgressState(partial) {
|
|
|
208993
210949
|
return getAuthProgressStateSync();
|
|
208994
210950
|
}
|
|
208995
210951
|
function normalizeLoginStateFromEnvVars(options) {
|
|
210952
|
+
if (options?.ignoreEnvVars) {
|
|
210953
|
+
return null;
|
|
210954
|
+
}
|
|
210955
|
+
// 优先检查 CloudBase API Key(优先级高于 TENCENTCLOUD_*)
|
|
210956
|
+
const { CLOUDBASE_API_KEY, CLOUDBASE_ENV_ID: CLOUDBASE_ENV, } = process.env;
|
|
210957
|
+
if (CLOUDBASE_API_KEY && CLOUDBASE_ENV) {
|
|
210958
|
+
return {
|
|
210959
|
+
_type: 'api_key',
|
|
210960
|
+
apiKey: CLOUDBASE_API_KEY,
|
|
210961
|
+
envId: CLOUDBASE_ENV,
|
|
210962
|
+
};
|
|
210963
|
+
}
|
|
210964
|
+
// 然后检查腾讯云密钥环境变量
|
|
208996
210965
|
const { TENCENTCLOUD_SECRETID, TENCENTCLOUD_SECRETKEY, TENCENTCLOUD_SESSIONTOKEN, } = process.env;
|
|
208997
|
-
if (
|
|
210966
|
+
if (TENCENTCLOUD_SECRETID && TENCENTCLOUD_SECRETKEY) {
|
|
208998
210967
|
return {
|
|
208999
210968
|
secretId: TENCENTCLOUD_SECRETID,
|
|
209000
210969
|
secretKey: TENCENTCLOUD_SECRETKEY,
|
|
@@ -209137,13 +211106,30 @@ function resetAuthProgressState() {
|
|
|
209137
211106
|
async function peekLoginState(options) {
|
|
209138
211107
|
const envVarLoginState = normalizeLoginStateFromEnvVars(options);
|
|
209139
211108
|
if (envVarLoginState) {
|
|
211109
|
+
// API Key 模式:需要先用 API Key 换取临时密钥
|
|
211110
|
+
if ('_type' in envVarLoginState && envVarLoginState._type === 'api_key') {
|
|
211111
|
+
(0, logger_js_1.debug)("peekLoginState: detected CLOUDBASE_API_KEY env var");
|
|
211112
|
+
try {
|
|
211113
|
+
// 优先使用 IDE 注入的工作目录,其次 process.cwd()
|
|
211114
|
+
const projectCwd = process.env.WORKSPACE_FOLDER_PATHS || process.cwd();
|
|
211115
|
+
const credential = await auth.loginByApiKey(envVarLoginState.apiKey, envVarLoginState.envId, { cwd: projectCwd });
|
|
211116
|
+
return credential;
|
|
211117
|
+
}
|
|
211118
|
+
catch (e) {
|
|
211119
|
+
(0, logger_js_1.debug)("peekLoginState: API Key login failed", { error: e instanceof Error ? e.message : String(e) });
|
|
211120
|
+
return null;
|
|
211121
|
+
}
|
|
211122
|
+
}
|
|
211123
|
+
// 腾讯云密钥模式:直接返回
|
|
209140
211124
|
(0, logger_js_1.debug)("loginByApiSecret");
|
|
209141
211125
|
return envVarLoginState;
|
|
209142
211126
|
}
|
|
211127
|
+
// 尝试从 toolbox 本地存储读取(包括项目级 API Key 凭证)
|
|
209143
211128
|
return auth.getLoginState();
|
|
209144
211129
|
}
|
|
209145
211130
|
async function ensureLogin(options) {
|
|
209146
211131
|
(0, logger_js_1.debug)("TENCENTCLOUD_SECRETID", { hasSecretId: !!process.env.TENCENTCLOUD_SECRETID });
|
|
211132
|
+
(0, logger_js_1.debug)("CLOUDBASE_API_KEY", { hasApiKey: !!process.env.CLOUDBASE_API_KEY });
|
|
209147
211133
|
const loginState = await peekLoginState({
|
|
209148
211134
|
ignoreEnvVars: options?.ignoreEnvVars,
|
|
209149
211135
|
});
|
|
@@ -209219,7 +211205,8 @@ async function getLoginState(options) {
|
|
|
209219
211205
|
return ensureLogin(options);
|
|
209220
211206
|
}
|
|
209221
211207
|
async function logout() {
|
|
209222
|
-
const
|
|
211208
|
+
const cwd = process.env.WORKSPACE_FOLDER_PATHS || process.cwd();
|
|
211209
|
+
const result = await auth.logout({ cwd });
|
|
209223
211210
|
resetAuthProgressState();
|
|
209224
211211
|
return result;
|
|
209225
211212
|
}
|
|
@@ -218011,6 +219998,14 @@ exports["default"] = Settings;
|
|
|
218011
219998
|
})));
|
|
218012
219999
|
|
|
218013
220000
|
|
|
220001
|
+
/***/ }),
|
|
220002
|
+
|
|
220003
|
+
/***/ 81813:
|
|
220004
|
+
/***/ ((module) => {
|
|
220005
|
+
|
|
220006
|
+
"use strict";
|
|
220007
|
+
module.exports = /*#__PURE__*/JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/ace+cbor":{"source":"iana"},"application/ace+json":{"source":"iana","compressible":true},"application/ace-groupcomm+cbor":{"source":"iana"},"application/ace-trl+cbor":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/aif+cbor":{"source":"iana"},"application/aif+json":{"source":"iana","compressible":true},"application/alto-cdni+json":{"source":"iana","compressible":true},"application/alto-cdnifilter+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-propmap+json":{"source":"iana","compressible":true},"application/alto-propmapparams+json":{"source":"iana","compressible":true},"application/alto-tips+json":{"source":"iana","compressible":true},"application/alto-tipsparams+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/appinstaller":{"compressible":false,"extensions":["appinstaller"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/appx":{"compressible":false,"extensions":["appx"]},"application/appxbundle":{"compressible":false,"extensions":["appxbundle"]},"application/at+jwt":{"source":"iana"},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/automationml-aml+xml":{"source":"iana","compressible":true,"extensions":["aml"]},"application/automationml-amlx+zip":{"source":"iana","compressible":false,"extensions":["amlx"]},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/bufr":{"source":"iana"},"application/c2pa":{"source":"iana"},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cda+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/ce+cbor":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/cid-edhoc+cbor-seq":{"source":"iana"},"application/city+json":{"source":"iana","compressible":true},"application/city+json-seq":{"source":"iana"},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-eap":{"source":"iana"},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/concise-problem-details+cbor":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cose-x509":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true,"extensions":["cpl"]},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwl":{"source":"iana","extensions":["cwl"]},"application/cwl+json":{"source":"iana","compressible":true},"application/cwl+yaml":{"source":"iana"},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dash-patch+xml":{"source":"iana","compressible":true,"extensions":["mpp"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana","extensions":["dcm"]},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dpop+jwt":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/eat+cwt":{"source":"iana"},"application/eat+jwt":{"source":"iana"},"application/eat-bun+cbor":{"source":"iana"},"application/eat-bun+json":{"source":"iana","compressible":true},"application/eat-ucs+cbor":{"source":"iana"},"application/eat-ucs+json":{"source":"iana","compressible":true},"application/ecmascript":{"source":"apache","compressible":true,"extensions":["ecma"]},"application/edhoc+cbor-seq":{"source":"iana"},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.legacyesn+json":{"source":"iana","compressible":true},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/entity-statement+jwt":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/express":{"source":"iana","extensions":["exp"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdf":{"source":"iana","extensions":["fdf"]},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geopose+json":{"source":"iana","compressible":true},"application/geoxacml+json":{"source":"iana","compressible":true},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gnap-binding-jws":{"source":"iana"},"application/gnap-binding-jwsd":{"source":"iana"},"application/gnap-binding-rotation-jws":{"source":"iana"},"application/gnap-binding-rotation-jwsd":{"source":"iana"},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/grib":{"source":"iana"},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/hl7v2+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"iana","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"apache","charset":"UTF-8","compressible":true,"extensions":["js"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/jscontact+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jsonpath":{"source":"iana"},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwk-set+jwt":{"source":"iana"},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/linkset":{"source":"iana"},"application/linkset+json":{"source":"iana","compressible":true},"application/load-control+xml":{"source":"iana","compressible":true},"application/logout+jwt":{"source":"iana"},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true,"extensions":["mpf"]},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/missing-blocks+cbor-seq":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4","mpg4","mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msix":{"compressible":false,"extensions":["msix"]},"application/msixbundle":{"compressible":false,"extensions":["msixbundle"]},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/oblivious-dns-message":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":true,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/ohttp-keys":{"source":"iana"},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg","one","onea"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p21":{"source":"iana"},"application/p21+zip":{"source":"iana","compressible":false},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana","extensions":["asc"]},"application/pgp-signature":{"source":"iana","extensions":["sig","asc"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/private-token-issuer-directory":{"source":"iana"},"application/private-token-request":{"source":"iana"},"application/private-token-response":{"source":"iana"},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/provided-claims+jwt":{"source":"iana"},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.implied-document+xml":{"source":"iana","compressible":true},"application/prs.implied-executable":{"source":"iana"},"application/prs.implied-object+json":{"source":"iana","compressible":true},"application/prs.implied-object+json-seq":{"source":"iana"},"application/prs.implied-object+yaml":{"source":"iana"},"application/prs.implied-structure":{"source":"iana"},"application/prs.mayfile":{"source":"iana"},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.vcfbzip2":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true,"extensions":["xsf"]},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"apache"},"application/reputon+json":{"source":"iana","compressible":true},"application/resolve-response+jwt":{"source":"iana"},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-checklist":{"source":"iana"},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-signed-tal":{"source":"iana"},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"apache"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spdx+json":{"source":"iana","compressible":true},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana","extensions":["sql"]},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/sslkeylogfile":{"source":"iana"},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/st2110-41":{"source":"iana"},"application/stix+json":{"source":"iana","compressible":true},"application/stratum":{"source":"iana"},"application/swid+cbor":{"source":"iana"},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tm+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/toc+cbor":{"source":"iana"},"application/token-introspection+jwt":{"source":"iana"},"application/toml":{"source":"iana","compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana","extensions":["trig"]},"application/trust-chain+json":{"source":"iana","compressible":true},"application/trust-mark+jwt":{"source":"iana"},"application/trust-mark-delegation+jwt":{"source":"iana"},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/uccs+cbor":{"source":"iana"},"application/ujcs+json":{"source":"iana","compressible":true},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vc":{"source":"iana"},"application/vc+cose":{"source":"iana"},"application/vc+jwt":{"source":"iana"},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.1ob":{"source":"iana"},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3a+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ach+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc8+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.5gsa2x":{"source":"iana"},"application/vnd.3gpp.5gsa2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gsv2x":{"source":"iana"},"application/vnd.3gpp.5gsv2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.crs+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.current-location-discovery+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-regroup+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-regroup+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-regroup+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.pinapp-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.seal-group-doc+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-network-qos-management-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-ue-config-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-unicast-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.seal-user-profile-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.v2x":{"source":"iana"},"application/vnd.3gpp.vae-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acm.addressxfer+json":{"source":"iana","compressible":true},"application/vnd.acm.chatbot+json":{"source":"iana","compressible":true},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"apache","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.age":{"source":"iana","extensions":["age"]},"application/vnd.ah-barcode":{"source":"apache"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.arrow.file":{"source":"iana"},"application/vnd.apache.arrow.stream":{"source":"iana"},"application/vnd.apache.parquet":{"source":"iana"},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.apexlang":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"apache"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autodesk.fbx":{"extensions":["fbx"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.belightsoft.lhzd+zip":{"source":"iana","compressible":false},"application/vnd.belightsoft.lhzl+zip":{"source":"iana","compressible":false},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.bzip3":{"source":"iana"},"application/vnd.c3voc.schedule+xml":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.cncf.helm.chart.content.v1.tar+gzip":{"source":"iana"},"application/vnd.cncf.helm.chart.provenance.v1.prov":{"source":"iana"},"application/vnd.cncf.helm.config.v1+json":{"source":"iana","compressible":true},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datalog":{"source":"iana"},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.dcmp+xml":{"source":"iana","compressible":true,"extensions":["dcmp"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.eclipse.ditto+json":{"source":"iana","compressible":true},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.eln+zip":{"source":"iana","compressible":false},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.erofs":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eu.kasparian.car+json":{"source":"iana","compressible":true},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.familysearch.gedcom+zip":{"source":"iana","compressible":false},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"apache","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.fdsn.stationxml+xml":{"source":"iana","charset":"XML-BASED","compressible":true},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.freelog.comic":{"source":"iana"},"application/vnd.frogans.fnc":{"source":"apache","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"apache","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.ga4gh.passport+jwt":{"source":"iana"},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.genozip":{"source":"iana"},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.gentoo.catmetadata+xml":{"source":"iana","compressible":true},"application/vnd.gentoo.ebuild":{"source":"iana"},"application/vnd.gentoo.eclass":{"source":"iana"},"application/vnd.gentoo.gpkg":{"source":"iana"},"application/vnd.gentoo.manifest":{"source":"iana"},"application/vnd.gentoo.pkgmetadata+xml":{"source":"iana","compressible":true},"application/vnd.gentoo.xpak":{"source":"iana"},"application/vnd.geo+json":{"source":"apache","compressible":true},"application/vnd.geocube+xml":{"source":"apache","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.pinboard":{"source":"iana"},"application/vnd.geogebra.slides":{"source":"iana","extensions":["ggs"]},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.gnu.taler.exchange+json":{"source":"iana","compressible":true},"application/vnd.gnu.taler.merchant+json":{"source":"iana","compressible":true},"application/vnd.google-apps.audio":{},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.drawing":{"compressible":false,"extensions":["gdraw"]},"application/vnd.google-apps.drive-sdk":{"compressible":false},"application/vnd.google-apps.file":{},"application/vnd.google-apps.folder":{"compressible":false},"application/vnd.google-apps.form":{"compressible":false,"extensions":["gform"]},"application/vnd.google-apps.fusiontable":{},"application/vnd.google-apps.jam":{"compressible":false,"extensions":["gjam"]},"application/vnd.google-apps.mail-layout":{},"application/vnd.google-apps.map":{"compressible":false,"extensions":["gmap"]},"application/vnd.google-apps.photo":{},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.script":{"compressible":false,"extensions":["gscript"]},"application/vnd.google-apps.shortcut":{},"application/vnd.google-apps.site":{"compressible":false,"extensions":["gsite"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-apps.unknown":{},"application/vnd.google-apps.video":{},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"apache","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true,"extensions":["xdcf"]},"application/vnd.gpxsee.map+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.hsl":{"source":"iana"},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"apache"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"apache","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"apache"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.ipfs.ipns-record":{"source":"iana"},"application/vnd.ipld.car":{"source":"iana"},"application/vnd.ipld.dag-cbor":{"source":"iana"},"application/vnd.ipld.dag-json":{"source":"iana"},"application/vnd.ipld.raw":{"source":"iana"},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kdl":{"source":"iana"},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.keyman.kmp+zip":{"source":"iana","compressible":false},"application/vnd.keyman.kmx":{"source":"iana"},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.ldev.productlicensing":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxar.archive.3tz+zip":{"source":"iana","compressible":false},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.mdl":{"source":"iana"},"application/vnd.mdl-mbsdf":{"source":"iana"},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.medicalholodeck.recordxr":{"source":"iana"},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mermaid":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.modl":{"source":"iana"},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-visio.viewer":{"extensions":["vdx"]},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msgpack":{"source":"iana"},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.nacamar.ybrid+json":{"source":"iana","compressible":true},"application/vnd.nato.bindingdataobject+cbor":{"source":"iana"},"application/vnd.nato.bindingdataobject+json":{"source":"iana","compressible":true},"application/vnd.nato.bindingdataobject+xml":{"source":"iana","compressible":true,"extensions":["bdo"]},"application/vnd.nato.openxmlformats-package.iepd+zip":{"source":"iana","compressible":false},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"apache","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oai.workflows":{"source":"iana"},"application/vnd.oai.workflows+json":{"source":"iana","compressible":true},"application/vnd.oai.workflows+yaml":{"source":"iana"},"application/vnd.oasis.opendocument.base":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"apache","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-master-template":{"source":"iana"},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"apache","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"apache","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.onvif.metadata":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.opentimestamps.ots":{"source":"iana"},"application/vnd.openvpi.dspx+json":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.procrate.brushset":{"extensions":["brushset"]},"application/vnd.procreate.brush":{"extensions":["brush"]},"application/vnd.procreate.dream":{"extensions":["drm"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.pt.mundusmundi":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true,"extensions":["xhtm"]},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.relpipe":{"source":"iana"},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.resilient.logic":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.sketchometry":{"source":"iana"},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.smintio.portals.archive":{"source":"iana"},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sybyl.mol2":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.syft+json":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uic.osdm+json":{"source":"iana","compressible":true},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml","uo"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.veraison.tsm-report+cbor":{"source":"iana"},"application/vnd.veraison.tsm-report+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veritone.aion+json":{"source":"iana","compressible":true},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw","vsdx","vtx"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vocalshaper.vsp4":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.wasmflow.wafl":{"source":"iana"},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordlift":{"source":"iana"},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xarin.cpj":{"source":"iana"},"application/vnd.xecrets-encrypted":{"source":"iana"},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/voucher-jws+json":{"source":"iana","compressible":true},"application/vp":{"source":"iana"},"application/vp+cose":{"source":"iana"},"application/vp+jwt":{"source":"iana"},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true,"extensions":["wif"]},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blender":{"extensions":["blend"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-compressed":{"extensions":["rar"]},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-ipynb+json":{"compressible":true,"extensions":["ipynb"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-iwork-keynote-sffkey":{"extensions":["key"]},"application/x-iwork-numbers-sffnumbers":{"extensions":["numbers"]},"application/x-iwork-pages-sffpages":{"extensions":["pages"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zip-compressed":{"extensions":["zip"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xfdf":{"source":"iana","extensions":["xfdf"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yaml":{"source":"iana"},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+cbor":{"source":"iana"},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yang-sid+json":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zip+dotlottie":{"extensions":["lottie"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana","extensions":["adts","aac"]},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flac":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/matroska":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/midi-clip":{"source":"iana"},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a","m4b"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"apache"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"source":"iana","compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana","extensions":["avci"]},"image/avcs":{"source":"iana","extensions":["avcs"]},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp","dib"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/dpx":{"source":"iana","extensions":["dpx"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/j2c":{"source":"iana"},"image/jaii":{"source":"iana","extensions":["jaii"]},"image/jais":{"source":"iana","extensions":["jais"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpg","jpeg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm","jpgm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxl":{"source":"iana","extensions":["jxl"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false,"extensions":["jfif"]},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif","btf"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.clip":{"source":"iana"},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","compressible":true,"extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"compressible":true,"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"iana","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-adobe-dng":{"extensions":["dng"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-emf":{"source":"iana"},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-wmf":{"source":"iana"},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/bhttp":{"source":"iana"},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/mls":{"source":"iana"},"message/news":{"source":"apache"},"message/ohttp-req":{"source":"iana"},"message/ohttp-res":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime","mht","mhtml"]},"message/s-http":{"source":"apache"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"apache"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/jt":{"source":"iana","extensions":["jt"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/prc":{"source":"iana","extensions":["prc"]},"model/step":{"source":"iana","extensions":["step","stp","stpnc","p21","210"]},"model/step+xml":{"source":"iana","compressible":true,"extensions":["stpx"]},"model/step+zip":{"source":"iana","compressible":false,"extensions":["stpz"]},"model/step-xml+zip":{"source":"iana","compressible":false,"extensions":["stpxz"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/u3d":{"source":"iana","extensions":["u3d"]},"model/vnd.bary":{"source":"iana","extensions":["bary"]},"model/vnd.cld":{"source":"iana","extensions":["cld"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana","extensions":["pyo","pyox"]},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usda":{"source":"iana","extensions":["usda"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"apache"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/hl7v2":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["md","markdown"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/prs.texi":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.exchangeable":{"source":"iana"},"text/vnd.familysearch.gedcom":{"source":"iana","extensions":["ged"]},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"apache"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.vcf":{"source":"iana"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vnd.zoo.kcl":{"source":"iana"},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/wgsl":{"source":"iana","extensions":["wgsl"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/evc":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/h266":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/jxsv":{"source":"iana"},"video/lottie+json":{"source":"iana","compressible":true},"video/matroska":{"source":"iana"},"video/matroska-3d":{"source":"iana"},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts","m2t","m2ts","mts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.planar":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"apache"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/vp9":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}');
|
|
220008
|
+
|
|
218014
220009
|
/***/ }),
|
|
218015
220010
|
|
|
218016
220011
|
/***/ 82005:
|
|
@@ -224909,15 +226904,42 @@ function registerGatewayTools(server) {
|
|
|
224909
226904
|
case "deleteAccess": {
|
|
224910
226905
|
const cloudbase = await getManager();
|
|
224911
226906
|
const accessPath = input.path ? normalizeAccessPath(input.path) : undefined;
|
|
226907
|
+
let resolvedAccessId = input.accessId;
|
|
226908
|
+
if (!resolvedAccessId) {
|
|
226909
|
+
if (!input.targetName && !accessPath) {
|
|
226910
|
+
throw new Error("action=deleteAccess 时至少需要提供 accessId,或提供 targetName/path 用于定位入口");
|
|
226911
|
+
}
|
|
226912
|
+
const accessList = await cloudbase.access.getAccessList({
|
|
226913
|
+
...(input.targetName ? { name: input.targetName } : {}),
|
|
226914
|
+
...(accessPath ? { path: accessPath } : {}),
|
|
226915
|
+
});
|
|
226916
|
+
const candidates = (accessList.APISet ?? []).filter((item) => {
|
|
226917
|
+
if (!accessPath) {
|
|
226918
|
+
return true;
|
|
226919
|
+
}
|
|
226920
|
+
return normalizeAccessPath(item.Path) === accessPath;
|
|
226921
|
+
});
|
|
226922
|
+
if (candidates.length === 0) {
|
|
226923
|
+
throw new Error("未找到可删除的访问入口,请确认 targetName/path 或直接传 accessId");
|
|
226924
|
+
}
|
|
226925
|
+
if (candidates.length > 1 && !accessPath) {
|
|
226926
|
+
throw new Error("匹配到多个访问入口,请补充 path 或直接传 accessId");
|
|
226927
|
+
}
|
|
226928
|
+
resolvedAccessId = candidates[0]?.APIId;
|
|
226929
|
+
}
|
|
226930
|
+
if (!resolvedAccessId) {
|
|
226931
|
+
throw new Error("无法解析访问入口 accessId,请改为显式传入 accessId");
|
|
226932
|
+
}
|
|
224912
226933
|
const result = await cloudbase.access.deleteAccess({
|
|
224913
226934
|
...(input.targetName ? { name: input.targetName } : {}),
|
|
224914
|
-
|
|
226935
|
+
apiId: resolvedAccessId,
|
|
224915
226936
|
});
|
|
224916
226937
|
(0, cloudbase_manager_js_1.logCloudBaseResult)(server.logger, result);
|
|
224917
226938
|
return buildEnvelope({
|
|
224918
226939
|
action: input.action,
|
|
224919
226940
|
targetName: input.targetName ?? null,
|
|
224920
226941
|
path: accessPath ?? null,
|
|
226942
|
+
accessId: resolvedAccessId,
|
|
224921
226943
|
raw: result,
|
|
224922
226944
|
}, "网关访问入口删除成功");
|
|
224923
226945
|
}
|
|
@@ -225019,6 +227041,7 @@ function registerGatewayTools(server) {
|
|
|
225019
227041
|
domain: zod_1.z.string().optional().describe("自定义域名"),
|
|
225020
227042
|
certificateId: zod_1.z.string().optional().describe("证书 ID"),
|
|
225021
227043
|
accessName: zod_1.z.string().optional().describe("访问入口名称,保留字段"),
|
|
227044
|
+
accessId: zod_1.z.string().optional().describe("访问入口 ID。deleteAccess 时可直接传入,避免参数歧义"),
|
|
225022
227045
|
},
|
|
225023
227046
|
annotations: {
|
|
225024
227047
|
readOnlyHint: false,
|
|
@@ -227255,6 +229278,225 @@ exports.ZipCrypto = __webpack_require__(94014);
|
|
|
227255
229278
|
module.exports = __webpack_require__(27910);
|
|
227256
229279
|
|
|
227257
229280
|
|
|
229281
|
+
/***/ }),
|
|
229282
|
+
|
|
229283
|
+
/***/ 86049:
|
|
229284
|
+
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
|
|
229285
|
+
|
|
229286
|
+
"use strict";
|
|
229287
|
+
/*!
|
|
229288
|
+
* mime-types
|
|
229289
|
+
* Copyright(c) 2014 Jonathan Ong
|
|
229290
|
+
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
229291
|
+
* MIT Licensed
|
|
229292
|
+
*/
|
|
229293
|
+
|
|
229294
|
+
|
|
229295
|
+
|
|
229296
|
+
/**
|
|
229297
|
+
* Module dependencies.
|
|
229298
|
+
* @private
|
|
229299
|
+
*/
|
|
229300
|
+
|
|
229301
|
+
var db = __webpack_require__(7598)
|
|
229302
|
+
var extname = (__webpack_require__(39902).extname)
|
|
229303
|
+
var mimeScore = __webpack_require__(30983)
|
|
229304
|
+
|
|
229305
|
+
/**
|
|
229306
|
+
* Module variables.
|
|
229307
|
+
* @private
|
|
229308
|
+
*/
|
|
229309
|
+
|
|
229310
|
+
var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
|
|
229311
|
+
var TEXT_TYPE_REGEXP = /^text\//i
|
|
229312
|
+
|
|
229313
|
+
/**
|
|
229314
|
+
* Module exports.
|
|
229315
|
+
* @public
|
|
229316
|
+
*/
|
|
229317
|
+
|
|
229318
|
+
exports.charset = charset
|
|
229319
|
+
exports.charsets = { lookup: charset }
|
|
229320
|
+
exports.contentType = contentType
|
|
229321
|
+
exports.extension = extension
|
|
229322
|
+
exports.extensions = Object.create(null)
|
|
229323
|
+
exports.lookup = lookup
|
|
229324
|
+
exports.types = Object.create(null)
|
|
229325
|
+
exports._extensionConflicts = []
|
|
229326
|
+
|
|
229327
|
+
// Populate the extensions/types maps
|
|
229328
|
+
populateMaps(exports.extensions, exports.types)
|
|
229329
|
+
|
|
229330
|
+
/**
|
|
229331
|
+
* Get the default charset for a MIME type.
|
|
229332
|
+
*
|
|
229333
|
+
* @param {string} type
|
|
229334
|
+
* @return {false|string}
|
|
229335
|
+
*/
|
|
229336
|
+
|
|
229337
|
+
function charset (type) {
|
|
229338
|
+
if (!type || typeof type !== 'string') {
|
|
229339
|
+
return false
|
|
229340
|
+
}
|
|
229341
|
+
|
|
229342
|
+
// TODO: use media-typer
|
|
229343
|
+
var match = EXTRACT_TYPE_REGEXP.exec(type)
|
|
229344
|
+
var mime = match && db[match[1].toLowerCase()]
|
|
229345
|
+
|
|
229346
|
+
if (mime && mime.charset) {
|
|
229347
|
+
return mime.charset
|
|
229348
|
+
}
|
|
229349
|
+
|
|
229350
|
+
// default text/* to utf-8
|
|
229351
|
+
if (match && TEXT_TYPE_REGEXP.test(match[1])) {
|
|
229352
|
+
return 'UTF-8'
|
|
229353
|
+
}
|
|
229354
|
+
|
|
229355
|
+
return false
|
|
229356
|
+
}
|
|
229357
|
+
|
|
229358
|
+
/**
|
|
229359
|
+
* Create a full Content-Type header given a MIME type or extension.
|
|
229360
|
+
*
|
|
229361
|
+
* @param {string} str
|
|
229362
|
+
* @return {false|string}
|
|
229363
|
+
*/
|
|
229364
|
+
|
|
229365
|
+
function contentType (str) {
|
|
229366
|
+
// TODO: should this even be in this module?
|
|
229367
|
+
if (!str || typeof str !== 'string') {
|
|
229368
|
+
return false
|
|
229369
|
+
}
|
|
229370
|
+
|
|
229371
|
+
var mime = str.indexOf('/') === -1 ? exports.lookup(str) : str
|
|
229372
|
+
|
|
229373
|
+
if (!mime) {
|
|
229374
|
+
return false
|
|
229375
|
+
}
|
|
229376
|
+
|
|
229377
|
+
// TODO: use content-type or other module
|
|
229378
|
+
if (mime.indexOf('charset') === -1) {
|
|
229379
|
+
var charset = exports.charset(mime)
|
|
229380
|
+
if (charset) mime += '; charset=' + charset.toLowerCase()
|
|
229381
|
+
}
|
|
229382
|
+
|
|
229383
|
+
return mime
|
|
229384
|
+
}
|
|
229385
|
+
|
|
229386
|
+
/**
|
|
229387
|
+
* Get the default extension for a MIME type.
|
|
229388
|
+
*
|
|
229389
|
+
* @param {string} type
|
|
229390
|
+
* @return {false|string}
|
|
229391
|
+
*/
|
|
229392
|
+
|
|
229393
|
+
function extension (type) {
|
|
229394
|
+
if (!type || typeof type !== 'string') {
|
|
229395
|
+
return false
|
|
229396
|
+
}
|
|
229397
|
+
|
|
229398
|
+
// TODO: use media-typer
|
|
229399
|
+
var match = EXTRACT_TYPE_REGEXP.exec(type)
|
|
229400
|
+
|
|
229401
|
+
// get extensions
|
|
229402
|
+
var exts = match && exports.extensions[match[1].toLowerCase()]
|
|
229403
|
+
|
|
229404
|
+
if (!exts || !exts.length) {
|
|
229405
|
+
return false
|
|
229406
|
+
}
|
|
229407
|
+
|
|
229408
|
+
return exts[0]
|
|
229409
|
+
}
|
|
229410
|
+
|
|
229411
|
+
/**
|
|
229412
|
+
* Lookup the MIME type for a file path/extension.
|
|
229413
|
+
*
|
|
229414
|
+
* @param {string} path
|
|
229415
|
+
* @return {false|string}
|
|
229416
|
+
*/
|
|
229417
|
+
|
|
229418
|
+
function lookup (path) {
|
|
229419
|
+
if (!path || typeof path !== 'string') {
|
|
229420
|
+
return false
|
|
229421
|
+
}
|
|
229422
|
+
|
|
229423
|
+
// get the extension ("ext" or ".ext" or full path)
|
|
229424
|
+
var extension = extname('x.' + path)
|
|
229425
|
+
.toLowerCase()
|
|
229426
|
+
.slice(1)
|
|
229427
|
+
|
|
229428
|
+
if (!extension) {
|
|
229429
|
+
return false
|
|
229430
|
+
}
|
|
229431
|
+
|
|
229432
|
+
return exports.types[extension] || false
|
|
229433
|
+
}
|
|
229434
|
+
|
|
229435
|
+
/**
|
|
229436
|
+
* Populate the extensions and types maps.
|
|
229437
|
+
* @private
|
|
229438
|
+
*/
|
|
229439
|
+
|
|
229440
|
+
function populateMaps (extensions, types) {
|
|
229441
|
+
Object.keys(db).forEach(function forEachMimeType (type) {
|
|
229442
|
+
var mime = db[type]
|
|
229443
|
+
var exts = mime.extensions
|
|
229444
|
+
|
|
229445
|
+
if (!exts || !exts.length) {
|
|
229446
|
+
return
|
|
229447
|
+
}
|
|
229448
|
+
|
|
229449
|
+
// mime -> extensions
|
|
229450
|
+
extensions[type] = exts
|
|
229451
|
+
|
|
229452
|
+
// extension -> mime
|
|
229453
|
+
for (var i = 0; i < exts.length; i++) {
|
|
229454
|
+
var extension = exts[i]
|
|
229455
|
+
types[extension] = _preferredType(extension, types[extension], type)
|
|
229456
|
+
|
|
229457
|
+
// DELETE (eventually): Capture extension->type maps that change as a
|
|
229458
|
+
// result of switching to mime-score. This is just to help make reviewing
|
|
229459
|
+
// PR #119 easier, and can be removed once that PR is approved.
|
|
229460
|
+
const legacyType = _preferredTypeLegacy(
|
|
229461
|
+
extension,
|
|
229462
|
+
types[extension],
|
|
229463
|
+
type
|
|
229464
|
+
)
|
|
229465
|
+
if (legacyType !== types[extension]) {
|
|
229466
|
+
exports._extensionConflicts.push([extension, legacyType, types[extension]])
|
|
229467
|
+
}
|
|
229468
|
+
}
|
|
229469
|
+
})
|
|
229470
|
+
}
|
|
229471
|
+
|
|
229472
|
+
// Resolve type conflict using mime-score
|
|
229473
|
+
function _preferredType (ext, type0, type1) {
|
|
229474
|
+
var score0 = type0 ? mimeScore(type0, db[type0].source) : 0
|
|
229475
|
+
var score1 = type1 ? mimeScore(type1, db[type1].source) : 0
|
|
229476
|
+
|
|
229477
|
+
return score0 > score1 ? type0 : type1
|
|
229478
|
+
}
|
|
229479
|
+
|
|
229480
|
+
// Resolve type conflict using pre-mime-score logic
|
|
229481
|
+
function _preferredTypeLegacy (ext, type0, type1) {
|
|
229482
|
+
var SOURCE_RANK = ['nginx', 'apache', undefined, 'iana']
|
|
229483
|
+
|
|
229484
|
+
var score0 = type0 ? SOURCE_RANK.indexOf(db[type0].source) : 0
|
|
229485
|
+
var score1 = type1 ? SOURCE_RANK.indexOf(db[type1].source) : 0
|
|
229486
|
+
|
|
229487
|
+
if (
|
|
229488
|
+
exports.types[extension] !== 'application/octet-stream' &&
|
|
229489
|
+
(score0 > score1 ||
|
|
229490
|
+
(score0 === score1 &&
|
|
229491
|
+
exports.types[extension]?.slice(0, 12) === 'application/'))
|
|
229492
|
+
) {
|
|
229493
|
+
return type0
|
|
229494
|
+
}
|
|
229495
|
+
|
|
229496
|
+
return score0 > score1 ? type0 : type1
|
|
229497
|
+
}
|
|
229498
|
+
|
|
229499
|
+
|
|
227258
229500
|
/***/ }),
|
|
227259
229501
|
|
|
227260
229502
|
/***/ 86144:
|
|
@@ -234606,6 +236848,8 @@ function shouldRegisterTool(toolName) {
|
|
|
234606
236848
|
'manageCloudRun',
|
|
234607
236849
|
// Download tools - local file downloads
|
|
234608
236850
|
'manageStorage',
|
|
236851
|
+
// Apps tools - deployApp reads local filePath for code upload
|
|
236852
|
+
'manageApps',
|
|
234609
236853
|
];
|
|
234610
236854
|
const shouldRegister = !cloudIncompatibleTools.includes(toolName);
|
|
234611
236855
|
if (!shouldRegister) {
|
|
@@ -258752,39 +260996,57 @@ class FunctionService {
|
|
|
258752
260996
|
return res;
|
|
258753
260997
|
}
|
|
258754
260998
|
catch (e) {
|
|
258755
|
-
//
|
|
260999
|
+
// 函数已存在(同名冲突)
|
|
258756
261000
|
const functionExist = e.code === 'ResourceInUse.FunctionName' || e.code === 'ResourceInUse.Function';
|
|
258757
|
-
|
|
258758
|
-
|
|
258759
|
-
//
|
|
258760
|
-
|
|
258761
|
-
|
|
258762
|
-
|
|
258763
|
-
|
|
258764
|
-
|
|
258765
|
-
|
|
258766
|
-
|
|
258767
|
-
|
|
258768
|
-
|
|
258769
|
-
|
|
258770
|
-
|
|
258771
|
-
|
|
258772
|
-
|
|
258773
|
-
|
|
258774
|
-
//
|
|
258775
|
-
|
|
258776
|
-
|
|
258777
|
-
|
|
258778
|
-
|
|
261001
|
+
if (functionExist) {
|
|
261002
|
+
// 检查同名函数是否是 CREATE_FAILED 残留
|
|
261003
|
+
// 场景:上次部署因依赖安装失败留下了残留函数,用户修正参数后重新部署(不传 force)
|
|
261004
|
+
// 此时应自动清理残留并重新创建,而不是报错要求用户手动删除或传 force
|
|
261005
|
+
try {
|
|
261006
|
+
const { Status } = await this.getFunctionDetail(funcName, codeSecret);
|
|
261007
|
+
if (Status === constant_1.SCF_STATUS.CREATE_FAILED) {
|
|
261008
|
+
console.warn(`[${funcName}] 检测到同名函数处于 CREATE_FAILED 状态,自动清理后重新创建...`);
|
|
261009
|
+
await this.deleteFunction(funcName);
|
|
261010
|
+
// 重新执行创建(递归调用,此时同名函数已删除,不会再碰到 ResourceInUse)
|
|
261011
|
+
return this.createFunction(funcParam);
|
|
261012
|
+
}
|
|
261013
|
+
}
|
|
261014
|
+
catch (checkErr) {
|
|
261015
|
+
// 查询或删除失败,继续走原有逻辑(force 判断)
|
|
261016
|
+
console.warn(`[${funcName}] 检查残留状态失败(可忽略): ${checkErr.message}`);
|
|
261017
|
+
}
|
|
261018
|
+
// 已存在且状态正常,强制覆盖更新
|
|
261019
|
+
if (force) {
|
|
261020
|
+
// 1. 更新函数代码(通过 deployMode 区分镜像部署和代码部署)
|
|
261021
|
+
const codeRes = await this.updateFunctionCode({
|
|
261022
|
+
func,
|
|
261023
|
+
base64Code,
|
|
261024
|
+
functionPath,
|
|
261025
|
+
functionRootPath,
|
|
261026
|
+
codeSecret: codeSecret,
|
|
261027
|
+
deployMode: isImageDeploy ? 'image' : undefined
|
|
261028
|
+
});
|
|
261029
|
+
// 等待函数状态正常
|
|
261030
|
+
await this.waitFunctionActive(funcName, codeSecret);
|
|
261031
|
+
// 2. 更新函数配置
|
|
261032
|
+
const configRes = await this.updateFunctionConfig(func);
|
|
261033
|
+
// 等待函数状态正常
|
|
261034
|
+
await this.waitFunctionActive(funcName, codeSecret);
|
|
261035
|
+
// 3. 创建函数触发器
|
|
261036
|
+
const triggerRes = await this.retryCreateTrigger(funcName, func.triggers);
|
|
261037
|
+
// 设置路径,创建云接入路径
|
|
261038
|
+
if (func.path) {
|
|
261039
|
+
await this.createAccessPath(funcName, func.path);
|
|
261040
|
+
}
|
|
261041
|
+
// 检查函数状态
|
|
261042
|
+
await this.waitFunctionActive(funcName, codeSecret);
|
|
261043
|
+
// 返回全部操作的响应值
|
|
261044
|
+
return {
|
|
261045
|
+
triggerRes,
|
|
261046
|
+
configRes,
|
|
261047
|
+
codeRes
|
|
261048
|
+
};
|
|
258779
261049
|
}
|
|
258780
|
-
// 检查函数状态
|
|
258781
|
-
await this.waitFunctionActive(funcName, codeSecret);
|
|
258782
|
-
// 返回全部操作的响应值
|
|
258783
|
-
return {
|
|
258784
|
-
triggerRes,
|
|
258785
|
-
configRes,
|
|
258786
|
-
codeRes
|
|
258787
|
-
};
|
|
258788
261050
|
}
|
|
258789
261051
|
// 不强制覆盖,抛出错误
|
|
258790
261052
|
if (e.message && !force) {
|
|
@@ -258809,8 +261071,8 @@ class FunctionService {
|
|
|
258809
261071
|
async getFunctionList(limit = 20, offset = 0) {
|
|
258810
261072
|
// 获取Function 环境配置
|
|
258811
261073
|
const { namespace } = this.getFunctionConfig();
|
|
258812
|
-
const res = await this.
|
|
258813
|
-
|
|
261074
|
+
const res = await this.tcbService.request('ListFunctions', {
|
|
261075
|
+
EnvId: namespace,
|
|
258814
261076
|
Limit: limit,
|
|
258815
261077
|
Offset: offset
|
|
258816
261078
|
});
|
|
@@ -258825,8 +261087,8 @@ class FunctionService {
|
|
|
258825
261087
|
async listFunctions(limit = 20, offset = 0) {
|
|
258826
261088
|
// 获取Function 环境配置
|
|
258827
261089
|
const { namespace } = this.getFunctionConfig();
|
|
258828
|
-
const res = await this.
|
|
258829
|
-
|
|
261090
|
+
const res = await this.tcbService.request('ListFunctions', {
|
|
261091
|
+
EnvId: namespace,
|
|
258830
261092
|
Limit: limit,
|
|
258831
261093
|
Offset: offset
|
|
258832
261094
|
});
|
|
@@ -258857,8 +261119,8 @@ class FunctionService {
|
|
|
258857
261119
|
const { envId } = options;
|
|
258858
261120
|
while (true) {
|
|
258859
261121
|
try {
|
|
258860
|
-
const res = await this.
|
|
258861
|
-
|
|
261122
|
+
const res = await this.tcbService.request('ListFunctions', {
|
|
261123
|
+
EnvId: envId,
|
|
258862
261124
|
Limit: pageSize,
|
|
258863
261125
|
Offset: currentOffset
|
|
258864
261126
|
});
|
|
@@ -264076,10 +266338,12 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
|
264076
266338
|
exports.getCredentialWithoutCheck = exports.checkAndGetCredential = exports.isCamRefused = exports.refreshTmpToken = exports.getCredentialData = exports.ENV_NAME = exports.authStore = void 0;
|
|
264077
266339
|
const cloud_api_1 = __webpack_require__(2090);
|
|
264078
266340
|
const common_1 = __webpack_require__(96711);
|
|
266341
|
+
const api_key_1 = __webpack_require__(12754);
|
|
264079
266342
|
const async_1 = __webpack_require__(80854);
|
|
264080
266343
|
const coding_1 = __webpack_require__(40540);
|
|
264081
266344
|
const system_1 = __webpack_require__(62179);
|
|
264082
266345
|
const localstore_1 = __webpack_require__(40833);
|
|
266346
|
+
const project_store_1 = __webpack_require__(65260);
|
|
264083
266347
|
const error_1 = __webpack_require__(64119);
|
|
264084
266348
|
const refreshTokenUrl = 'https://iaas.cloud.tencent.com/tcb_refresh';
|
|
264085
266349
|
exports.authStore = new localstore_1.LocalStore({
|
|
@@ -264094,6 +266358,8 @@ var ENV_NAME;
|
|
|
264094
266358
|
ENV_NAME["ENV_TCB_ENV_ID"] = "TENCENTCLOUD_TCB_ENVID";
|
|
264095
266359
|
ENV_NAME["ENV_RUNENV"] = "TENCENTCLOUD_RUNENV";
|
|
264096
266360
|
ENV_NAME["ENV_RUNENV_SCF"] = "TENCENTCLOUD_RUNENV=SCF";
|
|
266361
|
+
ENV_NAME["ENV_CLOUDBASE_API_KEY"] = "CLOUDBASE_API_KEY";
|
|
266362
|
+
ENV_NAME["ENV_CLOUDBASE_ENV_ID"] = "CLOUDBASE_ENV_ID";
|
|
264097
266363
|
})(ENV_NAME = exports.ENV_NAME || (exports.ENV_NAME = {}));
|
|
264098
266364
|
function resolveCredentialFormEnv() {
|
|
264099
266365
|
const getEnvVar = (envName) => {
|
|
@@ -264108,9 +266374,48 @@ function resolveCredentialFormEnv() {
|
|
|
264108
266374
|
token
|
|
264109
266375
|
};
|
|
264110
266376
|
}
|
|
266377
|
+
/**
|
|
266378
|
+
* 从环境变量检测 CloudBase API Key
|
|
266379
|
+
* 优先级高于 TENCENTCLOUD_SECRETID/KEY
|
|
266380
|
+
*/
|
|
266381
|
+
function resolveApiKeyFromEnv() {
|
|
266382
|
+
const apiKey = process.env[ENV_NAME.ENV_CLOUDBASE_API_KEY];
|
|
266383
|
+
const envId = process.env[ENV_NAME.ENV_CLOUDBASE_ENV_ID];
|
|
266384
|
+
if (apiKey && envId) {
|
|
266385
|
+
return { apiKey, envId };
|
|
266386
|
+
}
|
|
266387
|
+
return null;
|
|
266388
|
+
}
|
|
266389
|
+
// 获取项目级存储的 API Key 凭证
|
|
266390
|
+
function getProjectApiKeyCredential(cwd) {
|
|
266391
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
266392
|
+
try {
|
|
266393
|
+
const store = (0, project_store_1.getProjectStore)(cwd, { _: '', credential: {} }, 'auth');
|
|
266394
|
+
const stored = yield store.get('credential');
|
|
266395
|
+
if (!stored || !stored.secretId || !stored.authSource) {
|
|
266396
|
+
return null;
|
|
266397
|
+
}
|
|
266398
|
+
return (0, common_1.resolveCredential)(stored) || null;
|
|
266399
|
+
}
|
|
266400
|
+
catch (_a) {
|
|
266401
|
+
return null;
|
|
266402
|
+
}
|
|
266403
|
+
});
|
|
266404
|
+
}
|
|
264111
266405
|
// 获取 credential 数据
|
|
264112
|
-
function getCredentialData() {
|
|
266406
|
+
function getCredentialData(options) {
|
|
264113
266407
|
return __awaiter(this, void 0, void 0, function* () {
|
|
266408
|
+
// 1. 如果有 cwd,优先从项目级存储读取 API Key 凭证
|
|
266409
|
+
if (options === null || options === void 0 ? void 0 : options.cwd) {
|
|
266410
|
+
const projectCredential = yield getProjectApiKeyCredential(options.cwd);
|
|
266411
|
+
if (projectCredential) {
|
|
266412
|
+
return projectCredential;
|
|
266413
|
+
}
|
|
266414
|
+
}
|
|
266415
|
+
// 2. 检查 CLOUDBASE_API_KEY 环境变量(优先于 TENCENTCLOUD_*)
|
|
266416
|
+
// 注意:环境变量的 API Key 需要在外部调用 exchangeApiKeyForCredential 后才能使用
|
|
266417
|
+
// 这里只返回已有的凭证,不主动触发 exchange
|
|
266418
|
+
// 3. 原有逻辑:全局 auth.json → TENCENTCLOUD_* 环境变量
|
|
264114
266419
|
const localData = (yield exports.authStore.get('credential'));
|
|
264115
266420
|
const cloudCredentail = resolveCredentialFormEnv();
|
|
264116
266421
|
const credential = (0, common_1.resolveCredential)(localData) || cloudCredentail;
|
|
@@ -264196,11 +266501,38 @@ const isTokenExpired = (credential, gap = 120) => credential.accessTokenExpired
|
|
|
264196
266501
|
function checkAndGetCredential(options = {}) {
|
|
264197
266502
|
return __awaiter(this, void 0, void 0, function* () {
|
|
264198
266503
|
// 从本地存储中读取 credential
|
|
264199
|
-
const credential = yield getCredentialData();
|
|
266504
|
+
const credential = yield getCredentialData({ cwd: options.cwd });
|
|
264200
266505
|
if (!credential) {
|
|
264201
266506
|
return null;
|
|
264202
266507
|
}
|
|
264203
|
-
//
|
|
266508
|
+
// API Key 来源的凭证:过期后用 apiKey 重新换取
|
|
266509
|
+
if (credential.authSource === 'api_key' && credential.apiKey) {
|
|
266510
|
+
if (!isTokenExpired(credential)) {
|
|
266511
|
+
return wrapCheckAuth(credential, options);
|
|
266512
|
+
}
|
|
266513
|
+
// 过期了,用 apiKey 重新换取
|
|
266514
|
+
try {
|
|
266515
|
+
const refreshed = yield (0, api_key_1.exchangeApiKeyForCredential)({
|
|
266516
|
+
apiKey: credential.apiKey,
|
|
266517
|
+
envId: credential.envId
|
|
266518
|
+
});
|
|
266519
|
+
const newCredential = Object.assign(Object.assign({}, refreshed), { authSource: 'api_key', apiKey: credential.apiKey });
|
|
266520
|
+
// 存储到项目级存储(如果有 cwd)
|
|
266521
|
+
if (options.cwd) {
|
|
266522
|
+
const store = (0, project_store_1.getProjectStore)(options.cwd, { _: 'CloudBase API Key 凭据,请勿分享', credential: {} }, 'auth');
|
|
266523
|
+
yield store.set('credential', newCredential);
|
|
266524
|
+
}
|
|
266525
|
+
else {
|
|
266526
|
+
yield exports.authStore.set('credential', newCredential);
|
|
266527
|
+
}
|
|
266528
|
+
return wrapCheckAuth(newCredential, options);
|
|
266529
|
+
}
|
|
266530
|
+
catch (e) {
|
|
266531
|
+
// API Key 换取失败,返回 null
|
|
266532
|
+
return null;
|
|
266533
|
+
}
|
|
266534
|
+
}
|
|
266535
|
+
// 存在临时密钥信息(Web Auth / Device Flow)
|
|
264204
266536
|
if (credential.refreshToken) {
|
|
264205
266537
|
// 临时密钥在 2 小时有效期内,可以直接使用
|
|
264206
266538
|
if (!isTokenExpired(credential)) {
|
|
@@ -264241,9 +266573,9 @@ function checkAndGetCredential(options = {}) {
|
|
|
264241
266573
|
}
|
|
264242
266574
|
exports.checkAndGetCredential = checkAndGetCredential;
|
|
264243
266575
|
// 获取身份认证信息,不校验
|
|
264244
|
-
function getCredentialWithoutCheck() {
|
|
266576
|
+
function getCredentialWithoutCheck(options) {
|
|
264245
266577
|
return __awaiter(this, void 0, void 0, function* () {
|
|
264246
|
-
const credential = yield getCredentialData();
|
|
266578
|
+
const credential = yield getCredentialData({ cwd: options === null || options === void 0 ? void 0 : options.cwd });
|
|
264247
266579
|
if (!credential) {
|
|
264248
266580
|
return null;
|
|
264249
266581
|
}
|