Module.Exports = function (opts) { const options = {

property: 'session',
store: new Map(),
getSessionKey: (ctx) => ctx.from && ctx.chat && `${ctx.from.id}:${ctx.chat.id}`,
...opts
}

const ttlMs = options.ttl && options.ttl * 1000
const defaults = new Map() // для синхронизации значений по умолчанию в течении одноко тика

return (ctx, next) => {
const key = options.getSessionKey(ctx)
if (!key) {
return next(ctx)
}
const now = Date.now()

return Promise.resolve(options.store.get(key))
.then((state) => {
if (!state || state.expires < now) {
state = defaults.get(key)
if (!state) {
state = { session: {} }
defaults.set(key, state)
setImmediate(() => defaults.clear(key)) // отчищаем после тика, дальше уже в штатном режиме
}
}
return state
})
.then(({ session }) => {
Object.defineProperty(ctx, options.property, {
get: function () { return session },
set: function (newValue) { Object.assign(session, newValue) }
})
return next(ctx).then(() => options.store.set(key, {
session,
expires: ttlMs ? now + ttlMs : Infinity
}))
})
}
}

1 ответов

24 просмотра
Oscar-S Автор вопроса

Похожие вопросы

Обсуждают сегодня

Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Добрый день. Мне посоветовали обратиться к вам в чат за помощью. Ситуация описана на скрине. Как мне сказали, мне на бота навесили флудвейт. Есть ли возможность снять его ра...
OVERLINK
7
Просто по очереди выпиливаешь на ручной маппинг? По методу за раз
Andrii Kurdiumov
7
И? Все равно глазами проверять надо каждое поле
Andrii Kurdiumov
4
Ну есть у нас десяток компаний которым надо. Остальным то зачем?
Andrii Kurdiumov
4
Приветствую. А не подскажете какие ограничения есть на использования api метода setMyName ? Несколько раз сменил имя бота и получил бан на 2 месяца на смену имени.
Slick Slack
8
Всем привет! Взялся портировать модули на 18 версию, лезет _logger.log(log_level, 'no translation language detected, skipping translation %s', frame, stack_info=True) А чт...
Max Lit
3
Доброе утро, а кто то делал Google аналитику через php ? curl_setopt($ch, CURLOPT_NOSIGNAL, true); Это должно быть async без ожидания ответа. Вообще php нормально с таким с...
Max Dubovsky
9
Привет, коллеги! Возникла задача ограничить максимальный размер вложений для определённых расширений, например, чтобы для изображений лимит был 10 МБ, а для видео — 100 МБ. Ог...
Andro
1
Всем привет, добавляю поля в админку через контроллер взависимости от id, поля отображаются, сохраняются в бд, но не редактируются в админке, кто-то сталкивался с таким?
Catherine Poll
4
Карта сайта