cnpmcore 3.62.1 → 3.63.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/common/PackageUtil.d.ts +1 -0
- package/dist/app/common/adapter/CacheAdapter.d.ts +1 -0
- package/dist/app/common/adapter/NPMRegistry.d.ts +1 -1
- package/dist/app/common/adapter/NPMRegistry.js +1 -1
- package/dist/app/common/constants.d.ts +3 -0
- package/dist/app/common/constants.js +5 -2
- package/dist/app/common/enum/Task.d.ts +1 -0
- package/dist/app/common/enum/Task.js +2 -1
- package/dist/app/core/entity/ProxyCache.d.ts +19 -0
- package/dist/app/core/entity/ProxyCache.js +30 -0
- package/dist/app/core/entity/Task.d.ts +14 -0
- package/dist/app/core/entity/Task.js +27 -1
- package/dist/app/core/event/CacheCleaner.d.ts +11 -11
- package/dist/app/core/event/CacheCleaner.js +46 -46
- package/dist/app/core/event/ChangesStream.d.ts +9 -9
- package/dist/app/core/event/ChangesStream.js +38 -38
- package/dist/app/core/event/StoreManifest.d.ts +1 -1
- package/dist/app/core/event/StoreManifest.js +6 -6
- package/dist/app/core/event/SyncESPackage.d.ts +2 -2
- package/dist/app/core/event/SyncESPackage.js +10 -10
- package/dist/app/core/event/SyncPackageVersionFile.d.ts +3 -3
- package/dist/app/core/event/SyncPackageVersionFile.js +14 -14
- package/dist/app/core/service/CacheService.d.ts +1 -0
- package/dist/app/core/service/ProxyCacheService.d.ts +33 -0
- package/dist/app/core/service/ProxyCacheService.js +264 -0
- package/dist/app/port/controller/ProxyCacheController.d.ts +22 -0
- package/dist/app/port/controller/ProxyCacheController.js +180 -0
- package/dist/app/port/controller/package/DownloadPackageVersionTar.d.ts +5 -0
- package/dist/app/port/controller/package/DownloadPackageVersionTar.js +52 -4
- package/dist/app/port/controller/package/ShowPackageController.d.ts +2 -0
- package/dist/app/port/controller/package/ShowPackageController.js +24 -6
- package/dist/app/port/controller/package/ShowPackageVersionController.d.ts +2 -1
- package/dist/app/port/controller/package/ShowPackageVersionController.js +24 -10
- package/dist/app/port/schedule/CheckProxyCacheUpdateWorker.d.ts +7 -0
- package/dist/app/port/schedule/CheckProxyCacheUpdateWorker.js +70 -0
- package/dist/app/port/schedule/CheckRecentlyUpdatedPackages.js +2 -2
- package/dist/app/port/schedule/SyncProxyCacheWorker.d.ts +6 -0
- package/dist/app/port/schedule/SyncProxyCacheWorker.js +70 -0
- package/dist/app/repository/ProxyCacheRepository.d.ts +14 -0
- package/dist/app/repository/ProxyCacheRepository.js +75 -0
- package/dist/app/repository/model/ProxyCache.d.ts +11 -0
- package/dist/app/repository/model/ProxyCache.js +55 -0
- package/package.json +2 -1
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ProxyCacheService = exports.isPkgManifest = void 0;
|
|
13
|
+
const egg_errors_1 = require("egg-errors");
|
|
14
|
+
const tegg_1 = require("@eggjs/tegg");
|
|
15
|
+
const tegg_background_task_1 = require("@eggjs/tegg-background-task");
|
|
16
|
+
const semver_1 = require("semver");
|
|
17
|
+
const AbstractService_1 = require("../../common/AbstractService");
|
|
18
|
+
const TaskService_1 = require("./TaskService");
|
|
19
|
+
const CacheService_1 = require("./CacheService");
|
|
20
|
+
const RegistryManagerService_1 = require("./RegistryManagerService");
|
|
21
|
+
const NPMRegistry_1 = require("../../common/adapter/NPMRegistry");
|
|
22
|
+
const NFSAdapter_1 = require("../../common/adapter/NFSAdapter");
|
|
23
|
+
const ProxyCache_1 = require("../entity/ProxyCache");
|
|
24
|
+
const Task_1 = require("../entity/Task");
|
|
25
|
+
const ProxyCacheRepository_1 = require("../../repository/ProxyCacheRepository");
|
|
26
|
+
const Task_2 = require("../../common/enum/Task");
|
|
27
|
+
const PackageUtil_1 = require("../../common/PackageUtil");
|
|
28
|
+
const constants_1 = require("../../common/constants");
|
|
29
|
+
const Package_1 = require("../entity/Package");
|
|
30
|
+
function isoNow() {
|
|
31
|
+
return new Date().toISOString();
|
|
32
|
+
}
|
|
33
|
+
function isPkgManifest(fileType) {
|
|
34
|
+
return fileType === Package_1.DIST_NAMES.FULL_MANIFESTS || fileType === Package_1.DIST_NAMES.ABBREVIATED_MANIFESTS;
|
|
35
|
+
}
|
|
36
|
+
exports.isPkgManifest = isPkgManifest;
|
|
37
|
+
let ProxyCacheService = class ProxyCacheService extends AbstractService_1.AbstractService {
|
|
38
|
+
async getPackageVersionTarResponse(fullname, ctx) {
|
|
39
|
+
if (this.config.cnpmcore.syncPackageBlockList.includes(fullname)) {
|
|
40
|
+
throw new egg_errors_1.ForbiddenError(`stop proxy by block list: ${JSON.stringify(this.config.cnpmcore.syncPackageBlockList)}`);
|
|
41
|
+
}
|
|
42
|
+
return await this.getProxyResponse(ctx);
|
|
43
|
+
}
|
|
44
|
+
async getPackageManifest(fullname, fileType) {
|
|
45
|
+
const cachedStoreKey = (await this.proxyCacheRepository.findProxyCache(fullname, fileType))?.filePath;
|
|
46
|
+
if (cachedStoreKey) {
|
|
47
|
+
const nfsBytes = await this.nfsAdapter.getBytes(cachedStoreKey);
|
|
48
|
+
const nfsString = Buffer.from(nfsBytes).toString();
|
|
49
|
+
const nfsPkgManifgest = JSON.parse(nfsString);
|
|
50
|
+
return nfsPkgManifgest;
|
|
51
|
+
}
|
|
52
|
+
const manifest = await this.getRewrittenManifest(fullname, fileType);
|
|
53
|
+
this.backgroundTaskHelper.run(async () => {
|
|
54
|
+
await this.storeRewrittenManifest(manifest, fullname, fileType);
|
|
55
|
+
const cachedFiles = ProxyCache_1.ProxyCache.create({ fullname, fileType });
|
|
56
|
+
await this.proxyCacheRepository.saveProxyCache(cachedFiles);
|
|
57
|
+
});
|
|
58
|
+
return manifest;
|
|
59
|
+
}
|
|
60
|
+
// used by GET /:fullname/:versionOrTag
|
|
61
|
+
async getPackageVersionManifest(fullname, fileType, versionOrTag) {
|
|
62
|
+
let version;
|
|
63
|
+
if ((0, semver_1.valid)(versionOrTag)) {
|
|
64
|
+
version = versionOrTag;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const pkgManifest = await this.getPackageManifest(fullname, Package_1.DIST_NAMES.ABBREVIATED_MANIFESTS);
|
|
68
|
+
const distTags = pkgManifest['dist-tags'] || {};
|
|
69
|
+
version = distTags[versionOrTag] ? distTags[versionOrTag] : versionOrTag;
|
|
70
|
+
}
|
|
71
|
+
const cachedStoreKey = (await this.proxyCacheRepository.findProxyCache(fullname, fileType, version))?.filePath;
|
|
72
|
+
if (cachedStoreKey) {
|
|
73
|
+
const nfsBytes = await this.nfsAdapter.getBytes(cachedStoreKey);
|
|
74
|
+
const nfsString = Buffer.from(nfsBytes).toString();
|
|
75
|
+
return JSON.parse(nfsString);
|
|
76
|
+
}
|
|
77
|
+
const manifest = await this.getRewrittenManifest(fullname, fileType, versionOrTag);
|
|
78
|
+
this.backgroundTaskHelper.run(async () => {
|
|
79
|
+
await this.storeRewrittenManifest(manifest, fullname, fileType);
|
|
80
|
+
const cachedFiles = ProxyCache_1.ProxyCache.create({ fullname, fileType, version });
|
|
81
|
+
await this.proxyCacheRepository.saveProxyCache(cachedFiles);
|
|
82
|
+
});
|
|
83
|
+
return manifest;
|
|
84
|
+
}
|
|
85
|
+
async removeProxyCache(fullname, fileType, version) {
|
|
86
|
+
const storeKey = isPkgManifest(fileType)
|
|
87
|
+
? `/${constants_1.PROXY_CACHE_DIR_NAME}/${fullname}/${fileType}`
|
|
88
|
+
: `/${constants_1.PROXY_CACHE_DIR_NAME}/${fullname}/${version}/${fileType}`;
|
|
89
|
+
await this.nfsAdapter.remove(storeKey);
|
|
90
|
+
await this.proxyCacheRepository.removeProxyCache(fullname, fileType, version);
|
|
91
|
+
}
|
|
92
|
+
async createTask(targetName, options) {
|
|
93
|
+
return await this.taskService.createTask(Task_1.Task.createUpdateProxyCache(targetName, options), false);
|
|
94
|
+
}
|
|
95
|
+
async findExecuteTask() {
|
|
96
|
+
return await this.taskService.findExecuteTask(Task_2.TaskType.UpdateProxyCache);
|
|
97
|
+
}
|
|
98
|
+
async executeTask(task) {
|
|
99
|
+
const logs = [];
|
|
100
|
+
const fullname = task.data.fullname;
|
|
101
|
+
const { fileType, version } = task.data;
|
|
102
|
+
let cachedManifest;
|
|
103
|
+
logs.push(`[${isoNow()}] 🚧🚧🚧🚧🚧 Start update "${fullname}-${fileType}" 🚧🚧🚧🚧🚧`);
|
|
104
|
+
try {
|
|
105
|
+
const cachedFiles = await this.proxyCacheRepository.findProxyCache(fullname, fileType);
|
|
106
|
+
if (!cachedFiles)
|
|
107
|
+
throw new Error('task params error, can not found record in repo.');
|
|
108
|
+
cachedManifest = await this.getRewrittenManifest(fullname, fileType);
|
|
109
|
+
await this.storeRewrittenManifest(cachedManifest, fullname, fileType);
|
|
110
|
+
ProxyCache_1.ProxyCache.update(cachedFiles);
|
|
111
|
+
await this.proxyCacheRepository.saveProxyCache(cachedFiles);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
task.error = error;
|
|
115
|
+
logs.push(`[${isoNow()}] ❌ ${task.error}`);
|
|
116
|
+
logs.push(`[${isoNow()}] ❌❌❌❌❌ ${fullname}-${fileType} ${version ?? ''} ❌❌❌❌❌`);
|
|
117
|
+
await this.taskService.finishTask(task, Task_2.TaskState.Fail, logs.join('\n'));
|
|
118
|
+
this.logger.info('[ProxyCacheService.executeTask:fail] taskId: %s, targetName: %s, %s', task.taskId, task.targetName, task.error);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
logs.push(`[${isoNow()}] 🟢 Update Success.`);
|
|
122
|
+
const isFullManifests = fileType === Package_1.DIST_NAMES.FULL_MANIFESTS;
|
|
123
|
+
const cachedKey = await this.cacheService.getPackageEtag(fullname, isFullManifests);
|
|
124
|
+
if (cachedKey) {
|
|
125
|
+
const cacheBytes = Buffer.from(JSON.stringify(cachedManifest));
|
|
126
|
+
const { shasum: etag } = await (0, PackageUtil_1.calculateIntegrity)(cacheBytes);
|
|
127
|
+
await this.cacheService.savePackageEtagAndManifests(fullname, isFullManifests, etag, cacheBytes);
|
|
128
|
+
logs.push(`[${isoNow()}] 🟢 Update Cache Success.`);
|
|
129
|
+
}
|
|
130
|
+
await this.taskService.finishTask(task, Task_2.TaskState.Success, logs.join('\n'));
|
|
131
|
+
}
|
|
132
|
+
async getRewrittenManifest(fullname, fileType, versionOrTag) {
|
|
133
|
+
let responseResult;
|
|
134
|
+
switch (fileType) {
|
|
135
|
+
case Package_1.DIST_NAMES.FULL_MANIFESTS:
|
|
136
|
+
responseResult = await this.getUpstreamFullManifests(fullname);
|
|
137
|
+
break;
|
|
138
|
+
case Package_1.DIST_NAMES.ABBREVIATED_MANIFESTS:
|
|
139
|
+
responseResult = await this.getUpstreamAbbreviatedManifests(fullname);
|
|
140
|
+
break;
|
|
141
|
+
case Package_1.DIST_NAMES.MANIFEST:
|
|
142
|
+
responseResult = await this.getUpstreamPackageVersionManifest(fullname, versionOrTag);
|
|
143
|
+
break;
|
|
144
|
+
case Package_1.DIST_NAMES.ABBREVIATED:
|
|
145
|
+
responseResult = await this.getUpstreamAbbreviatedPackageVersionManifest(fullname, versionOrTag);
|
|
146
|
+
break;
|
|
147
|
+
default:
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
// replace tarball url
|
|
151
|
+
const manifest = responseResult.data;
|
|
152
|
+
const { sourceRegistry, registry } = this.config.cnpmcore;
|
|
153
|
+
if (isPkgManifest(fileType)) {
|
|
154
|
+
// pkg manifest
|
|
155
|
+
const versionMap = manifest.versions || {};
|
|
156
|
+
for (const key in versionMap) {
|
|
157
|
+
const versionItem = versionMap[key];
|
|
158
|
+
if (versionItem?.dist?.tarball) {
|
|
159
|
+
versionItem.dist.tarball = versionItem.dist.tarball.replace(sourceRegistry, registry);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// pkg version manifest
|
|
165
|
+
const distItem = manifest.dist || {};
|
|
166
|
+
if (distItem.tarball) {
|
|
167
|
+
distItem.tarball = distItem.tarball.replace(sourceRegistry, registry);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return manifest;
|
|
171
|
+
}
|
|
172
|
+
async storeRewrittenManifest(manifest, fullname, fileType) {
|
|
173
|
+
let storeKey;
|
|
174
|
+
if (isPkgManifest(fileType)) {
|
|
175
|
+
storeKey = `/${constants_1.PROXY_CACHE_DIR_NAME}/${fullname}/${fileType}`;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const version = manifest.version;
|
|
179
|
+
storeKey = `/${constants_1.PROXY_CACHE_DIR_NAME}/${fullname}/${version}/${fileType}`;
|
|
180
|
+
}
|
|
181
|
+
const nfsBytes = Buffer.from(JSON.stringify(manifest));
|
|
182
|
+
await this.nfsAdapter.uploadBytes(storeKey, nfsBytes);
|
|
183
|
+
}
|
|
184
|
+
async getProxyResponse(ctx, options) {
|
|
185
|
+
const registry = this.npmRegistry.registry;
|
|
186
|
+
const remoteAuthToken = await this.registryManagerService.getAuthTokenByRegistryHost(registry);
|
|
187
|
+
const authorization = this.npmRegistry.genAuthorizationHeader(remoteAuthToken);
|
|
188
|
+
const url = `${this.npmRegistry.registry}${ctx.url}`;
|
|
189
|
+
const res = await this.httpclient.request(url, {
|
|
190
|
+
timing: true,
|
|
191
|
+
followRedirect: true,
|
|
192
|
+
// once redirection is also count as a retry
|
|
193
|
+
retry: 7,
|
|
194
|
+
dataType: 'stream',
|
|
195
|
+
timeout: 10000,
|
|
196
|
+
compressed: true,
|
|
197
|
+
...options,
|
|
198
|
+
headers: {
|
|
199
|
+
accept: ctx.header?.accept,
|
|
200
|
+
'user-agent': ctx.header?.['user-agent'],
|
|
201
|
+
authorization,
|
|
202
|
+
'x-forwarded-for': ctx?.ip,
|
|
203
|
+
via: `1.1, ${this.config.cnpmcore.registry}`,
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
this.logger.info('[ProxyCacheService:getProxyStreamResponse] %s, status: %s', url, res.status);
|
|
207
|
+
return res;
|
|
208
|
+
}
|
|
209
|
+
async getUpstreamFullManifests(fullname) {
|
|
210
|
+
const url = `/${encodeURIComponent(fullname)}?t=${Date.now()}&cache=0`;
|
|
211
|
+
return await this.getProxyResponse({ url }, { dataType: 'json' });
|
|
212
|
+
}
|
|
213
|
+
async getUpstreamAbbreviatedManifests(fullname) {
|
|
214
|
+
const url = `/${encodeURIComponent(fullname)}?t=${Date.now()}&cache=0`;
|
|
215
|
+
return await this.getProxyResponse({ url, headers: { accept: constants_1.ABBREVIATED_META_TYPE } }, { dataType: 'json' });
|
|
216
|
+
}
|
|
217
|
+
async getUpstreamPackageVersionManifest(fullname, versionOrTag) {
|
|
218
|
+
const url = `/${encodeURIComponent(fullname)}/${encodeURIComponent(versionOrTag)}`;
|
|
219
|
+
return await this.getProxyResponse({ url }, { dataType: 'json' });
|
|
220
|
+
}
|
|
221
|
+
async getUpstreamAbbreviatedPackageVersionManifest(fullname, versionOrTag) {
|
|
222
|
+
const url = `/${encodeURIComponent(fullname)}/${encodeURIComponent(versionOrTag)}`;
|
|
223
|
+
return await this.getProxyResponse({ url, headers: { accept: constants_1.ABBREVIATED_META_TYPE } }, { dataType: 'json' });
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
exports.ProxyCacheService = ProxyCacheService;
|
|
227
|
+
__decorate([
|
|
228
|
+
(0, tegg_1.Inject)(),
|
|
229
|
+
__metadata("design:type", Object)
|
|
230
|
+
], ProxyCacheService.prototype, "httpclient", void 0);
|
|
231
|
+
__decorate([
|
|
232
|
+
(0, tegg_1.Inject)(),
|
|
233
|
+
__metadata("design:type", NPMRegistry_1.NPMRegistry)
|
|
234
|
+
], ProxyCacheService.prototype, "npmRegistry", void 0);
|
|
235
|
+
__decorate([
|
|
236
|
+
(0, tegg_1.Inject)(),
|
|
237
|
+
__metadata("design:type", NFSAdapter_1.NFSAdapter)
|
|
238
|
+
], ProxyCacheService.prototype, "nfsAdapter", void 0);
|
|
239
|
+
__decorate([
|
|
240
|
+
(0, tegg_1.Inject)(),
|
|
241
|
+
__metadata("design:type", ProxyCacheRepository_1.ProxyCacheRepository)
|
|
242
|
+
], ProxyCacheService.prototype, "proxyCacheRepository", void 0);
|
|
243
|
+
__decorate([
|
|
244
|
+
(0, tegg_1.Inject)(),
|
|
245
|
+
__metadata("design:type", RegistryManagerService_1.RegistryManagerService)
|
|
246
|
+
], ProxyCacheService.prototype, "registryManagerService", void 0);
|
|
247
|
+
__decorate([
|
|
248
|
+
(0, tegg_1.Inject)(),
|
|
249
|
+
__metadata("design:type", TaskService_1.TaskService)
|
|
250
|
+
], ProxyCacheService.prototype, "taskService", void 0);
|
|
251
|
+
__decorate([
|
|
252
|
+
(0, tegg_1.Inject)(),
|
|
253
|
+
__metadata("design:type", CacheService_1.CacheService)
|
|
254
|
+
], ProxyCacheService.prototype, "cacheService", void 0);
|
|
255
|
+
__decorate([
|
|
256
|
+
(0, tegg_1.Inject)(),
|
|
257
|
+
__metadata("design:type", tegg_background_task_1.BackgroundTaskHelper)
|
|
258
|
+
], ProxyCacheService.prototype, "backgroundTaskHelper", void 0);
|
|
259
|
+
exports.ProxyCacheService = ProxyCacheService = __decorate([
|
|
260
|
+
(0, tegg_1.SingletonProto)({
|
|
261
|
+
accessLevel: tegg_1.AccessLevel.PUBLIC,
|
|
262
|
+
})
|
|
263
|
+
], ProxyCacheService);
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJveHlDYWNoZVNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcHAvY29yZS9zZXJ2aWNlL1Byb3h5Q2FjaGVTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUNBLDJDQUE0QztBQUM1QyxzQ0FBOEU7QUFDOUUsc0VBQW1FO0FBQ25FLG1DQUE4QztBQUM5QyxrRUFBK0Q7QUFDL0QsK0NBQTRDO0FBQzVDLGlEQUE4QztBQUM5QyxxRUFBa0U7QUFDbEUsa0VBQStEO0FBQy9ELGdFQUE2RDtBQUM3RCxxREFBa0Q7QUFDbEQseUNBQStGO0FBQy9GLGdGQUE2RTtBQUM3RSxpREFBNkQ7QUFDN0QsMERBQThEO0FBQzlELHNEQUFxRjtBQUNyRiwrQ0FBK0M7QUFHL0MsU0FBUyxNQUFNO0lBQ2IsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0FBQ2xDLENBQUM7QUFFRCxTQUFnQixhQUFhLENBQUMsUUFBb0I7SUFDaEQsT0FBTyxRQUFRLEtBQUssb0JBQVUsQ0FBQyxjQUFjLElBQUksUUFBUSxLQUFLLG9CQUFVLENBQUMscUJBQXFCLENBQUM7QUFDakcsQ0FBQztBQUZELHNDQUVDO0FBU00sSUFBTSxpQkFBaUIsR0FBdkIsTUFBTSxpQkFBa0IsU0FBUSxpQ0FBZTtJQWtCcEQsS0FBSyxDQUFDLDRCQUE0QixDQUFDLFFBQWdCLEVBQUUsR0FBZTtRQUNsRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNoRSxNQUFNLElBQUksMkJBQWMsQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNwSDtRQUNELE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLFFBQXFFO1FBQzlHLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUN0RyxJQUFJLGNBQWMsRUFBRTtZQUNsQixNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxPQUFPLGVBQWUsQ0FBQztTQUN4QjtRQUVELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFrQixRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUN2QyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2hFLE1BQU0sV0FBVyxHQUFHLHVCQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDOUQsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxLQUFLLENBQUMseUJBQXlCLENBQUMsUUFBZ0IsRUFBRSxRQUFzRCxFQUFFLFlBQW9CO1FBQzVILElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxJQUFBLGNBQVcsRUFBQyxZQUFZLENBQUMsRUFBRTtZQUM3QixPQUFPLEdBQUcsWUFBWSxDQUFDO1NBQ3hCO2FBQU07WUFDTCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsb0JBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzlGLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEQsT0FBTyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7U0FDMUU7UUFDRCxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDO1FBQy9HLElBQUksY0FBYyxFQUFFO1lBQ2xCLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFpRCxDQUFDO1NBQzlFO1FBQ0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuRixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEUsTUFBTSxXQUFXLEdBQUcsdUJBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDdkUsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFnQixFQUFFLFFBQW9CLEVBQUUsT0FBZ0I7UUFDN0UsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQztZQUN0QyxDQUFDLENBQUMsSUFBSSxnQ0FBb0IsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFO1lBQ3BELENBQUMsQ0FBQyxJQUFJLGdDQUFvQixJQUFJLFFBQVEsSUFBSSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDbEUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQWtCLEVBQUUsT0FBb0M7UUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFdBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUErQixDQUFDO0lBQ2xJLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixPQUFPLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsZUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBVTtRQUMxQixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7UUFDMUIsTUFBTSxRQUFRLEdBQUksSUFBbUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3BFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUksSUFBbUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsSUFBSSxjQUFjLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRSw4QkFBOEIsUUFBUSxJQUFJLFFBQVEsY0FBYyxDQUFDLENBQUM7UUFDeEYsSUFBSTtZQUNGLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLFdBQVc7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1lBQ3RGLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBa0IsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RGLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsdUJBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0IsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzdEO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRSxXQUFXLFFBQVEsSUFBSSxRQUFRLElBQUksT0FBTyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEYsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsZ0JBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxFQUNwRixJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVDLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUM5QyxNQUFNLGVBQWUsR0FBRyxRQUFRLEtBQUssb0JBQVUsQ0FBQyxjQUFjLENBQUM7UUFDL0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDcEYsSUFBSSxTQUFTLEVBQUU7WUFDYixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUMvRCxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBQSxnQ0FBa0IsRUFBQyxVQUFVLENBQUMsQ0FBQztZQUM5RCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDakcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsZ0JBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQXVCLFFBQWUsRUFBRSxRQUFXLEVBQUUsWUFBb0I7UUFDakcsSUFBSSxjQUFjLENBQUM7UUFDbkIsUUFBUSxRQUFRLEVBQUU7WUFDaEIsS0FBSyxvQkFBVSxDQUFDLGNBQWM7Z0JBQzVCLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0QsTUFBTTtZQUNSLEtBQUssb0JBQVUsQ0FBQyxxQkFBcUI7Z0JBQ25DLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDdEUsTUFBTTtZQUNSLEtBQUssb0JBQVUsQ0FBQyxRQUFRO2dCQUN0QixjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsaUNBQWlDLENBQUMsUUFBUSxFQUFFLFlBQWEsQ0FBQyxDQUFDO2dCQUN2RixNQUFNO1lBQ1IsS0FBSyxvQkFBVSxDQUFDLFdBQVc7Z0JBQ3pCLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxRQUFRLEVBQUUsWUFBYSxDQUFDLENBQUM7Z0JBQ2xHLE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztRQUNyQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzFELElBQUksYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLGVBQWU7WUFDZixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUMzQyxLQUFLLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTtnQkFDNUIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO29CQUM5QixXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUN2RjthQUNGO1NBQ0Y7YUFBTTtZQUNMLHVCQUF1QjtZQUN2QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNyQyxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ3ZFO1NBQ0Y7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRU8sS0FBSyxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxRQUFnQixFQUFFLFFBQW9CO1FBQ25GLElBQUksUUFBZ0IsQ0FBQztRQUNyQixJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUMzQixRQUFRLEdBQUcsSUFBSSxnQ0FBb0IsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFLENBQUM7U0FDL0Q7YUFBTTtZQUNMLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDakMsUUFBUSxHQUFHLElBQUksZ0NBQW9CLElBQUksUUFBUSxJQUFJLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztTQUMxRTtRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBd0IsRUFBRSxPQUFrQztRQUN6RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUMzQyxNQUFNLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRS9FLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXJELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQzdDLE1BQU0sRUFBRSxJQUFJO1lBQ1osY0FBYyxFQUFFLElBQUk7WUFDcEIsNENBQTRDO1lBQzVDLEtBQUssRUFBRSxDQUFDO1lBQ1IsUUFBUSxFQUFFLFFBQVE7WUFDbEIsT0FBTyxFQUFFLEtBQUs7WUFDZCxVQUFVLEVBQUUsSUFBSTtZQUNoQixHQUFHLE9BQU87WUFDVixPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTTtnQkFDMUIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7Z0JBQ3hDLGFBQWE7Z0JBQ2IsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzFCLEdBQUcsRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTthQUM3QztTQUNGLENBQXVCLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyxLQUFLLENBQUMsd0JBQXdCLENBQUMsUUFBZ0I7UUFDckQsTUFBTSxHQUFHLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQztRQUN2RSxPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sS0FBSyxDQUFDLCtCQUErQixDQUFDLFFBQWdCO1FBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUM7UUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsaUNBQXFCLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEgsQ0FBQztJQUNPLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxRQUFnQixFQUFFLFlBQW9CO1FBQ3BGLE1BQU0sR0FBRyxHQUFHLElBQUksa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksa0JBQWtCLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ08sS0FBSyxDQUFDLDRDQUE0QyxDQUFDLFFBQWdCLEVBQUUsWUFBb0I7UUFDL0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ25GLE9BQU8sTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLGlDQUFxQixFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2hILENBQUM7Q0FFRixDQUFBO0FBek5ZLDhDQUFpQjtBQUVYO0lBRGhCLElBQUEsYUFBTSxHQUFFOztxREFDa0M7QUFFMUI7SUFEaEIsSUFBQSxhQUFNLEdBQUU7OEJBQ3FCLHlCQUFXO3NEQUFDO0FBRXpCO0lBRGhCLElBQUEsYUFBTSxHQUFFOzhCQUNvQix1QkFBVTtxREFBQztBQUV2QjtJQURoQixJQUFBLGFBQU0sR0FBRTs4QkFDOEIsMkNBQW9COytEQUFDO0FBRTNDO0lBRGhCLElBQUEsYUFBTSxHQUFFOzhCQUNnQywrQ0FBc0I7aUVBQUM7QUFFL0M7SUFEaEIsSUFBQSxhQUFNLEdBQUU7OEJBQ3FCLHlCQUFXO3NEQUFDO0FBRXpCO0lBRGhCLElBQUEsYUFBTSxHQUFFOzhCQUNzQiwyQkFBWTt1REFBQztBQUUzQjtJQURoQixJQUFBLGFBQU0sR0FBRTs4QkFDNkIsMkNBQW9COytEQUFDOzRCQWhCaEQsaUJBQWlCO0lBSDdCLElBQUEscUJBQWMsRUFBQztRQUNkLFdBQVcsRUFBRSxrQkFBVyxDQUFDLE1BQU07S0FDaEMsQ0FBQztHQUNXLGlCQUFpQixDQXlON0IifQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { EggContext } from '@eggjs/tegg';
|
|
2
|
+
import { AbstractController } from './AbstractController';
|
|
3
|
+
import { Static } from 'egg-typebox-validate/typebox';
|
|
4
|
+
import { QueryPageOptions } from '../typebox';
|
|
5
|
+
export declare class ProxyCacheController extends AbstractController {
|
|
6
|
+
private readonly proxyCacheRepository;
|
|
7
|
+
private readonly proxyCacheService;
|
|
8
|
+
private readonly nfsAdapter;
|
|
9
|
+
listProxyCache(pageSize: Static<typeof QueryPageOptions>['pageSize'], pageIndex: Static<typeof QueryPageOptions>['pageIndex']): Promise<import("../../core/util/EntityUtil").PageResult<import("../../core/entity/ProxyCache").ProxyCache>>;
|
|
10
|
+
showProxyCaches(pageSize: Static<typeof QueryPageOptions>['pageSize'], pageIndex: Static<typeof QueryPageOptions>['pageIndex'], fullname: string): Promise<import("../../core/util/EntityUtil").PageResult<import("../../core/entity/ProxyCache").ProxyCache>>;
|
|
11
|
+
refreshProxyCaches(fullname: string): Promise<{
|
|
12
|
+
ok: boolean;
|
|
13
|
+
tasks: import("../../core/entity/Task").CreateUpdateProxyCacheTask[];
|
|
14
|
+
}>;
|
|
15
|
+
removeProxyCaches(ctx: EggContext, fullname: string): Promise<{
|
|
16
|
+
ok: boolean;
|
|
17
|
+
result: import("leoric").Collection<import("../../repository/model/ProxyCache").ProxyCache>;
|
|
18
|
+
}>;
|
|
19
|
+
truncateProxyCaches(ctx: EggContext): Promise<{
|
|
20
|
+
ok: boolean;
|
|
21
|
+
}>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.ProxyCacheController = void 0;
|
|
16
|
+
const tegg_1 = require("@eggjs/tegg");
|
|
17
|
+
const egg_errors_1 = require("egg-errors");
|
|
18
|
+
const AbstractController_1 = require("./AbstractController");
|
|
19
|
+
const ProxyCacheRepository_1 = require("../../repository/ProxyCacheRepository");
|
|
20
|
+
const PackageUtil_1 = require("../../common/PackageUtil");
|
|
21
|
+
const ProxyCacheService_1 = require("../../core/service/ProxyCacheService");
|
|
22
|
+
const constants_1 = require("../../common/constants");
|
|
23
|
+
const NFSAdapter_1 = require("../../common/adapter/NFSAdapter");
|
|
24
|
+
let ProxyCacheController = class ProxyCacheController extends AbstractController_1.AbstractController {
|
|
25
|
+
async listProxyCache(pageSize, pageIndex) {
|
|
26
|
+
if (this.config.cnpmcore.syncMode !== constants_1.SyncMode.proxy) {
|
|
27
|
+
throw new egg_errors_1.ForbiddenError('proxy mode is not enabled');
|
|
28
|
+
}
|
|
29
|
+
return await this.proxyCacheRepository.listCachedFiles({
|
|
30
|
+
pageSize,
|
|
31
|
+
pageIndex,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async showProxyCaches(pageSize, pageIndex, fullname) {
|
|
35
|
+
if (this.config.cnpmcore.syncMode !== constants_1.SyncMode.proxy) {
|
|
36
|
+
throw new egg_errors_1.ForbiddenError('proxy mode is not enabled');
|
|
37
|
+
}
|
|
38
|
+
return await this.proxyCacheRepository.listCachedFiles({
|
|
39
|
+
pageSize,
|
|
40
|
+
pageIndex,
|
|
41
|
+
}, fullname);
|
|
42
|
+
}
|
|
43
|
+
async refreshProxyCaches(fullname) {
|
|
44
|
+
if (this.config.cnpmcore.syncMode !== constants_1.SyncMode.proxy) {
|
|
45
|
+
throw new egg_errors_1.ForbiddenError('proxy mode is not enabled');
|
|
46
|
+
}
|
|
47
|
+
const refreshList = await this.proxyCacheRepository.findProxyCaches(fullname);
|
|
48
|
+
if (refreshList.length === 0) {
|
|
49
|
+
throw new egg_errors_1.NotFoundError();
|
|
50
|
+
}
|
|
51
|
+
const taskList = refreshList
|
|
52
|
+
// 仅manifests需要更新,指定版本的package.json文件发布后不会改变
|
|
53
|
+
.filter(i => (0, ProxyCacheService_1.isPkgManifest)(i.fileType))
|
|
54
|
+
.map(async (item) => {
|
|
55
|
+
const task = await this.proxyCacheService.createTask(`${item.fullname}/${item.fileType}`, {
|
|
56
|
+
fullname: item.fullname,
|
|
57
|
+
fileType: item.fileType,
|
|
58
|
+
});
|
|
59
|
+
return task;
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
ok: true,
|
|
63
|
+
tasks: await Promise.all(taskList),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async removeProxyCaches(ctx, fullname) {
|
|
67
|
+
const isAdmin = await this.userRoleManager.isAdmin(ctx);
|
|
68
|
+
if (!isAdmin) {
|
|
69
|
+
throw new egg_errors_1.UnauthorizedError('only admin can do this');
|
|
70
|
+
}
|
|
71
|
+
if (this.config.cnpmcore.syncMode !== constants_1.SyncMode.proxy) {
|
|
72
|
+
throw new egg_errors_1.ForbiddenError('proxy mode is not enabled');
|
|
73
|
+
}
|
|
74
|
+
const proxyCachesList = await this.proxyCacheRepository.findProxyCaches(fullname);
|
|
75
|
+
if (proxyCachesList.length === 0) {
|
|
76
|
+
throw new egg_errors_1.NotFoundError();
|
|
77
|
+
}
|
|
78
|
+
const removingList = proxyCachesList.map(item => {
|
|
79
|
+
return this.proxyCacheService.removeProxyCache(item.fullname, item.fileType, item.version);
|
|
80
|
+
});
|
|
81
|
+
await Promise.all(removingList);
|
|
82
|
+
return {
|
|
83
|
+
ok: true,
|
|
84
|
+
result: proxyCachesList,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async truncateProxyCaches(ctx) {
|
|
88
|
+
const isAdmin = await this.userRoleManager.isAdmin(ctx);
|
|
89
|
+
if (!isAdmin) {
|
|
90
|
+
throw new egg_errors_1.UnauthorizedError('only admin can do this');
|
|
91
|
+
}
|
|
92
|
+
if (this.config.cnpmcore.syncMode !== constants_1.SyncMode.proxy) {
|
|
93
|
+
throw new egg_errors_1.ForbiddenError('proxy mode is not enabled');
|
|
94
|
+
}
|
|
95
|
+
await this.proxyCacheRepository.truncateProxyCache();
|
|
96
|
+
// 尝试删除proxy cache目录,若失败可手动管理
|
|
97
|
+
ctx.runInBackground(async () => {
|
|
98
|
+
try {
|
|
99
|
+
await this.nfsAdapter.remove(`/${constants_1.PROXY_CACHE_DIR_NAME}`);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
this.logger.error('[ProxyCacheService.truncateProxyCaches] remove proxy cache dir error: %s', err);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
ok: true,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
exports.ProxyCacheController = ProxyCacheController;
|
|
111
|
+
__decorate([
|
|
112
|
+
(0, tegg_1.Inject)(),
|
|
113
|
+
__metadata("design:type", ProxyCacheRepository_1.ProxyCacheRepository)
|
|
114
|
+
], ProxyCacheController.prototype, "proxyCacheRepository", void 0);
|
|
115
|
+
__decorate([
|
|
116
|
+
(0, tegg_1.Inject)(),
|
|
117
|
+
__metadata("design:type", ProxyCacheService_1.ProxyCacheService)
|
|
118
|
+
], ProxyCacheController.prototype, "proxyCacheService", void 0);
|
|
119
|
+
__decorate([
|
|
120
|
+
(0, tegg_1.Inject)(),
|
|
121
|
+
__metadata("design:type", NFSAdapter_1.NFSAdapter)
|
|
122
|
+
], ProxyCacheController.prototype, "nfsAdapter", void 0);
|
|
123
|
+
__decorate([
|
|
124
|
+
(0, tegg_1.HTTPMethod)({
|
|
125
|
+
method: tegg_1.HTTPMethodEnum.GET,
|
|
126
|
+
path: '/-/proxy-cache',
|
|
127
|
+
}),
|
|
128
|
+
__param(0, (0, tegg_1.HTTPQuery)()),
|
|
129
|
+
__param(1, (0, tegg_1.HTTPQuery)()),
|
|
130
|
+
__metadata("design:type", Function),
|
|
131
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
132
|
+
__metadata("design:returntype", Promise)
|
|
133
|
+
], ProxyCacheController.prototype, "listProxyCache", null);
|
|
134
|
+
__decorate([
|
|
135
|
+
(0, tegg_1.HTTPMethod)({
|
|
136
|
+
method: tegg_1.HTTPMethodEnum.GET,
|
|
137
|
+
path: `/-/proxy-cache/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})`,
|
|
138
|
+
}),
|
|
139
|
+
__param(0, (0, tegg_1.HTTPQuery)()),
|
|
140
|
+
__param(1, (0, tegg_1.HTTPQuery)()),
|
|
141
|
+
__param(2, (0, tegg_1.HTTPParam)()),
|
|
142
|
+
__metadata("design:type", Function),
|
|
143
|
+
__metadata("design:paramtypes", [Object, Object, String]),
|
|
144
|
+
__metadata("design:returntype", Promise)
|
|
145
|
+
], ProxyCacheController.prototype, "showProxyCaches", null);
|
|
146
|
+
__decorate([
|
|
147
|
+
(0, tegg_1.HTTPMethod)({
|
|
148
|
+
method: tegg_1.HTTPMethodEnum.PATCH,
|
|
149
|
+
path: `/-/proxy-cache/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})`,
|
|
150
|
+
}),
|
|
151
|
+
__param(0, (0, tegg_1.HTTPParam)()),
|
|
152
|
+
__metadata("design:type", Function),
|
|
153
|
+
__metadata("design:paramtypes", [String]),
|
|
154
|
+
__metadata("design:returntype", Promise)
|
|
155
|
+
], ProxyCacheController.prototype, "refreshProxyCaches", null);
|
|
156
|
+
__decorate([
|
|
157
|
+
(0, tegg_1.HTTPMethod)({
|
|
158
|
+
method: tegg_1.HTTPMethodEnum.DELETE,
|
|
159
|
+
path: `/-/proxy-cache/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})`,
|
|
160
|
+
}),
|
|
161
|
+
__param(0, (0, tegg_1.Context)()),
|
|
162
|
+
__param(1, (0, tegg_1.HTTPParam)()),
|
|
163
|
+
__metadata("design:type", Function),
|
|
164
|
+
__metadata("design:paramtypes", [Object, String]),
|
|
165
|
+
__metadata("design:returntype", Promise)
|
|
166
|
+
], ProxyCacheController.prototype, "removeProxyCaches", null);
|
|
167
|
+
__decorate([
|
|
168
|
+
(0, tegg_1.HTTPMethod)({
|
|
169
|
+
method: tegg_1.HTTPMethodEnum.DELETE,
|
|
170
|
+
path: '/-/proxy-cache',
|
|
171
|
+
}),
|
|
172
|
+
__param(0, (0, tegg_1.Context)()),
|
|
173
|
+
__metadata("design:type", Function),
|
|
174
|
+
__metadata("design:paramtypes", [Object]),
|
|
175
|
+
__metadata("design:returntype", Promise)
|
|
176
|
+
], ProxyCacheController.prototype, "truncateProxyCaches", null);
|
|
177
|
+
exports.ProxyCacheController = ProxyCacheController = __decorate([
|
|
178
|
+
(0, tegg_1.HTTPController)()
|
|
179
|
+
], ProxyCacheController);
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJveHlDYWNoZUNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hcHAvcG9ydC9jb250cm9sbGVyL1Byb3h5Q2FjaGVDb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHNDQVNxQjtBQUNyQiwyQ0FBOEU7QUFDOUUsNkRBQTBEO0FBQzFELGdGQUE2RTtBQUc3RSwwREFBK0Q7QUFDL0QsNEVBRzhDO0FBQzlDLHNEQUF3RTtBQUN4RSxnRUFBNkQ7QUFHdEQsSUFBTSxvQkFBb0IsR0FBMUIsTUFBTSxvQkFBcUIsU0FBUSx1Q0FBa0I7SUFZcEQsQUFBTixLQUFLLENBQUMsY0FBYyxDQUNMLFFBQXFELEVBQ3JELFNBQXVEO1FBRXBFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLG9CQUFRLENBQUMsS0FBSyxFQUFFO1lBQ3BELE1BQU0sSUFBSSwyQkFBYyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDdkQ7UUFDRCxPQUFPLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQztZQUNyRCxRQUFRO1lBQ1IsU0FBUztTQUNWLENBQUMsQ0FBQztJQUNMLENBQUM7SUFNSyxBQUFOLEtBQUssQ0FBQyxlQUFlLENBQWMsUUFBcUQsRUFDM0UsU0FBdUQsRUFBZSxRQUFnQjtRQUNqRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxvQkFBUSxDQUFDLEtBQUssRUFBRTtZQUNwRCxNQUFNLElBQUksMkJBQWMsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUM7WUFDckQsUUFBUTtZQUNSLFNBQVM7U0FDVixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQU1LLEFBQU4sS0FBSyxDQUFDLGtCQUFrQixDQUFj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
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EggContext } from '@eggjs/tegg';
|
|
3
3
|
import { AbstractController } from '../AbstractController';
|
|
4
|
+
import { RegistryManagerService } from '../../../core/service/RegistryManagerService';
|
|
4
5
|
export declare class DownloadPackageVersionTarController extends AbstractController {
|
|
5
6
|
private packageManagerService;
|
|
7
|
+
registryManagerService: RegistryManagerService;
|
|
8
|
+
private proxyCacheService;
|
|
9
|
+
private packageSyncerService;
|
|
6
10
|
private nfsAdapter;
|
|
7
11
|
downloadForOptions(ctx: EggContext): Promise<void>;
|
|
8
12
|
download(ctx: EggContext, fullname: string, filenameWithVersion: string): Promise<import("stream").Readable | undefined>;
|
|
9
13
|
deprecatedDownload(ctx: EggContext, fullname: string, fullnameWithVersion: string): Promise<import("stream").Readable | undefined>;
|
|
14
|
+
private getTgzProxyStream;
|
|
10
15
|
}
|
|
@@ -13,13 +13,17 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.DownloadPackageVersionTarController = void 0;
|
|
16
|
+
const node_stream_1 = require("node:stream");
|
|
16
17
|
const egg_errors_1 = require("egg-errors");
|
|
17
18
|
const tegg_1 = require("@eggjs/tegg");
|
|
18
19
|
const AbstractController_1 = require("../AbstractController");
|
|
19
20
|
const PackageUtil_1 = require("../../../common/PackageUtil");
|
|
21
|
+
const constants_1 = require("../../../common/constants");
|
|
20
22
|
const NFSAdapter_1 = require("../../../common/adapter/NFSAdapter");
|
|
21
23
|
const PackageManagerService_1 = require("../../../core/service/PackageManagerService");
|
|
22
|
-
const
|
|
24
|
+
const ProxyCacheService_1 = require("../../../core/service/ProxyCacheService");
|
|
25
|
+
const PackageSyncerService_1 = require("../../../core/service/PackageSyncerService");
|
|
26
|
+
const RegistryManagerService_1 = require("../../../core/service/RegistryManagerService");
|
|
23
27
|
let DownloadPackageVersionTarController = class DownloadPackageVersionTarController extends AbstractController_1.AbstractController {
|
|
24
28
|
// Support OPTIONS Request on tgz download
|
|
25
29
|
async downloadForOptions(ctx) {
|
|
@@ -40,8 +44,24 @@ let DownloadPackageVersionTarController = class DownloadPackageVersionTarControl
|
|
|
40
44
|
}
|
|
41
45
|
// check package version in database
|
|
42
46
|
const allowSync = this.getAllowSync(ctx);
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
let pkg;
|
|
48
|
+
let packageVersion;
|
|
49
|
+
try {
|
|
50
|
+
pkg = await this.getPackageEntityByFullname(fullname, allowSync);
|
|
51
|
+
packageVersion = await this.getPackageVersionEntity(pkg, version, allowSync);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (this.config.cnpmcore.syncMode === constants_1.SyncMode.proxy) {
|
|
55
|
+
// proxy mode package version not found.
|
|
56
|
+
const tgzStream = await this.getTgzProxyStream(ctx, fullname, version);
|
|
57
|
+
this.packageManagerService.plusPackageVersionCounter(fullname, version);
|
|
58
|
+
const passThroughRemoteStream = new node_stream_1.PassThrough();
|
|
59
|
+
tgzStream.pipe(passThroughRemoteStream);
|
|
60
|
+
ctx.attachment(`${filenameWithVersion}.tgz`);
|
|
61
|
+
return passThroughRemoteStream;
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
45
65
|
// read by nfs url
|
|
46
66
|
if (downloadUrl) {
|
|
47
67
|
this.packageManagerService.plusPackageVersionCounter(fullname, version);
|
|
@@ -68,12 +88,40 @@ let DownloadPackageVersionTarController = class DownloadPackageVersionTarControl
|
|
|
68
88
|
const filenameWithVersion = (0, PackageUtil_1.getScopeAndName)(fullnameWithVersion)[1];
|
|
69
89
|
return await this.download(ctx, fullname, filenameWithVersion);
|
|
70
90
|
}
|
|
91
|
+
async getTgzProxyStream(ctx, fullname, version) {
|
|
92
|
+
const { headers, status, res } = await this.proxyCacheService.getPackageVersionTarResponse(fullname, ctx);
|
|
93
|
+
ctx.status = status;
|
|
94
|
+
ctx.set(headers);
|
|
95
|
+
ctx.runInBackground(async () => {
|
|
96
|
+
const task = await this.packageSyncerService.createTask(fullname, {
|
|
97
|
+
authorIp: ctx.ip,
|
|
98
|
+
authorId: `pid_${process.pid}`,
|
|
99
|
+
tips: `Sync specific version in proxy mode cause by "${ctx.href}"`,
|
|
100
|
+
skipDependencies: true,
|
|
101
|
+
specificVersions: [version],
|
|
102
|
+
});
|
|
103
|
+
ctx.logger.info('[DownloadPackageVersionTarController.createSyncTask:success] taskId: %s, fullname: %s', task.taskId, fullname);
|
|
104
|
+
});
|
|
105
|
+
return res;
|
|
106
|
+
}
|
|
71
107
|
};
|
|
72
108
|
exports.DownloadPackageVersionTarController = DownloadPackageVersionTarController;
|
|
73
109
|
__decorate([
|
|
74
110
|
(0, tegg_1.Inject)(),
|
|
75
111
|
__metadata("design:type", PackageManagerService_1.PackageManagerService)
|
|
76
112
|
], DownloadPackageVersionTarController.prototype, "packageManagerService", void 0);
|
|
113
|
+
__decorate([
|
|
114
|
+
(0, tegg_1.Inject)(),
|
|
115
|
+
__metadata("design:type", RegistryManagerService_1.RegistryManagerService)
|
|
116
|
+
], DownloadPackageVersionTarController.prototype, "registryManagerService", void 0);
|
|
117
|
+
__decorate([
|
|
118
|
+
(0, tegg_1.Inject)(),
|
|
119
|
+
__metadata("design:type", ProxyCacheService_1.ProxyCacheService)
|
|
120
|
+
], DownloadPackageVersionTarController.prototype, "proxyCacheService", void 0);
|
|
121
|
+
__decorate([
|
|
122
|
+
(0, tegg_1.Inject)(),
|
|
123
|
+
__metadata("design:type", PackageSyncerService_1.PackageSyncerService)
|
|
124
|
+
], DownloadPackageVersionTarController.prototype, "packageSyncerService", void 0);
|
|
77
125
|
__decorate([
|
|
78
126
|
(0, tegg_1.Inject)(),
|
|
79
127
|
__metadata("design:type", NFSAdapter_1.NFSAdapter)
|
|
@@ -118,4 +166,4 @@ __decorate([
|
|
|
118
166
|
exports.DownloadPackageVersionTarController = DownloadPackageVersionTarController = __decorate([
|
|
119
167
|
(0, tegg_1.HTTPController)()
|
|
120
168
|
], DownloadPackageVersionTarController);
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
169
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG93bmxvYWRQYWNrYWdlVmVyc2lvblRhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2FwcC9wb3J0L2NvbnRyb2xsZXIvcGFja2FnZS9Eb3dubG9hZFBhY2thZ2VWZXJzaW9uVGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUEwQztBQUMxQywyQ0FFb0I7QUFDcEIsc0NBUXFCO0FBQ3JCLDhEQUEyRDtBQUMzRCw2REFBbUY7QUFDbkYseURBQXFEO0FBQ3JELG1FQUFnRTtBQUNoRSx1RkFBb0Y7QUFDcEYsK0VBQTRFO0FBQzVFLHFGQUFrRjtBQUNsRix5RkFBc0Y7QUFHL0UsSUFBTSxtQ0FBbUMsR0FBekMsTUFBTSxtQ0FBb0MsU0FBUSx1Q0FBa0I7SUFZekUsMENBQTBDO0lBTXBDLEFBQU4sS0FBSyxDQUFDLGtCQUFrQixDQUFZLEdBQWU7UUFDakQsR0FBRyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFPSyxBQUFOLEtBQUssQ0FBQyxRQUFRLENBQVksR0FBZSxFQUFlLFFBQWdCLEVBQWUsbUJBQTJCO1FBQ2hILHlFQUF5RTtRQUN6RSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hGLE1BQU0sUUFBUSxHQUFHLGFBQWEsUUFBUSxJQUFJLE9BQU8sSUFBSSxtQkFBbUIsTUFBTSxDQUFDO1FBQy9FLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFD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
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
2
3
|
import { EggContext } from '@eggjs/tegg';
|
|
3
4
|
import { AbstractController } from '../AbstractController';
|
|
4
5
|
export declare class ShowPackageController extends AbstractController {
|
|
5
6
|
private packageManagerService;
|
|
6
7
|
private cacheService;
|
|
8
|
+
private proxyCacheService;
|
|
7
9
|
show(ctx: EggContext, fullname: string): Promise<Buffer | undefined>;
|
|
8
10
|
}
|