products/userale/example/server.js (129 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ const express = require("express"); const w = require("ws"); const bodyParser = require("body-parser"); const fs = require("fs"); const path = require("path"); const logDirectory = path.resolve(__dirname, "../logs"); const logPath = path.resolve( logDirectory, "logs_" + new Date().getTime() + ".json", ); try { fs.lstatSync(logDirectory); } catch (e) { fs.mkdirSync(logDirectory); // Create directory if it doesn't exist } const wStream = fs.createWriteStream(logPath); wStream.on("open", function () { wStream.write("["); }); let firstLog = true; // ~~~~~~~~ Websocket Server ~~~~~~~~~~~~~~~~ const wss = new w.WebSocketServer({ port: 8001 }); wss.on("connection", (ws) => { console.log("New client connected"); ws.on("message", (message) => { console.log("message type:" + typeof message); const body = typeof message === "string" ? JSON.parse(message) : JSON.parse(message.toString()); const isEmptyArray = Array.isArray(body) && body.length === 0; const isEmptyObject = typeof body === "object" && body !== null && Object.keys(body).length === 0; if (isEmptyArray || isEmptyObject) return; console.log(body); let delimeter = ",\n\t"; if (firstLog) { wStream.write("\n\t"); firstLog = false; } else { wStream.write(delimeter); } const logLength = message.length - 1; body.forEach(function (log, i) { if (i === logLength) { delimeter = ""; } wStream.write(JSON.stringify(log) + delimeter); }); }); ws.on("close", () => { console.log("Client disconnected"); }); }); console.log("UserAle Websocket server running on port 8001"); // ~~~~~~~ End Websocket Server ~~~~~~~~~~~~~~ // ~~~~~~~ Normal Server ~~~~~~~~~~~~~~~~~~~ const app = express(); app.set("port", process.env.PORT || 8000); app.use(function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); res.header( "Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, X-Requested-With", ); // intercept OPTIONS method if ("OPTIONS" == req.method) { res.sendStatus(200); } else { next(); } }); app.use(bodyParser.urlencoded({ extended: true, limit: "100mb" })); app.use(bodyParser.json({ limit: "100mb" })); app.use(bodyParser.text()); app.use("/build", express.static(path.join(__dirname, "/../build"))); app.use("/", express.static(__dirname)); app.set("view engine", "jade"); app.use("/", express.static(__dirname)); app.get("/", function (req, res) { res.sendFile("index.html", { root: __dirname }); }); app.get("/ws", function (req, res) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS"); res.header( "Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, X-Requested-With", ); res.sendFile("ws-index.html", { root: __dirname }); }); app.get("/no-logging", function (req, res) { res.sendFile("no-logging.html", { root: __dirname }); }); app.post("/", function (req, res) { const body = typeof req.body === "string" ? JSON.parse(req.body) : req.body; const isEmptyArray = Array.isArray(body) && body.length === 0; const isEmptyObject = typeof body === "object" && body !== null && Object.keys(body).length === 0; if (isEmptyArray || isEmptyObject) return; console.log(body); let delimiter = ",\n\t"; if (firstLog) { wStream.write("\n\t"); firstLog = false; } else { wStream.write(delimiter); } const logLength = req.body.length - 1; body.forEach(function (log, i) { if (i === logLength) { delimiter = ""; } wStream.write(JSON.stringify(log) + delimiter); }); res.sendStatus(200); }); app.listen(app.get("port"), function () { console.log("UserAle Local running on port", app.get("port")); }); function closeLogServer() { wStream.end("\n]"); process.exit(); } // ~~~~~~~ End Normal Server ~~~~~~~~~~~~~ process.on("SIGTERM", function () { closeLogServer(); }); process.on("SIGINT", function () { closeLogServer(); });