esa-pcg-cli 0.1.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/LICENSE +21 -0
- package/README.md +65 -0
- package/dist/_inline-overrides.js +7 -0
- package/dist/_protocol/endpoints.d.ts +14 -0
- package/dist/_protocol/endpoints.js +24 -0
- package/dist/_protocol/index.d.ts +3 -0
- package/dist/_protocol/index.js +20 -0
- package/dist/_protocol/keys.d.ts +27 -0
- package/dist/_protocol/keys.js +36 -0
- package/dist/_protocol/types.d.ts +72 -0
- package/dist/_protocol/types.js +3 -0
- package/dist/adapters/adapter.interface.d.ts +8 -0
- package/dist/adapters/adapter.interface.js +3 -0
- package/dist/adapters/converters/passthrough.d.ts +16 -0
- package/dist/adapters/converters/passthrough.js +19 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/local-fs.adapter.d.ts +12 -0
- package/dist/adapters/local-fs.adapter.js +37 -0
- package/dist/adapters/oss.adapter.d.ts +13 -0
- package/dist/adapters/oss.adapter.js +26 -0
- package/dist/adapters/wrappers/node-server.d.ts +57 -0
- package/dist/adapters/wrappers/node-server.js +282 -0
- package/dist/bin/cli.d.ts +2 -0
- package/dist/bin/cli.js +21 -0
- package/dist/commands/build.d.ts +10 -0
- package/dist/commands/build.js +247 -0
- package/dist/commands/deploy.d.ts +11 -0
- package/dist/commands/deploy.js +116 -0
- package/dist/commands/purge.d.ts +15 -0
- package/dist/commands/purge.js +135 -0
- package/dist/commands/serve.d.ts +14 -0
- package/dist/commands/serve.js +162 -0
- package/dist/commands/upload-assets.d.ts +12 -0
- package/dist/commands/upload-assets.js +46 -0
- package/dist/commands/upload-cache.d.ts +13 -0
- package/dist/commands/upload-cache.js +70 -0
- package/dist/compile/compileCacheAssetsManifest.d.ts +1 -0
- package/dist/compile/compileCacheAssetsManifest.js +67 -0
- package/dist/config/default-open-next-config.d.ts +3 -0
- package/dist/config/default-open-next-config.js +30 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +36 -0
- package/dist/overrides/incrementalCache/gateway.d.ts +32 -0
- package/dist/overrides/incrementalCache/gateway.js +160 -0
- package/dist/overrides/tagCache/gateway.d.ts +26 -0
- package/dist/overrides/tagCache/gateway.js +211 -0
- package/dist/runtime/gateway-auth.d.ts +51 -0
- package/dist/runtime/gateway-auth.js +121 -0
- package/dist/runtime/image-proxy.d.ts +16 -0
- package/dist/runtime/image-proxy.js +149 -0
- package/dist/util/fs.d.ts +3 -0
- package/dist/util/fs.js +39 -0
- package/package.json +47 -0
- package/runtime/pcg-image-loader.js +13 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gateway 增量缓存 Override
|
|
4
|
+
*
|
|
5
|
+
* Next.js Function 运行时的增量缓存实现,通过 Gateway 代理读写 OSS。
|
|
6
|
+
* 鉴权统一走 runtime/gateway-auth(HMAC 签名 + 4 header)。
|
|
7
|
+
*
|
|
8
|
+
* @see specs/runtime/incremental-cache-override.spec.md
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const protocol_1 = require("../../_protocol");
|
|
12
|
+
const gateway_auth_1 = require("../../runtime/gateway-auth");
|
|
13
|
+
const GET_TIMEOUT = 5000;
|
|
14
|
+
const SET_TIMEOUT = 10000;
|
|
15
|
+
const DELETE_TIMEOUT = 5000;
|
|
16
|
+
function buildKey(config, key, isFetch) {
|
|
17
|
+
return (0, protocol_1.buildOssKey)({
|
|
18
|
+
appId: `${config.aliuid}/${config.routinename}`,
|
|
19
|
+
buildId: config.version,
|
|
20
|
+
key,
|
|
21
|
+
cacheType: isFetch ? 'fetch' : 'cache',
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
class GatewayIncrementalCache {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.name = 'gateway-incremental-cache';
|
|
27
|
+
this.config = null;
|
|
28
|
+
this.configLoaded = false;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 延迟加载配置,避免在构造函数中因环境变量缺失而阻塞 Function 启动。
|
|
32
|
+
*/
|
|
33
|
+
getConfig() {
|
|
34
|
+
if (!this.configLoaded) {
|
|
35
|
+
this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
36
|
+
this.configLoaded = true;
|
|
37
|
+
}
|
|
38
|
+
return this.config;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 从 Gateway 读取缓存。
|
|
42
|
+
*/
|
|
43
|
+
async get(key, isFetch) {
|
|
44
|
+
const config = this.getConfig();
|
|
45
|
+
if (!config)
|
|
46
|
+
return null;
|
|
47
|
+
const ossKey = buildKey(config, key, isFetch);
|
|
48
|
+
try {
|
|
49
|
+
const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {
|
|
50
|
+
method: 'GET',
|
|
51
|
+
timeoutMs: GET_TIMEOUT,
|
|
52
|
+
});
|
|
53
|
+
if (res.status === 404)
|
|
54
|
+
return null;
|
|
55
|
+
if (!res.ok) {
|
|
56
|
+
if (res.status === 401 || res.status === 403) {
|
|
57
|
+
console.error(`[incrementalCache] GET 被拒绝: key="${ossKey}" (${res.status}),请检查签名 secret 或 key 前缀`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.warn(`[incrementalCache] GET 失败: key="${ossKey}", 状态码=${res.status}`);
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const body = await res.text();
|
|
65
|
+
let envelope;
|
|
66
|
+
try {
|
|
67
|
+
envelope = JSON.parse(body);
|
|
68
|
+
}
|
|
69
|
+
catch (_a) {
|
|
70
|
+
console.warn(`[incrementalCache] JSON 解析失败: key="${ossKey}"`);
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
if (!envelope ||
|
|
74
|
+
typeof envelope !== 'object' ||
|
|
75
|
+
typeof envelope.lastModified !== 'number') {
|
|
76
|
+
console.warn(`[incrementalCache] envelope 格式异常或缺 lastModified: key="${ossKey}"`);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return { value: envelope.value, lastModified: envelope.lastModified };
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
if (err.name === 'AbortError') {
|
|
83
|
+
console.warn(`[incrementalCache] GET 超时: key="${ossKey}" (${GET_TIMEOUT}ms)`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.warn(`[incrementalCache] GET 异常: key="${ossKey}", ${err.message}`);
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 向 Gateway 写入缓存。
|
|
93
|
+
*/
|
|
94
|
+
async set(key, value, isFetch) {
|
|
95
|
+
const config = this.getConfig();
|
|
96
|
+
if (!config)
|
|
97
|
+
return;
|
|
98
|
+
const ossKey = buildKey(config, key, isFetch);
|
|
99
|
+
const body = JSON.stringify({ lastModified: Date.now(), value });
|
|
100
|
+
try {
|
|
101
|
+
const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {
|
|
102
|
+
method: 'PUT',
|
|
103
|
+
headers: { 'Content-Type': 'application/json' },
|
|
104
|
+
body,
|
|
105
|
+
timeoutMs: SET_TIMEOUT,
|
|
106
|
+
});
|
|
107
|
+
if (!res.ok) {
|
|
108
|
+
if (res.status === 401 || res.status === 403) {
|
|
109
|
+
console.error(`[incrementalCache] PUT 被拒绝: key="${ossKey}" (${res.status}),请检查签名 secret 或 key 前缀`);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.warn(`[incrementalCache] PUT 失败: key="${ossKey}", 状态码=${res.status}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
if (err.name === 'AbortError') {
|
|
118
|
+
console.warn(`[incrementalCache] PUT 超时: key="${ossKey}" (${SET_TIMEOUT}ms)`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.warn(`[incrementalCache] PUT 异常: key="${ossKey}", ${err.message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 通过 Gateway 删除缓存。
|
|
127
|
+
*/
|
|
128
|
+
async delete(key, isFetch) {
|
|
129
|
+
const config = this.getConfig();
|
|
130
|
+
if (!config)
|
|
131
|
+
return;
|
|
132
|
+
const ossKey = buildKey(config, key, isFetch);
|
|
133
|
+
try {
|
|
134
|
+
const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {
|
|
135
|
+
method: 'DELETE',
|
|
136
|
+
timeoutMs: DELETE_TIMEOUT,
|
|
137
|
+
});
|
|
138
|
+
if (res.status === 404)
|
|
139
|
+
return;
|
|
140
|
+
if (!res.ok) {
|
|
141
|
+
if (res.status === 401 || res.status === 403) {
|
|
142
|
+
console.error(`[incrementalCache] DELETE 被拒绝: key="${ossKey}" (${res.status}),请检查签名 secret 或 key 前缀`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
console.warn(`[incrementalCache] DELETE 失败: key="${ossKey}", 状态码=${res.status}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
if (err.name === 'AbortError') {
|
|
151
|
+
console.warn(`[incrementalCache] DELETE 超时: key="${ossKey}" (${DELETE_TIMEOUT}ms)`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.warn(`[incrementalCache] DELETE 异常: key="${ossKey}", ${err.message}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.default = GatewayIncrementalCache;
|
|
160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvaW5jcmVtZW50YWxDYWNoZS9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQUVILDRDQUE0QztBQUM1Qyw2REFJb0M7QUFFcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQ2YsTUFBeUIsRUFDekIsR0FBVyxFQUNYLE9BQWlCO0lBRWpCLE9BQU8sSUFBQSxzQkFBVyxFQUFDO1FBQ2pCLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUMvQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsR0FBRztRQUNILFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBcUIsdUJBQXVCO0lBQTVDO1FBQ0UsU0FBSSxHQUFHLDJCQUFvQyxDQUFDO1FBRXBDLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBcUsvQixDQUFDO0lBbktDOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsR0FBVyxFQUNYLE9BQWlCO1FBRWpC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Z0JBQ2hCLFNBQVMsRUFBRSxjQUFjO2FBQzFCLENBQUMsQ0FBQztZQUVILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO2dCQUFFLE9BQU87WUFFL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtvQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCx1Q0FBdUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLHlCQUF5QixDQUN2RixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0NBQXNDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7aUJBQ0g7YUFDRjtTQUNGO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDakIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLGNBQWMsS0FBSyxDQUN0RSxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDaEUsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUF6S0QsMENBeUtDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IOWinumHj+e8k+WtmCBPdmVycmlkZVxuICpcbiAqIE5leHQuanMgRnVuY3Rpb24g6L+Q6KGM5pe255qE5aKe6YeP57yT5a2Y5a6e546w77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIE9TU+OAglxuICog6Ym05p2D57uf5LiA6LWwIHJ1bnRpbWUvZ2F0ZXdheS1hdXRo77yISE1BQyDnrb7lkI0gKyA0IGhlYWRlcu+8ieOAglxuICpcbiAqIEBzZWUgc3BlY3MvcnVudGltZS9pbmNyZW1lbnRhbC1jYWNoZS1vdmVycmlkZS5zcGVjLm1kXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRPc3NLZXkgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuXG5jb25zdCBHRVRfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBTRVRfVElNRU9VVCA9IDEwMDAwO1xuY29uc3QgREVMRVRFX1RJTUVPVVQgPSA1MDAwO1xuXG5mdW5jdGlvbiBidWlsZEtleShcbiAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAga2V5OiBzdHJpbmcsXG4gIGlzRmV0Y2g/OiBib29sZWFuXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRPc3NLZXkoe1xuICAgIGFwcElkOiBgJHtjb25maWcuYWxpdWlkfS8ke2NvbmZpZy5yb3V0aW5lbmFtZX1gLFxuICAgIGJ1aWxkSWQ6IGNvbmZpZy52ZXJzaW9uLFxuICAgIGtleSxcbiAgICBjYWNoZVR5cGU6IGlzRmV0Y2ggPyAnZmV0Y2gnIDogJ2NhY2hlJyxcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhdGV3YXlJbmNyZW1lbnRhbENhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LWluY3JlbWVudGFsLWNhY2hlJyBhcyBjb25zdDtcblxuICBwcml2YXRlIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWdMb2FkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICog5bu26L+f5Yqg6L296YWN572u77yM6YG/5YWN5Zyo5p6E6YCg5Ye95pWw5Lit5Zug546v5aKD5Y+Y6YeP57y65aSx6ICM6Zi75aGeIEZ1bmN0aW9uIOWQr+WKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maWcoKTogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnTG9hZGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWdMb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICog5LuOIEdhdGV3YXkg6K+75Y+W57yT5a2Y44CCXG4gICAqL1xuICBhc3luYyBnZXQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXNGZXRjaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx7IHZhbHVlOiBhbnk7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvc3NLZXkgPSBidWlsZEtleShjb25maWcsIGtleSwgaXNGZXRjaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgdGltZW91dE1zOiBHRVRfVElNRU9VVCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbnVsbDtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICBsZXQgZW52ZWxvcGU6IHsgbGFzdE1vZGlmaWVkPzogdW5rbm93bjsgdmFsdWU/OiB1bmtub3duIH07XG4gICAgICB0cnkge1xuICAgICAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbaW5jcmVtZW50YWxDYWNoZV0gSlNPTiDop6PmnpDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhZW52ZWxvcGUgfHxcbiAgICAgICAgdHlwZW9mIGVudmVsb3BlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICB0eXBlb2YgZW52ZWxvcGUubGFzdE1vZGlmaWVkICE9PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIGVudmVsb3BlIOagvOW8j+W8guW4uOaIlue8uiBsYXN0TW9kaWZpZWQ6IGtleT1cIiR7b3NzS2V5fVwiYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiBlbnZlbG9wZS52YWx1ZSwgbGFzdE1vZGlmaWVkOiBlbnZlbG9wZS5sYXN0TW9kaWZpZWQgfTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gR0VUIOi2heaXtjoga2V5PVwiJHtvc3NLZXl9XCIgKCR7R0VUX1RJTUVPVVR9bXMpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gR0VUIOW8guW4uDoga2V5PVwiJHtvc3NLZXl9XCIsICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWQkSBHYXRld2F5IOWGmeWFpee8k+WtmOOAglxuICAgKi9cbiAgYXN5bmMgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgaXNGZXRjaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3NzS2V5ID0gYnVpbGRLZXkoY29uZmlnLCBrZXksIGlzRmV0Y2gpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHksXG4gICAgICAgIHRpbWVvdXRNczogU0VUX1RJTUVPVVQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtTRVRfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBHYXRld2F5IOWIoOmZpOe8k+WtmOOAglxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nLCBpc0ZldGNoPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IG9zc0tleSA9IGJ1aWxkS2V5KGNvbmZpZywga2V5LCBpc0ZldGNoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCBgL3N0b3JhZ2UvJHtvc3NLZXl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB0aW1lb3V0TXM6IERFTEVURV9USU1FT1VULFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQpIHJldHVybjtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtERUxFVEVfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway Tag 缓存 Override (nextMode)
|
|
3
|
+
*
|
|
4
|
+
* 使用 OpenNext 的 nextMode 接口,通过 Gateway 代理读写 TableStore。
|
|
5
|
+
* 鉴权统一走 runtime/gateway-auth(HMAC 签名 + 4 header)。
|
|
6
|
+
*/
|
|
7
|
+
declare type NextModeTagCacheWriteInput = string | {
|
|
8
|
+
tag: string;
|
|
9
|
+
stale?: number;
|
|
10
|
+
expire?: number;
|
|
11
|
+
};
|
|
12
|
+
export default class GatewayTagCache {
|
|
13
|
+
name: "gateway-tag-cache";
|
|
14
|
+
mode: "nextMode";
|
|
15
|
+
private config;
|
|
16
|
+
private configLoaded;
|
|
17
|
+
private getConfig;
|
|
18
|
+
private buildTagKey;
|
|
19
|
+
getLastRevalidated(tags: string[]): Promise<number>;
|
|
20
|
+
hasBeenRevalidated(tags: string[], lastModified?: number): Promise<boolean>;
|
|
21
|
+
isStale(tags: string[], lastModified?: number): Promise<boolean>;
|
|
22
|
+
writeTags(tags: NextModeTagCacheWriteInput[]): Promise<void>;
|
|
23
|
+
private batchGetTags;
|
|
24
|
+
private batchWrite;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gateway Tag 缓存 Override (nextMode)
|
|
4
|
+
*
|
|
5
|
+
* 使用 OpenNext 的 nextMode 接口,通过 Gateway 代理读写 TableStore。
|
|
6
|
+
* 鉴权统一走 runtime/gateway-auth(HMAC 签名 + 4 header)。
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const gateway_auth_1 = require("../../runtime/gateway-auth");
|
|
10
|
+
const QUERY_TIMEOUT = 3000;
|
|
11
|
+
const WRITE_TIMEOUT = 5000;
|
|
12
|
+
const BATCH_SIZE = 200;
|
|
13
|
+
function stripLeadingSlash(s) {
|
|
14
|
+
return s.replace(/^\/+/, '');
|
|
15
|
+
}
|
|
16
|
+
class GatewayTagCache {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.name = 'gateway-tag-cache';
|
|
19
|
+
this.mode = 'nextMode';
|
|
20
|
+
this.config = null;
|
|
21
|
+
this.configLoaded = false;
|
|
22
|
+
}
|
|
23
|
+
getConfig() {
|
|
24
|
+
if (!this.configLoaded) {
|
|
25
|
+
this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
26
|
+
this.configLoaded = true;
|
|
27
|
+
}
|
|
28
|
+
return this.config;
|
|
29
|
+
}
|
|
30
|
+
buildTagKey(tag) {
|
|
31
|
+
const config = this.getConfig();
|
|
32
|
+
if (!config)
|
|
33
|
+
return tag;
|
|
34
|
+
return `${config.version}/${stripLeadingSlash(tag)}`;
|
|
35
|
+
}
|
|
36
|
+
async getLastRevalidated(tags) {
|
|
37
|
+
const config = this.getConfig();
|
|
38
|
+
if (!config)
|
|
39
|
+
return 0;
|
|
40
|
+
try {
|
|
41
|
+
const rows = await this.batchGetTags(config, tags);
|
|
42
|
+
let maxRevalidatedAt = 0;
|
|
43
|
+
for (const row of rows) {
|
|
44
|
+
if (row.revalidatedAt && row.revalidatedAt > maxRevalidatedAt) {
|
|
45
|
+
maxRevalidatedAt = row.revalidatedAt;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return maxRevalidatedAt;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
console.warn(`[tagCache] getLastRevalidated error: ${err.message}`);
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async hasBeenRevalidated(tags, lastModified) {
|
|
56
|
+
const config = this.getConfig();
|
|
57
|
+
if (!config)
|
|
58
|
+
return false;
|
|
59
|
+
if (tags.length === 0)
|
|
60
|
+
return false;
|
|
61
|
+
try {
|
|
62
|
+
const rows = await this.batchGetTags(config, tags);
|
|
63
|
+
const now = Date.now();
|
|
64
|
+
const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;
|
|
65
|
+
for (const row of rows) {
|
|
66
|
+
if (row.expire !== undefined) {
|
|
67
|
+
if (row.expire <= now && row.expire > lm) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (row.revalidatedAt !== undefined && row.revalidatedAt > lm) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.warn(`[tagCache] hasBeenRevalidated error: ${err.message}`);
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async isStale(tags, lastModified) {
|
|
83
|
+
var _a;
|
|
84
|
+
const config = this.getConfig();
|
|
85
|
+
if (!config)
|
|
86
|
+
return false;
|
|
87
|
+
if (tags.length === 0)
|
|
88
|
+
return false;
|
|
89
|
+
try {
|
|
90
|
+
const rows = await this.batchGetTags(config, tags);
|
|
91
|
+
const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;
|
|
92
|
+
for (const row of rows) {
|
|
93
|
+
if (row.stale === undefined)
|
|
94
|
+
continue;
|
|
95
|
+
const revalidatedAt = (_a = row.revalidatedAt) !== null && _a !== void 0 ? _a : 0;
|
|
96
|
+
if (revalidatedAt > lm && row.stale >= lm) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.warn(`[tagCache] isStale error: ${err.message}`);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
async writeTags(tags) {
|
|
108
|
+
if (!tags || tags.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
const config = this.getConfig();
|
|
111
|
+
if (!config)
|
|
112
|
+
return;
|
|
113
|
+
const writeTs = Date.now();
|
|
114
|
+
const rows = tags.map(input => {
|
|
115
|
+
const tagStr = typeof input === 'string' ? input : input.tag;
|
|
116
|
+
const stale = typeof input === 'string' ? undefined : input.stale;
|
|
117
|
+
const expire = typeof input === 'string' ? undefined : input.expire;
|
|
118
|
+
const tagKey = this.buildTagKey(tagStr);
|
|
119
|
+
const columns = [
|
|
120
|
+
{ name: 'revalidatedAt', value: writeTs },
|
|
121
|
+
];
|
|
122
|
+
if (stale !== undefined) {
|
|
123
|
+
columns.push({ name: 'stale', value: stale });
|
|
124
|
+
}
|
|
125
|
+
if (expire !== undefined) {
|
|
126
|
+
columns.push({ name: 'expire', value: expire });
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
primaryKey: [
|
|
130
|
+
{ name: 'app_id', value: `${config.aliuid}/${config.routinename}` },
|
|
131
|
+
{ name: 'tag', value: tagKey },
|
|
132
|
+
],
|
|
133
|
+
columns,
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
await this.batchWrite(config, rows);
|
|
137
|
+
}
|
|
138
|
+
// ---- private methods ----
|
|
139
|
+
async batchGetTags(config, tags) {
|
|
140
|
+
const primaryKeys = tags.map(tag => [
|
|
141
|
+
{ name: 'app_id', value: `${config.aliuid}/${config.routinename}` },
|
|
142
|
+
{ name: 'tag', value: this.buildTagKey(tag) },
|
|
143
|
+
]);
|
|
144
|
+
const res = await (0, gateway_auth_1.gatewayFetch)(config, '/table/batch-get-row', {
|
|
145
|
+
method: 'POST',
|
|
146
|
+
headers: { 'Content-Type': 'application/json' },
|
|
147
|
+
body: JSON.stringify({ primaryKeys }),
|
|
148
|
+
timeoutMs: QUERY_TIMEOUT,
|
|
149
|
+
});
|
|
150
|
+
if (!res.ok) {
|
|
151
|
+
if (res.status === 401 || res.status === 403) {
|
|
152
|
+
console.error(`[tagCache] batch-get-row rejected (${res.status})`);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.warn(`[tagCache] batch-get-row failed: status=${res.status}`);
|
|
156
|
+
}
|
|
157
|
+
return [];
|
|
158
|
+
}
|
|
159
|
+
const data = (await res.json());
|
|
160
|
+
if (!data.rows)
|
|
161
|
+
return [];
|
|
162
|
+
return data.rows.map(row => {
|
|
163
|
+
var _a;
|
|
164
|
+
const result = {};
|
|
165
|
+
for (const col of (_a = row.columns) !== null && _a !== void 0 ? _a : []) {
|
|
166
|
+
if (col.name === 'revalidatedAt' && typeof col.value === 'number') {
|
|
167
|
+
result.revalidatedAt = col.value;
|
|
168
|
+
}
|
|
169
|
+
else if (col.name === 'stale' && typeof col.value === 'number') {
|
|
170
|
+
result.stale = col.value;
|
|
171
|
+
}
|
|
172
|
+
else if (col.name === 'expire' && typeof col.value === 'number') {
|
|
173
|
+
result.expire = col.value;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return result;
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
async batchWrite(config, rows) {
|
|
180
|
+
if (rows.length === 0)
|
|
181
|
+
return;
|
|
182
|
+
for (let i = 0; i < rows.length; i += BATCH_SIZE) {
|
|
183
|
+
const batch = rows.slice(i, i + BATCH_SIZE);
|
|
184
|
+
try {
|
|
185
|
+
const res = await (0, gateway_auth_1.gatewayFetch)(config, '/table/batch-write', {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers: { 'Content-Type': 'application/json' },
|
|
188
|
+
body: JSON.stringify({ rows: batch }),
|
|
189
|
+
timeoutMs: WRITE_TIMEOUT,
|
|
190
|
+
});
|
|
191
|
+
if (res.status === 401 || res.status === 403) {
|
|
192
|
+
console.error(`[tagCache] batch-write rejected (${res.status})`);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (!res.ok) {
|
|
196
|
+
console.warn(`[tagCache] batch-write failed: status=${res.status}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err.name === 'AbortError') {
|
|
201
|
+
console.warn(`[tagCache] batch-write timeout (${WRITE_TIMEOUT}ms)`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.warn(`[tagCache] batch-write error: ${err.message}`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
exports.default = GatewayTagCache;
|
|
211
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBRXBDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDO0FBRXZCLFNBQVMsaUJBQWlCLENBQUMsQ0FBUztJQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFnQkQsTUFBcUIsZUFBZTtJQUFwQztRQUNFLFNBQUksR0FBRyxtQkFBNEIsQ0FBQztRQUNwQyxTQUFJLEdBQUcsVUFBbUIsQ0FBQztRQUVuQixXQUFNLEdBQTZCLElBQUksQ0FBQztRQUN4QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztJQTBOL0IsQ0FBQztJQXhOUyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFBLG9DQUFxQixHQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXO1FBQzdCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sR0FBRyxDQUFDO1FBQ3hCLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFjO1FBQ3JDLE1BQU0sTUFBTSxH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RTtvQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDckU7YUFDRjtZQUFDLE9BQU8sR0FBUSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO29CQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxhQUFhLEtBQUssQ0FBQyxDQUFDO2lCQUNyRTtxQkFBTTtvQkFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztpQkFDOUQ7YUFDRjtTQUNGO0lBQ0gsQ0FBQztDQUNGO0FBL05ELGtDQStOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2F0ZXdheSBUYWcg57yT5a2YIE92ZXJyaWRlIChuZXh0TW9kZSlcbiAqXG4gKiDkvb/nlKggT3Blbk5leHQg55qEIG5leHRNb2RlIOaOpeWPo++8jOmAmui/hyBHYXRld2F5IOS7o+eQhuivu+WGmSBUYWJsZVN0b3Jl44CCXG4gKiDpibTmnYPnu5/kuIDotbAgcnVudGltZS9nYXRld2F5LWF1dGjvvIhITUFDIOetvuWQjSArIDQgaGVhZGVy77yJ44CCXG4gKi9cblxuaW1wb3J0IHtcbiAgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLFxuICBnYXRld2F5RmV0Y2gsXG4gIEdhdGV3YXlBdXRoQ29uZmlnLFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxudHlwZSBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwge1xuICAgICAgdGFnOiBzdHJpbmc7XG4gICAgICBzdGFsZT86IG51bWJlcjtcbiAgICAgIGV4cGlyZT86IG51bWJlcjtcbiAgICB9O1xuXG5pbnRlcmZhY2UgVGFnUm93IHtcbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhbGU/OiBudW1iZXI7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheVRhZ0NhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LXRhZy1jYWNoZScgYXMgY29uc3Q7XG4gIG1vZGUgPSAnbmV4dE1vZGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZ2V0Q29uZmlnKCk6IEdhdGV3YXlBdXRoQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ0xvYWRlZCkge1xuICAgICAgdGhpcy5jb25maWcgPSBsb2FkR2F0ZXdheUF1dGhDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnTG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRhZ0tleSh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIHRhZztcbiAgICByZXR1cm4gYCR7Y29uZmlnLnZlcnNpb259LyR7c3RyaXBMZWFkaW5nU2xhc2godGFnKX1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0TGFzdFJldmFsaWRhdGVkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGxldCBtYXhSZXZhbGlkYXRlZEF0ID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICYmIHJvdy5yZXZhbGlkYXRlZEF0ID4gbWF4UmV2YWxpZGF0ZWRBdCkge1xuICAgICAgICAgIG1heFJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1heFJldmFsaWRhdGVkQXQ7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBnZXRMYXN0UmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNCZWVuUmV2YWxpZGF0ZWQoXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5leHBpcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyb3cuZXhwaXJlIDw9IG5vdyAmJiByb3cuZXhwaXJlID4gbG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm93LnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGhhc0JlZW5SZXZhbGlkYXRlZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1N0YWxlKHRhZ3M6IHN0cmluZ1tdLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdGFsZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IHJvdy5yZXZhbGlkYXRlZEF0ID8/IDA7XG4gICAgICAgIGlmIChyZXZhbGlkYXRlZEF0ID4gbG0gJiYgcm93LnN0YWxlID49IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGlzU3RhbGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgd3JpdGVUYWdzKHRhZ3M6IE5leHRNb2RlVGFnQ2FjaGVXcml0ZUlucHV0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IHdyaXRlVHMgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRhZ3MubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IHRhZ1N0ciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IGlucHV0LnRhZztcbiAgICAgIGNvbnN0IHN0YWxlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LnN0YWxlO1xuICAgICAgY29uc3QgZXhwaXJlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LmV4cGlyZTtcbiAgICAgIGNvbnN0IHRhZ0tleSA9IHRoaXMuYnVpbGRUYWdLZXkodGFnU3RyKTtcblxuICAgICAgY29uc3QgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW1xuICAgICAgICB7IG5hbWU6ICdyZXZhbGlkYXRlZEF0JywgdmFsdWU6IHdyaXRlVHMgfSxcbiAgICAgIF07XG4gICAgICBpZiAoc3RhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2x1bW5zLnB1c2goeyBuYW1lOiAnc3RhbGUnLCB2YWx1ZTogc3RhbGUgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ2V4cGlyZScsIHZhbHVlOiBleHBpcmUgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByaW1hcnlLZXk6IFtcbiAgICAgICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0YWdLZXkgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmJhdGNoV3JpdGUoY29uZmlnLCByb3dzKTtcbiAgfVxuXG4gIC8vIC0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIGJhdGNoR2V0VGFncyhcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHRhZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8VGFnUm93W10+IHtcbiAgICBjb25zdCBwcmltYXJ5S2V5cyA9IHRhZ3MubWFwKHRhZyA9PiBbXG4gICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgeyBuYW1lOiAndGFnJywgdmFsdWU6IHRoaXMuYnVpbGRUYWdLZXkodGFnKSB9LFxuICAgIF0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC1nZXQtcm93Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJpbWFyeUtleXMgfSksXG4gICAgICB0aW1lb3V0TXM6IFFVRVJZX1RJTUVPVVQsXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICAgIHJvd3M/OiB7XG4gICAgICAgIHByaW1hcnlLZXk/OiBhbnlbXTtcbiAgICAgICAgY29sdW1ucz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXTtcbiAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgaWYgKCFkYXRhLnJvd3MpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBkYXRhLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgICBjb25zdCByZXN1bHQ6IFRhZ1JvdyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBjb2wgb2Ygcm93LmNvbHVtbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSAncmV2YWxpZGF0ZWRBdCcgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQucmV2YWxpZGF0ZWRBdCA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ3N0YWxlJyAmJiB0eXBlb2YgY29sLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlc3VsdC5zdGFsZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ2V4cGlyZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuZXhwaXJlID0gY29sLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaFdyaXRlKFxuICAgIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcsXG4gICAgcm93czoge1xuICAgICAgcHJpbWFyeUtleTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgICAgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgIH1bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSByb3dzLnNsaWNlKGksIGkgKyBCQVRDSF9TSVpFKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC13cml0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJvd3M6IGJhdGNoIH0pLFxuICAgICAgICAgIHRpbWVvdXRNczogV1JJVEVfVElNRU9VVCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgcmVqZWN0ZWQgKCR7cmVzLnN0YXR1c30pYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgZmFpbGVkOiBzdGF0dXM9JHtyZXMuc3RhdHVzfWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSB0aW1lb3V0ICgke1dSSVRFX1RJTUVPVVR9bXMpYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gateway 鉴权共享客户端
|
|
3
|
+
*
|
|
4
|
+
* FC 端调 Gateway 的统一签名实现。所有 override 和 image-proxy 共用此 client,
|
|
5
|
+
* 确保签名算法与 Gateway 验证侧(src/middleware/jwt-auth.middleware.ts)一致。
|
|
6
|
+
*
|
|
7
|
+
* 算法:
|
|
8
|
+
* authKey = HMAC-SHA256(secret, aliuid + routinename + version) → hex
|
|
9
|
+
* md5Hash = MD5(authKey + expires + aliuid + routinename + version) → hex
|
|
10
|
+
* Authorization = `${expires}-${md5Hash}`
|
|
11
|
+
* expires = 毫秒时间戳
|
|
12
|
+
*/
|
|
13
|
+
export interface GatewayAuthConfig {
|
|
14
|
+
gatewayUrl: string;
|
|
15
|
+
secret: string;
|
|
16
|
+
aliuid: string;
|
|
17
|
+
routinename: string;
|
|
18
|
+
version: string;
|
|
19
|
+
}
|
|
20
|
+
export interface GatewaySignedHeaders {
|
|
21
|
+
authorization: string;
|
|
22
|
+
aliuid: string;
|
|
23
|
+
routinename: string;
|
|
24
|
+
version: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 从环境变量加载配置。缺必需变量返回 null + console.error,不抛。
|
|
28
|
+
*
|
|
29
|
+
* ESA runtime 直接注入以下 5 个 env:
|
|
30
|
+
* - ESA_CACHE_GW_GATEWAY_ENDPOINT
|
|
31
|
+
* - ESA_CACHE_GW_AUTH_KEY
|
|
32
|
+
* - ESA_CACHE_GW_ALIUID
|
|
33
|
+
* - ESA_CACHE_GW_ROUTINENAME
|
|
34
|
+
* - ESA_CACHE_GW_VERSION
|
|
35
|
+
*/
|
|
36
|
+
export declare function loadGatewayAuthConfig(): GatewayAuthConfig | null;
|
|
37
|
+
/**
|
|
38
|
+
* 算 Gateway 鉴权 4 header。每次请求重算 expires。
|
|
39
|
+
* 算法严格对齐 src/middleware/jwt-auth.middleware.ts:66-75。
|
|
40
|
+
*/
|
|
41
|
+
export declare function signGatewayHeaders(cfg: GatewayAuthConfig, ttlMs?: number): GatewaySignedHeaders;
|
|
42
|
+
/**
|
|
43
|
+
* 自动注入签名 4 header 后 fetch;带超时控制(AbortController)。
|
|
44
|
+
*
|
|
45
|
+
* @param cfg loadGatewayAuthConfig() 返回值
|
|
46
|
+
* @param pathOrUrl 以 `/` 开头视为路径,与 cfg.gatewayUrl 拼接;否则视为完整 URL
|
|
47
|
+
* @param init RequestInit + 可选 timeoutMs
|
|
48
|
+
*/
|
|
49
|
+
export declare function gatewayFetch(cfg: GatewayAuthConfig, pathOrUrl: string, init?: RequestInit & {
|
|
50
|
+
timeoutMs?: number;
|
|
51
|
+
}): Promise<Response>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Gateway 鉴权共享客户端
|
|
4
|
+
*
|
|
5
|
+
* FC 端调 Gateway 的统一签名实现。所有 override 和 image-proxy 共用此 client,
|
|
6
|
+
* 确保签名算法与 Gateway 验证侧(src/middleware/jwt-auth.middleware.ts)一致。
|
|
7
|
+
*
|
|
8
|
+
* 算法:
|
|
9
|
+
* authKey = HMAC-SHA256(secret, aliuid + routinename + version) → hex
|
|
10
|
+
* md5Hash = MD5(authKey + expires + aliuid + routinename + version) → hex
|
|
11
|
+
* Authorization = `${expires}-${md5Hash}`
|
|
12
|
+
* expires = 毫秒时间戳
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.gatewayFetch = exports.signGatewayHeaders = exports.loadGatewayAuthConfig = void 0;
|
|
16
|
+
const crypto_1 = require("crypto");
|
|
17
|
+
const DEFAULT_TTL_MS = 5 * 60 * 1000;
|
|
18
|
+
const DEFAULT_TIMEOUT_MS = 5000;
|
|
19
|
+
/**
|
|
20
|
+
* 使用未被 Next.js patch 的原始 fetch,避免 cache override 内部请求
|
|
21
|
+
* 被 Next.js 拦截导致递归死锁。延迟解析以允许测试环境 mock。
|
|
22
|
+
*/
|
|
23
|
+
function _fetch(input, init) {
|
|
24
|
+
var _a;
|
|
25
|
+
const fn = globalThis.__nextPatched
|
|
26
|
+
? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch
|
|
27
|
+
: globalThis.fetch;
|
|
28
|
+
return fn(input, init);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 从环境变量加载配置。缺必需变量返回 null + console.error,不抛。
|
|
32
|
+
*
|
|
33
|
+
* ESA runtime 直接注入以下 5 个 env:
|
|
34
|
+
* - ESA_CACHE_GW_GATEWAY_ENDPOINT
|
|
35
|
+
* - ESA_CACHE_GW_AUTH_KEY
|
|
36
|
+
* - ESA_CACHE_GW_ALIUID
|
|
37
|
+
* - ESA_CACHE_GW_ROUTINENAME
|
|
38
|
+
* - ESA_CACHE_GW_VERSION
|
|
39
|
+
*/
|
|
40
|
+
function loadGatewayAuthConfig() {
|
|
41
|
+
const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;
|
|
42
|
+
const secret = process.env.ESA_CACHE_GW_AUTH_KEY;
|
|
43
|
+
const aliuid = process.env.ESA_CACHE_GW_ALIUID;
|
|
44
|
+
const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;
|
|
45
|
+
const version = process.env.ESA_CACHE_GW_VERSION;
|
|
46
|
+
const missing = [];
|
|
47
|
+
if (!gatewayUrl)
|
|
48
|
+
missing.push('ESA_CACHE_GW_GATEWAY_ENDPOINT');
|
|
49
|
+
if (!secret)
|
|
50
|
+
missing.push('ESA_CACHE_GW_AUTH_KEY');
|
|
51
|
+
if (!aliuid)
|
|
52
|
+
missing.push('ESA_CACHE_GW_ALIUID');
|
|
53
|
+
if (!routinename)
|
|
54
|
+
missing.push('ESA_CACHE_GW_ROUTINENAME');
|
|
55
|
+
if (!version)
|
|
56
|
+
missing.push('ESA_CACHE_GW_VERSION');
|
|
57
|
+
if (missing.length > 0) {
|
|
58
|
+
console.error(`[gateway-auth] 缺少必需的环境变量: ${missing.join(', ')}`);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
gatewayUrl: gatewayUrl.replace(/\/+$/, ''),
|
|
63
|
+
secret: secret,
|
|
64
|
+
aliuid: aliuid,
|
|
65
|
+
routinename: routinename,
|
|
66
|
+
version: version,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
exports.loadGatewayAuthConfig = loadGatewayAuthConfig;
|
|
70
|
+
/**
|
|
71
|
+
* 算 Gateway 鉴权 4 header。每次请求重算 expires。
|
|
72
|
+
* 算法严格对齐 src/middleware/jwt-auth.middleware.ts:66-75。
|
|
73
|
+
*/
|
|
74
|
+
function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {
|
|
75
|
+
const expires = String(Date.now() + ttlMs);
|
|
76
|
+
const authKey = cfg.secret;
|
|
77
|
+
const md5Hash = (0, crypto_1.createHash)('md5')
|
|
78
|
+
.update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`)
|
|
79
|
+
.digest('hex');
|
|
80
|
+
return {
|
|
81
|
+
authorization: `${expires}-${md5Hash}`,
|
|
82
|
+
aliuid: cfg.aliuid,
|
|
83
|
+
routinename: cfg.routinename,
|
|
84
|
+
version: cfg.version,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
exports.signGatewayHeaders = signGatewayHeaders;
|
|
88
|
+
/**
|
|
89
|
+
* 自动注入签名 4 header 后 fetch;带超时控制(AbortController)。
|
|
90
|
+
*
|
|
91
|
+
* @param cfg loadGatewayAuthConfig() 返回值
|
|
92
|
+
* @param pathOrUrl 以 `/` 开头视为路径,与 cfg.gatewayUrl 拼接;否则视为完整 URL
|
|
93
|
+
* @param init RequestInit + 可选 timeoutMs
|
|
94
|
+
*/
|
|
95
|
+
async function gatewayFetch(cfg, pathOrUrl, init) {
|
|
96
|
+
var _a, _b;
|
|
97
|
+
const url = pathOrUrl.startsWith('/')
|
|
98
|
+
? `${cfg.gatewayUrl}${pathOrUrl}`
|
|
99
|
+
: pathOrUrl;
|
|
100
|
+
const signed = signGatewayHeaders(cfg);
|
|
101
|
+
const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);
|
|
102
|
+
headers.set('Authorization', signed.authorization);
|
|
103
|
+
headers.set('AliUid', signed.aliuid);
|
|
104
|
+
headers.set('RoutineName', signed.routinename);
|
|
105
|
+
headers.set('Version', signed.version);
|
|
106
|
+
const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;
|
|
107
|
+
const controller = new AbortController();
|
|
108
|
+
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
109
|
+
try {
|
|
110
|
+
return await _fetch(url, {
|
|
111
|
+
...init,
|
|
112
|
+
headers,
|
|
113
|
+
signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
clearTimeout(timer);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.gatewayFetch = gatewayFetch;
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS1hdXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvZ2F0ZXdheS1hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7O0FBRUgsbUNBQWdEO0FBRWhELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBaUJoQzs7O0dBR0c7QUFDSCxTQUFTLE1BQU0sQ0FDYixLQUF3QixFQUN4QixJQUFrQjs7SUFFbEIsTUFBTSxFQUFFLEdBQUksVUFBa0IsQ0FBQyxhQUFhO1FBQzFDLENBQUMsQ0FBQyxNQUFDLFVBQWtCLENBQUMsZUFBZSxtQ0FBSSxVQUFVLENBQUMsS0FBSztRQUN6RCxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNyQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7SUFFakQsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQy9ELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ25ELElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2pELElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzNELElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ25ELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdEIsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE9BQU87UUFDTCxVQUFVLEVBQUUsVUFBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBQzNDLE1BQU0sRUFBRSxNQUFPO1FBQ2YsTUFBTSxFQUFFLE1BQU87UUFDZixXQUFXLEVBQUUsV0FBWTtRQUN6QixPQUFPLEVBQUUsT0FBUTtLQUNsQixDQUFDO0FBQ0osQ0FBQztBQXpCRCxzREF5QkM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FDaEMsR0FBc0IsRUFDdEIsUUFBZ0IsY0FBYztJQUU5QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBQSxtQkFBVSxFQUFDLEtBQUssQ0FBQztTQUM5QixNQUFNLENBQUMsR0FBRyxPQUFPLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDM0UsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pCLE9BQU87UUFDTCxhQUFhLEVBQUUsR0FBRyxPQUFPLElBQUksT0FBTyxFQUFFO1FBQ3RDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtRQUNsQixXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7UUFDNUIsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0tBQ3JCLENBQUM7QUFDSixDQUFDO0FBZkQsZ0RBZUM7QUFFRDs7Ozs7O0dBTUc7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxHQUFzQixFQUN0QixTQUFpQixFQUNqQixJQUEyQzs7SUFFM0MsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7UUFDbkMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUU7UUFDakMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVkLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFdkMsTUFBTSxTQUFTLEdBQUcsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsU0FBUyxtQ0FBSSxrQkFBa0IsQ0FBQztJQUN4RCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSTtRQUNGLE9BQU8sTUFBTSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLEdBQUcsSUFBSTtZQUNQLE9BQU87WUFDUCxNQUFNLEVBQUUsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSxtQ0FBSSxVQUFVLENBQUMsTUFBTTtTQUMxQyxDQUFDLENBQUM7S0FDSjtZQUFTO1FBQ1IsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JCO0FBQ0gsQ0FBQztBQTdCRCxvQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdhdGV3YXkg6Ym05p2D5YWx5Lqr5a6i5oi356uvXG4gKlxuICogRkMg56uv6LCDIEdhdGV3YXkg55qE57uf5LiA562+5ZCN5a6e546w44CC5omA5pyJIG92ZXJyaWRlIOWSjCBpbWFnZS1wcm94eSDlhbHnlKjmraQgY2xpZW5077yMXG4gKiDnoa7kv53nrb7lkI3nrpfms5XkuI4gR2F0ZXdheSDpqozor4HkvqfvvIhzcmMvbWlkZGxld2FyZS9qd3QtYXV0aC5taWRkbGV3YXJlLnRz77yJ5LiA6Ie044CCXG4gKlxuICog566X5rOV77yaXG4gKiAgIGF1dGhLZXkgPSBITUFDLVNIQTI1NihzZWNyZXQsIGFsaXVpZCArIHJvdXRpbmVuYW1lICsgdmVyc2lvbikg4oaSIGhleFxuICogICBtZDVIYXNoID0gTUQ1KGF1dGhLZXkgKyBleHBpcmVzICsgYWxpdWlkICsgcm91dGluZW5hbWUgKyB2ZXJzaW9uKSDihpIgaGV4XG4gKiAgIEF1dGhvcml6YXRpb24gPSBgJHtleHBpcmVzfS0ke21kNUhhc2h9YFxuICogICBleHBpcmVzID0g5q+r56eS5pe26Ze05oizXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSG1hYywgY3JlYXRlSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5cbmNvbnN0IERFRkFVTFRfVFRMX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IERFRkFVTFRfVElNRU9VVF9NUyA9IDUwMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2F0ZXdheUF1dGhDb25maWcge1xuICBnYXRld2F5VXJsOiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nO1xuICBhbGl1aWQ6IHN0cmluZztcbiAgcm91dGluZW5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGV3YXlTaWduZWRIZWFkZXJzIHtcbiAgYXV0aG9yaXphdGlvbjogc3RyaW5nO1xuICBhbGl1aWQ6IHN0cmluZztcbiAgcm91dGluZW5hbWU6IHN0cmluZztcbiAgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIOS9v+eUqOacquiiqyBOZXh0LmpzIHBhdGNoIOeahOWOn+WniyBmZXRjaO+8jOmBv+WFjSBjYWNoZSBvdmVycmlkZSDlhoXpg6jor7fmsYJcbiAqIOiiqyBOZXh0LmpzIOaLpuaIquWvvOiHtOmAkuW9kuatu+mUgeOAguW7tui/n+ino+aekOS7peWFgeiuuOa1i+ivleeOr+WigyBtb2Nr44CCXG4gKi9cbmZ1bmN0aW9uIF9mZXRjaChcbiAgaW5wdXQ6IFJlcXVlc3RJbmZvIHwgVVJMLFxuICBpbml0PzogUmVxdWVzdEluaXRcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgZm4gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fbmV4dFBhdGNoZWRcbiAgICA/IChnbG9iYWxUaGlzIGFzIGFueSkuX19vcmlnaW5hbEZldGNoID8/IGdsb2JhbFRoaXMuZmV0Y2hcbiAgICA6IGdsb2JhbFRoaXMuZmV0Y2g7XG4gIHJldHVybiBmbihpbnB1dCwgaW5pdCk7XG59XG5cbi8qKlxuICog5LuO546v5aKD5Y+Y6YeP5Yqg6L296YWN572u44CC57y65b+F6ZyA5Y+Y6YeP6L+U5ZueIG51bGwgKyBjb25zb2xlLmVycm9y77yM5LiN5oqb44CCXG4gKlxuICogRVNBIHJ1bnRpbWUg55u05o6l5rOo5YWl5Lul5LiLIDUg5LiqIGVudu+8mlxuICogICAtIEVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UXG4gKiAgIC0gRVNBX0NBQ0hFX0dXX0FVVEhfS0VZXG4gKiAgIC0gRVNBX0NBQ0hFX0dXX0FMSVVJRFxuICogICAtIEVTQV9DQUNIRV9HV19ST1VUSU5FTkFNRVxuICogICAtIEVTQV9DQUNIRV9HV19WRVJTSU9OXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkR2F0ZXdheUF1dGhDb25maWcoKTogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsIHtcbiAgY29uc3QgZ2F0ZXdheVVybCA9IHByb2Nlc3MuZW52LkVTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UO1xuICBjb25zdCBzZWNyZXQgPSBwcm9jZXNzLmVudi5FU0FfQ0FDSEVfR1dfQVVUSF9LRVk7XG4gIGNvbnN0IGFsaXVpZCA9IHByb2Nlc3MuZW52LkVTQV9DQUNIRV9HV19BTElVSUQ7XG4gIGNvbnN0IHJvdXRpbmVuYW1lID0gcHJvY2Vzcy5lbnYuRVNBX0NBQ0hFX0dXX1JPVVRJTkVOQU1FO1xuICBjb25zdCB2ZXJzaW9uID0gcHJvY2Vzcy5lbnYuRVNBX0NBQ0hFX0dXX1ZFUlNJT047XG5cbiAgY29uc3QgbWlzc2luZzogc3RyaW5nW10gPSBbXTtcbiAgaWYgKCFnYXRld2F5VXJsKSBtaXNzaW5nLnB1c2goJ0VTQV9DQUNIRV9HV19HQVRFV0FZX0VORFBPSU5UJyk7XG4gIGlmICghc2VjcmV0KSBtaXNzaW5nLnB1c2goJ0VTQV9DQUNIRV9HV19BVVRIX0tFWScpO1xuICBpZiAoIWFsaXVpZCkgbWlzc2luZy5wdXNoKCdFU0FfQ0FDSEVfR1dfQUxJVUlEJyk7XG4gIGlmICghcm91dGluZW5hbWUpIG1pc3NpbmcucHVzaCgnRVNBX0NBQ0hFX0dXX1JPVVRJTkVOQU1FJyk7XG4gIGlmICghdmVyc2lvbikgbWlzc2luZy5wdXNoKCdFU0FfQ0FDSEVfR1dfVkVSU0lPTicpO1xuICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5lcnJvcihgW2dhdGV3YXktYXV0aF0g57y65bCR5b+F6ZyA55qE546v5aKD5Y+Y6YePOiAke21pc3Npbmcuam9pbignLCAnKX1gKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2F0ZXdheVVybDogZ2F0ZXdheVVybCEucmVwbGFjZSgvXFwvKyQvLCAnJyksXG4gICAgc2VjcmV0OiBzZWNyZXQhLFxuICAgIGFsaXVpZDogYWxpdWlkISxcbiAgICByb3V0aW5lbmFtZTogcm91dGluZW5hbWUhLFxuICAgIHZlcnNpb246IHZlcnNpb24hLFxuICB9O1xufVxuXG4vKipcbiAqIOeulyBHYXRld2F5IOmJtOadgyA0IGhlYWRlcuOAguavj+asoeivt+axgumHjeeulyBleHBpcmVz44CCXG4gKiDnrpfms5XkuKXmoLzlr7npvZAgc3JjL21pZGRsZXdhcmUvand0LWF1dGgubWlkZGxld2FyZS50czo2Ni03NeOAglxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbkdhdGV3YXlIZWFkZXJzKFxuICBjZmc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICB0dGxNczogbnVtYmVyID0gREVGQVVMVF9UVExfTVNcbik6IEdhdGV3YXlTaWduZWRIZWFkZXJzIHtcbiAgY29uc3QgZXhwaXJlcyA9IFN0cmluZyhEYXRlLm5vdygpICsgdHRsTXMpO1xuICBjb25zdCBhdXRoS2V5ID0gY2ZnLnNlY3JldDtcbiAgY29uc3QgbWQ1SGFzaCA9IGNyZWF0ZUhhc2goJ21kNScpXG4gICAgLnVwZGF0ZShgJHthdXRoS2V5fSR7ZXhwaXJlc30ke2NmZy5hbGl1aWR9JHtjZmcucm91dGluZW5hbWV9JHtjZmcudmVyc2lvbn1gKVxuICAgIC5kaWdlc3QoJ2hleCcpO1xuICByZXR1cm4ge1xuICAgIGF1dGhvcml6YXRpb246IGAke2V4cGlyZXN9LSR7bWQ1SGFzaH1gLFxuICAgIGFsaXVpZDogY2ZnLmFsaXVpZCxcbiAgICByb3V0aW5lbmFtZTogY2ZnLnJvdXRpbmVuYW1lLFxuICAgIHZlcnNpb246IGNmZy52ZXJzaW9uLFxuICB9O1xufVxuXG4vKipcbiAqIOiHquWKqOazqOWFpeetvuWQjSA0IGhlYWRlciDlkI4gZmV0Y2jvvJvluKbotoXml7bmjqfliLbvvIhBYm9ydENvbnRyb2xsZXLvvInjgIJcbiAqXG4gKiBAcGFyYW0gY2ZnIGxvYWRHYXRld2F5QXV0aENvbmZpZygpIOi/lOWbnuWAvFxuICogQHBhcmFtIHBhdGhPclVybCDku6UgYC9gIOW8gOWktOinhuS4uui3r+W+hO+8jOS4jiBjZmcuZ2F0ZXdheVVybCDmi7zmjqXvvJvlkKbliJnop4bkuLrlrozmlbQgVVJMXG4gKiBAcGFyYW0gaW5pdCBSZXF1ZXN0SW5pdCArIOWPr+mAiSB0aW1lb3V0TXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdhdGV3YXlGZXRjaChcbiAgY2ZnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAgcGF0aE9yVXJsOiBzdHJpbmcsXG4gIGluaXQ/OiBSZXF1ZXN0SW5pdCAmIHsgdGltZW91dE1zPzogbnVtYmVyIH1cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgdXJsID0gcGF0aE9yVXJsLnN0YXJ0c1dpdGgoJy8nKVxuICAgID8gYCR7Y2ZnLmdhdGV3YXlVcmx9JHtwYXRoT3JVcmx9YFxuICAgIDogcGF0aE9yVXJsO1xuXG4gIGNvbnN0IHNpZ25lZCA9IHNpZ25HYXRld2F5SGVhZGVycyhjZmcpO1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gIGhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgc2lnbmVkLmF1dGhvcml6YXRpb24pO1xuICBoZWFkZXJzLnNldCgnQWxpVWlkJywgc2lnbmVkLmFsaXVpZCk7XG4gIGhlYWRlcnMuc2V0KCdSb3V0aW5lTmFtZScsIHNpZ25lZC5yb3V0aW5lbmFtZSk7XG4gIGhlYWRlcnMuc2V0KCdWZXJzaW9uJywgc2lnbmVkLnZlcnNpb24pO1xuXG4gIGNvbnN0IHRpbWVvdXRNcyA9IGluaXQ/LnRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVM7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcyk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgX2ZldGNoKHVybCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBzaWduYWw6IGluaXQ/LnNpZ25hbCA/PyBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG59XG4iXX0=
|