UNPKG

cnpmcore

Version:
119 lines 9.75 kB
"use strict"; 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); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ShowPackageController = void 0; const tegg_1 = require("@eggjs/tegg"); const AbstractController_1 = require("../AbstractController"); const PackageUtil_1 = require("../../../common/PackageUtil"); const SyncUtil_1 = require("../../../common/SyncUtil"); const PackageManagerService_1 = require("../../../core/service/PackageManagerService"); const CacheService_1 = require("../../../core/service/CacheService"); let ShowPackageController = class ShowPackageController extends AbstractController_1.AbstractController { async show(ctx, fullname) { const [scope, name] = (0, PackageUtil_1.getScopeAndName)(fullname); const isSync = (0, SyncUtil_1.isSyncWorkerRequest)(ctx); const abbreviatedMetaType = 'application/vnd.npm.install-v1+json'; const isFullManifests = ctx.accepts(['json', abbreviatedMetaType]) !== abbreviatedMetaType; // 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.substring(2); } if (requestEtag === cacheEtag) { // make sure CDN cache header set here this.setCDNHeaders(ctx); // 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.setCDNHeaders(ctx); return cacheBytes; } } } catch (e) { this.logger.error(e); this.logger.error('[ShowPackageController.show:error] get cache error, ignore'); } // handle cache miss let result; if (isFullManifests) { result = await this.packageManagerService.listPackageFullManifests(scope, name, isSync); } else { result = await this.packageManagerService.listPackageAbbreviatedManifests(scope, name, isSync); } const { etag, data, blockReason } = result; // 404, no data if (!etag) { 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.setCDNHeaders(ctx); throw this.createPackageBlockError(blockReason, fullname); } const cacheBytes = Buffer.from(JSON.stringify(data)); // 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.setCDNHeaders(ctx); return cacheBytes; } }; exports.ShowPackageController = ShowPackageController; __decorate([ (0, tegg_1.Inject)(), __metadata("design:type", PackageManagerService_1.PackageManagerService) ], ShowPackageController.prototype, "packageManagerService", void 0); __decorate([ (0, tegg_1.Inject)(), __metadata("design:type", CacheService_1.CacheService) ], ShowPackageController.prototype, "cacheService", void 0); __decorate([ (0, tegg_1.HTTPMethod)({ // GET /:fullname // https://www.npmjs.com/package/path-to-regexp#custom-matching-parameters path: `/:fullname(${PackageUtil_1.FULLNAME_REG_STRING})`, method: tegg_1.HTTPMethodEnum.GET, }), __param(0, (0, tegg_1.Context)()), __param(1, (0, tegg_1.HTTPParam)()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, String]), __metadata("design:returntype", Promise) ], ShowPackageController.prototype, "show", null); exports.ShowPackageController = ShowPackageController = __decorate([ (0, tegg_1.HTTPController)() ], ShowPackageController); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvd1BhY2thZ2VDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vYXBwL3BvcnQvY29udHJvbGxlci9wYWNrYWdlL1Nob3dQYWNrYWdlQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxzQ0FRcUI7QUFDckIsOERBQTJEO0FBQzNELDZEQUFtRjtBQUNuRix1REFBK0Q7QUFDL0QsdUZBQW9GO0FBQ3BGLHFFQUFrRTtBQUczRCxJQUFNLHFCQUFxQixHQUEzQixNQUFNLHFCQUFzQixTQUFRLHVDQUFrQjtJQVlyRCxBQUFOLEtBQUssQ0FBQyxJQUFJLENBQVksR0FBZSxFQUFlLFFBQWdCO1FBQ2xFLE1BQU0sQ0FBRSxLQUFLLEVBQUUsSUFBSSxDQUFFLEdBQUcsSUFBQSw2QkFBZSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUEsOEJBQW1CLEVBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxtQkFBbUIsR0FBRyxxQ0FBcUMsQ0FBQztRQUNsRSxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFFLENBQUMsS0FBSyxtQkFBbUIsQ0FBQztRQUU3RixlQUFlO1FBQ2Ysa0NBQWtDO1FBQ2xDLElBQUk7WUFDRixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsTUFBTSxJQUFJLFNBQVMsRUFBRTtnQkFDeEIsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ25ELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDaEMsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFT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