Я использовал materialize чуть ли не один раз в жизни. И вот тоже сейчас смотрю - пожалуй, мой случай можно было реализовать через defaultIfEmpty, и было бы чуть проще.
Как-то у него сочетались сказки с жестокостью. Даже сейчас какие-то слегка жутковатые вечатления от прочитанного. Белый шарик матроса Вилсона, Синий город на садовой. Не все книги, конечно - были и просто светлые детские книги (те же Алые перья стрел). Но первые ассоциации, что приходят на ум при упоминании Крапивина - именно вот те, жестокие.
Мы используем подобный подход для приоритезации тех долга в команде. Только первая фаза - генерация идей - у нас асинхронная (и порой довольно растянутая во времени): перед митингом все могут добавить свои идеи в общий список.
SRP и DRY вообще несвязанные друг с другом принципы. Легко можно представить себ код, удовлетворяющий SRP, в котором при этом много повторения. Равно как и наоборот.
Hello.js - достаточно популярная библиотека для входа через соцсети. По умолчанию открывает именно попап. У них на главном сайте вверху ряд кнопок - сами попробуйте.
Понял. Все же дополнительные операции не в деструктуризации как таковой, а именно в rest. Но если кто-то делает rest с деструктуризацией, то предполагается, что ему таки нужно это значение.
Кстати, ваш антипаттерн - он про spread syntax, тут вообще нет деструктуризации.
Возможно, минусующие среагировали на $mol_ в названии типов? Я с ходу подумал было, что вы выкатили реализацию на чем-то отличном от TS. Но перешел по ссылке - и там, конечно, чистый TS, так что сравнение вполне честное
Но с "куда проще" не согласен. У автора в статье кода раза в 2 меньше. Может, конечно, из-за разного форматирование / разбивки по строкам. Но и существенного выигрыша в сложности тоже не вижу в вашем варианте.
Ну то есть, конечно, да. Сессии наше все. Просто и надежно. Несколько миллисекунд на чтение сессии из кэша, скорее всего, приемлемая цена за меньшую сложность кода.
Проблема обычной сессии в том, что каждый запрос создает нагрузку на ваш сервис аутентикации. Решении - в куку с сессией записать дополнительные данные (например, айди пользователя, список прав). И чтобы защищиться от подделки, дополнительно подписываем. И еще нам надо знать, как давно мы эти доп. данные записали (они имеют обыкновение устаревать). В итоге мы изобрели свой формат для того, что уже стандартизировано в JWT.
Получается когда токен будет скомпрометирован, мы сможем бесконечно им пользоваться?
Так же, как и утекшей сессией (в типичном случае с session id в кукиз). Можно предусмотреть разные механизмы защиты - например, периодически инвалидировать сессию и заставлять юзера перелогиниться, делать лимит на число одновременных сессий у юзера.
"просто держим в памяти" - Тоесть при каждой перезагрузке станицы мы делаем refresh?
Да. Это один апи-запрос к auth-провайдеру
> Refresh-токен держим в памяти, никуда не записываем для безопасности.
вы наверное имели в виду Access - токен ?
Access- токен - это само собой, как описано в предыдушем варианте. Я как раз про refresh-токен, чтобы минимизировать риск его компрометации. Именно поэтому в данном сценарии при обновлении страницы придется делать редирект на страницу auth-провайдера, для получения нового refresh-токена.
хранить Access в памяти мне искажаться вполне приемлемой, Спасибо) но это тоже уязвимость, так как данные можно получить
во втором примере (который не компилируется) по ошибке остался лишний `as const`
Все-таки дело не в этом, а в чем-то другом. Выглядит как баг компиляторе. В общем случае TS отлично видит, что переменная больше нигде не меняется.
Упрощенный пример:
result
тут все ещеlet
- но все компилируется.А вот это уже не компилируется - хотя у константы BAR выведенный тип остался без изменения
Да, вы правы, а я был невнимателен. С race будет то же самое только в случае, если оба источника одноразовые (к примеру, запросы к серверу).
Пожалуй да, вариант с materialize самый простой. Даже удивительно, что в rxjs из коробки нет какого-то оператора для такого поведения.
Первый случай с задержкой можно проще:
Второй - еще проще
Я использовал materialize чуть ли не один раз в жизни. И вот тоже сейчас смотрю - пожалуй, мой случай можно было реализовать через
defaultIfEmpty
, и было бы чуть проще.Как-то у него сочетались сказки с жестокостью. Даже сейчас какие-то слегка жутковатые вечатления от прочитанного. Белый шарик матроса Вилсона, Синий город на садовой. Не все книги, конечно - были и просто светлые детские книги (те же Алые перья стрел). Но первые ассоциации, что приходят на ум при упоминании Крапивина - именно вот те, жестокие.
Мы используем подобный подход для приоритезации тех долга в команде. Только первая фаза - генерация идей - у нас асинхронная (и порой довольно растянутая во времени): перед митингом все могут добавить свои идеи в общий список.
Как раз наоборот. Это для команд, которые принимают решение совместно, а не полагаются на руководителя, который скажет, что сделать.
Да, стремноватая калька. Но смысл ясен - кто-то, кто ведет обсуждение. Председатель? На суть статьи это не влияет - там все по делу.
SRP и DRY вообще несвязанные друг с другом принципы. Легко можно представить себ код, удовлетворяющий SRP, в котором при этом много повторения. Равно как и наоборот.
Hello.js - достаточно популярная библиотека для входа через соцсети. По умолчанию открывает именно попап. У них на главном сайте вверху ряд кнопок - сами попробуйте.
Понял. Все же дополнительные операции не в деструктуризации как таковой, а именно в rest. Но если кто-то делает rest с деструктуризацией, то предполагается, что ему таки нужно это значение.
Кстати, ваш антипаттерн - он про spread syntax, тут вообще нет деструктуризации.
А что именно в деструктурировании тормозное?
у этих двух вызовов будет разница в скорости?
А у Chrome есть Cookies Having Independent Partitioned State (CHIPS)
(кстати, это еще и игра слов: chocolate chips cookies - популярный вид печенек с кусочками шоколада)
Как и с случае с Firefox, печеньки тут только секционированные, но не эфемерные - то есть не очищаются автоматически при закрытии браузера
Возможно, минусующие среагировали на
$mol_
в названии типов? Я с ходу подумал было, что вы выкатили реализацию на чем-то отличном от TS. Но перешел по ссылке - и там, конечно, чистый TS, так что сравнение вполне честноеЗаминусовали, может, и зря.
Но с "куда проще" не согласен. У автора в статье кода раза в 2 меньше. Может, конечно, из-за разного форматирование / разбивки по строкам. Но и существенного выигрыша в сложности тоже не вижу в вашем варианте.
Из плюсов - финальный тип вызывается напрямую
тогда как в статье обертка из двух типов (
Тайпскрипт клевый!
Тут на волне Wordle-хайпа недавно проскакивала реализация Wordle на типах Тайпскрипта.
https://github.com/johanneslumpe/typescriptle
Ну то есть, конечно, да. Сессии наше все. Просто и надежно. Несколько миллисекунд на чтение сессии из кэша, скорее всего, приемлемая цена за меньшую сложность кода.
Проблема обычной сессии в том, что каждый запрос создает нагрузку на ваш сервис аутентикации. Решении - в куку с сессией записать дополнительные данные (например, айди пользователя, список прав). И чтобы защищиться от подделки, дополнительно подписываем. И еще нам надо знать, как давно мы эти доп. данные записали (они имеют обыкновение устаревать). В итоге мы изобрели свой формат для того, что уже стандартизировано в JWT.
редирект на сайт auth-провайдера выглядит примерно так:
request: GET /login?redirect=https://my-site.com | Host auth.com
response: 302 | Location: https://my-site.com/?refresh-token=AABBCC
То есть при условии, что на домене auth.com у нас есть кука с сессией, редирект туда-обратно осуществялется без участия пользователя.
сторонний код его другими способами может прочитать (пропатчить window.fetch, прочитать из location.query после редиректа, etc).
сторонний код так просто не прочитает переменную, если она в глобальный скоуп не экспортируется прямо или косвенно.
Так же, как и утекшей сессией (в типичном случае с session id в кукиз). Можно предусмотреть разные механизмы защиты - например, периодически инвалидировать сессию и заставлять юзера перелогиниться, делать лимит на число одновременных сессий у юзера.
Да. Это один апи-запрос к auth-провайдеру
Access- токен - это само собой, как описано в предыдушем варианте. Я как раз про refresh-токен, чтобы минимизировать риск его компрометации. Именно поэтому в данном сценарии при обновлении страницы придется делать редирект на страницу auth-провайдера, для получения нового refresh-токена.
Каким образом их можно получить?
В ответе может быть несколько заголовков Set-Cookie, каждый выставляет одну куку.