AWS DynamoDB powered session middleware for Telegraf.
foo@bar:~$ yarn add telegraf-session-dynamodb
const Telegraf = require('telegraf')
const DynamoDBSession = require('telegraf-session-dynamodb')
const bot = new Telegraf(process.env.BOT_TOKEN)
const dynamoDBSession = new DynamoDBSession({
dynamoDBConfig: {
params: {
TableName: process.env.AWS_DYNAMODB_TABLE
},
region: process.env.AWS_REGION
}
})
bot.use(dynamoDBSession.middleware())
bot.on('text', (ctx) => {
ctx.session.counter = ctx.session.counter || 0
ctx.session.counter++
console.log('Session', ctx.session)
})
bot.startPolling()
When you have stored the session key beforehand, you can access a session without having access to a context object. This is useful when you perform OAUTH or something similar, when a REDIRECT_URI is called on your bot server.
const dynamoDBSession = new DynamoDBSession({
dynamoDBConfig: {
params: {
TableName: process.env.AWS_DYNAMODB_TABLE
},
region: process.env.AWS_REGION
}
})
// Retrieve session state by session key
dynamoDBSession.getSession(key)
.then((session) => {
console.log('Session state', session)
})
// Save session state
dynamoDBSession.saveSession(key, session)
dynamoDBConfig
:
params
: TableName
: AWS DynamoDB Table to store session (default: telegraf-session-dynamodb)region
: AWS Region (default: ap-northeast-1)property
: context property name (default: session
)ttl
: Time To Live in minutes, -1 for never expire (default: -1
)getSessionKey
: session key resolver function (ctx) => any
)Default implementation of getSessionKey
:
function getSessionKey(ctx) {
if (!ctx.from || !ctx.chat) {
return
}
return `${ctx.from.id}:${ctx.chat.id}`
}
To destroy a session simply set it to null
.
bot.on('text', (ctx) => {
ctx.session = null
})
foo@bar:~$ yarn
foo@bar:~$ yarn global add serverless
foo@bar:~$ docker pull lambci/lambda
foo@bar:~$ sls dynamodb install
foo@bar:~$ sls offline start -r ap-northeast-1 --noTimeout &
foo@bar:~$ yarn test:local
Remarks: TTL will NOT work for DynamoDB Local
SessionKey (String)
as primary keyttl
as the TTL attribute in Manage TTLfoo@bar:~$ aws configure
foo@bar:~$ yarn
foo@bar:~$ yarn test