瀏覽代碼

Remove uwebsockets (#9160)

Nate 1 年之前
父節點
當前提交
4b0a91f071

+ 0 - 55
frameworks/JavaScript/uwebsockets.js/README.md

@@ -1,55 +0,0 @@
-# uWebSockets.js Benchmarking Test
-
-uWebSockets is a web server written in C/C++ (https://github.com/uNetworking/uWebSockets)
-
-µWebSockets.js is a web server bypass for Node.js (https://github.com/uNetworking/uWebSockets.js)
-
-## Important Libraries
-
-The tests were run with:
-
-- [uWebSockets.js](https://github.com/uNetworking/uWebSockets.js/)
-- [postgres](https://github.com/porsager/postgres/)
-- [mariadb](https://github.com/mariadb-corporation/mariadb-connector-nodejs/)
-
-## Database
-
-There are individual handlers for each DB approach. The logic for each of them are found here:
-
-- [PostgreSQL](src/database/postgres.js)
-- [MySQL](src/database/mysql.js)
-
-There are **no database endpoints** or drivers attached by default.
-
-To initialize the application with one of these, run any _one_ of the following commands:
-
-```sh
-$ DATABASE=postgres npm start
-$ DATABASE=mysql npm start
-```
-
-## Test Endpoints
-
-> Visit the test requirements [here](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview)
-
-```sh
-$ curl localhost:8080/json
-$ curl localhost:8080/plaintext
-
-# The following are only available with the DATABASE env var
-
-$ curl localhost:8080/db
-$ curl localhost:8080/fortunes
-
-$ curl localhost:8080/updates?queries=
-$ curl localhost:8080/updates?queries=2
-$ curl localhost:8080/updates?queries=1000
-$ curl localhost:8080/updates?queries=foo
-$ curl localhost:8080/updates?queries=0
-
-$ curl localhost:8080/queries?queries=
-$ curl localhost:8080/queries?queries=2
-$ curl localhost:8080/queries?queries=1000
-$ curl localhost:8080/queries?queries=foo
-$ curl localhost:8080/queries?queries=0
-```

+ 0 - 68
frameworks/JavaScript/uwebsockets.js/benchmark_config.json

@@ -1,68 +0,0 @@
-{
-  "framework": "uwebsockets.js",
-  "tests": [
-    {
-      "default": {
-        "approach": "Realistic",
-        "classification": "Platform",
-        "database": "None",
-        "database_os": "Linux",
-        "display_name": "uWebSockets.js",
-        "flavor": "NodeJS",
-        "framework": "uWebSockets.js",
-        "json_url": "/json",
-        "language": "JavaScript",
-        "notes": "",
-        "orm": "Raw",
-        "os": "Linux",
-        "plaintext_url": "/plaintext",
-        "platform": "nodejs",
-        "port": 8080,
-        "versus": "nodejs",
-        "webserver": "None"
-      },
-      "postgres": {
-        "approach": "Realistic",
-        "classification": "Platform",
-        "database": "Postgres",
-        "database_os": "Linux",
-        "db_url": "/db",
-        "display_name": "uWebSockets.js",
-        "flavor": "NodeJS",
-        "fortune_url": "/fortunes",
-        "framework": "uWebSockets.js",
-        "language": "JavaScript",
-        "notes": "",
-        "orm": "Raw",
-        "os": "Linux",
-        "platform": "None",
-        "port": 8080,
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "versus": "nodejs",
-        "webserver": "None"
-      },
-      "mysql": {
-        "approach": "Realistic",
-        "classification": "Platform",
-        "database": "MySQL",
-        "database_os": "Linux",
-        "db_url": "/db",
-        "display_name": "uWebSockets.js",
-        "flavor": "NodeJS",
-        "fortune_url": "/fortunes",
-        "framework": "uWebSockets.js",
-        "language": "JavaScript",
-        "notes": "",
-        "orm": "Raw",
-        "os": "Linux",
-        "platform": "None",
-        "port": 8080,
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "versus": "nodejs",
-        "webserver": "None"
-      }
-    }
-  ]
-}

+ 0 - 105
frameworks/JavaScript/uwebsockets.js/package-lock.json

@@ -1,105 +0,0 @@
-{
-  "name": "uwebsockets.js",
-  "version": "0.0.1",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "uwebsockets.js",
-      "version": "0.0.1",
-      "license": "MIT",
-      "dependencies": {
-        "mariadb": "^3.3.0",
-        "postgres": "^3.4.4",
-        "slow-json-stringify": "^2.0.1",
-        "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0"
-      }
-    },
-    "node_modules/@types/geojson": {
-      "version": "7946.0.14",
-      "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
-      "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
-    },
-    "node_modules/@types/node": {
-      "version": "20.12.7",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz",
-      "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==",
-      "dependencies": {
-        "undici-types": "~5.26.4"
-      }
-    },
-    "node_modules/denque": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lru-cache": {
-      "version": "10.2.2",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz",
-      "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==",
-      "engines": {
-        "node": "14 || >=16.14"
-      }
-    },
-    "node_modules/mariadb": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.0.tgz",
-      "integrity": "sha512-sAL4bJgbfCAtXcE8bXI+NAMzVaPNkIU8hRZUXYfgNFoWB9U57G3XQiMeCx/A6IrS6y7kGwBLylrwgsZQ8kUYlw==",
-      "dependencies": {
-        "@types/geojson": "^7946.0.14",
-        "@types/node": "^20.11.17",
-        "denque": "^2.1.0",
-        "iconv-lite": "^0.6.3",
-        "lru-cache": "^10.2.0"
-      },
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/postgres": {
-      "version": "3.4.4",
-      "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.4.tgz",
-      "integrity": "sha512-IbyN+9KslkqcXa8AO9fxpk97PA4pzewvpi2B3Dwy9u4zpV32QicaEdgmF3eSQUzdRk7ttDHQejNgAEr4XoeH4A==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "type": "individual",
-        "url": "https://github.com/sponsors/porsager"
-      }
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "node_modules/slow-json-stringify": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/slow-json-stringify/-/slow-json-stringify-2.0.1.tgz",
-      "integrity": "sha512-jqyzIqTaSkRGcWdWqjmOLKHZgOGUT71ZCTsvQu1xGu9Mqaod7O26y5FJJEmaUQhaTWh0bkXv2qqN0i+EQsD1jQ=="
-    },
-    "node_modules/undici-types": {
-      "version": "5.26.5",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
-      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
-    },
-    "node_modules/uWebSockets.js": {
-      "version": "20.44.0",
-      "resolved": "git+ssh://[email protected]/uNetworking/uWebSockets.js.git#8fa05571bf6ea95be8966ad313d9d39453e381ae"
-    }
-  }
-}

+ 0 - 18
frameworks/JavaScript/uwebsockets.js/package.json

@@ -1,18 +0,0 @@
-{
-  "dependencies": {
-    "mariadb": "^3.3.0",
-    "postgres": "^3.4.4",
-    "slow-json-stringify": "^2.0.1",
-    "uWebSockets.js": "uNetworking/uWebSockets.js#v20.44.0"
-  },
-  "license": "MIT",
-  "main": "src/server.js",
-  "name": "uwebsockets.js",
-  "private": true,
-  "scripts": {
-    "dev": "node src/server.js",
-    "start": "node src/clustered.js"
-  },
-  "type": "module",
-  "version": "0.0.1"
-}

+ 0 - 23
frameworks/JavaScript/uwebsockets.js/src/clustered.js

@@ -1,23 +0,0 @@
-import cluster from "node:cluster";
-import os from "node:os";
-import process from "node:process";
-
-if (cluster.isPrimary) {
-  // Master Node
-  console.log(`Primary ${process.pid} is running`);
-
-  // Fork workers
-  const numCPUs = os.availableParallelism();
-  for (let i = 0; i < numCPUs; i++) {
-    cluster.fork();
-  }
-
-  cluster.on("exit", (worker) => {
-    console.log(`worker ${worker.process.pid} died`);
-    process.exit(1);
-  });
-} else {
-  // Cluster Node
-  await import("./server.js");
-  console.log(`Worker ${process.pid} started`);
-}

+ 0 - 16
frameworks/JavaScript/uwebsockets.js/src/database/mysql.js

@@ -1,16 +0,0 @@
-import { createPool } from "mariadb";
-import os from "node:os";
-
-const pool = createPool({
-  host: "tfb-database",
-  user: "benchmarkdbuser",
-  password: "benchmarkdbpass",
-  database: "hello_world",
-  connectionLimit: os.availableParallelism()
-});
-
-export const fortunes = async () => await pool.execute("SELECT id, message FROM fortune");
-
-export const find = async (id) => await pool.execute("SELECT id, randomnumber FROM world WHERE id = ?", [id]).then((arr) => arr[0]);
-
-export const bulkUpdate = async (worlds) => await Promise.all(worlds.map(world => pool.execute("UPDATE world SET randomnumber = ? WHERE id = ?", [world.randomNumber, world.id])));

+ 0 - 17
frameworks/JavaScript/uwebsockets.js/src/database/postgres.js

@@ -1,17 +0,0 @@
-import postgres from "postgres";
-
-const sql = postgres({
-  host: "tfb-database",
-  user: "benchmarkdbuser",
-  password: "benchmarkdbpass",
-  database: "hello_world",
-  max: 1
-});
-
-export const fortunes = async () => await sql`SELECT id, message FROM fortune`;
-
-export const find = async (id) => await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then((arr) => arr[0]);
-
-export const bulkUpdate = async (worlds) => await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int
-  FROM (VALUES ${sql(worlds.map(world => [world.id, world.randomNumber]).sort((a, b) => (a[0] < b[0]) ? -1 : 1))}) AS update_data (id, randomNumber)
-  WHERE world.id = (update_data.id)::int`;

+ 0 - 194
frameworks/JavaScript/uwebsockets.js/src/server.js

@@ -1,194 +0,0 @@
-import uWebSockets from "uWebSockets.js";
-import {
-  addBenchmarkHeaders,
-  generateRandomNumber,
-  getQueriesCount,
-  handleError,
-  escape,
-  jsonSerializer,
-  worldObjectSerializer,
-  sortByMessage
-} from "./utils.js";
-
-let db;
-const { DATABASE } = process.env;
-if (DATABASE) db = await import(`./database/${DATABASE}.js`);
-
-const webserver = uWebSockets.App();
-
-webserver.get("/plaintext", new uWebSockets.DeclarativeResponse()
-              .writeHeader("Server", "uWebSockets.js")
-              .writeHeader("Content-Type", "text/plain")
-              .end("Hello, World!")
-);
-
-webserver.get("/json", (response) => {
-  addBenchmarkHeaders(response);
-  response.writeHeader("Content-Type", "application/json");
-  // response.end(JSON.stringify({ message: "Hello, World!" }));
-  response.end(jsonSerializer({ message: "Hello, World!" }));
-});
-
-if (db) {
-  webserver.get("/db", async (response) => {
-    response.onAborted(() => {
-      response.aborted = true;
-    });
-
-    try {
-      const row = await db.find(generateRandomNumber());
-
-      if (response.aborted) {
-        return;
-      }
-
-      response.cork(() => {
-        addBenchmarkHeaders(response);
-        response.writeHeader("Content-Type", "application/json");
-        // response.end(JSON.stringify(rows));
-        response.end(worldObjectSerializer(row));
-      });
-    } catch (error) {
-      if (response.aborted) {
-        return;
-      }
-
-      handleError(error, response);
-    }
-  });
-
-  webserver.get("/queries", async (response, request) => {
-    response.onAborted(() => {
-      response.aborted = true;
-    });
-
-    try {
-      const queriesCount = getQueriesCount(request);
-
-      const databaseJobs = new Array(queriesCount);
-
-      for (let i = 0; i < queriesCount; i++) {
-        databaseJobs[i] = db.find(generateRandomNumber());
-      }
-
-      const worldObjects = await Promise.all(databaseJobs);
-
-      if (response.aborted) {
-        return;
-      }
-
-      response.cork(() => {
-        addBenchmarkHeaders(response);
-        response.writeHeader("Content-Type", "application/json");
-        response.end(JSON.stringify(worldObjects));
-      });
-    } catch (error) {
-      if (response.aborted) {
-        return;
-      }
-
-      handleError(error, response);
-    }
-  });
-  
-  const extra = { id: 0, message: "Additional fortune added at request time." };
-
-  webserver.get("/fortunes", async (response) => {
-    response.onAborted(() => {
-      response.aborted = true;
-    });
-
-    try {
-      const rows = [extra, ...await db.fortunes()];
-
-      if (response.aborted) {
-        return;
-      }
-
-      // rows.push({
-      //   id: 0,
-      //   message: "Additional fortune added at request time.",
-      // });
-
-      // rows.sort((a, b) => (a.message < b.message) ? -1 : 1);
-      sortByMessage(rows)
-
-      const n = rows.length
-
-      let html = "", i = 0;
-      for (; i < n; i++) {
-        html += `<tr><td>${rows[i].id}</td><td>${escape(rows[i].message)}</td></tr>`;
-      }
-
-      response.cork(() => {
-        addBenchmarkHeaders(response);
-        response.writeHeader("Content-Type", "text/html; charset=utf-8");
-        response.end(`<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>${html}</table></body></html>`);
-      });
-    } catch (error) {
-      if (response.aborted) {
-        return;
-      }
-
-      handleError(error, response);
-    }
-  });
-
-  webserver.get("/updates", async (response, request) => {
-    response.onAborted(() => {
-      response.aborted = true;
-    });
-
-    try {
-      const queriesCount = getQueriesCount(request);
-
-      const databaseJobs = new Array(queriesCount);
-
-      for (let i = 0; i < queriesCount; i++) {
-        databaseJobs[i] = db.find(generateRandomNumber());
-      }
-
-      const worldObjects = await Promise.all(databaseJobs);
-
-      for (let i = 0; i < queriesCount; i++) {
-        worldObjects[i].randomNumber = generateRandomNumber();
-      }
-
-      await db.bulkUpdate(worldObjects);
-
-      if (response.aborted) {
-        return;
-      }
-
-      response.cork(() => {
-        addBenchmarkHeaders(response);
-        response.writeHeader("Content-Type", "application/json");
-        response.end(JSON.stringify(worldObjects));
-      });
-    } catch (error) {
-      if (response.aborted) {
-        return;
-      }
-
-      handleError(error, response);
-    }
-  });
-}
-
-webserver.any("/*", (response) => {
-  response.writeStatus("404 Not Found");
-  addBenchmarkHeaders(response);
-  response.writeHeader("Content-Type", "text/plain");
-  response.end("Not Found");
-});
-
-const host = process.env.HOST || "0.0.0.0";
-const port = parseInt(process.env.PORT || "8080");
-webserver.listen(host, port, (socket) => {
-  if (!socket) {
-    console.error(`Couldn't bind to http://${host}:${port}!`);
-    process.exit(1);
-  }
-
-  console.log(`Successfully bound to http://${host}:${port}.`);
-});

