server.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const db = process.env.DATABASE;
  2. const { App } = require('@ionited/mesh');
  3. const addHeaders = (res, contentType) => res.header('Content-Type', contentType).header('Server', 'Mesh');
  4. const escapeHTMLRules = {
  5. "&": "&",
  6. "<": "&#60;",
  7. ">": "&#62;",
  8. '"': "&#34;",
  9. "'": "&#39;",
  10. "/": "&#47;",
  11. };
  12. const unsafeHTMLMatcher = /[&<>"'\/]/g;
  13. const escape = text => {
  14. if (unsafeHTMLMatcher.test(text) === false) return text;
  15. return text.replace(unsafeHTMLMatcher, m => escapeHTMLRules[m] || m);
  16. }
  17. const random = () => Math.floor(Math.random() * 1e4) + 1;
  18. const app = new App();
  19. app
  20. .get('/json', (_, res) => {
  21. addHeaders(res, 'application/json');
  22. res.json({ message: 'Hello, World!' });
  23. })
  24. .get('/plaintext', (_, res) => {
  25. addHeaders(res, 'text/plain');
  26. res.send('Hello, World!');
  27. });
  28. if (db) {
  29. const DRIVER = require(`./drivers/${db}`);
  30. app
  31. .get('/db', async (_, res) => {
  32. addHeaders(res, 'application/json');
  33. res.json(await DRIVER.find(random()));
  34. })
  35. .get('/queries', async (req, res) => {
  36. const { queries } = req.query();
  37. const count = Math.min(parseInt(queries) || 1, 500);
  38. const arr = [];
  39. for (let i = 0; i < count; i++) arr.push(await DRIVER.find(random()));
  40. addHeaders(res, 'application/json');
  41. res.json(arr);
  42. })
  43. .get('/fortunes', async (_, res) => {
  44. const items = [{
  45. id: 0,
  46. message: 'Additional fortune added at request time.'
  47. }, ...await DRIVER.fortunes()].sort((a, b) => a.message.localeCompare(b.message));
  48. let html = '<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>';
  49. for (let i = 0; i < items.length; i++) html += `<tr><td>${items[i].id}</td><td>${escape(items[i].message)}</td></tr>`;
  50. html += '</table></body></html>';
  51. addHeaders(res, 'text/html; charset=utf-8');
  52. res.send(html);
  53. })
  54. .get('/updates', async (req, res) => {
  55. const { queries } = req.query();
  56. const count = Math.min(parseInt(queries) || 1, 500);
  57. const arr = [];
  58. for (let i = 0; i < count; i++) arr.push(await DRIVER.find(random()));
  59. for (let i = 0; i < count; i++) {
  60. arr[i].randomNumber = random();
  61. await DRIVER.update(arr[i]);
  62. }
  63. addHeaders(res, 'application/json');
  64. res.json(arr);
  65. });
  66. }
  67. app.listen(8080);