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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/_inline-overrides.js +7 -0
  4. package/dist/_protocol/endpoints.d.ts +14 -0
  5. package/dist/_protocol/endpoints.js +24 -0
  6. package/dist/_protocol/index.d.ts +3 -0
  7. package/dist/_protocol/index.js +20 -0
  8. package/dist/_protocol/keys.d.ts +27 -0
  9. package/dist/_protocol/keys.js +36 -0
  10. package/dist/_protocol/types.d.ts +72 -0
  11. package/dist/_protocol/types.js +3 -0
  12. package/dist/adapters/adapter.interface.d.ts +8 -0
  13. package/dist/adapters/adapter.interface.js +3 -0
  14. package/dist/adapters/converters/passthrough.d.ts +16 -0
  15. package/dist/adapters/converters/passthrough.js +19 -0
  16. package/dist/adapters/index.d.ts +3 -0
  17. package/dist/adapters/index.js +8 -0
  18. package/dist/adapters/local-fs.adapter.d.ts +12 -0
  19. package/dist/adapters/local-fs.adapter.js +37 -0
  20. package/dist/adapters/oss.adapter.d.ts +13 -0
  21. package/dist/adapters/oss.adapter.js +26 -0
  22. package/dist/adapters/wrappers/node-server.d.ts +57 -0
  23. package/dist/adapters/wrappers/node-server.js +282 -0
  24. package/dist/bin/cli.d.ts +2 -0
  25. package/dist/bin/cli.js +21 -0
  26. package/dist/commands/build.d.ts +10 -0
  27. package/dist/commands/build.js +247 -0
  28. package/dist/commands/deploy.d.ts +11 -0
  29. package/dist/commands/deploy.js +116 -0
  30. package/dist/commands/purge.d.ts +15 -0
  31. package/dist/commands/purge.js +135 -0
  32. package/dist/commands/serve.d.ts +14 -0
  33. package/dist/commands/serve.js +162 -0
  34. package/dist/commands/upload-assets.d.ts +12 -0
  35. package/dist/commands/upload-assets.js +46 -0
  36. package/dist/commands/upload-cache.d.ts +13 -0
  37. package/dist/commands/upload-cache.js +70 -0
  38. package/dist/compile/compileCacheAssetsManifest.d.ts +1 -0
  39. package/dist/compile/compileCacheAssetsManifest.js +67 -0
  40. package/dist/config/default-open-next-config.d.ts +3 -0
  41. package/dist/config/default-open-next-config.js +30 -0
  42. package/dist/index.d.ts +13 -0
  43. package/dist/index.js +36 -0
  44. package/dist/overrides/incrementalCache/gateway.d.ts +32 -0
  45. package/dist/overrides/incrementalCache/gateway.js +160 -0
  46. package/dist/overrides/tagCache/gateway.d.ts +26 -0
  47. package/dist/overrides/tagCache/gateway.js +211 -0
  48. package/dist/runtime/gateway-auth.d.ts +51 -0
  49. package/dist/runtime/gateway-auth.js +121 -0
  50. package/dist/runtime/image-proxy.d.ts +16 -0
  51. package/dist/runtime/image-proxy.js +149 -0
  52. package/dist/util/fs.d.ts +3 -0
  53. package/dist/util/fs.js +39 -0
  54. package/package.json +47 -0
  55. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS1hdXRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvZ2F0ZXdheS1hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7R0FXRzs7O0FBRUgsbUNBQWdEO0FBRWhELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDO0FBaUJoQzs7O0dBR0c7QUFDSCxTQUFTLE1BQU0sQ0FDYixLQUF3QixFQUN4QixJQUFrQjs7SUFFbEIsTUFBTSxFQUFFLEdBQUksVUFBa0IsQ0FBQyxhQUFhO1FBQzFDLENBQUMsQ0FBQyxNQUFDLFVBQWtCLENBQUMsZUFBZSxtQ0FBSSxVQUFVLENBQUMsS0FBSztRQUN6RCxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNyQixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQWdCLHFCQUFxQjtJQUNuQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztJQUMvQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDO0lBQ3pELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUM7SUFFakQsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQy9ELElBQUksQ0FBQyxNQUFN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QUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUQsSUFBSTtRQUNGLE9BQU8sTUFBTSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLEdBQUcsSUFBSTtZQUNQLE9BQU87WUFDUCxNQUFNLEVBQUUsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsTUFBTSxtQ0FBSSxVQUFVLENBQUMsTUFBTTtTQUMxQyxDQUFDLENBQUM7S0FDSjtZQUFTO1FBQ1IsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JCO0FBQ0gsQ0FBQztBQTdCRCxvQ0E2QkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdhdGV3YXkg6Ym05p2D5YWx5Lqr5a6i5oi356uvXG4gKlxuICogRkMg56uv6LCDIEdhdGV3YXkg55qE57uf5LiA562+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=