UNPKG

xud

Version:
130 lines 5.53 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const http_1 = __importDefault(require("http")); const HttpService_1 = __importDefault(require("./HttpService")); class HttpServer { constructor(logger, service) { this.logger = logger; this.processRequest = (req, res) => __awaiter(this, void 0, void 0, function* () { let statusCode = 200; let resJson; let reqJson; try { reqJson = yield this.reqToJson(req); } catch (err) { statusCode = 400; resJson = { message: JSON.stringify(err), retry: false }; } if (reqJson) { try { switch (req.url) { case '/preimage': resJson = yield this.httpService.providePreimage(reqJson); break; case '/incoming-transfer': resJson = yield this.httpService.incomingTransfer(reqJson); break; case '/deposit-confirmed': reqJson = this.httpService.depositConfirmed(reqJson); break; default: throw new Error(`unable to process request to ${req.url}`); } } catch (err) { const msg = `processing request to ${req.url} failed`; this.logger.error(msg, err); statusCode = 500; resJson = { message: msg }; } } res.writeHead(statusCode, { 'Content-Type': 'application/json' }); res.end(JSON.stringify(resJson)); }); this.requestListener = (req, res) => __awaiter(this, void 0, void 0, function* () { if (!req.headers['content-length']) { res.writeHead(411); res.end(); return; } const SUPPORTED_ENDPOINTS = [ '/preimage', '/incoming-transfer', '/deposit-confirmed', ]; if (req.url && SUPPORTED_ENDPOINTS.includes(req.url)) { yield this.processRequest(req, res); } else { res.writeHead(404); res.end(); } }); this.reqToJson = (req) => { return new Promise((resolve, reject) => { const body = []; req.on('data', (chunk) => { body.push(chunk); }).on('end', () => { const bodyStr = Buffer.concat(body).toString(); const reqContentLength = parseInt(req.headers['content-length'] || '', 10); if (bodyStr.length !== reqContentLength) { reject('invalid content-length header'); return; } try { const reqJson = JSON.parse(bodyStr); this.logger.debug(`http server request json: ${JSON.stringify(reqJson)}`); resolve(reqJson); } catch (err) { reject('cannot parse request json'); } }); }); }; /** * Starts the server and begins listening on the provided port. */ this.listen = (port, host) => __awaiter(this, void 0, void 0, function* () { return new Promise((resolve, reject) => { const listenErrHandler = (err) => { reject(err); }; this.server.listen(port, host).once('listening', () => { this.logger.info(`http server listening on ${host}:${port}`); this.server.removeListener('error', listenErrHandler); resolve(); }).on('error', listenErrHandler); }); }); /** * Stops listening for requests. */ this.close = () => { return new Promise((resolve) => { this.server.close(() => { this.logger.info('http server has closed'); resolve(); }); }); }; this.server = http_1.default.createServer(this.requestListener); this.httpService = new HttpService_1.default(service); } } exports.default = HttpServer; //# sourceMappingURL=HttpServer.js.map