UNPKG

cnpmcore

Version:

Private NPM Registry for Enterprise

166 lines 15.1 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; import { HTTPContext, Context, HTTPController, HTTPMethod, HTTPMethodEnum, HTTPParam, Inject } from 'egg'; import { ABBREVIATED_META_TYPE, SyncMode } from "../../../common/constants.js"; import { FULLNAME_REG_STRING, getScopeAndName, calculateIntegrity } from "../../../common/PackageUtil.js"; import { isSyncWorkerRequest } from "../../../common/SyncUtil.js"; import { DIST_NAMES } from "../../../core/entity/Package.js"; import { BugVersionService } from "../../../core/service/BugVersionService.js"; import { AbstractController } from "../AbstractController.js"; let ShowPackageController = class ShowPackageController extends AbstractController { setCacheHeaders(ctx, isTeamBound) { if (isTeamBound) { ctx.set('cache-control', 'private, no-store'); } else { this.setCDNHeaders(ctx); } } async show(ctx, fullname) { const [scope, name] = getScopeAndName(fullname); const isTeamBound = await this.userRoleManager.checkReadAccess(ctx, scope, name); const isSync = isSyncWorkerRequest(ctx); const isFullManifests = ctx.accepts(['json', ABBREVIATED_META_TYPE]) !== ABBREVIATED_META_TYPE; // handle cache // fallback to db when cache error try { const cacheEtag = await this.cacheService.getPackageEtag(fullname, isFullManifests); if (!isSync && cacheEtag) { let requestEtag = ctx.request.get('if-none-match'); if (requestEtag.startsWith('W/')) { requestEtag = requestEtag.slice(2); } if (requestEtag === cacheEtag) { // make sure CDN cache header set here this.setCacheHeaders(ctx, isTeamBound); // match etag, set status 304 ctx.status = 304; return; } // get cache pkg data const cacheBytes = await this.cacheService.getPackageManifests(fullname, isFullManifests); if (cacheBytes && cacheBytes.length > 0) { ctx.set('etag', `W/${cacheEtag}`); ctx.type = 'json'; this.setCacheHeaders(ctx, isTeamBound); return cacheBytes; } } } catch (e) { this.logger.error(e); this.logger.error('[ShowPackageController.show:error] get cache error, ignore'); } // handle cache miss const { blockReason, etag, data: cacheBytes, } = await this.getFullManifestsBytes(ctx, fullname, isFullManifests, isSync); // 404, no data if (!etag || !cacheBytes) { const allowSync = this.getAllowSync(ctx); // don't set cdn header, no cdn cache for new package to sync as soon as possible throw this.createPackageNotFoundErrorWithRedirect(fullname, undefined, allowSync); } if (blockReason) { this.setCacheHeaders(ctx, isTeamBound); throw this.createPackageBlockError(blockReason, fullname); } // only set cache with normal request // sync request response with no bug version fixed if (!isSync) { ctx.runInBackground(async () => { await this.cacheService.savePackageEtagAndManifests(fullname, isFullManifests, etag, cacheBytes); }); } // set etag // https://forum.nginx.org/read.php?2,240120,240120#msg-240120 // should set weak etag avoid nginx remove it ctx.set('etag', `W/${etag}`); ctx.type = 'json'; this.setCacheHeaders(ctx, isTeamBound); return cacheBytes; } async getFullManifestsBytes(ctx, fullname, isFullManifests, isSync) { // TODO: need to support proxy mode with JSONBuilder if (this.config.cnpmcore.experimental.enableJSONBuilder && this.config.cnpmcore.syncMode !== SyncMode.proxy) { const hasBugVersions = await this.bugVersionService.hasBugVersions(fullname); if (!hasBugVersions) { // no bug versions, use JSONBuilder return await this.getFullManifestsBytesWithJSONBuilder(fullname, isFullManifests); } } const [scope, name] = getScopeAndName(fullname); if (this.config.cnpmcore.syncMode === SyncMode.proxy) { // proxy mode const fileType = isFullManifests ? DIST_NAMES.FULL_MANIFESTS : DIST_NAMES.ABBREVIATED_MANIFESTS; const { data: sourceManifest } = await this.proxyCacheService.getProxyResponse(ctx, { dataType: 'json', }); const pkgManifest = this.proxyCacheService.replaceTarballUrl(sourceManifest, fileType); const nfsBytes = Buffer.from(JSON.stringify(pkgManifest)); const { shasum: etag } = await calculateIntegrity(nfsBytes); return { data: nfsBytes, etag, blockReason: '' }; } // sync mode let result; if (isFullManifests) { result = await this.packageManagerService.listPackageFullManifests(scope, name, isSync); } else { result = await this.packageManagerService.listPackageAbbreviatedManifests(scope, name, isSync); } return { ...result, data: result.data ? Buffer.from(JSON.stringify(result.data)) : null, }; } async getFullManifestsBytesWithJSONBuilder(fullname, isFullManifests) { const [scope, name] = getScopeAndName(fullname); if (isFullManifests) { return await this.packageManagerService.listPackageFullManifestsBuffer(scope, name); } return await this.packageManagerService.listPackageAbbreviatedManifestsBuffer(scope, name); } }; __decorate([ Inject(), __metadata("design:type", Function) ], ShowPackageController.prototype, "packageManagerService", void 0); __decorate([ Inject(), __metadata("design:type", Function) ], ShowPackageController.prototype, "cacheService", void 0); __decorate([ Inject(), __metadata("design:type", Function) ], ShowPackageController.prototype, "proxyCacheService", void 0); __decorate([ Inject(), __metadata("design:type", BugVersionService) ], ShowPackageController.prototype, "bugVersionService", void 0); __decorate([ HTTPMethod({ // GET /:fullname // https://www.npmjs.com/package/path-to-regexp#custom-matching-parameters path: `/:fullname(${FULLNAME_REG_STRING})`, method: HTTPMethodEnum.GET, }), __param(0, HTTPContext()), __param(1, HTTPParam()), __metadata("design:type", Function), __metadata("design:paramtypes", [Context, String]), __metadata("design:returntype", Promise) ], ShowPackageController.prototype, "show", null); ShowPackageController = __decorate([ HTTPController() ], ShowPackageController); export { ShowPackageController }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvd1BhY2thZ2VDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9wYWNrYWdlL1Nob3dQYWNrYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRTFHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBSS9FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3ZELElBQU0scUJBQXFCLEdBQTNCLE1BQU0scUJBQXNCLFNBQVEsa0JBQWtCO0lBVW5ELGVBQWUsQ0FBQyxHQUFZLEVBQUUsV0FBb0I7UUFDeEQsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixHQUFHLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hELENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQVFLLEFBQU4sS0FBSyxDQUFDLElBQUksQ0FBZ0IsR0FBWSxFQUFlLFFBQWdCO1FBQ25FLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxD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