UNPKG

rosetta-sdk-typescript

Version:

Typescript SDK to create and interact with Rosetta API implementations.

116 lines (115 loc) 4.57 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.RosettaServer = void 0; const express_1 = __importDefault(require("express")); const OpenApiValidator = __importStar(require("express-openapi-validator")); const fs_1 = require("fs"); const path_1 = require("path"); const swagger = __importStar(require("swagger-ui-express")); const filesystem_1 = require("tsconfig-paths/lib/filesystem"); const _1 = require("./"); /** * Default roseeta server params. */ const defaultServerParams = { openApiValidateRequests: true, openApiValidateResponses: true, openApiServeDocs: true, openApiServeSpec: true, welcomeMessage: 'Welcome to the Rosetta Server', ignorePaths: ['/robots.txt'], }; /** * Main class of this SDK. A Rosetta implementation should initialize this object and start the server. * * */ const apiSpec = path_1.join(__dirname, '../../api.json'); if (!filesystem_1.fileExistsSync(apiSpec)) { throw new Error(`${apiSpec} does not exist!`); } const apiContent = fs_1.readFileSync(apiSpec, 'utf-8'); const api = JSON.parse(apiContent); class RosettaServer { constructor(params) { var _a; this.params = params; const resolvedParams = Object.assign(Object.assign({}, defaultServerParams), params); if (!resolvedParams.apiServiceFactory) { throw new Error('apiServiceFactory must be provided!!'); } this.openApiRouterResolver = new _1.OpenApiRouterResolver(new _1.ApiControllerFactoryImpl(resolvedParams.apiServiceFactory)); const app = express_1.default(); (_a = resolvedParams.appSetupCallback) === null || _a === void 0 ? void 0 : _a.call(resolvedParams, app); app.use(express_1.default.json()); app.use(express_1.default.urlencoded({ extended: false })); app.get('/', (req, res) => res.send(resolvedParams.welcomeMessage)); if (resolvedParams.openApiServeSpec) app.get('/openapi', (req, res) => res.json(api)); if (resolvedParams.openApiServeDocs) app.use('/api-docs', swagger.serve, swagger.setup(api)); app.use(_1.ServerUtils.errorHandler()); app.use(OpenApiValidator.middleware({ operationHandlers: { basePath: __dirname, resolver: (modulePath, route) => { return this.openApiRouterResolver.resolver(route); }, }, ignorePaths: (path) => { return resolvedParams.ignorePaths.includes(path); }, apiSpec: apiSpec, validateRequests: resolvedParams.openApiValidateRequests, validateResponses: resolvedParams.openApiValidateResponses, })); this.app = app; } start(port) { if (this.server) { throw new Error('Server has already started!!!'); } return new Promise((resolve) => { this.server = this.app.listen({ port: port }, () => { console.log(`🚀 Rosetta server ready and listening at ==> http://localhost:${port}`); resolve(); }); }); } stop() { if (!this.server) { return Promise.resolve(); } return new Promise((resolve) => { this.server.close(() => { this.server = undefined; resolve(); }); }); } } exports.RosettaServer = RosettaServer; // The Rosetta api this SDK supports. RosettaServer.ROSETTA_API_VERSION = api.info.version;