helper.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. const Handlebars = require('handlebars');
  2. const { sjs, attr } = require("slow-json-stringify");
  3. const GREETING = "Hello, World!";
  4. const headerTypes = {
  5. plain: 'text/plain',
  6. json: 'application/json',
  7. html: 'text/html; charset=UTF-8'
  8. };
  9. function sortByMessage(arr) {
  10. const n = arr.length;
  11. for (let i = 1; i < n; i++) {
  12. const c = arr[i];
  13. let j = i - 1;
  14. while (j > -1 && c.message < arr[j].message) {
  15. arr[j + 1] = arr[j];
  16. j--;
  17. }
  18. arr[j + 1] = c;
  19. }
  20. return arr;
  21. }
  22. function generateRandomNumber(){
  23. return Math.ceil(Math.random() * 10000);
  24. }
  25. const jsonSerializer = sjs({ message: attr("string") });
  26. const worldObjectSerializer = sjs({ id: attr("number"), randomnumber: attr("number")});
  27. const escapeHTMLRules = { '&': '&#38;', '<': '&#60;', '>': '&#62;', '"': '&#34;', "'": '&#39;', '/': '&#47;' }
  28. const unsafeHTMLMatcher = /[&<>"'\/]/g
  29. function escapeHtmlFromText(text) {
  30. if (unsafeHTMLMatcher.test(text) === false) return text;
  31. return text.replace(unsafeHTMLMatcher, function (m) { return escapeHTMLRules[m] || m; });
  32. }
  33. function writeResponse(res, text, type = headerTypes["json"]) {
  34. res.writeHead(200, {
  35. "content-type": type,
  36. server: "Node",
  37. });
  38. res.end(text);
  39. }
  40. const self = (module.exports = {
  41. sortByMessage,
  42. generateRandomNumber,
  43. jsonSerializer,
  44. worldObjectSerializer,
  45. escapeHtmlFromText,
  46. writeResponse,
  47. headerTypes,
  48. additionalFortune: () => ({
  49. id: 0,
  50. message: "Additional fortune added at request time.",
  51. }),
  52. fortunesTemplate: Handlebars.compile(
  53. [
  54. "<!DOCTYPE html>",
  55. "<html>",
  56. "<head><title>Fortunes</title></head>",
  57. "<body>",
  58. "<table>",
  59. "<tr>",
  60. "<th>id</th>",
  61. "<th>message</th>",
  62. "</tr>",
  63. "{{#fortunes}}",
  64. "<tr>",
  65. "<td>{{id}}</td>",
  66. "<td>{{message}}</td>",
  67. "</tr>",
  68. "{{/fortunes}}",
  69. "</table>",
  70. "</body>",
  71. "</html>",
  72. ].join("")
  73. ),
  74. randomTfbNumber: () => Math.floor(Math.random() * 10000) + 1,
  75. fillArray: (value, len) => {
  76. const arr = [];
  77. for (let i = 0; i < len; i++) {
  78. arr.push(value);
  79. }
  80. return arr;
  81. },
  82. addTfbHeaders: (res, headerType) => {
  83. res.setHeader('Server', 'Node');
  84. res.setHeader('Content-Type', headerTypes[headerType]);
  85. },
  86. responses: {
  87. jsonSerialization: (req, res) => {
  88. writeResponse(res, jsonSerializer({ message: GREETING }));
  89. },
  90. plaintext: (req, res) => {
  91. writeResponse(res, GREETING, headerTypes['plain']);
  92. },
  93. routeNotImplemented: (req, res) => {
  94. res.writeHead(501, { "Content-Type": "text/plain; charset=UTF-8" });
  95. const reason = {
  96. reason: "`" + req.url + "` is not an implemented route",
  97. };
  98. res.end(JSON.stringify(reason));
  99. },
  100. },
  101. });