UNPKG

azurite

Version:

An open source Azure Storage API compatible server

127 lines 8.06 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 TableSASAuthenticator_1 = tslib_1.__importDefault(require("./authentication/TableSASAuthenticator")); const TableTokenAuthenticator_1 = tslib_1.__importDefault(require("./authentication/TableTokenAuthenticator")); const mappers_1 = require("./generated/artifacts/mappers"); const operation_1 = require("./generated/artifacts/operation"); const specifications_1 = tslib_1.__importDefault(require("./generated/artifacts/specifications")); const ExpressMiddlewareFactory_1 = tslib_1.__importDefault(require("./generated/ExpressMiddlewareFactory")); const ServiceHandler_1 = tslib_1.__importDefault(require("./handlers/ServiceHandler")); const TableHandler_1 = tslib_1.__importDefault(require("./handlers/TableHandler")); const AuthenticationMiddlewareFactory_1 = tslib_1.__importDefault(require("./middleware/AuthenticationMiddlewareFactory")); const tableStorageContext_middleware_1 = tslib_1.__importDefault(require("./middleware/tableStorageContext.middleware")); const constants_1 = require("./utils/constants"); const PreflightMiddlewareFactory_1 = tslib_1.__importDefault(require("./middleware/PreflightMiddlewareFactory")); const morgan = require("morgan"); const TableSharedKeyAuthenticator_1 = tslib_1.__importDefault(require("./authentication/TableSharedKeyAuthenticator")); const TableSharedKeyLiteAuthenticator_1 = tslib_1.__importDefault(require("./authentication/TableSharedKeyLiteAuthenticator")); const telemetry_middleware_1 = tslib_1.__importDefault(require("./middleware/telemetry.middleware")); /** * Default RequestListenerFactory based on express framework. * * When creating other server implementations, such as based on Koa. Should also create a NEW * corresponding TableKoaRequestListenerFactory class by extending IRequestListenerFactory. * * @export * @class TableRequestListenerFactory * @implements {IRequestListenerFactory} */ class TableRequestListenerFactory { constructor(metadataStore, accountDataStore, enableAccessLog, accessLogWriteStream, skipApiVersionCheck, oauth, disableProductStyleUrl) { this.metadataStore = metadataStore; this.accountDataStore = accountDataStore; this.enableAccessLog = enableAccessLog; this.accessLogWriteStream = accessLogWriteStream; this.skipApiVersionCheck = skipApiVersionCheck; this.oauth = oauth; this.disableProductStyleUrl = disableProductStyleUrl; } createRequestListener() { [ operation_1.Operation.Table_Create, operation_1.Operation.Table_Query, operation_1.Operation.Table_Delete, operation_1.Operation.Table_QueryEntities, operation_1.Operation.Table_QueryEntitiesWithPartitionAndRowKey, operation_1.Operation.Table_UpdateEntity, operation_1.Operation.Table_MergeEntity, operation_1.Operation.Table_DeleteEntity, operation_1.Operation.Table_InsertEntity ].forEach((operation) => { specifications_1.default[operation].isXML = false; }); // TODO: MERGE verbs is not supported by auto generator yet, // So there we generate a post method and change the verb for MERGE here Object.defineProperty(specifications_1.default[operation_1.Operation.Table_MergeEntityWithMerge], "httpMethod", { value: "MERGE", writable: false }); // TODO: Override Query Table JSON response element value mappers_1.TableQueryResponse.type.modelProperties.value.xmlElementName = "value"; 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_TABLE_CONTEXT_PATH); // Send Telemetry data const telemetryMiddlewareFactory = new telemetry_middleware_1.default(constants_1.DEFAULT_TABLE_CONTEXT_PATH); // Create handlers into handler middleware factory const handlers = { tableHandler: new TableHandler_1.default(this.metadataStore, Logger_1.default), serviceHandler: new ServiceHandler_1.default(this.metadataStore, Logger_1.default) }; /* * 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, tableStorageContext_middleware_1.default)(this.skipApiVersionCheck, this.disableProductStyleUrl)); // Dispatch incoming HTTP request to specific operation app.use(middlewareFactory.createDispatchMiddleware()); // AuthN middleware, like shared key auth or SAS auth const authenticationMiddlewareFactory = new AuthenticationMiddlewareFactory_1.default(Logger_1.default); const authenticators = [ new TableSharedKeyLiteAuthenticator_1.default(this.accountDataStore, Logger_1.default), new TableSharedKeyAuthenticator_1.default(this.accountDataStore, Logger_1.default), new AccountSASAuthenticator_1.default(this.accountDataStore, Logger_1.default), new TableSASAuthenticator_1.default(this.accountDataStore, this.metadataStore, Logger_1.default) ]; if (this.oauth !== undefined) { authenticators.push(new TableTokenAuthenticator_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 request handling, preflight request and the corresponding actual request const preflightMiddlewareFactory = new PreflightMiddlewareFactory_1.default(Logger_1.default); // CORS actual request handling. // tslint:disable-next-line:max-line-length // See as https://docs.microsoft.com/en-us/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services 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()); // CORS preflight request handling, processing OPTIONS requests. // TODO: Should support OPTIONS in swagger and autorest, then this handling can be moved to ServiceHandler. 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 = TableRequestListenerFactory; //# sourceMappingURL=TableRequestListenerFactory.js.map