esa-pcg-cli 0.1.2 → 0.1.4
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/README.md +10 -24
- package/dist/_inline-overrides.js +2 -2
- package/dist/_protocol/types.d.ts +3 -0
- package/dist/_protocol/types.js +1 -1
- package/dist/adapters/wrappers/node-server.js +6 -2
- package/dist/commands/build.js +25 -1
- package/dist/overrides/tagCache/gateway.d.ts +3 -0
- package/dist/overrides/tagCache/gateway.js +31 -1
- package/dist/runtime/cdn-purge.d.ts +53 -0
- package/dist/runtime/cdn-purge.js +259 -0
- package/dist/runtime/edge-context.d.ts +26 -0
- package/dist/runtime/edge-context.js +77 -0
- package/dist/runtime/image-config.d.ts +45 -0
- package/dist/runtime/image-config.js +144 -0
- package/dist/runtime/image-proxy.js +15 -1
- package/package.json +1 -1
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
const gateway_auth_1 = require("../../runtime/gateway-auth");
|
|
10
|
+
const cdn_purge_1 = require("../../runtime/cdn-purge");
|
|
10
11
|
const QUERY_TIMEOUT = 3000;
|
|
11
12
|
const WRITE_TIMEOUT = 5000;
|
|
12
13
|
const BATCH_SIZE = 200;
|
|
@@ -19,6 +20,8 @@ class GatewayTagCache {
|
|
|
19
20
|
this.mode = 'nextMode';
|
|
20
21
|
this.config = null;
|
|
21
22
|
this.configLoaded = false;
|
|
23
|
+
this.purgeClient = null;
|
|
24
|
+
this.purgeClientLoaded = false;
|
|
22
25
|
}
|
|
23
26
|
getConfig() {
|
|
24
27
|
if (!this.configLoaded) {
|
|
@@ -27,6 +30,14 @@ class GatewayTagCache {
|
|
|
27
30
|
}
|
|
28
31
|
return this.config;
|
|
29
32
|
}
|
|
33
|
+
getPurgeClient() {
|
|
34
|
+
if (!this.purgeClientLoaded) {
|
|
35
|
+
const cfg = (0, cdn_purge_1.loadCdnPurgeConfig)();
|
|
36
|
+
this.purgeClient = cfg ? (0, cdn_purge_1.createCdnPurgeClient)(cfg) : null;
|
|
37
|
+
this.purgeClientLoaded = true;
|
|
38
|
+
}
|
|
39
|
+
return this.purgeClient;
|
|
40
|
+
}
|
|
30
41
|
buildTagKey(tag) {
|
|
31
42
|
const config = this.getConfig();
|
|
32
43
|
if (!config)
|
|
@@ -134,9 +145,24 @@ class GatewayTagCache {
|
|
|
134
145
|
};
|
|
135
146
|
});
|
|
136
147
|
await this.batchWrite(config, rows);
|
|
148
|
+
// 写库成功后,fire-and-forget 触发 ESA 边缘缓存失效。
|
|
149
|
+
// 任何失败都不应回灌到调用方,所以 catch 直接 warn,不 throw、不 await。
|
|
150
|
+
const purgeClient = this.getPurgeClient();
|
|
151
|
+
if (purgeClient) {
|
|
152
|
+
const tagStrs = tags
|
|
153
|
+
.map(t => (typeof t === 'string' ? t : t.tag))
|
|
154
|
+
.filter((s) => typeof s === 'string' && s.length > 0);
|
|
155
|
+
if (tagStrs.length > 0) {
|
|
156
|
+
purgeClient.purgeByTags(tagStrs).catch(err => {
|
|
157
|
+
var _a;
|
|
158
|
+
console.warn(`[tagCache] purge fan-out failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
137
162
|
}
|
|
138
163
|
// ---- private methods ----
|
|
139
164
|
async batchGetTags(config, tags) {
|
|
165
|
+
var _a, _b;
|
|
140
166
|
const primaryKeys = tags.map(tag => [
|
|
141
167
|
{ name: 'app_id', value: `${config.aliuid}/${config.routinename}` },
|
|
142
168
|
{ name: 'tag', value: this.buildTagKey(tag) },
|
|
@@ -157,6 +183,7 @@ class GatewayTagCache {
|
|
|
157
183
|
return [];
|
|
158
184
|
}
|
|
159
185
|
const data = (await res.json());
|
|
186
|
+
console.log(`[tagCache] batch-get-row ok: tags=${tags.length} rows=${(_b = (_a = data.rows) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0}`);
|
|
160
187
|
if (!data.rows)
|
|
161
188
|
return [];
|
|
162
189
|
return data.rows.map(row => {
|
|
@@ -195,6 +222,9 @@ class GatewayTagCache {
|
|
|
195
222
|
if (!res.ok) {
|
|
196
223
|
console.warn(`[tagCache] batch-write failed: status=${res.status}`);
|
|
197
224
|
}
|
|
225
|
+
else {
|
|
226
|
+
console.log(`[tagCache] batch-write ok: rows=${batch.length}`);
|
|
227
|
+
}
|
|
198
228
|
}
|
|
199
229
|
catch (err) {
|
|
200
230
|
if (err.name === 'AbortError') {
|
|
@@ -208,4 +238,4 @@ class GatewayTagCache {
|
|
|
208
238
|
}
|
|
209
239
|
}
|
|
210
240
|
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=
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBQ3BDLHVEQUlpQztBQUVqQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUM7QUFDM0IsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUV2QixTQUFTLGlCQUFpQixDQUFDLENBQVM7SUFDbEMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBZ0JELE1BQXFCLGVBQWU7SUFBcEM7UUFDRSxTQUFJLEdBQUcsbUJBQTRCLENBQUM7UUFDcEMsU0FBSSxHQUFHLFVBQW1CLENBQUM7UUFFbkIsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFDeEMsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsZ0JBQVcsR0FBMEIsSUFBSSxDQUFDO1FBQzFDLHNCQUFpQixHQUFHLEtBQUssQ0FBQztJQXVQcEMsQ0FBQztJQXJQUyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFBLG9DQUFxQixHQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFBLDhCQUFrQixHQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0NBQW9CLEVBQUMsR0FBRyxDQUFDLENB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LENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtvQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCxvQ0FBb0MsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUNsRCxDQUFDO29CQUNGLE9BQU87aUJBQ1I7Z0JBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRTthQUNGO1lBQUMsT0FBTyxHQUFRLEVBQUU7Z0JBQ2pCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7b0JBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUNBQW1DLGFBQWEsS0FBSyxDQUFDLENBQUM7aUJBQ3JFO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2lCQUM5RDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUEvUEQsa0NBK1BDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IFRhZyDnvJPlrZggT3ZlcnJpZGUgKG5leHRNb2RlKVxuICpcbiAqIOS9v+eUqCBPcGVuTmV4dCDnmoQgbmV4dE1vZGUg5o6l5Y+j77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIFRhYmxlU3RvcmXjgIJcbiAqIOmJtOadg+e7n+S4gOi1sCBydW50aW1lL2dhdGV3YXktYXV0aO+8iEhNQUMg562+5ZCNICsgNCBoZWFkZXLvvInjgIJcbiAqL1xuXG5pbXBvcnQge1xuICBsb2FkR2F0ZXdheUF1dGhDb25maWcsXG4gIGdhdGV3YXlGZXRjaCxcbiAgR2F0ZXdheUF1dGhDb25maWcsXG59IGZyb20gJy4uLy4uL3J1bnRpbWUvZ2F0ZXdheS1hdXRoJztcbmltcG9ydCB7XG4gIGxvYWRDZG5QdXJnZUNvbmZpZyxcbiAgY3JlYXRlQ2RuUHVyZ2VDbGllbnQsXG4gIENkblB1cmdlQ2xpZW50LFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2Nkbi1wdXJnZSc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxudHlwZSBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwge1xuICAgICAgdGFnOiBzdHJpbmc7XG4gICAgICBzdGFsZT86IG51bWJlcjtcbiAgICAgIGV4cGlyZT86IG51bWJlcjtcbiAgICB9O1xuXG5pbnRlcmZhY2UgVGFnUm93IHtcbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhbGU/OiBudW1iZXI7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheVRhZ0NhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LXRhZy1jYWNoZScgYXMgY29uc3Q7XG4gIG1vZGUgPSAnbmV4dE1vZGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHVyZ2VDbGllbnQ6IENkblB1cmdlQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHVyZ2VDbGllbnRMb2FkZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGdldENvbmZpZygpOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWdMb2FkZWQpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHVyZ2VDbGllbnQoKTogQ2RuUHVyZ2VDbGllbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucHVyZ2VDbGllbnRMb2FkZWQpIHtcbiAgICAgIGNvbnN0IGNmZyA9IGxvYWRDZG5QdXJnZUNvbmZpZygpO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudCA9IGNmZyA/IGNyZWF0ZUNkblB1cmdlQ2xpZW50KGNmZykgOiBudWxsO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudExvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1cmdlQ2xpZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFRhZ0tleSh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIHRhZztcbiAgICByZXR1cm4gYCR7Y29uZmlnLnZlcnNpb259LyR7c3RyaXBMZWFkaW5nU2xhc2godGFnKX1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0TGFzdFJldmFsaWRhdGVkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGxldCBtYXhSZXZhbGlkYXRlZEF0ID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICYmIHJvdy5yZXZhbGlkYXRlZEF0ID4gbWF4UmV2YWxpZGF0ZWRBdCkge1xuICAgICAgICAgIG1heFJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1heFJldmFsaWRhdGVkQXQ7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBnZXRMYXN0UmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNCZWVuUmV2YWxpZGF0ZWQoXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5leHBpcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyb3cuZXhwaXJlIDw9IG5vdyAmJiByb3cuZXhwaXJlID4gbG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm93LnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGhhc0JlZW5SZXZhbGlkYXRlZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1N0YWxlKHRhZ3M6IHN0cmluZ1tdLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdGFsZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IHJvdy5yZXZhbGlkYXRlZEF0ID8/IDA7XG4gICAgICAgIGlmIChyZXZhbGlkYXRlZEF0ID4gbG0gJiYgcm93LnN0YWxlID49IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGlzU3RhbGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgd3JpdGVUYWdzKHRhZ3M6IE5leHRNb2RlVGFnQ2FjaGVXcml0ZUlucHV0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IHdyaXRlVHMgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRhZ3MubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IHRhZ1N0ciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IGlucHV0LnRhZztcbiAgICAgIGNvbnN0IHN0YWxlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LnN0YWxlO1xuICAgICAgY29uc3QgZXhwaXJlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LmV4cGlyZTtcbiAgICAgIGNvbnN0IHRhZ0tleSA9IHRoaXMuYnVpbGRUYWdLZXkodGFnU3RyKTtcblxuICAgICAgY29uc3QgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdID0gW1xuICAgICAgICB7IG5hbWU6ICdyZXZhbGlkYXRlZEF0JywgdmFsdWU6IHdyaXRlVHMgfSxcbiAgICAgIF07XG4gICAgICBpZiAoc3RhbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb2x1bW5zLnB1c2goeyBuYW1lOiAnc3RhbGUnLCB2YWx1ZTogc3RhbGUgfSk7XG4gICAgICB9XG4gICAgICBpZiAoZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ2V4cGlyZScsIHZhbHVlOiBleHBpcmUgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByaW1hcnlLZXk6IFtcbiAgICAgICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0YWdLZXkgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLmJhdGNoV3JpdGUoY29uZmlnLCByb3dzKTtcblxuICAgIC8vIOWGmeW6k+aIkOWKn+WQjixmaXJlLWFuZC1mb3JnZXQg6Kem5Y+RIEVTQSDovrnnvJjnvJPlrZjlpLHmlYjjgIJcbiAgICAvLyDku7vkvZXlpLHotKXpg73kuI3lupTlm57ngYzliLDosIPnlKjmlrks5omA5LulIGNhdGNoIOebtOaOpSB3YXJuLOS4jSB0aHJvd+OAgeS4jSBhd2FpdOOAglxuICAgIGNvbnN0IHB1cmdlQ2xpZW50ID0gdGhpcy5nZXRQdXJnZUNsaWVudCgpO1xuICAgIGlmIChwdXJnZUNsaWVudCkge1xuICAgICAgY29uc3QgdGFnU3RycyA9IHRhZ3NcbiAgICAgICAgLm1hcCh0ID0+ICh0eXBlb2YgdCA9PT0gJ3N0cmluZycgPyB0IDogdC50YWcpKVxuICAgICAgICAuZmlsdGVyKChzKTogcyBpcyBzdHJpbmcgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnICYmIHMubGVuZ3RoID4gMCk7XG4gICAgICBpZiAodGFnU3Rycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHB1cmdlQ2xpZW50LnB1cmdlQnlUYWdzKHRhZ1N0cnMpLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIHB1cmdlIGZhbi1vdXQgZmFpbGVkOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS1cblxuICBwcml2YXRlIGFzeW5jIGJhdGNoR2V0VGFncyhcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHRhZ3M6IHN0cmluZ1tdXG4gICk6IFByb21pc2U8VGFnUm93W10+IHtcbiAgICBjb25zdCBwcmltYXJ5S2V5cyA9IHRhZ3MubWFwKHRhZyA9PiBbXG4gICAgICB7IG5hbWU6ICdhcHBfaWQnLCB2YWx1ZTogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCB9LFxuICAgICAgeyBuYW1lOiAndGFnJywgdmFsdWU6IHRoaXMuYnVpbGRUYWdLZXkodGFnKSB9LFxuICAgIF0pO1xuXG4gICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC1nZXQtcm93Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJpbWFyeUtleXMgfSksXG4gICAgICB0aW1lb3V0TXM6IFFVRVJZX1RJTUVPVVQsXG4gICAgfSk7XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIHtcbiAgICAgIHJvd3M/OiB7XG4gICAgICAgIHByaW1hcnlLZXk/OiBhbnlbXTtcbiAgICAgICAgY29sdW1ucz86IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXTtcbiAgICAgIH1bXTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICBgW3RhZ0NhY2hlXSBiYXRjaC1nZXQtcm93IG9rOiB0YWdzPSR7dGFncy5sZW5ndGh9IHJvd3M9JHtkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwfWBcbiAgICApO1xuXG4gICAgaWYgKCFkYXRhLnJvd3MpIHJldHVybiBbXTtcblxuICAgIHJldHVybiBkYXRhLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgICBjb25zdCByZXN1bHQ6IFRhZ1JvdyA9IHt9O1xuICAgICAgZm9yIChjb25zdCBjb2wgb2Ygcm93LmNvbHVtbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGNvbC5uYW1lID09PSAncmV2YWxpZGF0ZWRBdCcgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQucmV2YWxpZGF0ZWRBdCA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ3N0YWxlJyAmJiB0eXBlb2YgY29sLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlc3VsdC5zdGFsZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChjb2wubmFtZSA9PT0gJ2V4cGlyZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuZXhwaXJlID0gY29sLnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaFdyaXRlKFxuICAgIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcsXG4gICAgcm93czoge1xuICAgICAgcHJpbWFyeUtleTogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgICAgY29sdW1uczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfVtdO1xuICAgIH1bXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSByb3dzLnNsaWNlKGksIGkgKyBCQVRDSF9TSVpFKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgJy90YWJsZS9iYXRjaC13cml0ZScsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHJvd3M6IGJhdGNoIH0pLFxuICAgICAgICAgIHRpbWVvdXRNczogV1JJVEVfVElNRU9VVCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgcmVqZWN0ZWQgKCR7cmVzLnN0YXR1c30pYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgZmFpbGVkOiBzdGF0dXM9JHtyZXMuc3RhdHVzfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIG9rOiByb3dzPSR7YmF0Y2gubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSB0aW1lb3V0ICgke1dSSVRFX1RJTUVPVVR9bXMpYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDN Purge Runtime
|
|
3
|
+
*
|
|
4
|
+
* 在 revalidateTag / revalidatePath 后,fire-and-forget 触发 ESA 边缘缓存失效。
|
|
5
|
+
*
|
|
6
|
+
* 设计原则:
|
|
7
|
+
* - tag → paths 反查走 **本地** manifest(build 时由 pcg build 把
|
|
8
|
+
* .open-next/dynamodb-provider/dynamodb-cache.json 嵌入 FC bundle),
|
|
9
|
+
* 运行时第一次用到时 lazy 加载到内存 Map,后续 O(1) 查询,无网络往返
|
|
10
|
+
* - /cache/refresh 走 Gateway,沿用现有 HMAC 鉴权 + ESA 分流
|
|
11
|
+
* - 所有失败仅 warn,绝不抛错(purge 是优化,不是正确性)
|
|
12
|
+
* - hostname / siteId 走 per-request edge-context(AsyncLocalStorage),
|
|
13
|
+
* 由 node-server wrapper 从入站请求 header 注入;ctx 缺这两项时 skip + warn,
|
|
14
|
+
* 不再静默生效。鉴权(5 env)缺失则 loadCdnPurgeConfig 返回 null,
|
|
15
|
+
* 上游降级 no-op,连 client 都不构造。
|
|
16
|
+
* - 跨 tag 反查结果去重,每 path 追加 /_next/data/{buildId}/{path}.json
|
|
17
|
+
* - 调 /cache/refresh 时按 100 URL/批、batch 内并发上限 4
|
|
18
|
+
*/
|
|
19
|
+
import { GatewayAuthConfig } from './gateway-auth';
|
|
20
|
+
export interface CdnPurgeConfig extends GatewayAuthConfig {
|
|
21
|
+
/**
|
|
22
|
+
* 覆盖默认 manifest 路径,主要给测试用。
|
|
23
|
+
* 默认 = path.join(__dirname, '__pcg_tag_manifest.json'),
|
|
24
|
+
* 即 FC bundle 内与 cache.cjs 同级。
|
|
25
|
+
*/
|
|
26
|
+
manifestPath?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CdnPurgeClient {
|
|
29
|
+
/**
|
|
30
|
+
* 异步触发 ESA 缓存失效。不阻塞调用方,失败仅 warn。
|
|
31
|
+
* 内部完成 path 去重 + ISR 数据路径补全 + 限流。
|
|
32
|
+
*/
|
|
33
|
+
purgeByPaths(paths: string[]): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* tag → paths 反查 + purge。
|
|
36
|
+
* 反查走本地嵌入的 manifest 文件,无网络 IO。
|
|
37
|
+
*/
|
|
38
|
+
purgeByTags(tags: string[]): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* 加载 purge 配置。
|
|
42
|
+
*
|
|
43
|
+
* hostname / siteId 不再从 env 取,改由 node-server wrapper 在入口
|
|
44
|
+
* runWithEdgeContext(headers, …) 把请求头里的 host 与 x-alicdn-site-id 注入
|
|
45
|
+
* AsyncLocalStorage,refreshBatch 时即时读取。原因:
|
|
46
|
+
* - 一个 routine 可能服务多 site / 多 hostname,启动期 env 无法表达
|
|
47
|
+
* - 本地 dev 若没带头,这次 purge 直接 skip + warn,不再静默生效
|
|
48
|
+
*
|
|
49
|
+
* 复用 loadGatewayAuthConfig 的 5 个 env 做 HMAC 鉴权 / endpoint 选取。
|
|
50
|
+
* 缺这五个 env 返回 null,调用方应跳过 purge(不影响 tag 写库)。
|
|
51
|
+
*/
|
|
52
|
+
export declare function loadCdnPurgeConfig(): CdnPurgeConfig | null;
|
|
53
|
+
export declare function createCdnPurgeClient(cfg: CdnPurgeConfig): CdnPurgeClient;
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CDN Purge Runtime
|
|
4
|
+
*
|
|
5
|
+
* 在 revalidateTag / revalidatePath 后,fire-and-forget 触发 ESA 边缘缓存失效。
|
|
6
|
+
*
|
|
7
|
+
* 设计原则:
|
|
8
|
+
* - tag → paths 反查走 **本地** manifest(build 时由 pcg build 把
|
|
9
|
+
* .open-next/dynamodb-provider/dynamodb-cache.json 嵌入 FC bundle),
|
|
10
|
+
* 运行时第一次用到时 lazy 加载到内存 Map,后续 O(1) 查询,无网络往返
|
|
11
|
+
* - /cache/refresh 走 Gateway,沿用现有 HMAC 鉴权 + ESA 分流
|
|
12
|
+
* - 所有失败仅 warn,绝不抛错(purge 是优化,不是正确性)
|
|
13
|
+
* - hostname / siteId 走 per-request edge-context(AsyncLocalStorage),
|
|
14
|
+
* 由 node-server wrapper 从入站请求 header 注入;ctx 缺这两项时 skip + warn,
|
|
15
|
+
* 不再静默生效。鉴权(5 env)缺失则 loadCdnPurgeConfig 返回 null,
|
|
16
|
+
* 上游降级 no-op,连 client 都不构造。
|
|
17
|
+
* - 跨 tag 反查结果去重,每 path 追加 /_next/data/{buildId}/{path}.json
|
|
18
|
+
* - 调 /cache/refresh 时按 100 URL/批、batch 内并发上限 4
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.createCdnPurgeClient = exports.loadCdnPurgeConfig = void 0;
|
|
22
|
+
const fs = require("fs");
|
|
23
|
+
const path = require("path");
|
|
24
|
+
const gateway_auth_1 = require("./gateway-auth");
|
|
25
|
+
const edge_context_1 = require("./edge-context");
|
|
26
|
+
const REFRESH_TIMEOUT_MS = 15000;
|
|
27
|
+
const URL_BATCH_SIZE = 100;
|
|
28
|
+
const REFRESH_CONCURRENCY = 4;
|
|
29
|
+
// 与 build.ts 中 TAG_MANIFEST_FILENAME 保持一致(对侧是写入,这侧是读取)
|
|
30
|
+
const TAG_MANIFEST_FILENAME = '__pcg_tag_manifest.json';
|
|
31
|
+
function stripLeadingSlash(s) {
|
|
32
|
+
return s.replace(/^\/+/, '');
|
|
33
|
+
}
|
|
34
|
+
function ensureLeadingSlash(s) {
|
|
35
|
+
return s.startsWith('/') ? s : `/${s}`;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 加载 purge 配置。
|
|
39
|
+
*
|
|
40
|
+
* hostname / siteId 不再从 env 取,改由 node-server wrapper 在入口
|
|
41
|
+
* runWithEdgeContext(headers, …) 把请求头里的 host 与 x-alicdn-site-id 注入
|
|
42
|
+
* AsyncLocalStorage,refreshBatch 时即时读取。原因:
|
|
43
|
+
* - 一个 routine 可能服务多 site / 多 hostname,启动期 env 无法表达
|
|
44
|
+
* - 本地 dev 若没带头,这次 purge 直接 skip + warn,不再静默生效
|
|
45
|
+
*
|
|
46
|
+
* 复用 loadGatewayAuthConfig 的 5 个 env 做 HMAC 鉴权 / endpoint 选取。
|
|
47
|
+
* 缺这五个 env 返回 null,调用方应跳过 purge(不影响 tag 写库)。
|
|
48
|
+
*/
|
|
49
|
+
function loadCdnPurgeConfig() {
|
|
50
|
+
const base = (0, gateway_auth_1.loadGatewayAuthConfig)();
|
|
51
|
+
if (!base)
|
|
52
|
+
return null;
|
|
53
|
+
return { ...base };
|
|
54
|
+
}
|
|
55
|
+
exports.loadCdnPurgeConfig = loadCdnPurgeConfig;
|
|
56
|
+
function createCdnPurgeClient(cfg) {
|
|
57
|
+
var _a;
|
|
58
|
+
const buildId = cfg.version;
|
|
59
|
+
const pathPrefix = `${buildId}/`;
|
|
60
|
+
const manifestPath = (_a = cfg.manifestPath) !== null && _a !== void 0 ? _a : path.join(__dirname, TAG_MANIFEST_FILENAME);
|
|
61
|
+
// lazy 加载;Promise 用于并发首次调用的合流
|
|
62
|
+
let manifestPromise = null;
|
|
63
|
+
async function loadManifest() {
|
|
64
|
+
if (manifestPromise)
|
|
65
|
+
return manifestPromise;
|
|
66
|
+
manifestPromise = (async () => {
|
|
67
|
+
var _a, _b, _c, _d;
|
|
68
|
+
const map = new Map();
|
|
69
|
+
let raw;
|
|
70
|
+
try {
|
|
71
|
+
raw = await fs.promises.readFile(manifestPath, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
// ENOENT 是常见情况(纯静态项目无 tag,或老版 CLI 未嵌入),静默降级
|
|
75
|
+
if ((err === null || err === void 0 ? void 0 : err.code) !== 'ENOENT') {
|
|
76
|
+
console.warn(`[cdn-purge] manifest read error ${manifestPath}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
77
|
+
}
|
|
78
|
+
return new Map();
|
|
79
|
+
}
|
|
80
|
+
let rows;
|
|
81
|
+
try {
|
|
82
|
+
const parsed = JSON.parse(raw);
|
|
83
|
+
rows = Array.isArray(parsed) ? parsed : [];
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
console.warn(`[cdn-purge] manifest parse error ${manifestPath}: ${(_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err}`);
|
|
87
|
+
return new Map();
|
|
88
|
+
}
|
|
89
|
+
for (const row of rows) {
|
|
90
|
+
const tagPk = (_c = row === null || row === void 0 ? void 0 : row.tag) === null || _c === void 0 ? void 0 : _c.S;
|
|
91
|
+
const pathPk = (_d = row === null || row === void 0 ? void 0 : row.path) === null || _d === void 0 ? void 0 : _d.S;
|
|
92
|
+
if (typeof tagPk !== 'string' || typeof pathPk !== 'string')
|
|
93
|
+
continue;
|
|
94
|
+
// 只接受当前 buildId 的行;OpenNext 已保证 prefix,但万一混入旧行就跳过
|
|
95
|
+
if (!tagPk.startsWith(pathPrefix))
|
|
96
|
+
continue;
|
|
97
|
+
if (!pathPk.startsWith(pathPrefix))
|
|
98
|
+
continue;
|
|
99
|
+
const tag = tagPk.slice(pathPrefix.length);
|
|
100
|
+
const p = pathPk.slice(pathPrefix.length);
|
|
101
|
+
if (!tag || !p)
|
|
102
|
+
continue;
|
|
103
|
+
let bucket = map.get(tag);
|
|
104
|
+
if (!bucket) {
|
|
105
|
+
bucket = new Set();
|
|
106
|
+
map.set(tag, bucket);
|
|
107
|
+
}
|
|
108
|
+
bucket.add(p);
|
|
109
|
+
}
|
|
110
|
+
const result = new Map();
|
|
111
|
+
let totalEntries = 0;
|
|
112
|
+
for (const [tag, set] of map) {
|
|
113
|
+
result.set(tag, Array.from(set));
|
|
114
|
+
totalEntries += set.size;
|
|
115
|
+
}
|
|
116
|
+
console.log(`[cdn-purge] manifest loaded: tags=${result.size} entries=${totalEntries} (${manifestPath})`);
|
|
117
|
+
return result;
|
|
118
|
+
})();
|
|
119
|
+
return manifestPromise;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 把若干 Next 路由 path 展开成需 purge 的 URL 列表:
|
|
123
|
+
* - 跳过空串、去重(基于规范化后的 leading "/")
|
|
124
|
+
* - 对每个 path 追加 /_next/data/{buildId}/{path}.json
|
|
125
|
+
* - 拼上 https://{hostname}
|
|
126
|
+
*/
|
|
127
|
+
function expandPathsToUrls(paths, hostname) {
|
|
128
|
+
const normalized = new Set();
|
|
129
|
+
for (const p of paths) {
|
|
130
|
+
if (!p)
|
|
131
|
+
continue;
|
|
132
|
+
normalized.add(ensureLeadingSlash(p));
|
|
133
|
+
}
|
|
134
|
+
if (normalized.size === 0)
|
|
135
|
+
return [];
|
|
136
|
+
const urls = new Set();
|
|
137
|
+
for (const p of normalized) {
|
|
138
|
+
urls.add(`https://${hostname}${p}`);
|
|
139
|
+
const rel = stripLeadingSlash(p);
|
|
140
|
+
// pages router ISR 必需;app router 多打一条无副作用
|
|
141
|
+
urls.add(`https://${hostname}/_next/data/${buildId}/${rel || 'index'}.json`);
|
|
142
|
+
}
|
|
143
|
+
return Array.from(urls);
|
|
144
|
+
}
|
|
145
|
+
async function refreshBatch(urls, hostname, siteId) {
|
|
146
|
+
var _a;
|
|
147
|
+
const body = {
|
|
148
|
+
hostname,
|
|
149
|
+
siteId,
|
|
150
|
+
urls,
|
|
151
|
+
};
|
|
152
|
+
let res;
|
|
153
|
+
try {
|
|
154
|
+
res = await (0, gateway_auth_1.gatewayFetch)(cfg, '/cache/refresh', {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: { 'Content-Type': 'application/json' },
|
|
157
|
+
body: JSON.stringify(body),
|
|
158
|
+
timeoutMs: REFRESH_TIMEOUT_MS,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
console.warn(`[cdn-purge] cache/refresh error (${urls.length} urls): ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (!res.ok) {
|
|
166
|
+
let detail = '';
|
|
167
|
+
try {
|
|
168
|
+
detail = (await res.text()).slice(0, 200);
|
|
169
|
+
}
|
|
170
|
+
catch (_b) {
|
|
171
|
+
/* ignore */
|
|
172
|
+
}
|
|
173
|
+
console.warn(`[cdn-purge] cache/refresh failed status=${res.status} urls=${urls.length} ${detail}`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
console.log(`[cdn-purge] cache/refresh ok: urls=${urls.length}`);
|
|
177
|
+
}
|
|
178
|
+
async function refreshUrls(allUrls, hostname, siteId) {
|
|
179
|
+
if (allUrls.length === 0)
|
|
180
|
+
return;
|
|
181
|
+
const batches = [];
|
|
182
|
+
for (let i = 0; i < allUrls.length; i += URL_BATCH_SIZE) {
|
|
183
|
+
batches.push(allUrls.slice(i, i + URL_BATCH_SIZE));
|
|
184
|
+
}
|
|
185
|
+
// 并发上限 REFRESH_CONCURRENCY 的滑动窗口
|
|
186
|
+
let cursor = 0;
|
|
187
|
+
async function worker() {
|
|
188
|
+
while (cursor < batches.length) {
|
|
189
|
+
const idx = cursor++;
|
|
190
|
+
await refreshBatch(batches[idx], hostname, siteId);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const workers = Array.from({ length: Math.min(REFRESH_CONCURRENCY, batches.length) }, () => worker());
|
|
194
|
+
await Promise.all(workers);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* 从当前请求的 AsyncLocalStorage 拿 hostname/siteId。
|
|
198
|
+
* 缺任一即返回 null,调用方 warn 后 skip — 本地无 header 路径就是这条降级。
|
|
199
|
+
*/
|
|
200
|
+
function resolveTarget(action) {
|
|
201
|
+
const { hostname, siteId } = (0, edge_context_1.getEdgeContext)();
|
|
202
|
+
if (!hostname || siteId === undefined || siteId === '') {
|
|
203
|
+
console.warn(`[cdn-purge] ${action} skip: edge context missing (hostname=${hostname !== null && hostname !== void 0 ? hostname : '∅'} siteId=${siteId !== null && siteId !== void 0 ? siteId : '∅'}); ` +
|
|
204
|
+
`要求入站请求带 host 与 x-alicdn-site-id`);
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
return { hostname, siteId };
|
|
208
|
+
}
|
|
209
|
+
async function purgeByPaths(paths) {
|
|
210
|
+
var _a;
|
|
211
|
+
try {
|
|
212
|
+
const target = resolveTarget('purgeByPaths');
|
|
213
|
+
if (!target)
|
|
214
|
+
return;
|
|
215
|
+
const urls = expandPathsToUrls(paths, target.hostname);
|
|
216
|
+
console.log(`[cdn-purge] purgeByPaths: input=${paths.length} urls=${urls.length}`);
|
|
217
|
+
await refreshUrls(urls, target.hostname, target.siteId);
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
console.warn(`[cdn-purge] purgeByPaths error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
async function purgeByTags(tags) {
|
|
224
|
+
var _a;
|
|
225
|
+
try {
|
|
226
|
+
const uniqueTags = Array.from(new Set(tags
|
|
227
|
+
.map(t => (typeof t === 'string' ? t : ''))
|
|
228
|
+
.map(t => t.trim())
|
|
229
|
+
.filter(Boolean)));
|
|
230
|
+
if (uniqueTags.length === 0)
|
|
231
|
+
return;
|
|
232
|
+
const target = resolveTarget('purgeByTags');
|
|
233
|
+
if (!target)
|
|
234
|
+
return;
|
|
235
|
+
const map = await loadManifest();
|
|
236
|
+
const merged = new Set();
|
|
237
|
+
for (const t of uniqueTags) {
|
|
238
|
+
const paths = map.get(t);
|
|
239
|
+
if (!paths)
|
|
240
|
+
continue;
|
|
241
|
+
for (const p of paths)
|
|
242
|
+
merged.add(p);
|
|
243
|
+
}
|
|
244
|
+
if (merged.size === 0) {
|
|
245
|
+
console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=0 (manifest miss, skip)`);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const urls = expandPathsToUrls(Array.from(merged), target.hostname);
|
|
249
|
+
console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=${merged.size} urls=${urls.length}`);
|
|
250
|
+
await refreshUrls(urls, target.hostname, target.siteId);
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.warn(`[cdn-purge] purgeByTags error: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return { purgeByPaths, purgeByTags };
|
|
257
|
+
}
|
|
258
|
+
exports.createCdnPurgeClient = createCdnPurgeClient;
|
|
259
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RuLXB1cmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY2RuLXB1cmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7OztBQUVILHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0IsaURBSXdCO0FBQ3hCLGlEQUFnRDtBQUVoRCxNQUFNLGtCQUFrQixHQUFHLEtBQU0sQ0FBQztBQUVsQyxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFDM0IsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFFOUIsdURBQXVEO0FBQ3ZELE1BQU0scUJBQXFCLEdBQUcseUJBQXlCLENBQUM7QUF5QnhELFNBQVMsaUJBQWlCLENBQUMsQ0FBUztJQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQVM7SUFDbkMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDekMsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBZ0Isa0JBQWtCO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUEsb0NBQXFCLEdBQUUsQ0FBQztJQUNyQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO0FBQ3JCLENBQUM7QUFKRCxnREFJQztBQVlELFNBQWdCLG9CQUFvQixDQUFDLEdBQW1COztJQUN0RCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBQzVCLE1BQU0sVUFBVSxHQUFHLEdBQUcsT0FBTyxHQUFHLENBQUM7SUFDakMsTUFBTSxZQUFZLEdBQ2hCLE1BQUEsR0FBRyxD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QWtDLFVBQVUsQ0FBQyxNQUFNLFlBQVksTUFBTSxDQUFDLElBQUksU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQ2pHLENBQUM7WUFDRixNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDekQ7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxNQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxPQUFPLG1DQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDdkU7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBNU9ELG9EQTRPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ0ROIFB1cmdlIFJ1bnRpbWVcbiAqXG4gKiDlnKggcmV2YWxpZGF0ZVRhZyAvIHJldmFsaWRhdGVQYXRoIOWQjixmaXJlLWFuZC1mb3JnZXQg6Kem5Y+RIEVTQSDovrnnvJjnvJPlrZjlpLHmlYjjgIJcbiAqXG4gKiDorr7orqHljp/liJk6XG4gKiAgIC0gdGFnIOKGkiBwYXRocyDlj43mn6XotbAgKirmnKzlnLAqKiBtYW5pZmVzdChidWlsZCDml7bnlLEgcGNnIGJ1aWxkIOaKilxuICogICAgIC5vcGVuLW5leHQvZHluYW1vZGItcHJvdmlkZXIvZHluYW1vZGItY2FjaGUuanNvbiDltYzlhaUgRkMgYnVuZGxlKSxcbiAqICAgICDov5DooYzml7bnrKzkuIDmrKHnlKjliLDml7YgbGF6eSDliqDovb3liLDlhoXlrZggTWFwLOWQjue7rSBPKDEpIOafpeivoizml6DnvZHnu5zlvoDov5RcbiAqICAgLSAvY2FjaGUvcmVmcmVzaCDotbAgR2F0ZXdheSzmsr/nlKjnjrDmnIkgSE1BQyDpibTmnYMgKyBFU0Eg5YiG5rWBXG4gKiAgIC0g5omA5pyJ5aSx6LSl5LuFIHdhcm4s57ud5LiN5oqb6ZSZKHB1cmdlIOaYr+S8mOWMlizkuI3mmK/mraPnoa7mgKcpXG4gKiAgIC0gaG9zdG5hbWUgLyBzaXRlSWQg6LWwIHBlci1yZXF1ZXN0IGVkZ2UtY29udGV4dChBc3luY0xvY2FsU3RvcmFnZSksXG4gKiAgICAg55SxIG5vZGUtc2VydmVyIHdyYXBwZXIg5LuO5YWl56uZ6K+35rGCIGhlYWRlciDms6jlhaU7Y3R4IOe8uui/meS4pOmhueaXtiBza2lwICsgd2FybixcbiAqICAgICDkuI3lho3pnZnpu5jnlJ/mlYjjgILpibTmnYMoNSBlbnYp57y65aSx5YiZIGxvYWRDZG5QdXJnZUNvbmZpZyDov5Tlm54gbnVsbCxcbiAqICAgICDkuIrmuLjpmY3nuqcgbm8tb3As6L+eIGNsaWVudCDpg73kuI3mnoTpgKDjgIJcbiAqICAgLSDot6ggdGFnIOWPjeafpee7k+aenOWOu+mHjSzmr48gcGF0aCDov73liqAgL19uZXh0L2RhdGEve2J1aWxkSWR9L3twYXRofS5qc29uXG4gKiAgIC0g6LCDIC9jYWNoZS9yZWZyZXNoIOaXtuaMiSAxMDAgVVJML+aJueOAgWJhdGNoIOWGheW5tuWPkeS4iumZkCA0XG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENhY2hlUmVmcmVzaFJlcXVlc3QgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHsgZ2V0RWRnZUNvbnRleHQgfSBmcm9tICcuL2VkZ2UtY29udGV4dCc7XG5cbmNvbnN0IFJFRlJFU0hfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuY29uc3QgVVJMX0JBVENIX1NJWkUgPSAxMDA7XG5jb25zdCBSRUZSRVNIX0NPTkNVUlJFTkNZID0gNDtcblxuLy8g5LiOIGJ1aWxkLnRzIOS4rSBUQUdfTUFOSUZFU1RfRklMRU5BTUUg5L+d5oyB5LiA6Ie0KOWvueS+p+aYr+WGmeWFpSzov5nkvqfmmK/or7vlj5YpXG5jb25zdCBUQUdfTUFOSUZFU1RfRklMRU5BTUUgPSAnX19wY2dfdGFnX21hbmlmZXN0Lmpzb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENkblB1cmdlQ29uZmlnIGV4dGVuZHMgR2F0ZXdheUF1dGhDb25maWcge1xuICAvKipcbiAgICog6KaG55uW6buY6K6kIG1hbmlmZXN0IOi3r+W+hCzkuLvopoHnu5nmtYvor5XnlKjjgIJcbiAgICog6buY6K6kID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ19fcGNnX3RhZ19tYW5pZmVzdC5qc29uJyksXG4gICAqIOWNsyBGQyBidW5kbGUg5YaF5LiOIGNhY2hlLmNqcyDlkIznuqfjgIJcbiAgICovXG4gIG1hbmlmZXN0UGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDZG5QdXJnZUNsaWVudCB7XG4gIC8qKlxuICAgKiDlvILmraXop6blj5EgRVNBIOe8k+WtmOWkseaViOOAguS4jemYu+Whnuiwg+eUqOaWuSzlpLHotKXku4Ugd2FybuOAglxuICAgKiDlhoXpg6jlrozmiJAgcGF0aCDljrvph40gKyBJU1Ig5pWw5o2u6Lev5b6E6KGl5YWoICsg6ZmQ5rWB44CCXG4gICAqL1xuICBwdXJnZUJ5UGF0aHMocGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogdGFnIOKGkiBwYXRocyDlj43mn6UgKyBwdXJnZeOAglxuICAgKiDlj43mn6XotbDmnKzlnLDltYzlhaXnmoQgbWFuaWZlc3Qg5paH5Lu2LOaXoOe9kee7nCBJT+OAglxuICAgKi9cbiAgcHVyZ2VCeVRhZ3ModGFnczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxuZnVuY3Rpb24gZW5zdXJlTGVhZGluZ1NsYXNoKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnN0YXJ0c1dpdGgoJy8nKSA/IHMgOiBgLyR7c31gO1xufVxuXG4vKipcbiAqIOWKoOi9vSBwdXJnZSDphY3nva7jgIJcbiAqXG4gKiBob3N0bmFtZSAvIHNpdGVJZCDkuI3lho3ku44gZW52IOWPlizmlLnnlLEgbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKjlhaXlj6NcbiAqIHJ1bldpdGhFZGdlQ29udGV4dChoZWFkZXJzLCDigKYpIOaKiuivt+axguWktOmHjOeahCBob3N0IOS4jiB4LWFsaWNkbi1zaXRlLWlkIOazqOWFpVxuICogQXN5bmNMb2NhbFN0b3JhZ2UscmVmcmVzaEJhdGNoIOaXtuWNs+aXtuivu+WPluOAguWOn+WboDpcbiAqICAgLSDkuIDkuKogcm91dGluZSDlj6/og73mnI3liqHlpJogc2l0ZSAvIOWkmiBob3N0bmFtZSzlkK/liqjmnJ8gZW52IOaXoOazleihqOi+vlxuICogICAtIOacrOWcsCBkZXYg6Iul5rKh5bim5aS0LOi/measoSBwdXJnZSDnm7TmjqUgc2tpcCArIHdhcm4s5LiN5YaN6Z2Z6buY55Sf5pWIXG4gKlxuICog5aSN55SoIGxvYWRHYXRld2F5QXV0aENvbmZpZyDnmoQgNSDkuKogZW52IOWBmiBITUFDIOmJtOadgyAvIGVuZHBvaW50IOmAieWPluOAglxuICog57y66L+Z5LqU5LiqIGVudiDov5Tlm54gbnVsbCzosIPnlKjmlrnlupTot7Pov4cgcHVyZ2Uo5LiN5b2x5ZONIHRhZyDlhpnlupMp44CCXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ2RuUHVyZ2VDb25maWcoKTogQ2RuUHVyZ2VDb25maWcgfCBudWxsIHtcbiAgY29uc3QgYmFzZSA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICBpZiAoIWJhc2UpIHJldHVybiBudWxsO1xuICByZXR1cm4geyAuLi5iYXNlIH07XG59XG5cbi8qKlxuICogZHluYW1vZGItcHJvdmlkZXIvZHluYW1vZGItY2FjaGUuanNvbiDnmoTooYzmoLzlvI8g4oCU4oCUXG4gKiDnlLEgT3Blbk5leHQgYnVpbGQg55u05o6l5Lqn5Ye6LOWtl+auteWQjeWbuuWumuS4uiBEeW5hbW9EQiDlsZ7mgKfmmKDlsITmoLzlvI/jgIJcbiAqL1xuaW50ZXJmYWNlIER5bmFtb1RhZ1JvdyB7XG4gIHRhZzogeyBTOiBzdHJpbmcgfTtcbiAgcGF0aDogeyBTOiBzdHJpbmcgfTtcbiAgcmV2YWxpZGF0ZWRBdD86IHsgTjogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDZG5QdXJnZUNsaWVudChjZmc6IENkblB1cmdlQ29uZmlnKTogQ2RuUHVyZ2VDbGllbnQge1xuICBjb25zdCBidWlsZElkID0gY2ZnLnZlcnNpb247XG4gIGNvbnN0IHBhdGhQcmVmaXggPSBgJHtidWlsZElkfS9gO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPVxuICAgIGNmZy5tYW5pZmVzdFBhdGggPz8gcGF0aC5qb2luKF9fZGlybmFtZSwgVEFHX01BTklGRVNUX0ZJTEVOQU1FKTtcblxuICAvLyBsYXp5IOWKoOi9vTtQcm9taXNlIOeUqOS6juW5tuWPkemmluasoeiwg+eUqOeahOWQiOa1gVxuICBsZXQgbWFuaWZlc3RQcm9taXNlOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZ1tdPj4gfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkTWFuaWZlc3QoKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmdbXT4+IHtcbiAgICBpZiAobWFuaWZlc3RQcm9taXNlKSByZXR1cm4gbWFuaWZlc3RQcm9taXNlO1xuICAgIG1hbmlmZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gICAgICBsZXQgcmF3OiBzdHJpbmc7XG4gICAgICB0cnkge1xuICAgICAgICByYXcgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShtYW5pZmVzdFBhdGgsICd1dGYtOCcpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgLy8gRU5PRU5UIOaYr+W4uOingeaDheWGtSjnuq/pnZnmgIHpobnnm67ml6AgdGFnLOaIluiAgeeJiCBDTEkg5pyq5bWM5YWlKSzpnZnpu5jpmY3nuqdcbiAgICAgICAgaWYgKGVycj8uY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW2Nkbi1wdXJnZV0gbWFuaWZlc3QgcmVhZCBlcnJvciAke21hbmlmZXN0UGF0aH06ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgICAgfVxuICAgICAgbGV0IHJvd3M6IER5bmFtb1RhZ1Jvd1tdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShyYXcpO1xuICAgICAgICByb3dzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkIDogW107XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtjZG4tcHVyZ2VdIG1hbmlmZXN0IHBhcnNlIGVycm9yICR7bWFuaWZlc3RQYXRofTogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgICAgICBjb25zdCB0YWdQayA9IHJvdz8udGFnPy5TO1xuICAgICAgICBjb25zdCBwYXRoUGsgPSByb3c/LnBhdGg/LlM7XG4gICAgICAgIGlmICh0eXBlb2YgdGFnUGsgIT09ICdzdHJpbmcnIHx8IHR5cGVvZiBwYXRoUGsgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgLy8g5Y+q5o6l5Y+X5b2T5YmNIGJ1aWxkSWQg55qE6KGMO09wZW5OZXh0IOW3suS/neivgSBwcmVmaXgs5L2G5LiH5LiA5re35YWl5pen6KGM5bCx6Lez6L+HXG4gICAgICAgIGlmICghdGFnUGsuc3RhcnRzV2l0aChwYXRoUHJlZml4KSkgY29udGludWU7XG4gICAgICAgIGlmICghcGF0aFBrLnN0YXJ0c1dpdGgocGF0aFByZWZpeCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB0YWcgPSB0YWdQay5zbGljZShwYXRoUHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHAgPSBwYXRoUGsuc2xpY2UocGF0aFByZWZpeC5sZW5ndGgpO1xuICAgICAgICBpZiAoIXRhZyB8fCAhcCkgY29udGludWU7XG4gICAgICAgIGxldCBidWNrZXQgPSBtYXAuZ2V0KHRhZyk7XG4gICAgICAgIGlmICghYnVja2V0KSB7XG4gICAgICAgICAgYnVja2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgbWFwLnNldCh0YWcsIGJ1Y2tldCk7XG4gICAgICAgIH1cbiAgICAgICAgYnVja2V0LmFkZChwKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICAgICAgbGV0IHRvdGFsRW50cmllcyA9IDA7XG4gICAgICBmb3IgKGNvbnN0IFt0YWcsIHNldF0gb2YgbWFwKSB7XG4gICAgICAgIHJlc3VsdC5zZXQodGFnLCBBcnJheS5mcm9tKHNldCkpO1xuICAgICAgICB0b3RhbEVudHJpZXMgKz0gc2V0LnNpemU7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtjZG4tcHVyZ2VdIG1hbmlmZXN0IGxvYWRlZDogdGFncz0ke3Jlc3VsdC5zaXplfSBlbnRyaWVzPSR7dG90YWxFbnRyaWVzfSAoJHttYW5pZmVzdFBhdGh9KWBcbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pKCk7XG4gICAgcmV0dXJuIG1hbmlmZXN0UHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiDmioroi6XlubIgTmV4dCDot6/nlLEgcGF0aCDlsZXlvIDmiJDpnIAgcHVyZ2Ug55qEIFVSTCDliJfooag6XG4gICAqICAgLSDot7Pov4fnqbrkuLLjgIHljrvph40o5Z+65LqO6KeE6IyD5YyW5ZCO55qEIGxlYWRpbmcgXCIvXCIpXG4gICAqICAgLSDlr7nmr4/kuKogcGF0aCDov73liqAgL19uZXh0L2RhdGEve2J1aWxkSWR9L3twYXRofS5qc29uXG4gICAqICAgLSDmi7zkuIogaHR0cHM6Ly97aG9zdG5hbWV9XG4gICAqL1xuICBmdW5jdGlvbiBleHBhbmRQYXRoc1RvVXJscyhwYXRoczogc3RyaW5nW10sIGhvc3RuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcCBvZiBwYXRocykge1xuICAgICAgaWYgKCFwKSBjb250aW51ZTtcbiAgICAgIG5vcm1hbGl6ZWQuYWRkKGVuc3VyZUxlYWRpbmdTbGFzaChwKSk7XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkLnNpemUgPT09IDApIHJldHVybiBbXTtcblxuICAgIGNvbnN0IHVybHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHAgb2Ygbm9ybWFsaXplZCkge1xuICAgICAgdXJscy5hZGQoYGh0dHBzOi8vJHtob3N0bmFtZX0ke3B9YCk7XG4gICAgICBjb25zdCByZWwgPSBzdHJpcExlYWRpbmdTbGFzaChwKTtcbiAgICAgIC8vIHBhZ2VzIHJvdXRlciBJU1Ig5b+F6ZyAO2FwcCByb3V0ZXIg5aSa5omT5LiA5p2h5peg5Ymv5L2c55SoXG4gICAgICB1cmxzLmFkZChcbiAgICAgICAgYGh0dHBzOi8vJHtob3N0bmFtZX0vX25leHQvZGF0YS8ke2J1aWxkSWR9LyR7cmVsIHx8ICdpbmRleCd9Lmpzb25gXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbSh1cmxzKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hCYXRjaChcbiAgICB1cmxzOiBzdHJpbmdbXSxcbiAgICBob3N0bmFtZTogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJvZHk6IENhY2hlUmVmcmVzaFJlcXVlc3QgPSB7XG4gICAgICBob3N0bmFtZSxcbiAgICAgIHNpdGVJZCxcbiAgICAgIHVybHMsXG4gICAgfTtcblxuICAgIGxldCByZXM6IFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY2ZnLCAnL2NhY2hlL3JlZnJlc2gnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICAgIHRpbWVvdXRNczogUkVGUkVTSF9USU1FT1VUX01TLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtjZG4tcHVyZ2VdIGNhY2hlL3JlZnJlc2ggZXJyb3IgKCR7dXJscy5sZW5ndGh9IHVybHMpOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbGV0IGRldGFpbCA9ICcnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGV0YWlsID0gKGF3YWl0IHJlcy50ZXh0KCkpLnNsaWNlKDAsIDIwMCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLyogaWdub3JlICovXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbY2RuLXB1cmdlXSBjYWNoZS9yZWZyZXNoIGZhaWxlZCBzdGF0dXM9JHtyZXMuc3RhdHVzfSB1cmxzPSR7dXJscy5sZW5ndGh9ICR7ZGV0YWlsfWBcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBbY2RuLXB1cmdlXSBjYWNoZS9yZWZyZXNoIG9rOiB1cmxzPSR7dXJscy5sZW5ndGh9YCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoVXJscyhcbiAgICBhbGxVcmxzOiBzdHJpbmdbXSxcbiAgICBob3N0bmFtZTogc3RyaW5nLFxuICAgIHNpdGVJZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhbGxVcmxzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgYmF0Y2hlczogc3RyaW5nW11bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsVXJscy5sZW5ndGg7IGkgKz0gVVJMX0JBVENIX1NJWkUpIHtcbiAgICAgIGJhdGNoZXMucHVzaChhbGxVcmxzLnNsaWNlKGksIGkgKyBVUkxfQkFUQ0hfU0laRSkpO1xuICAgIH1cblxuICAgIC8vIOW5tuWPkeS4iumZkCBSRUZSRVNIX0NPTkNVUlJFTkNZIOeahOa7keWKqOeql+WPo1xuICAgIGxldCBjdXJzb3IgPSAwO1xuICAgIGFzeW5jIGZ1bmN0aW9uIHdvcmtlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIHdoaWxlIChjdXJzb3IgPCBiYXRjaGVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBpZHggPSBjdXJzb3IrKztcbiAgICAgICAgYXdhaXQgcmVmcmVzaEJhdGNoKGJhdGNoZXNbaWR4XSwgaG9zdG5hbWUsIHNpdGVJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd29ya2VycyA9IEFycmF5LmZyb20oXG4gICAgICB7IGxlbmd0aDogTWF0aC5taW4oUkVGUkVTSF9DT05DVVJSRU5DWSwgYmF0Y2hlcy5sZW5ndGgpIH0sXG4gICAgICAoKSA9PiB3b3JrZXIoKVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG4gIH1cblxuICAvKipcbiAgICog5LuO5b2T5YmN6K+35rGC55qEIEFzeW5jTG9jYWxTdG9yYWdlIOaLvyBob3N0bmFtZS9zaXRlSWTjgIJcbiAgICog57y65Lu75LiA5Y2z6L+U5ZueIG51bGws6LCD55So5pa5IHdhcm4g5ZCOIHNraXAg4oCUIOacrOWcsOaXoCBoZWFkZXIg6Lev5b6E5bCx5piv6L+Z5p2h6ZmN57qn44CCXG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KFxuICAgIGFjdGlvbjogc3RyaW5nXG4gICk6IHsgaG9zdG5hbWU6IHN0cmluZzsgc2l0ZUlkOiBzdHJpbmcgfCBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHNpdGVJZCB9ID0gZ2V0RWRnZUNvbnRleHQoKTtcbiAgICBpZiAoIWhvc3RuYW1lIHx8IHNpdGVJZCA9PT0gdW5kZWZpbmVkIHx8IHNpdGVJZCA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFtjZG4tcHVyZ2VdICR7YWN0aW9ufSBza2lwOiBlZGdlIGNvbnRleHQgbWlzc2luZyAoaG9zdG5hbWU9JHtob3N0bmFtZSA/PyAn4oiFJ30gc2l0ZUlkPSR7c2l0ZUlkID8/ICfiiIUnfSk7IGAgK1xuICAgICAgICAgIGDopoHmsYLlhaXnq5nor7fmsYLluKYgaG9zdCDkuI4geC1hbGljZG4tc2l0ZS1pZGBcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdG5hbWUsIHNpdGVJZCB9O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHVyZ2VCeVBhdGhzKHBhdGhzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KCdwdXJnZUJ5UGF0aHMnKTtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgICBjb25zdCB1cmxzID0gZXhwYW5kUGF0aHNUb1VybHMocGF0aHMsIHRhcmdldC5ob3N0bmFtZSk7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtjZG4tcHVyZ2VdIHB1cmdlQnlQYXRoczogaW5wdXQ9JHtwYXRocy5sZW5ndGh9IHVybHM9JHt1cmxzLmxlbmd0aH1gXG4gICAgICApO1xuICAgICAgYXdhaXQgcmVmcmVzaFVybHModXJscywgdGFyZ2V0Lmhvc3RuYW1lLCB0YXJnZXQuc2l0ZUlkKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbY2RuLXB1cmdlXSBwdXJnZUJ5UGF0aHMgZXJyb3I6ICR7ZXJyPy5tZXNzYWdlID8/IGVycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwdXJnZUJ5VGFncyh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1bmlxdWVUYWdzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICB0YWdzXG4gICAgICAgICAgICAubWFwKHQgPT4gKHR5cGVvZiB0ID09PSAnc3RyaW5nJyA/IHQgOiAnJykpXG4gICAgICAgICAgICAubWFwKHQgPT4gdC50cmltKCkpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBpZiAodW5pcXVlVGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCgncHVyZ2VCeVRhZ3MnKTtcbiAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG1hcCA9IGF3YWl0IGxvYWRNYW5pZmVzdCgpO1xuXG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB1bmlxdWVUYWdzKSB7XG4gICAgICAgIGNvbnN0IHBhdGhzID0gbWFwLmdldCh0KTtcbiAgICAgICAgaWYgKCFwYXRocykgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwYXRocykgbWVyZ2VkLmFkZChwKTtcbiAgICAgIH1cbiAgICAgIGlmIChtZXJnZWQuc2l6ZSA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgW2Nkbi1wdXJnZV0gcHVyZ2VCeVRhZ3M6IGlucHV0PSR7dW5pcXVlVGFncy5sZW5ndGh9IG1hdGNoZWQ9MCAobWFuaWZlc3QgbWlzcywgc2tpcClgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXJscyA9IGV4cGFuZFBhdGhzVG9VcmxzKEFycmF5LmZyb20obWVyZ2VkKSwgdGFyZ2V0Lmhvc3RuYW1lKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW2Nkbi1wdXJnZV0gcHVyZ2VCeVRhZ3M6IGlucHV0PSR7dW5pcXVlVGFncy5sZW5ndGh9IG1hdGNoZWQ9JHttZXJnZWQuc2l6ZX0gdXJscz0ke3VybHMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgICBhd2FpdCByZWZyZXNoVXJscyh1cmxzLCB0YXJnZXQuaG9zdG5hbWUsIHRhcmdldC5zaXRlSWQpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFtjZG4tcHVyZ2VdIHB1cmdlQnlUYWdzIGVycm9yOiAke2Vycj8ubWVzc2FnZSA/PyBlcnJ9YCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgcHVyZ2VCeVBhdGhzLCBwdXJnZUJ5VGFncyB9O1xufVxuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Edge Request Context
|
|
3
|
+
*
|
|
4
|
+
* 在 ESA / 边缘环境,siteId 和 hostname 从入站请求 header 取,不再依赖
|
|
5
|
+
* 启动时 env 注入。原因:
|
|
6
|
+
* - 一个 routine 实例可能服务多个 site / hostname(灰度、多版本、聚合域),
|
|
7
|
+
* 启动时 env 无法表达 per-request 变化
|
|
8
|
+
* - 让 ops 不必再为每个部署额外配两个 env
|
|
9
|
+
*
|
|
10
|
+
* 实现用 AsyncLocalStorage:
|
|
11
|
+
* - node-server wrapper 在 handler 入口处 runWithEdgeContext(headers, fn)
|
|
12
|
+
* - 下游 cdn-purge / 其他模块用 getEdgeContext() 同步读取
|
|
13
|
+
* - 即使 purge 是 fire-and-forget,promise 链也会继承当前 ALS,
|
|
14
|
+
* refreshBatch 内仍能拿到当时请求的 ctx
|
|
15
|
+
*
|
|
16
|
+
* 关键 header:
|
|
17
|
+
* - x-alicdn-site-id → siteId
|
|
18
|
+
* - host / x-forwarded-host → hostname(首选 host,缺失才退 x-forwarded-host)
|
|
19
|
+
*/
|
|
20
|
+
export interface EdgeContext {
|
|
21
|
+
siteId?: string | number;
|
|
22
|
+
hostname?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function buildEdgeContextFromHeaders(headers: Record<string, string | undefined>): EdgeContext;
|
|
25
|
+
export declare function runWithEdgeContext<T>(headers: Record<string, string | undefined>, fn: () => T): T;
|
|
26
|
+
export declare function getEdgeContext(): EdgeContext;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Edge Request Context
|
|
4
|
+
*
|
|
5
|
+
* 在 ESA / 边缘环境,siteId 和 hostname 从入站请求 header 取,不再依赖
|
|
6
|
+
* 启动时 env 注入。原因:
|
|
7
|
+
* - 一个 routine 实例可能服务多个 site / hostname(灰度、多版本、聚合域),
|
|
8
|
+
* 启动时 env 无法表达 per-request 变化
|
|
9
|
+
* - 让 ops 不必再为每个部署额外配两个 env
|
|
10
|
+
*
|
|
11
|
+
* 实现用 AsyncLocalStorage:
|
|
12
|
+
* - node-server wrapper 在 handler 入口处 runWithEdgeContext(headers, fn)
|
|
13
|
+
* - 下游 cdn-purge / 其他模块用 getEdgeContext() 同步读取
|
|
14
|
+
* - 即使 purge 是 fire-and-forget,promise 链也会继承当前 ALS,
|
|
15
|
+
* refreshBatch 内仍能拿到当时请求的 ctx
|
|
16
|
+
*
|
|
17
|
+
* 关键 header:
|
|
18
|
+
* - x-alicdn-site-id → siteId
|
|
19
|
+
* - host / x-forwarded-host → hostname(首选 host,缺失才退 x-forwarded-host)
|
|
20
|
+
*/
|
|
21
|
+
var _a;
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.getEdgeContext = exports.runWithEdgeContext = exports.buildEdgeContextFromHeaders = void 0;
|
|
24
|
+
const node_async_hooks_1 = require("node:async_hooks");
|
|
25
|
+
// OpenNext build 把 wrapper / tagCache 等分别作为 esbuild 入口打包,即便同一 routine
|
|
26
|
+
// 里 edge-context.ts 也会被复制成多份 —— 每份各自 `new AsyncLocalStorage()`,
|
|
27
|
+
// store 互不可见,wrapper 注入的 ctx 在 cdn-purge 一侧读到永远是 undefined。
|
|
28
|
+
// 用 Symbol.for 把单例挂到 globalThis,所有副本拿到同一个 ALS。
|
|
29
|
+
const ALS_KEY = Symbol.for('pcg.edgeContext.als');
|
|
30
|
+
const globalRef = globalThis;
|
|
31
|
+
const storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : (globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage());
|
|
32
|
+
const SITE_ID_HEADER = 'x-alicdn-site-id';
|
|
33
|
+
const HOSTNAME_HEADER = 'host';
|
|
34
|
+
const FORWARDED_HOSTNAME_HEADER = 'x-forwarded-host';
|
|
35
|
+
function pickHeader(headers, name) {
|
|
36
|
+
var _a;
|
|
37
|
+
return (_a = headers[name]) !== null && _a !== void 0 ? _a : headers[name.toLowerCase()];
|
|
38
|
+
}
|
|
39
|
+
function parseHostname(raw) {
|
|
40
|
+
var _a;
|
|
41
|
+
if (!raw)
|
|
42
|
+
return undefined;
|
|
43
|
+
const first = (_a = raw.split(',')[0]) === null || _a === void 0 ? void 0 : _a.trim();
|
|
44
|
+
return first || undefined;
|
|
45
|
+
}
|
|
46
|
+
function parseSiteId(raw) {
|
|
47
|
+
if (!raw)
|
|
48
|
+
return undefined;
|
|
49
|
+
const trimmed = raw.trim();
|
|
50
|
+
if (!trimmed)
|
|
51
|
+
return undefined;
|
|
52
|
+
const n = Number(trimmed);
|
|
53
|
+
return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;
|
|
54
|
+
}
|
|
55
|
+
function buildEdgeContextFromHeaders(headers) {
|
|
56
|
+
var _a;
|
|
57
|
+
const ctx = {};
|
|
58
|
+
const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));
|
|
59
|
+
if (siteId !== undefined)
|
|
60
|
+
ctx.siteId = siteId;
|
|
61
|
+
const hostname = (_a = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a !== void 0 ? _a : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));
|
|
62
|
+
if (hostname)
|
|
63
|
+
ctx.hostname = hostname;
|
|
64
|
+
return ctx;
|
|
65
|
+
}
|
|
66
|
+
exports.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;
|
|
67
|
+
function runWithEdgeContext(headers, fn) {
|
|
68
|
+
const ctx = buildEdgeContextFromHeaders(headers);
|
|
69
|
+
return storage.run(ctx, fn);
|
|
70
|
+
}
|
|
71
|
+
exports.runWithEdgeContext = runWithEdgeContext;
|
|
72
|
+
function getEdgeContext() {
|
|
73
|
+
var _a;
|
|
74
|
+
return (_a = storage.getStore()) !== null && _a !== void 0 ? _a : {};
|
|
75
|
+
}
|
|
76
|
+
exports.getEdgeContext = getEdgeContext;
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRnZS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvZWRnZS1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7O0FBRUgsdURBQXFEO0FBT3JELHNFQUFzRTtBQUN0RSxnRUFBZ0U7QUFDaEUsNERBQTREO0FBQzVELCtDQUErQztBQUMvQyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFJbEQsTUFBTSxTQUFTLEdBQUcsVUFBMkIsQ0FBQztBQUM5QyxNQUFNLE9BQU8sR0FDWCxNQUFBLFNBQVMsQ0FBQyxPQUFPLENBQUMsbUNBQ2xCLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksb0NBQWlCLEVBQWUsQ0FBQyxDQUFDO0FBRTlELE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFDO0FBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUMvQixNQUFNLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0FBRXJELFNBQVMsVUFBVSxDQUNqQixPQUEyQyxFQUMzQyxJQUFZOztJQUVaLE9BQU8sTUFBQSxPQUFPLENBQUMsSUFBSSxDQUFDLG1DQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsR0FBdUI7O0lBQzVDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxLQUFLLEdBQUcsTUFBQSxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxJQUFJLEVBQUUsQ0FBQztJQUN4QyxPQUFPLEtBQUssSUFBSSxTQUFTLENBQUM7QUFDNUIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEdBQXVCO0lBQzFDLElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztBQUNuRSxDQUFDO0FBRUQsU0FBZ0IsMkJBQTJCLENBQ3pDLE9BQTJDOztJQUUzQyxNQUFNLEdBQUcsR0FBZ0IsRUFBRSxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDaEUsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzlDLE1BQU0sUUFBUSxHQUNaLE1BQUEsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUMsbUNBQ25ELGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLHlCQUF5QixDQUFDLENBQUMsQ0FBQztJQUNoRSxJQUFJLFFBQVE7UUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUN0QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFYRCxrRUFXQztBQUVELFNBQWdCLGtCQUFrQixDQUNoQyxPQUEyQyxFQUMzQyxFQUFXO0lBRVgsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBTkQsZ0RBTUM7QUFFRCxTQUFnQixjQUFjOztJQUM1QixPQUFPLE1BQUEsT0FBTyxDQUFDLFFBQVEsRUFBRSxtQ0FBSSxFQUFFLENBQUM7QUFDbEMsQ0FBQztBQUZELHdDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFZGdlIFJlcXVlc3QgQ29udGV4dFxuICpcbiAqIOWcqCBFU0EgLyDovrnnvJjnjq/looMsc2l0ZUlkIOWSjCBob3N0bmFtZSDku47lhaXnq5nor7fmsYIgaGVhZGVyIOWPlizkuI3lho3kvp3otZZcbiAqIOWQr+WKqOaXtiBlbnYg5rOo5YWl44CC5Y6f5ZugOlxuICogICAtIOS4gOS4qiByb3V0aW5lIOWunuS+i+WPr+iDveacjeWKoeWkmuS4qiBzaXRlIC8gaG9zdG5hbWUo54Gw5bqm44CB5aSa54mI5pys44CB6IGa5ZCI5Z+fKSxcbiAqICAgICDlkK/liqjml7YgZW52IOaXoOazleihqOi+viBwZXItcmVxdWVzdCDlj5jljJZcbiAqICAgLSDorqkgb3BzIOS4jeW/heWGjeS4uuavj+S4qumDqOe9sumineWklumFjeS4pOS4qiBlbnZcbiAqXG4gKiDlrp7njrDnlKggQXN5bmNMb2NhbFN0b3JhZ2U6XG4gKiAgIC0gbm9kZS1zZXJ2ZXIgd3JhcHBlciDlnKggaGFuZGxlciDlhaXlj6PlpIQgcnVuV2l0aEVkZ2VDb250ZXh0KGhlYWRlcnMsIGZuKVxuICogICAtIOS4i+a4uCBjZG4tcHVyZ2UgLyDlhbbku5bmqKHlnZfnlKggZ2V0RWRnZUNvbnRleHQoKSDlkIzmraXor7vlj5ZcbiAqICAgLSDljbPkvb8gcHVyZ2Ug5pivIGZpcmUtYW5kLWZvcmdldCxwcm9taXNlIOmTvuS5n+S8mue7p+aJv+W9k+WJjSBBTFMsXG4gKiAgICAgcmVmcmVzaEJhdGNoIOWGheS7jeiDveaLv+WIsOW9k+aXtuivt+axgueahCBjdHhcbiAqXG4gKiDlhbPplK4gaGVhZGVyOlxuICogICAtIHgtYWxpY2RuLXNpdGUtaWQgIOKGkiBzaXRlSWRcbiAqICAgLSBob3N0IC8geC1mb3J3YXJkZWQtaG9zdCDihpIgaG9zdG5hbWUo6aaW6YCJIGhvc3Qs57y65aSx5omN6YCAIHgtZm9yd2FyZGVkLWhvc3QpXG4gKi9cblxuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tICdub2RlOmFzeW5jX2hvb2tzJztcblxuZXhwb3J0IGludGVyZmFjZSBFZGdlQ29udGV4dCB7XG4gIHNpdGVJZD86IHN0cmluZyB8IG51bWJlcjtcbiAgaG9zdG5hbWU/OiBzdHJpbmc7XG59XG5cbi8vIE9wZW5OZXh0IGJ1aWxkIOaKiiB3cmFwcGVyIC8gdGFnQ2FjaGUg562J5YiG5Yir5L2c5Li6IGVzYnVpbGQg5YWl5Y+j5omT5YyFLOWNs+S+v+WQjOS4gCByb3V0aW5lXG4vLyDph4wgZWRnZS1jb250ZXh0LnRzIOS5n+S8muiiq+WkjeWItuaIkOWkmuS7vSDigJTigJQg5q+P5Lu95ZCE6IeqIGBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKWAsXG4vLyBzdG9yZSDkupLkuI3lj6/op4Esd3JhcHBlciDms6jlhaXnmoQgY3R4IOWcqCBjZG4tcHVyZ2Ug5LiA5L6n6K+75Yiw5rC46L+c5pivIHVuZGVmaW5lZOOAglxuLy8g55SoIFN5bWJvbC5mb3Ig5oqK5Y2V5L6L5oyC5YiwIGdsb2JhbFRoaXMs5omA5pyJ5Ymv5pys5ou/5Yiw5ZCM5LiA5LiqIEFMU+OAglxuY29uc3QgQUxTX0tFWSA9IFN5bWJvbC5mb3IoJ3BjZy5lZGdlQ29udGV4dC5hbHMnKTtcbnR5cGUgR2xvYmFsV2l0aEFscyA9IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbQUxTX0tFWV0/OiBBc3luY0xvY2FsU3RvcmFnZTxFZGdlQ29udGV4dD47XG59O1xuY29uc3QgZ2xvYmFsUmVmID0gZ2xvYmFsVGhpcyBhcyBHbG9iYWxXaXRoQWxzO1xuY29uc3Qgc3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+ID1cbiAgZ2xvYmFsUmVmW0FMU19LRVldID8/XG4gIChnbG9iYWxSZWZbQUxTX0tFWV0gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8RWRnZUNvbnRleHQ+KCkpO1xuXG5jb25zdCBTSVRFX0lEX0hFQURFUiA9ICd4LWFsaWNkbi1zaXRlLWlkJztcbmNvbnN0IEhPU1ROQU1FX0hFQURFUiA9ICdob3N0JztcbmNvbnN0IEZPUldBUkRFRF9IT1NUTkFNRV9IRUFERVIgPSAneC1mb3J3YXJkZWQtaG9zdCc7XG5cbmZ1bmN0aW9uIHBpY2tIZWFkZXIoXG4gIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGhlYWRlcnNbbmFtZV0gPz8gaGVhZGVyc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xufVxuXG5mdW5jdGlvbiBwYXJzZUhvc3RuYW1lKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0ID0gcmF3LnNwbGl0KCcsJylbMF0/LnRyaW0oKTtcbiAgcmV0dXJuIGZpcnN0IHx8IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VTaXRlSWQocmF3OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdHJpbW1lZCA9IHJhdy50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbiA9IE51bWJlcih0cmltbWVkKTtcbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShuKSAmJiB0cmltbWVkID09PSBTdHJpbmcobikgPyBuIDogdHJpbW1lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRWRnZUNvbnRleHRGcm9tSGVhZGVycyhcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPlxuKTogRWRnZUNvbnRleHQge1xuICBjb25zdCBjdHg6IEVkZ2VDb250ZXh0ID0ge307XG4gIGNvbnN0IHNpdGVJZCA9IHBhcnNlU2l0ZUlkKHBpY2tIZWFkZXIoaGVhZGVycywgU0lURV9JRF9IRUFERVIpKTtcbiAgaWYgKHNpdGVJZCAhPT0gdW5kZWZpbmVkKSBjdHguc2l0ZUlkID0gc2l0ZUlkO1xuICBjb25zdCBob3N0bmFtZSA9XG4gICAgcGFyc2VIb3N0bmFtZShwaWNrSGVhZGVyKGhlYWRlcnMsIEhPU1ROQU1FX0hFQURFUikpID8/XG4gICAgcGFyc2VIb3N0bmFtZShwaWNrSGVhZGVyKGhlYWRlcnMsIEZPUldBUkRFRF9IT1NUTkFNRV9IRUFERVIpKTtcbiAgaWYgKGhvc3RuYW1lKSBjdHguaG9zdG5hbWUgPSBob3N0bmFtZTtcbiAgcmV0dXJuIGN0eDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bldpdGhFZGdlQ29udGV4dDxUPihcbiAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPixcbiAgZm46ICgpID0+IFRcbik6IFQge1xuICBjb25zdCBjdHggPSBidWlsZEVkZ2VDb250ZXh0RnJvbUhlYWRlcnMoaGVhZGVycyk7XG4gIHJldHVybiBzdG9yYWdlLnJ1bihjdHgsIGZuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEVkZ2VDb250ZXh0KCk6IEVkZ2VDb250ZXh0IHtcbiAgcmV0dXJuIHN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyB7fTtcbn1cbiJdfQ==
|