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
JavaScript
"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