+ 0 - 86
frameworks/JavaScript/uwebsockets.js/src/utils.js

@@ -1,86 +0,0 @@
-import { sjs, attr } from 'slow-json-stringify'
-
-/**
- * Add Benchmark HTTP response headers.
- *
- * Add HTTP response headers `Server` which is required by the test suite.
- * Header `Date` is automatically added by uWebsockets
- * https://github.com/uNetworking/uWebSockets/blob/master/src/HttpResponse.h#L78
- * 
- * https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview
- *
- * @param {import('uWebSockets.js').HttpResponse} response
- */
-export function addBenchmarkHeaders(response) {
-  response.writeHeader("Server", "uWebSockets.js");
-}
-
-/**
- * Handle error for response
- *
- * @param {Error} error
- * @param {import('uWebSockets.js').HttpResponse} response
- */
-export function handleError(error, response) {
-  console.error(error);
-  response.cork(() => {
-    addBenchmarkHeaders(response);
-    response.writeHeader("Content-Type", "text/plain");
-    response.end("Internal Server Error");
-  });
-}
-
-/**
- * Get queries count
- *
- * @param {import('uWebSockets.js').HttpRequest} request
- */
-export function getQueriesCount(request) {
-  return Math.min(parseInt(request.getQuery("queries")) || 1, 500);
-}
-
-/**
- * Generate random number
- *
- */
-export function generateRandomNumber() {
-  return Math.ceil(Math.random() * 10000);
-}
-
-/**
- * Escape unsafe HTML Code
- *
- */
-const escapeHTMLRules = { '&': '&#38;', '<': '&#60;', '>': '&#62;', '"': '&#34;', "'": '&#39;', '/': '&#47;' }
-
-const unsafeHTMLMatcher = /[&<>"'\/]/g
-
-export function escape(text) {
-  if (unsafeHTMLMatcher.test(text) === false) return text;
-  return text.replace(unsafeHTMLMatcher, function (m) { return escapeHTMLRules[m] || m; });
-}
-
-/**
- * Using Slow json stringify module to get faster results 
- */
-export const jsonSerializer = sjs({ message: attr("string")}); 
-export const worldObjectSerializer = sjs({ id: attr('number'), randomnumber: attr('number') });
-// export const worldObjectsSerializer = sjs({ rows: attr("array", worldObjectSerializer) });
-
-/**
- * Using Sort method which is performant for the test scenario
- * @returns 
- */
-export function sortByMessage (arr) {
-  const n = arr.length
-  for (let i = 1; i < n; i++) {
-    const c = arr[i]
-    let j = i - 1
-    while ((j > -1) && (c.message < arr[j].message)) {
-      arr[j + 1] = arr[j]
-      j--
-    }
-    arr[j + 1] = c
-  }
-  return arr
-}

+ 0 - 12
frameworks/JavaScript/uwebsockets.js/uwebsockets.js-mysql.dockerfile

@@ -1,12 +0,0 @@
-FROM node:20-slim
-
-COPY ./ ./
-
-RUN npm install
-
-ENV NODE_ENV production
-ENV DATABASE mysql
-
-EXPOSE 8080
-
-CMD ["npm", "start"]

+ 0 - 12
frameworks/JavaScript/uwebsockets.js/uwebsockets.js-postgres.dockerfile

@@ -1,12 +0,0 @@
-FROM node:20-slim
-
-COPY ./ ./
-
-RUN npm install
-
-ENV NODE_ENV production
-ENV DATABASE postgres
-
-EXPOSE 8080
-
-CMD ["npm", "start"]

+ 0 - 11
frameworks/JavaScript/uwebsockets.js/uwebsockets.js.dockerfile

@@ -1,11 +0,0 @@
-FROM node:20-slim
-
-COPY ./ ./
-
-RUN npm install
-
-ENV NODE_ENV production
-
-EXPOSE 8080
-
-CMD ["npm", "start"]