azurite
Version:
An open source Azure Storage API compatible server
127 lines • 8.06 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 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