- PVSM.RU - https://www.pvsm.ru -
В цикле коммита ShareJS существует 4 хука. Реализацию двух из них (submit и after submit) вы можете посмотреть в коде ShareJS [1]. А двух остальных (preValidate и validate) в коде LiveDB [2].
Последовательность вызова хуков такова:
Мы потратили много времени на обсуждение деталей этих хуков и мы намеренно оставили их достаточно низкоуровневыми в рамках ShareJS/LiveDB.
Методы LiveDB намеренно сделаны синхронными. Эти методы могут быть вызваны много раз в процессе валидации, поскольку если два разных клиента одновременно изменяют один и тот же документ, выигрывает клиент сабмитящий первым и последующие попытки отклоняются до завершения операции. Добавление асинхронных вызовов для получения дополнительных данных здесь было бы неэффективным учитывая, что методы могут вызываться многократно. In addition, async calls could cause resource starvation where some servers with a slower running task could consistently lose to servers with faster tasks many times in a row. Cинхронные вызовы существенно снижают вероятность этого.
Валидация в LiveDB разделена на два метода, чтобы избежать постоянного, зачастую ненужного клонирования документа. Если вы хотите иметь единственный вызов валидации с вариантами документа до и после после операции, вы можете глубоко клонировать документ в preValidate и затем использовать его и изменённую версию в validate.
Правильный метод получения дополнительных данных для контроля доступа — использование Express middleware или ShareJS submit middleware, и добавление их сессию, которая передаётся в preValidate / validate.
Текущая реализация немного запутана и в идеале racer-access должен иметь более интуитивный API и документацию. Я рад предложениям по улучшению racer-access, но не думаю, что имеет смысл что-то менять в LiveDB.
Автор: Imbolc
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/50220
Ссылки в тексте:
[1] коде ShareJS: https://github.com/share/ShareJS/blob/master/lib/server/useragent.js#L379
[2] коде LiveDB: https://github.com/share/livedb/blob/master/lib/ot.js#L38
[3] Источник: http://habrahabr.ru/post/205220/
Нажмите здесь для печати.