• Как на клиенте определить время жизни токена JWT?

    @deliro
    Время жизни на клиенте самого токена проверять не надо:
    1. JWT может быть httpOnly, иначе это прямой удар по безопасности в виде возможности сXSSить этот токен скриптами
    2. У пользователя на ПК время может отличаться от серверного. Допустим, время жизни JWT — 5 минут, а у пользователя часы спешат на 6 минут. Этой разницы недостаточно, чтобы SSL не установилось, зато достаточно, чтобы твой скрипт навсегда зациклился в попытке получить "свежий" токен, думая, что он несвежий

    Поэтому делаешь так:
    После успешного получения JWT ставишь в localStorage текущее время пользователя (пренебрегая разницей между действительным временем истечения и временем исполнения твоей функции — оно скорее всего не будет превышать пинг пользователя + 100мс). Каждый запрос прерываешь с помощью какого-нибудь https://github.com/axios/axios#interceptors В этом "прерывателе" смотришь в localStorage и если прошло 50-80% (тут оставляем запас, потому что мы выше пренебрегли разницей + сам запрос может длится некоторое время [например, это могут быть сетевые задержки, или запрос будет лежать в очереди, пока воркеры заняты или какие-то запросы бэкенда в БД будут происходить до валидации JWT] + часы пользователя могут идти быстрее серверных и дать лишние пару микросекунд) времени жизни JWT — отправляешь сперва запрос на рефреш этого токена, а потом уже отправляешь сам запрос.
    Ответ написан
    1 комментарий
  • Как правильно типизировать функцию getvalue?

    WblCHA
    @WblCHA
    https://www.typescriptlang.org/play/?#code/MYewdgz...

    const error = Symbol();
    type CheckSubKey<K, SK extends string> = K extends `${string}${SK}${string}`
      ? SK
      : SK & { [error]: '(!) Invalid subkey (!)' };
    
    interface GetValue {
      <T extends object>(obj: T): <K extends keyof T>(key: K) => T[K];
      <T extends object, I extends boolean = false>(
        obj: T,
        isIncludeKey?: I,
      ): I extends true
        ? <K extends string>(key: CheckSubKey<keyof T, K>) => T[`${string}${K}${string}` & keyof T][]
        : <K extends keyof T>(key: K) => T[K];
    }
    
    const getValue: GetValue =
      (obj: object, isIncludeKey = false) =>
      (key: unknown): unknown[] => {
        if (!isIncludeKey) {
          return obj[key as keyof typeof obj];
        }
    
        return Object.entries(obj).reduce((result: unknown[], pair: [key: string, value: unknown]) => {
          const [pairKey, pairValue] = pair;
    
          if (pairKey.includes(key as string)) {
            return [...result, pairValue];
          }
    
          return result;
        }, []);
      };
    
    const o = {
      asd: 1 as const,
      asdfg: '2' as const,
      qweg: [3] as const,
    };
    
    const v1 = getValue(o)('asd'); // 1
    const v2 = getValue(o, true)('a'); // (1 | "2")[]
    const v3 = getValue(o, true)('f'); // "2"[]
    const v4 = getValue(o, true)('g'); // ("2" | readonly [3])[]
    const v5 = getValue(o, true)('uuu'); // error
    Ответ написан
    2 комментария
  • Как сделать скриншот содержимого IFrame?

    sanchezzzhak
    @sanchezzzhak
    Ля ля ля...
    у вас не получиться сделать скриншот средставми JS, если iframe это внешний источник обращение к frame доступно только через postMessage в обоих направлениях.
    Для локальных фреймов которые созданы родительским окном можно использовать все что угодно.
    так работает например vpaid реклама на yootube и на милионах других сайтах.

    Решение только использовать web-driver который запускает реальный браузер через selenium это chrome или firefox

    на nodejs можно использовать безголовый-хром в лоб, на пхп уже не вспомню как запускать шайтан машину.
    можно воспользоваться готовой библиотекой требует php8.1

    посути это обертка вокруг безголового хрома.
    https://github.com/spatie/browsershot
    Ответ написан
    1 комментарий
  • Фибоначчи без использования BigInt на javascript?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Без BigInt - никак. Числа-то большие получаются. Если нет библиотеки, придется самостоятельно писать длинную арифметику. Просто храните цифры числа в массиве и длину рядом. Вам надо будет только сложение реализовывать, ну это делается столбиком одним циклом. Храните перенос с младших разрядов в переменной. Можно или исходники BigInt поискать, или вот тут посмотреть
    Ответ написан
    Комментировать
  • Не видит сайт на GitHub pages. В чём проблема?

    paulradzkov
    @paulradzkov
    Дизайнер, верстальщик, начальник отдела UI
    Вариант 1. В этом репозитории создайте ветку «gh-pages» и перекиньте туда код. GitHub pages берут код только из ветки «gh-pages». Тогда ваш сайт будет открываться по ссылке IgorichYak.github.io/Portfolio-Syte (кстати, правильно писать «site» )

    Вариант 2. Создайте репозиторий «IgorichYak.github.io» и положите верстку в ветку master. Для репозиториев вида «username.github.io» GitHub pages берут код только из ветки «master». Тогда вы получите более короткий адрес в браузере IgorichYak.github.io
    Ответ написан
    1 комментарий