|
@@ -0,0 +1,167 @@
|
|
|
+// speedtest
|
|
|
+// Написать асинхронную функцию, где:
|
|
|
+// count - количество повторов
|
|
|
+// parallel - количество одновременных запросов / промисов в одном повторе
|
|
|
+// getPromise - функция, которая умеет вернуть нужный Вам промис для тестирования скорости его работы
|
|
|
+// которая будет в цикле count раз создавать parallel промисов с помощью переданной функции getPromise, дожидаться выполнения всех parallel промисов, после чего цикл повторяется.
|
|
|
+// Замерить время общее время выполнения, и вычислить:
|
|
|
+// duration, общую длительность работы цикла
|
|
|
+// parallelDuration, среднее время обработки запроса параллельно(за какое время исполнилось parallel * count промисов),
|
|
|
+// paralledSpeed, скорость в запросах в миллисекунду
|
|
|
+// queryDuration, реальное среднее время запроса(отталкиваясь от count и времени работы цикла).
|
|
|
+// querySpeed, реальное средняя скорость запроса
|
|
|
+// Эти переменные вернуть в одном объекте - результате(см.заготовку выше)
|
|
|
+// Для отладки попробуйте на delay(пример выше есть, реальное время будет отличаться на единицы - десятки миллисекунд).Потом можете попробовать на swapi.dev.Не создавайте чрезмерно много параллельных запросов.
|
|
|
+{
|
|
|
+ async function speedtest(getPromise, count, parallel = 1) {
|
|
|
+
|
|
|
+ const start = performance.now()
|
|
|
+ let promiseArr = []
|
|
|
+
|
|
|
+ for (let i = 0; i < count; i++) {
|
|
|
+ for (let j = 0; j < parallel; j++) {
|
|
|
+ promiseArr.push(getPromise())
|
|
|
+ }
|
|
|
+ await Promise.all(promiseArr)
|
|
|
+ }
|
|
|
+
|
|
|
+ const end = performance.now()
|
|
|
+
|
|
|
+ const duration = +(end - start).toFixed(5)
|
|
|
+ const querySpeed = +(count / duration).toFixed(5)
|
|
|
+ const queryDuration = +(duration / count).toFixed(5)
|
|
|
+ const paralledSpeed = +((count * parallel) / duration).toFixed(5)
|
|
|
+ const parallelDuration = +(duration / (count * parallel)).toFixed(5)
|
|
|
+
|
|
|
+ return {
|
|
|
+ duration,
|
|
|
+ querySpeed,
|
|
|
+ queryDuration,
|
|
|
+ paralledSpeed,
|
|
|
+ parallelDuration
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
|
|
|
+
|
|
|
+ // Проверка
|
|
|
+ speedtest(() => delay(1000), 10, 10).then(result => console.log('delay: ', result))
|
|
|
+ // {duration: 10000,
|
|
|
+ // querySpeed: 0.001, //1 тысячная запроса за миллисекунду
|
|
|
+ // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем
|
|
|
+ // parallelSpeed: 0.01 // 100 запросов за 10000 миллисекунд
|
|
|
+ // parallelDuration: 100 // 100 запросов за 10000 миллисекунд
|
|
|
+ speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5).then(result => console.log('swapi: ', result))
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// gql
|
|
|
+// Напишите функцию gql, которая осуществляет GraphQL запрос. Функция принимает три параметра:
|
|
|
+// 1. Эндпоинт - адрес сервера.Например "http://shop-roles.node.ed.asmer.org.ua/graphql"
|
|
|
+// 2. Текст запроса(query).Например:
|
|
|
+// query cats($q: String){
|
|
|
+// CategoryFind(query: $q){
|
|
|
+// _id name
|
|
|
+// }
|
|
|
+// }
|
|
|
+// 3. Параметры(переменные)(variables) запроса объектом.Например:
|
|
|
+// {
|
|
|
+// q: "[{}]"
|
|
|
+// }
|
|
|
+// Функция должна возвращать промис, созданный fetch со следующими настройками:
|
|
|
+// Метод POST
|
|
|
+// Заголовки:
|
|
|
+// Content - Type - application / json
|
|
|
+// Accept - application / json
|
|
|
+// Тело - JSON, объект с двумя ключами - query(текст запроса) и variables
|
|
|
+
|
|
|
+{
|
|
|
+ const gql = function (url, query, variables) {
|
|
|
+ let gqlParams = {
|
|
|
+ method: 'POST',
|
|
|
+ headers: {
|
|
|
+ 'Content-Type': 'application/json',
|
|
|
+ Accept: 'application/json'
|
|
|
+ },
|
|
|
+ body: JSON.stringify(
|
|
|
+ {
|
|
|
+ query,
|
|
|
+ variables
|
|
|
+ }
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ return fetch(url, gqlParams).then(res => res.json())
|
|
|
+ };
|
|
|
+
|
|
|
+ // проверка
|
|
|
+ (async () => {
|
|
|
+ const catQuery = `query cats($q: String){
|
|
|
+ CategoryFind(query: $q){
|
|
|
+ _id name
|
|
|
+ }
|
|
|
+ }`
|
|
|
+ const cats = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", catQuery, { q: "[{}]" })
|
|
|
+ console.log(1, cats) //список категорий с _id name и всем таким прочим
|
|
|
+
|
|
|
+
|
|
|
+ const loginQuery = `query login($login:String, $password:String){
|
|
|
+ login(login:$login, password:$password)
|
|
|
+ }`
|
|
|
+
|
|
|
+ const token = await gql("http://shop-roles.node.ed.asmer.org.ua/graphql", loginQuery, { login: "test457", password: "123123" })
|
|
|
+ console.log(2, token)
|
|
|
+ })()
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// jwtDecode
|
|
|
+// Напишете функцию jwtDecode, которая принимает единственный параметр token и возвращает информацию из переданного JWT токена.
|
|
|
+// Алгоритм раскодирования:
|
|
|
+// Разбить токен на три части.Разделитель - . (точка)
|
|
|
+// Выделить среднюю часть.
|
|
|
+// Используя функцию atob раскодировать среднюю часть из кодировки Base64, получив JSON
|
|
|
+// Раскодировать JSON
|
|
|
+// Вернуть раскодированные данные из JSON
|
|
|
+// Учтите, что в качестве токена может быть передана какая - то дичь.В таком случае раскодировка не получится, и функция:
|
|
|
+// Не должна сыпать красными матюками(ошибками) в консоль
|
|
|
+// Должна просто вернуть undefined
|
|
|
+{
|
|
|
+ const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOnsiaWQiOiI2MzIyMDVhZWI3NGUxZjVmMmVjMWEzMjAiLCJsb2dpbiI6InRlc3Q0NTciLCJhY2wiOlsiNjMyMjA1YWViNzRlMWY1ZjJlYzFhMzIwIiwidXNlciJdfSwiaWF0IjoxNjY4MjcyMTYzfQ.rxV1ki9G6LjT2IPWcqkMeTi_1K9sb3Si8vLB6UDAGdw"
|
|
|
+
|
|
|
+ const jwtDecode = function (token) {
|
|
|
+ try {
|
|
|
+ let parseData = token.split('.')[1]
|
|
|
+ return JSON.parse(atob(parseData))
|
|
|
+ }
|
|
|
+ catch (e) {
|
|
|
+ return undefined
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log(jwtDecode(token))
|
|
|
+ //{
|
|
|
+ // "sub": {
|
|
|
+ // "id": "632205aeb74e1f5f2ec1a320",
|
|
|
+ // "login": "test457",
|
|
|
+ // "acl": [
|
|
|
+ // "632205aeb74e1f5f2ec1a320",
|
|
|
+ // "user"
|
|
|
+ // ]
|
|
|
+ // },
|
|
|
+ // "iat": 1668272163
|
|
|
+ //}
|
|
|
+
|
|
|
+ try {
|
|
|
+ console.log(jwtDecode()) //undefined
|
|
|
+ console.log(jwtDecode("дичь")) //undefined
|
|
|
+ console.log(jwtDecode("ey.ey.ey")) //undefined
|
|
|
+
|
|
|
+ console.log('до сюда доработало, а значит jwtDecode не матерился в консоль красным цветом')
|
|
|
+ }
|
|
|
+ finally {
|
|
|
+ console.log('ДЗ, видимо, окончено')
|
|
|
+ }
|
|
|
+}
|