UNPKG

serverless-offline-edge-lambda

Version:

A plugin for the Serverless Framework that simulates the behavior of AWS CloudFront Edge Lambdas while developing offline.

122 lines 5.14 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CloudFrontLifecycle = void 0; const errors_1 = require("../errors"); const utils_1 = require("../utils"); class CloudFrontLifecycle { constructor(serverless, options, event, context, fileService, fnSet, origin) { this.serverless = serverless; this.options = options; this.event = event; this.context = context; this.fileService = fileService; this.fnSet = fnSet; this.origin = origin; this.log = serverless.cli.log.bind(serverless.cli); } run(url) { return __awaiter(this, void 0, void 0, function* () { this.log(`Request for ${url}`); try { return yield this.onViewerRequest(); } catch (err) { if (!(err instanceof errors_1.NoResult)) { throw err; } } try { return yield this.onCache(); } catch (err) { if (!(err instanceof errors_1.NoResult)) { throw err; } } const result = yield this.onOriginRequest(); yield this.fileService.saveToCache((0, utils_1.combineResult)(this.event, result)); return yield this.onViewerResponse(result); }); } onViewerRequest() { return __awaiter(this, void 0, void 0, function* () { this.log('→ viewer-request'); const result = yield this.fnSet.viewerRequest(this.event, this.context); if ((0, utils_1.isResponseResult)(result)) { return this.onViewerResponse(result); } throw new errors_1.NoResult(); }); } onViewerResponse(result) { return __awaiter(this, void 0, void 0, function* () { this.log('← viewer-response'); const event = (0, utils_1.combineResult)(this.event, result); return this.fnSet.viewerResponse(event, this.context); }); } onCache() { return __awaiter(this, void 0, void 0, function* () { this.log('→ cache'); if (this.options.disableCache) { this.log('✗ Cache disabled'); throw new errors_1.NoResult(); } const cached = this.fileService.retrieveFromCache(this.event); if (!cached) { this.log('✗ Cache miss'); throw new errors_1.NoResult(); } else { this.log('✓ Cache hit'); throw new errors_1.NoResult(); } const result = (0, utils_1.toResultResponse)(cached); return this.onViewerResponse(result); }); } onOrigin() { return __awaiter(this, void 0, void 0, function* () { this.log('→ origin'); return yield this.fnSet.origin.retrieve(this.event); }); } onOriginRequest() { return __awaiter(this, void 0, void 0, function* () { this.log('→ origin-request'); // Inject origin into request once we reach the origin request step // as it is not available in viewer requests this.injectOriginIntoRequest(); const result = yield this.fnSet.originRequest(this.event, this.context); if ((0, utils_1.isResponseResult)(result)) { return result; } const resultFromOrigin = yield this.onOrigin(); return this.onOriginResponse(resultFromOrigin); }); } onOriginResponse(result) { return __awaiter(this, void 0, void 0, function* () { this.log('← origin-response'); const event = (0, utils_1.combineResult)(this.event, result); return this.fnSet.originResponse(event, this.context); }); } injectOriginIntoRequest() { var _a, _b, _c; if (((_c = (_b = (_a = this === null || this === void 0 ? void 0 : this.event) === null || _a === void 0 ? void 0 : _a.Records[0]) === null || _b === void 0 ? void 0 : _b.cf) === null || _c === void 0 ? void 0 : _c.request) && this.origin !== null) { this.event.Records[0].cf.request.origin = this.origin; } } } exports.CloudFrontLifecycle = CloudFrontLifecycle; //# sourceMappingURL=cloudfront.service.js.map