src/server/http.js
const http = require("http");
const https = require("https");
const JsonRpcServerFactory = require(".");
const HttpServerProtocol = require("./protocol/http");
/**
* Creates instance of HttpServerFactory
* @extends JsonRpcServerFactory
*/
class HttpServerFactory extends JsonRpcServerFactory {
/**
*
* In addition to the params and properties for [JsonRpcServerFactory]{@link JsonRpcServerFactory}
* the WsServerProtocol has the following properties:
*
* @property {'http'|'https'} scheme The scheme to allow connections with
* @property {object} sslOptions Any of the ssl options for the http server according to https://nodejs.org/api/tls.html#tls_tls_createsecurecontext_options
*/
constructor(options) {
super(options);
this.scheme = this.options.scheme || "http";
this.sslOptions = this.options.ssl;
this.protocol = HttpServerProtocol;
this.pendingRequests = [];
}
/** @inheritdoc */
setServer() {
if (this.scheme === "http") {
this.server = new http.Server();
} else if (this.scheme === "https") {
this.server = new https.Server({
...this.sslOptions
});
} else {
throw Error("Invalid scheme");
}
}
/** @inheritdoc */
buildProtocol() {
this.server.on("connection", (client) => {
this.clientConnected(client);
this.clients.push(client);
client.on("close", () => {
this.clientDisconnected(client);
});
// maybe need .on('end') event listener?
});
this.server.on("request", (request, response) => {
const pcol = new this.protocol(
this,
request,
response,
this.options.version,
this.options.delimiter
);
pcol.clientConnected();
this.pendingRequests.push(pcol);
});
}
/**
* Called when the server receives a `connection` event.
*
* @param {net.Socket} client Instance of `net.Socket`
* @returns {net.Socket} Returns an instance of `net.Socket`
*/
clientConnected(client) {
return client;
}
}
module.exports = HttpServerFactory;