IlyaSemenov / grammy-scenes

Nested named scenes for grammY
MIT License
26 stars 0 forks source link

bot.catch doesn't work with await ctx.scenes.abort() #20

Open naumoff1337 opened 7 months ago

naumoff1337 commented 7 months ago

When throwing an error from the scene using throw new Error(), it fails to exit the scene in bot.catch()

err.ctx.session.scenes equals undefined

import { Bot, Context, session, SessionFlavor } from 'grammy'
import { ScenesSessionData, ScenesFlavor } from 'grammy-scenes'
import { TypeormAdapter } from '@grammyjs/storage-typeorm'

import { AppDataSource } from './db'
import { SessionEntity } from './session.entity'
import { scenes } from './scenes'

type MyContext = Context & SessionFlavor<ScenesSessionData> & ScenesFlavor

async function bootstrap() {
  const bot = new Bot<MyContext>(process.env.BOT_TOKEN)

  bot.use(
    session({
      initial: () => ({}),
      storage: new TypeormAdapter({
        repository: AppDataSource.getRepository(SessionEntity),
      }),
    }),
  )

  bot.use(scenes.manager())

  bot.command('start', async (ctx) => {
    await ctx.scenes.enter('main')
  })

  bot.use(scenes)

  bot.catch(async (err) => {
    const ctx = err.ctx;

    await ctx.scenes.abort() // scenes exit doesn't work
  })

  bot.start()
}

bootstrap()