1.8.1 • Published 5 years ago

@nestling/context v1.8.1

Weekly downloads
2
License
MIT
Repository
github
Last release
5 years ago

Context module for NestJS

Conventional context module.

Use it to store context about the application.

Setup

Global Context

import { ContextModule } from '@nestling/context'

@Module({
  imports: [
    ContextModule
  ]
})
export class ApplicationModule {}

@Component()
export class MyMiddleware {
  constructor(
    private context: ContextService
  ) {}
  
  someMethod() {
    this.context.set('someGlobalContext', ...)
  }
}

@Component()
export class MyService {
  constructor(
    private context: ContextService
  ) {}
  
  someMethod() {
    if (this.context.has('someGlobalContext')) {
      this.context.get('someGlobalContext')
      ...
    }
  }
}

Per Request / Response Context

First make sure the ContextModule is imported, it will automatically define a ContextModel on each request / response pair, this is done internally by the ContextInterceptor.

The context is shared among request & response, representing the same context instance.

imports: [
  ContextModule 
]

Functions

The context can be retrieved from either the request or the response.

 request.context.set('prop', value')
 request.context.get('prop'')
 request.context.has('prop'')
 
 response.context.set('prop', value')
 response.context.get('prop'')
 response.context.has('prop'')

Convenience functions are also available:

import {
  hasContext,
  getContext,
  setContext
} from '@nestling/context'

// sets .context on request
setContext('jwt', decoded, request)

// additional functions:
hasContext('jwt', request)
getContext<ExpectedType>('jwt', request) // ExpectedType or null

@Context decorator

The @Context decorator can be used to retrieve context which was previously set on the request.

If @Context() is called with no arguments it will supply the whole context.

@Controller()
export class MyController {
  @Get()
  async getPosts(
    @Context('jwt') jwt,
    @Context('nested.path') nestedPath,
    @Context(['nested', 'path', 'also']) nestedPathAlso
    @Context() context
  ) {}
}

Example Context Supplier

Note that although the context is set on the request, it will also be available on the response.

import {
  CanActivate,
  Injectable,
  ExecutionContext
} from '@nestjs/common'
import { ErrorMessage } from '@nestling/errors'
import * as jwt from 'jsonwebtoken'
import { ConfigService } from '@nestling/config'
import { setContext } from '@nestling/context'

import { JWTConfig } from './types'

@Injectable()
class JsonWebtokenGuard implements CanActivate {
  constructor (
    private config: ConfigService
  ) {}

  async canActivate (executionContext: ExecutionContext): Promise<boolean> {
    const {
      jwt: {
        contextKey = 'jwt',
        secret,
        header = 'authorization'
      }
    }: JWTConfig = this.config as any

    const httpContext = executionContext.switchToHttp()
    const request = httpContext.getRequest()
    const { headers } = request

    if (typeof headers[header] === 'string') {
      const parts = headers[header].split(' ')

      if (parts[0] === 'Bearer') {
        const token = parts[1]
        const decoded: any = jwt.verify(token, secret)

        setContext(contextKey, decoded, request)

        return true
      }
    }

    throw new ErrorMessage('auth:unauthorized')
  }
}
1.8.1

5 years ago

1.8.0

6 years ago

1.7.0

6 years ago

1.6.1

6 years ago

1.6.0

6 years ago

1.5.0

6 years ago

1.4.0

6 years ago

1.3.0

6 years ago

1.2.1

6 years ago

1.2.0

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.1

6 years ago