0.2.22 • Published 10 months ago

@nclabs/nestjs-rpc-module v0.2.22

Weekly downloads
-
License
UNLICENSED
Repository
github
Last release
10 months ago

nestjs-nclabs-rpc-module

Utilitário NestJS para configuração de rotas e cache em microsserviços. Utilizado especificamente para projetos nclabs

Instalação

npm i @nclabs/nestjs-rpc-module

Configuração

Carregar o arquivo de configuração (ex.: docker-compose.env) compartilhado entre todos os serviços.

  • As váriáveis descritas no arquivo de configuração são carregadas e tratadas pela biblioteca de configuração.

  • Todas as variáveis de ambiente são expostas com seu nome original no atributo env da biblioteca de configuração.

Arquivo de configuração modelo: https://github.com/nclabs-npm/nestjs-nc-template/blob/main/dist/docker-compose.env

Variável de ambiente que DEVE ser setada no docker-compose.yml:

environment:
  SERVICE_NAME: <your-service-name>

Variáveis de ambiente que PODEM ser setada no docker-compose.yml:

environment:
  ...
  # Gerar log de repostas com sucesso
  LOG_RESPONSE=<true | false>

  # Nível de log dos erros
  LOG_ERROR_LEVEL=<debug | info | warn | error | fatal>

Modulo

// app.module.ts

...
import { NclabsRpcModule } from '@nclabs/rpc-module';

@Module({
  imports: [    
    // ...
    NclabsRpcModule.register({ 
      autoInterceptCache: true,   // true ou false: default true
      }),
    // ...
  ],
  // ...
})
export class AppModule {}

Recursos

RecursoTipoUsoObservação
NclabsConfigLib*Disponibiliza todas as váriaveis de ambiente
NclabsHttpDecoratorControllerConfigura requisições HTTP
NclabsActionDecoratorControllerConfigura requisições RPC
NclabsEventDecoratorControllerConfigura envio de eventos RPC
NclabsCtxDecoratorControllerAcessa informações do contexto do microserviço
NclabsContextInterface*Tipo de contexto do microserviço
NclabsRpcClientServiceProviderController ServiceMétodos para requisição de microserviços externos (RPC conf)
NclabsCacherServiceProviderController ServiceMétodos para o tratamento manual do cache
INclabsExceptionInterface*Tipo de exceção do microserviço

NclabsConfig

const config = NclabsConfig.load();

console.log(config.service);
console.log(config.g5.baseUrl);

console.log(config.env.get('SERVICE_NAME'));
console.log(config.env.get('G5_BASE_URL'));

Controller - Method Configuration

// app.controller.ts

...

@Controller()
export class AppController {

  ...

  /**
   *    HTTP REQUEST
   */
  @NclabsAction({
    path: 'your-path/:id',
    methods: ['GET', 'POST'],
    cache: {
      keys: ['#headers.authorization', '#data.id', 'some-key'],
      ttl: 1200, // seconds
    },
  })
  youRpcMethodName(@NclabsCtx() context: NclabsContext) {
    // Do something
    return;
  }

  /**
   *    RPC CALL 
   */
  @NclabsAction({
    name: 'your-action-name',
    cache: {
      keys: ['#headers.authorization', '#params.id', 'some-key'],
      ttl: 1200, // seconds
    },
  })
  youRpcMethodName(@NclabsCtx() context: NclabsContext) {
    // Do something
    return;
  }

  ...

HTTP REQUEST:

Registra a rota definida em path para os métodos indicados em methods. Quando o parâmetro methods não for informado, todos os métodos são permitidos.

No Exemplo acima:

  • GET /your-path/:id
  • POST /your-path/:id

RPC:

O método poderá ser requisitado pelo padrão service.name

Onde:

  - service = SERVICE_NAME  (definido no environment do docker compose)
  - name    = your-action-name (configurado no decorator do método)

CACHE:

O atributo cache disponibiliza párâmetros de configuração do cache para o retorno da requisição com as chaves especificadas no keys e com o TTL especificado no ttl.

O cacher gera a chave do cache com base no serviço, protocolo (HTTP/RCP), nome do método e as chaves especificadas no keys. Que aceita valores estaticos, variáveis previamente carregadas (lembrando que o NestJs carrega os decorator antes de instanciar os módulos) e variáveis do contexto que poderão ser acessadas através do prefixo # sendo possível utilizar qualquer atributo de retorno do contexto.

A sintaxe da chave é:

<SERVICE_NAME>:-.<key 1>.<key 2>.<key 3>

  // Exemplo:

  // SERVICE_NAME = senior-auth

  @NclabsHttp({
    path: '/user-credential:id',
    methods: ['GET'],
    cache: {
      keys: [
        '#headers.authorization',  // value from context.headers
        '#params.id',              // value from context.params
        'some-key'                 // static value
      ],
      ttl: 1200,                   // seconds
    },
  })
  getUserCredential(...) {
    
  }

  ...

A chave gerada para o cache será algo assim:

senior-auth:http-get-getUserCredential.Bearer A8DA9S8Asc8ca9sud0c0sgh.123.some-key
**** IMPORTANTE ****

Os decorator são processados antes da instanciação dos módulos e,
portanto, serviços injetados e providers não estão disponíveis.

Se precisar de variáveis de ambiente para compor a chave do cache,
é necessário utilizar o o acesso através da classe de configuração
`NclabsConfig.load()`.

Contexto

// app.controller.ts
// app.service.ts

...

@Controller()

  ...

  youMethod(@NclabsCtx() context: NclabsContext) {

    const { meta, headers, params, data } = context;

    // meta:    Informações do microserviço 
    // headers: Header do request
    // params:  Path parameters do request
    // data:    Request (Body and Query parameters)

    return;
  }

  ...

   👉      context.params somente terá valores nas requisições HTTP. Levar em consideração as possíveis chamadas RPC.

Client Service

// app.controller.ts
// app.service.ts

...

@Controller()
// ou
@Injectable()

  ...

  constructor(
    private readonly clientRpc: NclabsRpcClientService,
  ) {}

  ...

  /**
   *    CALL - Observable Approach
   */ 
  yourMethod(@NclabsCtx() context: NclabsContext): Observable<Person> {
    
    const payload = { 
      name: context.data.name
    }; 

    return this.clientRpc.call('other-service.action', payload, context); 
  }

  /**
   *    CALL- Promise Approach
   */ 
  async yourAsyncMethod(@NclabsCtx() context: NclabsContext): Promise<Person> {
    
    const payload = { 
      name: context.data.name
    }; 

    const person = await this.clientRpc.callAsync('person.create', payload, context);

    // do something

    return person; 
  }


  /**
   *    CALL with event emitter
   */ 
  otherMethod(@NclabsCtx() context: NclabsContext): Observable<Person> {
    
    const payload = { 
      name: context.data.name
    }; 

    return this.clientRpc.call('person.create', payload, context).pipe(
      // Emit event
      tap((data: Person) => this.clientRpc.emit('person-created', data)),
    ); 
  }


  ...

Exceptions

AS requisições REST e chamadas de serviço (...client.call) abstraem a normalização do objeto de exceções.

Quando for necessário lançar exceções manualmente, utilizar a sintaxe abaixo:

// app.controller.ts
// app.service.ts

...

@Controller()
// ou
@Injectable()

  ...

  /**
   * 
   *  Generate password for G5
   * 
   */
  private _generateEncryptPassword(username: string): string {

    // create/get password

    if (!password || password === 'null') {
      const error = {
        code: 401,
        type: 'UNAUTHORIZED',
        message: 'Não foi possível gerar a senha encriptada do Senior G5',
        error: {
          jar: 'crypt.jar',
          encrypt: 'CBC',
          user: username,
          date: dt.toLocaleString('pt-BR', options).replace(',', ''),
        },
      };

      throw new RpcException(error);
    }

    // do something

    return encryptedPassword;
  }

  ...
0.2.22

10 months ago

0.2.21

10 months ago

0.2.12

1 year ago

0.2.11

1 year ago

0.2.10

1 year ago

0.2.9

1 year ago

0.2.8

1 year ago

0.2.7

1 year ago

0.2.6

1 year ago

0.2.5

1 year ago

0.2.4

1 year ago

0.2.3

1 year ago

0.2.2

1 year ago

0.2.1

1 year ago

0.1.47

1 year ago

0.1.46

1 year ago

0.1.45

1 year ago

0.1.44

1 year ago

0.1.43

1 year ago

0.1.42

1 year ago

0.1.41

1 year ago

0.1.40

1 year ago

0.1.39

1 year ago

0.1.38

1 year ago

0.1.37

1 year ago

0.1.36

1 year ago

0.1.35

1 year ago

0.1.34

1 year ago

0.1.33

1 year ago

0.1.32

1 year ago

0.1.31

1 year ago

0.1.30

1 year ago

0.1.29

1 year ago

0.1.28

1 year ago

0.1.27

1 year ago

0.1.26

1 year ago

0.1.25

1 year ago

0.1.24

1 year ago

0.1.23

1 year ago

0.1.22

1 year ago

0.1.21

1 year ago

0.1.20

1 year ago

0.1.19

1 year ago

0.1.18

1 year ago

0.1.17

1 year ago

0.1.16

1 year ago

0.1.15

1 year ago

0.1.14

1 year ago

0.1.13

1 year ago

0.1.12

1 year ago

0.1.10

1 year ago

0.1.9

1 year ago

0.1.8

1 year ago

0.1.7

1 year ago

0.1.6

1 year ago

0.1.5

1 year ago

0.1.4

1 year ago

0.1.3

1 year ago

0.1.2

1 year ago

0.1.1

1 year ago

0.0.77

1 year ago

0.0.76

1 year ago

0.0.75

1 year ago

0.0.74

1 year ago

0.0.73

1 year ago

0.0.72

1 year ago

0.0.71

1 year ago

0.0.70

1 year ago

0.0.69

1 year ago

0.0.68

1 year ago

0.0.67

1 year ago

0.0.65

1 year ago

0.0.64

1 year ago

0.0.63

1 year ago

0.0.62

1 year ago

0.0.61

1 year ago

0.0.60

1 year ago

0.0.59

1 year ago

0.0.58

1 year ago

0.0.57

1 year ago

0.0.56

1 year ago

0.0.55

1 year ago

0.0.54

1 year ago

0.0.53

1 year ago

0.0.52

1 year ago

0.0.51

1 year ago

0.0.50

1 year ago

0.0.49

1 year ago

0.0.48

1 year ago

0.0.47

1 year ago

0.0.46

1 year ago

0.0.45

1 year ago

0.0.44

1 year ago

0.0.43

1 year ago

0.0.42

1 year ago

0.0.41

1 year ago

0.0.40

1 year ago

0.0.39

1 year ago

0.0.38

1 year ago

0.0.37

1 year ago

0.0.36

1 year ago

0.0.35

1 year ago

0.0.34

1 year ago

0.0.33

1 year ago

0.0.32

1 year ago

0.0.31

1 year ago

0.0.30

1 year ago

0.0.29

1 year ago

0.0.28

1 year ago

0.0.27

1 year ago

0.0.26

1 year ago

0.0.25

1 year ago

0.0.24

1 year ago

0.0.23

1 year ago

0.0.22

1 year ago

0.0.21

1 year ago

0.0.20

1 year ago

0.0.19

1 year ago

0.0.18

1 year ago

0.0.17

1 year ago

0.0.16

1 year ago

0.0.15

1 year ago

0.0.14

1 year ago

0.0.13

1 year ago

0.0.12

1 year ago

0.0.11

1 year ago

0.0.10

1 year ago

0.0.9

1 year ago

0.0.8

1 year ago

0.0.7

1 year ago

0.0.6

1 year ago

0.0.5

1 year ago

0.0.4

1 year ago

0.0.3

1 year ago

0.0.2

1 year ago

0.0.1

1 year ago