transgate
Version:
Agent-based task flow framework
86 lines (85 loc) • 2.6 kB
JavaScript
;
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 buffer_1 = require("./buffer");
/**
* HTTP server Gate for Input
*/
class HttpServerGate {
/**
* @param {number} options.port - listen port
* @param {string} options.host - bind host
*/
constructor(options = {}) {
const { port = 18000, host } = options;
this._buffer = new buffer_1.ItemBuffer();
this._server = http_1.default.createServer((req, res) => {
if (req.method === 'POST' || req.method == 'PUT') {
let body = '';
req.on('data', data => {
body += data;
}).on('end', () => {
if (body.length === 0) {
this._buffer.write(null);
res.writeHead(204);
res.end();
return;
}
try {
const item = JSON.parse(body);
this._buffer.write(item);
res.writeHead(204);
res.end();
}
catch (e) {
console.error(e);
res.writeHead(422, { 'Content-Length': 0 });
res.end();
}
});
}
else {
res.writeHead(405, { 'Content-Length': 0 });
res.end();
}
});
this._server.listen(port, host);
}
/**
* @return {http.Server} - HTTP server instance
*/
get server() {
return this._server;
}
/**
* @return {Promise<object>} - A promise that resolves the item when recevied
*/
async receive() {
const entry = await this._buffer.read();
if (entry === null) {
await this.close();
return null;
}
return entry;
}
/**
* Close HTTP server
* @return {Promise} - A promise that resolves server closed
*/
close() {
const svr = this._server;
if (svr) {
this._server = null;
return new Promise((resolve) => {
svr.close(resolve);
});
}
else {
return Promise.resolve();
}
}
}
exports.HttpServerGate = HttpServerGate;