azurite
Version:
An open source Azure Storage API compatible server
99 lines • 6.62 kB
JavaScript
"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 QueueSASAuthenticator_1 = tslib_1.__importDefault(require("./authentication/QueueSASAuthenticator"));
const QueueSharedKeyAuthenticator_1 = tslib_1.__importDefault(require("./authentication/QueueSharedKeyAuthenticator"));
const QueueTokenAuthenticator_1 = tslib_1.__importDefault(require("./authentication/QueueTokenAuthenticator"));
const ExpressMiddlewareFactory_1 = tslib_1.__importDefault(require("./generated/ExpressMiddlewareFactory"));
const MessageIdHandler_1 = tslib_1.__importDefault(require("./handlers/MessageIdHandler"));
const MessagesHandler_1 = tslib_1.__importDefault(require("./handlers/MessagesHandler"));
const QueueHandler_1 = tslib_1.__importDefault(require("./handlers/QueueHandler"));
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 constants_1 = require("./utils/constants");
const morgan = require("morgan");
const queueStorageContext_middleware_1 = tslib_1.__importDefault(require("./middlewares/queueStorageContext.middleware"));
/**
* Default RequestListenerFactory based on express framework.
*
* When creating other server implementations, such as based on Koa. Should also create a NEW
* corresponding QueueKoaRequestListenerFactory class by extending IRequestListenerFactory.
*
* @export
* @class QueueRequestListenerFactory
* @implements {IRequestListenerFactory}
*/
class QueueRequestListenerFactory {
constructor(metadataStore, extentStore, accountDataStore, enableAccessLog, accessLogWriteStream, skipApiVersionCheck, oauth, disableProductStyleUrl) {
this.metadataStore = metadataStore;
this.extentStore = extentStore;
this.accountDataStore = accountDataStore;
this.enableAccessLog = enableAccessLog;
this.accessLogWriteStream = accessLogWriteStream;
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_QUEUE_CONTEXT_PATH);
// Create handlers into handler middleware factory
const handlers = {
serviceHandler: new ServiceHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default),
queueHandler: new QueueHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default),
messagesHandler: new MessagesHandler_1.default(this.metadataStore, this.extentStore, Logger_1.default),
messageIdHandler: new MessageIdHandler_1.default(this.metadataStore, this.extentStore, 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, queueStorageContext_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 QueueSharedKeyAuthenticator_1.default(this.accountDataStore, Logger_1.default),
new AccountSASAuthenticator_1.default(this.accountDataStore, Logger_1.default),
new QueueSASAuthenticator_1.default(this.accountDataStore, this.metadataStore, Logger_1.default)
];
if (this.oauth !== undefined) {
authenticators.push(new QueueTokenAuthenticator_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());
// Generated, will end and return HTTP response immediately
app.use(middlewareFactory.createEndMiddleware());
return app;
}
}
exports.default = QueueRequestListenerFactory;
//# sourceMappingURL=QueueRequestListenerFactory.js.map