xud
Version:
Exchange Union Daemon
130 lines • 5.53 kB
JavaScript
;
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