UNPKG

@nodefony/http-bundle

Version:

Nodefony Framework Bundle HTTP

184 lines (164 loc) 4.44 kB
const WebSocketServer = require('websocket'); const http = require("http"); nodefony.register("wsResponse", function () { const CLOSE_DESCRIPTIONS = WebSocketServer.connection.CLOSE_DESCRIPTIONS; const Response = class Response { constructor(connection, container) { this.container = container; if (connection) { this.setConnection(connection); } else { this.statusMessage = "closed"; this.config = null; this.webSocketVersion = null; } this.body = ""; this.statusCode = 1000; //cookies this.cookies = {}; this.encoding = this.setEncoding('utf8'); // struct headers this.headers = {}; this.type = "utf8"; } setConnection(connection) { this.connection = connection; this.statusMessage = this.connection.state; this.config = this.connection.config; this.webSocketVersion = this.connection.webSocketVersion; return connection; } log(pci, severity, msgid, msg) { let syslog = this.container.get("syslog"); if (!msgid) { msgid = "WEBSOCKET RESPONSE"; } return syslog.log(pci, severity, msgid, msg); } setBody(ele) { switch (nodefony.typeOf(ele)) { case "object": case "array": this.body = JSON.stringify(ele); break; default: this.body = ele.toString(); } return this.body; } getLength(ele) { return Buffer.byteLength(ele); } send(data, type) { if (data) { switch (type) { case "utf8": this.connection.sendUTF(data.utf8Data); break; case "binary": this.connection.sendBytes(data.binaryData); break; default: this.connection.send(data); } } else { if (this.body) { if (!type) { type = this.encoding; } return this.send(this.body); } } this.body = ""; } close(reasonCode, description) { if (this.connection.state === "open") { try { return this.connection.close((reasonCode || this.statusCode), (description || "closed")); } catch (e) { throw e; } } throw new Error("Connection already closed"); } drop(reasonCode, description) { if (this.connection.state === "open") { try { return this.connection.close((reasonCode || this.statusCode), (description || this.statusMessage)); } catch (e) { throw e; } } throw new Error("Connection already closed"); } clean() { delete this.connection; delete this.body; } addCookie(cookie) { if (cookie instanceof nodefony.cookies.cookie) { this.cookies[cookie.name] = cookie; } else { throw new Error("Response addCookies not valid cookies"); } } setEncoding(encoding) { return this.encoding = encoding; } setStatusCode(status, message) { if (status && typeof status !== "number") { status = parseInt(status, 10); if (isNaN(status)) { status = 500; } } if (!status) { status = 500; } this.statusCode = status; if (!message) { if (CLOSE_DESCRIPTIONS[this.statusCode]) { message = CLOSE_DESCRIPTIONS[this.statusCode]; } else { message = http.STATUS_CODES[this.statusCode]; } } this.statusMessage = message || null; return { code: this.statusCode, message: this.statusMessage }; } getStatus() { return { code: this.getStatusCode(), message: this.getStatusMessage() }; } getStatusCode() { return this.statusCode; } getStatusMessage() { return this.statusMessage; } setCookies() { for (var cook in this.cookies) { this.setCookie(this.cookies[cook]); } } setCookie(cookie) { this.log("ADD COOKIE ==> " + cookie.serialize(), "DEBUG"); this.setHeader('Set-Cookie', cookie.serialize()); } //ADD INPLICIT HEADER setHeader( /*name, value*/ ) { //this.response.setHeader(name, value); return true; } setHeaders( /*obj*/ ) { //nodefony.extend(this.headers, obj); return true; } }; return Response; });