HW18.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. // speedtest
  2. // Написать асинхронную функцию, где:
  3. // count - количество повторов
  4. // parallel - количество одновременных запросов / промисов в одном повторе
  5. // getPromise - функция, которая умеет вернуть нужный Вам промис для тестирования скорости его работы
  6. // которая будет в цикле count раз создавать parallel промисов с помощью переданной функции getPromise, дожидаться выполнения всех parallel промисов, после чего цикл повторяется.
  7. // Замерить время общее время выполнения, и вычислить:
  8. // duration, общую длительность работы цикла
  9. // parallelDuration, среднее время обработки запроса параллельно(за какое время исполнилось parallel * count промисов),
  10. // paralledSpeed, скорость в запросах в миллисекунду
  11. // queryDuration, реальное среднее время запроса(отталкиваясь от count и времени работы цикла).
  12. // querySpeed, реальное средняя скорость запроса
  13. // Эти переменные вернуть в одном объекте - результате(см.заготовку выше)
  14. // Для отладки попробуйте на delay(пример выше есть, реальное время будет отличаться на единицы - десятки миллисекунд).Потом можете попробовать на swapi.dev.Не создавайте чрезмерно много параллельных запросов.
  15. {
  16. async function speedtest(getPromise, count, parallel = 1) {
  17. const start = performance.now()
  18. let promiseArr = []
  19. for (let i = 0; i < count; i++) {
  20. for (let j = 0; j < parallel; j++) {
  21. promiseArr.push(getPromise())
  22. }
  23. await Promise.all(promiseArr)
  24. }
  25. const end = performance.now()
  26. const duration = +(end - start).toFixed(5)
  27. const querySpeed = +(count / duration).toFixed(5)
  28. const queryDuration = +(duration / count).toFixed(5)
  29. const paralledSpeed = +((count * parallel) / duration).toFixed(5)
  30. const parallelDuration = +(duration / (count * parallel)).toFixed(5)
  31. return {
  32. duration,
  33. querySpeed,
  34. queryDuration,
  35. paralledSpeed,
  36. parallelDuration
  37. }
  38. }
  39. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
  40. // Проверка
  41. speedtest(() => delay(1000), 10, 10).then(result => console.log('delay: ', result))
  42. // {duration: 10000,
  43. // querySpeed: 0.001, //1 тысячная запроса за миллисекунду
  44. // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем
  45. // parallelSpeed: 0.01 // 100 запросов за 10000 миллисекунд
  46. // parallelDuration: 100 // 100 запросов за 10000 миллисекунд
  47. speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5).then(result => console.log('swapi: ', result))
  48. }
  49. // gql
  50. // Напишите функцию gql, которая осуществляет GraphQL запрос. Функция принимает три параметра:
  51. // 1. Эндпоинт - адрес сервера.Например "http://shop-roles.node.ed.asmer.org.ua/graphql"
  52. // 2. Текст запроса(query).Например:
  53. // query cats($q: String){
  54. // CategoryFind(query: $q){
  55. // _id name
  56. // }
  57. // }
  58. // 3. Параметры(переменные)(variables) запроса объектом.Например:
  59. // {
  60. // q: "[{}]"
  61. // }
  62. // Функция должна возвращать промис, созданный fetch со следующими настройками:
  63. // Метод POST
  64. // Заголовки:
  65. // Content - Type - application / json
  66. // Accept - application / json
  67. // Тело - JSON, объект с двумя ключами - query(текст запроса) и variables
  68. {
  69. const gql = function (url, query, variables) {
  70. let gqlParams = {
  71. method: 'POST',
  72. headers: {
  73. 'Content-Type': 'application/json',
  74. Accept: 'application/json'
  75. },
  76. body: JSON.stringify(
  77. {
  78. query,
  79. variables
  80. }
  81. )
  82. }
  83. return fetch(url, gqlParams).then(res => res.json())
  84. };
  85. // проверка
  86. (async () => {
  87. const catQuery = `query cats($q: String){
  88. CategoryFind(query: $q){
  89. _id name
  90. }
  91. }`
  92. const cats = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", catQuery, { q: "[{}]" })
  93. console.log(1, cats) //список категорий с _id name и всем таким прочим
  94. const loginQuery = `query login($login:String, $password:String){
  95. login(login:$login, password:$password)
  96. }`
  97. const token = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", loginQuery, { login: "test457", password: "123123" })
  98. console.log(2, token)
  99. })()
  100. }
  101. // jwtDecode
  102. // Напишете функцию jwtDecode, которая принимает единственный параметр token и возвращает информацию из переданного JWT токена.
  103. // Алгоритм раскодирования:
  104. // Разбить токен на три части.Разделитель - . (точка)
  105. // Выделить среднюю часть.
  106. // Используя функцию atob раскодировать среднюю часть из кодировки Base64, получив JSON
  107. // Раскодировать JSON
  108. // Вернуть раскодированные данные из JSON
  109. // Учтите, что в качестве токена может быть передана какая - то дичь.В таком случае раскодировка не получится, и функция:
  110. // Не должна сыпать красными матюками(ошибками) в консоль
  111. // Должна просто вернуть undefined
  112. {
  113. const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOnsiaWQiOiI2MzIyMDVhZWI3NGUxZjVmMmVjMWEzMjAiLCJsb2dpbiI6InRlc3Q0NTciLCJhY2wiOlsiNjMyMjA1YWViNzRlMWY1ZjJlYzFhMzIwIiwidXNlciJdfSwiaWF0IjoxNjY4MjcyMTYzfQ.rxV1ki9G6LjT2IPWcqkMeTi_1K9sb3Si8vLB6UDAGdw"
  114. const jwtDecode = function (token) {
  115. try {
  116. let parseData = token.split('.')[1]
  117. return JSON.parse(atob(parseData))
  118. }
  119. catch (e) {
  120. return undefined
  121. }
  122. }
  123. console.log(jwtDecode(token))
  124. //{
  125. // "sub": {
  126. // "id": "632205aeb74e1f5f2ec1a320",
  127. // "login": "test457",
  128. // "acl": [
  129. // "632205aeb74e1f5f2ec1a320",
  130. // "user"
  131. // ]
  132. // },
  133. // "iat": 1668272163
  134. //}
  135. try {
  136. console.log(jwtDecode()) //undefined
  137. console.log(jwtDecode("дичь")) //undefined
  138. console.log(jwtDecode("ey.ey.ey")) //undefined
  139. console.log('до сюда доработало, а значит jwtDecode не матерился в консоль красным цветом')
  140. }
  141. finally {
  142. console.log('ДЗ, видимо, окончено')
  143. }
  144. }