UNPKG

azurite

Version:

An open source Azure Storage API compatible server

118 lines 8.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const express_1 = tslib_1.__importDefault(require("express")); const Logger_1 = tslib_1.__importDefault(require("../common/Logger")); const AccountSASAuthenticator_1 = tslib_1.__importDefault(require("./authentication/AccountSASAuthenticator")); const BlobSASAuthenticator_1 = tslib_1.__importDefault(require("./authentication/BlobSASAuthenticator")); const BlobSharedKeyAuthenticator_1 = tslib_1.__importDefault(require("./authentication/BlobSharedKeyAuthenticator")); const BlobTokenAuthenticator_1 = tslib_1.__importDefault(require("./authentication/BlobTokenAuthenticator")); const PublicAccessAuthenticator_1 = tslib_1.__importDefault(require("./authentication/PublicAccessAuthenticator")); const ExpressMiddlewareFactory_1 = tslib_1.__importDefault(require("./generated/ExpressMiddlewareFactory")); const AppendBlobHandler_1 = tslib_1.__importDefault(require("./handlers/AppendBlobHandler")); const BlobHandler_1 = tslib_1.__importDefault(require("./handlers/BlobHandler")); const BlockBlobHandler_1 = tslib_1.__importDefault(require("./handlers/BlockBlobHandler")); const ContainerHandler_1 = tslib_1.__importDefault(require("./handlers/ContainerHandler")); const PageBlobHandler_1 = tslib_1.__importDefault(require("./handlers/PageBlobHandler")); const PageBlobRangesManager_1 = tslib_1.__importDefault(require("./handlers/PageBlobRangesManager")); const ServiceHandler_1 = tslib_1.__importDefault(require("./handlers/ServiceHandler")); const AuthenticationMiddlewareFactory_1 = tslib_1.__importDefault(require("./middlewares/AuthenticationMiddlewareFactory")); const PreflightMiddlewareFactory_1 = tslib_1.__importDefault(require("./middlewares/PreflightMiddlewareFactory")); const StrictModelMiddlewareFactory_1 = tslib_1.__importStar(require("./middlewares/StrictModelMiddlewareFactory")); const constants_1 = require("./utils/constants"); const morgan = require("morgan"); const blobStorageContext_middleware_1 = tslib_1.__importDefault(require("./middlewares/blobStorageContext.middleware")); const telemetry_middleware_1 = tslib_1.__importDefault(require("./middlewares/telemetry.middleware")); /** * Default RequestListenerFactory based on express framework. * * When creating other server implementations, such as based on Koa. Should also create a NEW * corresponding BlobKoaRequestListenerFactory class by extending IRequestListenerFactory. * * @export * @class BlobRequestListenerFactory * @implements {IRequestListenerFactory} */ class BlobRequestListenerFactory { constructor(metadataStore, extentStore, accountDataStore, enableAccessLog, accessLogWriteStream, loose, skipApiVersionCheck, oauth, disableProductStyleUrl) { this.metadataStore = metadataStore; this.extentStore = extentStore; this.accountDataStore = accountDataStore; this.enableAccessLog = enableAccessLog; this.accessLogWriteStream = accessLogWriteStream; this.loose = loose; this.skipApiVersionCheck = skipApiVersionCheck; this.oauth = oauth; this.disableProductStyleUrl = disableProductStyleUrl; } createRequestListener() { const app = (0, express_1.default)().disable("x-powered-by"); // MiddlewareFactory is a factory to create auto-generated middleware const middlewareFactory = new ExpressMiddlewareFactory_1.default(Logger_1.default, constants_1.DEFAULT_CONTEXT_PATH); // Create handlers into handler middleware factory const pageBlobRangesManager = new PageBlobRangesManager_1.default(); const loose = this.loose || false; const handlers = { appendBlobHandler: new AppendBlobHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default, loose), blobHandler: new BlobHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default, loose, pageBlobRangesManager), blockBlobHandler: new BlockBlobHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default, loose), containerHandler: new ContainerHandler_1.default(this.accountDataStore, this.oauth, this.metadataStore, this.extentStore, Logger_1.default, loose, this.disableProductStyleUrl), pageBlobHandler: new PageBlobHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default, loose, pageBlobRangesManager), serviceHandler: new ServiceHandler_1.default(this.accountDataStore, this.oauth, this.metadataStore, this.extentStore, Logger_1.default, loose, this.disableProductStyleUrl) }; // CORS request handling, preflight request and the corresponding actual request const preflightMiddlewareFactory = new PreflightMiddlewareFactory_1.default(Logger_1.default); // Send Telemetry data const telemetryMiddlewareFactory = new telemetry_middleware_1.default(constants_1.DEFAULT_CONTEXT_PATH); // Strict mode unsupported features blocker const strictModelMiddlewareFactory = new StrictModelMiddlewareFactory_1.default(Logger_1.default, [StrictModelMiddlewareFactory_1.UnsupportedHeadersBlocker, StrictModelMiddlewareFactory_1.UnsupportedParametersBlocker]); /* * Generated middleware should follow strict orders * Manually created middleware can be injected into any points */ // Access log per request if (this.enableAccessLog) { app.use(morgan("common", { stream: this.accessLogWriteStream })); } // Manually created middleware to deserialize feature related context which swagger doesn't know app.use((0, blobStorageContext_middleware_1.default)(this.skipApiVersionCheck, this.disableProductStyleUrl, this.loose)); // Dispatch incoming HTTP request to specific operation app.use(middlewareFactory.createDispatchMiddleware()); // Block unsupported features in strict mode by default if (this.loose === false || this.loose === undefined) { app.use(strictModelMiddlewareFactory.createStrictModelMiddleware()); } // AuthN middleware, like shared key auth or SAS auth const authenticationMiddlewareFactory = new AuthenticationMiddlewareFactory_1.default(Logger_1.default); const authenticators = [ new PublicAccessAuthenticator_1.default(this.metadataStore, Logger_1.default), new BlobSharedKeyAuthenticator_1.default(this.accountDataStore, Logger_1.default), new AccountSASAuthenticator_1.default(this.accountDataStore, this.metadataStore, Logger_1.default), new BlobSASAuthenticator_1.default(this.accountDataStore, this.metadataStore, Logger_1.default) ]; if (this.oauth !== undefined) { authenticators.push(new BlobTokenAuthenticator_1.default(this.accountDataStore, this.oauth, Logger_1.default)); } app.use(authenticationMiddlewareFactory.createAuthenticationMiddleware(authenticators)); // Generated, will do basic validation defined in swagger app.use(middlewareFactory.createDeserializerMiddleware()); // Generated, inject handlers to create a handler middleware app.use(middlewareFactory.createHandlerMiddleware(handlers)); // CORS app.use(preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore, true)); app.use(preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore, false)); // Generated, will serialize response models into HTTP response app.use(middlewareFactory.createSerializerMiddleware()); // Preflight app.use(preflightMiddlewareFactory.createOptionsHandlerMiddleware(this.metadataStore)); // Generated, will return MiddlewareError and Errors thrown in previous middleware/handlers to HTTP response app.use(middlewareFactory.createErrorMiddleware()); // Send out telemetry data app.use(telemetryMiddlewareFactory.createTelemetryMiddleware()); // Generated, will end and return HTTP response immediately app.use(middlewareFactory.createEndMiddleware()); return app; } } exports.default = BlobRequestListenerFactory; //# sourceMappingURL=BlobRequestListenerFactory.js.map