azurite
Version:
An open source Azure Storage API compatible server
113 lines • 7.95 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 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"));
/**
* 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);
// 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());
// Generated, will end and return HTTP response immediately
app.use(middlewareFactory.createEndMiddleware());
return app;
}
}
exports.default = BlobRequestListenerFactory;
//# sourceMappingURL=BlobRequestListenerFactory.js.map