Skip to content

Share same context between 'limit' and 'ttl' #1576

Open
@siisee11

Description

@siisee11

Is there an existing issue that is already proposing this?

  • I have searched the existing issues

Is your feature request related to a problem? Please describe it

Below is my throttler module code. I used identical code for both the "ttl" and "limit" functions, resulting in fetching the same data from the database twice. Is there a way to share the ExecutionContext between the "limit" and "ttl" functions to avoid this duplication?

    ThrottlerModule.forRootAsync({
      imports: [ConfigModule, JwtModule, GlobalModule],
      inject: [ConfigService, JwtService, SupabaseService],
      useFactory: (
        config: ConfigService,
        jwtService: JwtService,
        supabaseService: SupabaseService
      ) => ({
        ttl: async (context) => {
          const request = context.switchToHttp().getRequest();
          const extractor = ExtractJwt.fromAuthHeaderAsBearerToken();
          const accessToken = ExtractJwt.fromExtractors([extractor])(request);
          const payload = jwtService.decode(accessToken);
          const userId = payload.sub;
          const expressPass = await supabaseService.getExpressPass(userId);
          return expressPass ? 1000 : 60;
        },
        limit: async (context) => {
          const request = context.switchToHttp().getRequest();
          const extractor = ExtractJwt.fromAuthHeaderAsBearerToken();
          const accessToken = ExtractJwt.fromExtractors([extractor])(request);
          const payload = jwtService.decode(accessToken);
          const userId = payload.sub;
          const expressPass = await supabaseService.getExpressPass(userId);
          return expressPass ? 1000 : 1;
        },

        storage: config.get("REDIS_URL")
          ? new ThrottlerStorageRedisService(config.get("REDIS_URL"))
          : undefined,
      }),
    }),
    ```

### Describe the solution you'd like

Inject data to request before executing ttl, limit function.

const expressPass = request.expressPass


### Teachability, documentation, adoption, migration strategy

_No response_

### What is the motivation / use case for changing the behavior?

.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions