Skip to content

Commit d856a55

Browse files
feature(microservices): add RequestContext to request scoped
1 parent 999da76 commit d856a55

File tree

6 files changed

+42
-5
lines changed

6 files changed

+42
-5
lines changed

packages/microservices/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ export * from './interfaces';
1414
export * from './module';
1515
export * from './nest-microservice';
1616
export * from './server';
17+
export * from './tokens';

packages/microservices/interfaces/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ export * from './message-handler.interface';
66
export * from './microservice-configuration.interface';
77
export * from './packet.interface';
88
export * from './pattern-metadata.interface';
9+
export * from './request-context.interface';
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface RequestContext<T = any> {
2+
pattern: string | Record<string, any>;
3+
data: T;
4+
}

packages/microservices/listeners-controller.ts

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@ import { Controller } from '@nestjs/common/interfaces/controllers/controller.int
22
import { createContextId } from '@nestjs/core/helpers/context-id-factory';
33
import { NestContainer } from '@nestjs/core/injector/container';
44
import { Injector } from '@nestjs/core/injector/injector';
5-
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
5+
import {
6+
ContextId,
7+
InstanceWrapper,
8+
} from '@nestjs/core/injector/instance-wrapper';
69
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
10+
import { REQUEST } from '@nestjs/core/router/request/request-constants';
711
import { IClientProxyFactory } from './client/client-proxy-factory';
812
import { ClientsContainer } from './container';
913
import { RpcContextCreator } from './context/rpc-context-creator';
10-
import { CustomTransportStrategy } from './interfaces';
14+
import { CustomTransportStrategy, RequestContext } from './interfaces';
1115
import { ListenerMetadataExplorer } from './listener-metadata-explorer';
1216
import { Server } from './server/server';
1317

@@ -48,8 +52,10 @@ export class ListenersController {
4852
}
4953
server.addHandler(
5054
pattern,
51-
async data => {
55+
async (data: unknown) => {
5256
const contextId = createContextId();
57+
this.registerRequestProvider({ pattern, data }, contextId);
58+
5359
const contextInstance = await this.injector.loadPerContext(
5460
instance,
5561
module,
@@ -88,4 +94,17 @@ export class ListenersController {
8894
) {
8995
Reflect.set(instance, property, client);
9096
}
97+
98+
private registerRequestProvider(
99+
request: RequestContext,
100+
contextId: ContextId,
101+
) {
102+
const coreModuleRef = this.container.getInternalCoreModuleRef();
103+
const wrapper = coreModuleRef.getProviderByKey(REQUEST);
104+
105+
wrapper.setInstanceByContextId(contextId, {
106+
instance: request,
107+
isResolved: true,
108+
});
109+
}
91110
}

packages/microservices/tokens.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { REQUEST } from '@nestjs/core';
2+
3+
export const CONTEXT = REQUEST;

sample/03-microservices/src/math/math.controller.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import { Controller, Get, Inject } from '@nestjs/common';
2-
import { ClientProxy, MessagePattern } from '@nestjs/microservices';
2+
import {
3+
ClientProxy,
4+
CONTEXT,
5+
MessagePattern,
6+
RequestContext,
7+
} from '@nestjs/microservices';
38
import { Observable } from 'rxjs';
49
import { MATH_SERVICE } from './math.constants';
510

611
@Controller()
712
export class MathController {
8-
constructor(@Inject(MATH_SERVICE) private readonly client: ClientProxy) {}
13+
constructor(
14+
@Inject(MATH_SERVICE) private readonly client: ClientProxy,
15+
@Inject(CONTEXT) private readonly ctx: RequestContext<number[]>,
16+
) {}
917

1018
@Get()
1119
execute(): Observable<number> {
@@ -16,6 +24,7 @@ export class MathController {
1624

1725
@MessagePattern({ cmd: 'sum' })
1826
sum(data: number[]): number {
27+
console.log(this.ctx);
1928
return (data || []).reduce((a, b) => a + b);
2029
}
2130
}

0 commit comments

Comments
 (0)