@zdavison/nestjs-rpc-toolkit 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/bin/bootstrap.d.ts +19 -0
  2. package/dist/bin/bootstrap.d.ts.map +1 -0
  3. package/dist/bin/bootstrap.js +275 -0
  4. package/dist/bin/bootstrap.js.map +1 -0
  5. package/dist/bin/init.js +0 -0
  6. package/dist/decorators/rpc-controller.decorator.d.ts.map +1 -1
  7. package/dist/decorators/rpc-controller.decorator.js +21 -0
  8. package/dist/decorators/rpc-controller.decorator.js.map +1 -1
  9. package/dist/decorators/rpc-method.decorator.d.ts +2 -2
  10. package/dist/decorators/rpc-method.decorator.d.ts.map +1 -1
  11. package/dist/decorators/rpc-method.decorator.js +50 -26
  12. package/dist/decorators/rpc-method.decorator.js.map +1 -1
  13. package/dist/generators/rpc-types-generator.d.ts +2 -0
  14. package/dist/generators/rpc-types-generator.d.ts.map +1 -1
  15. package/dist/generators/rpc-types-generator.js +187 -20
  16. package/dist/generators/rpc-types-generator.js.map +1 -1
  17. package/dist/index.d.ts +1 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/rpc/rpc-client.d.ts.map +1 -1
  22. package/dist/rpc/rpc-client.js +3 -1
  23. package/dist/rpc/rpc-client.js.map +1 -1
  24. package/dist/rpc/rpc-registry.d.ts.map +1 -1
  25. package/dist/rpc/rpc-registry.js +11 -1
  26. package/dist/rpc/rpc-registry.js.map +1 -1
  27. package/dist/transport/in-process.client.d.ts +2 -0
  28. package/dist/transport/in-process.client.d.ts.map +1 -1
  29. package/dist/transport/in-process.client.js +5 -0
  30. package/dist/transport/in-process.client.js.map +1 -1
  31. package/dist/transport/in-process.transport.d.ts.map +1 -1
  32. package/dist/transport/in-process.transport.js +8 -1
  33. package/dist/transport/in-process.transport.js.map +1 -1
  34. package/dist/types/serializable.d.ts +35 -4
  35. package/dist/types/serializable.d.ts.map +1 -1
  36. package/package.json +8 -6
  37. package/README.md +0 -263
@@ -1 +1 @@
1
- {"version":3,"file":"in-process.transport.js","sourceRoot":"","sources":["../../src/transport/in-process.transport.ts"],"names":[],"mappings":";;;AAAA,yDAAoG;AAEpG,MAAa,0BAA2B,SAAQ,sBAAM;IAGpD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,CAAC;YACzC,0BAA0B,CAAC,QAAQ,GAAG,IAAI,0BAA0B,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,0BAA0B,CAAC,QAAQ,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,QAAoB;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,KAAK;QACH,qBAAqB;IACvB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAS;QAC1C,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,iCAAiC;IACjC,SAAS,CAAC,OAAe,EAAE,IAAS;QAClC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AA3DD,gEA2DC"}
1
+ {"version":3,"file":"in-process.transport.js","sourceRoot":"","sources":["../../src/transport/in-process.transport.ts"],"names":[],"mappings":";;;AAAA,yDAAoG;AAEpG,MAAa,0BAA2B,SAAQ,sBAAM;IAGpD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,CAAC;YACzC,0BAA0B,CAAC,QAAQ,GAAG,IAAI,0BAA0B,EAAE,CAAC;QACzE,CAAC;QACD,OAAO,0BAA0B,CAAC,QAAQ,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,QAAoB;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,KAAK;QACH,qBAAqB;IACvB,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEnD,0FAA0F;QAC1F,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YACnE,0DAA0D;YAC1D,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,WAAW,CACf,OAAe,EACf,MAAkB,EAClB,OAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,IAAS;QAC1C,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,iCAAiC;IACjC,SAAS,CAAC,OAAe,EAAE,IAAS;QAClC,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,8BAAc,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF;AApED,gEAoEC"}
@@ -2,18 +2,32 @@
2
2
  * Type utilities for ensuring JSON serialization compatibility in RPC methods.
3
3
  * These types help catch non-serializable types at compile time.
4
4
  */
5
- type JsonPrimitive = string | number | boolean | null | Date;
6
- export type SerializableJson = JsonPrimitive | SerializableJsonObject | SerializableJsonArray;
5
+ /**
6
+ * JSON primitive types (Date is NOT included as it doesn't round-trip correctly over TCP)
7
+ */
8
+ type SerializableJsonPrimitive = string | number | boolean | null;
9
+ /**
10
+ * Recursively defined JSON-serializable types (strict JSON only)
11
+ */
12
+ export type SerializableJson = SerializableJsonPrimitive | SerializableJsonObject | SerializableJsonArray;
7
13
  interface SerializableJsonObject {
8
14
  [key: string]: SerializableJson;
9
15
  }
10
16
  interface SerializableJsonArray extends Array<SerializableJson> {
11
17
  }
18
+ type HasNeverProperty<T> = {
19
+ [K in keyof T]: [T[K]] extends [never] ? true : false;
20
+ }[keyof T] extends false ? false : true;
21
+ type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;
22
+ type IsSerializable<T> = Equal<T, undefined> extends true ? never : Equal<T, symbol> extends true ? never : Equal<T, null> extends true ? T : T extends Function ? never : T extends Date ? never : T extends string | number | boolean ? T : T extends Array<infer U> ? Array<IsSerializable<U>> : T extends object ? ({
23
+ [K in keyof T]: IsSerializable<T[K]>;
24
+ } extends infer O ? HasNeverProperty<O> extends true ? never : O : never) : never;
12
25
  /**
13
26
  * Helper type to check if a type is serializable.
14
- * This creates compile-time errors for non-serializable types.
27
+ * Validates strict JSON compatibility (no Date, no undefined, no functions, no symbols).
28
+ * Non-serializable types will result in 'never'.
15
29
  */
16
- export type AssertSerializable<T> = T extends SerializableJson ? T : never;
30
+ export type AssertSerializable<T> = IsSerializable<T>;
17
31
  /**
18
32
  * Utility type that extracts parameters from a function type
19
33
  * and ensures they are all serializable
@@ -31,5 +45,22 @@ export type SerializableReturnType<T extends (...args: any[]) => any> = T extend
31
45
  * Ensures both parameters and return type are serializable.
32
46
  */
33
47
  export type SerializableRpcMethod<T extends (...args: any[]) => any> = (...args: SerializableParameters<T>) => T extends (...args: any[]) => Promise<any> ? Promise<SerializableReturnType<T>> : SerializableReturnType<T>;
48
+ /**
49
+ * Constraint type that ensures all parameters are serializable.
50
+ * Returns true if all params are serializable, false otherwise.
51
+ */
52
+ type AreParametersSerializable<T extends (...args: any[]) => any> = T extends (...args: infer P) => any ? P extends any[] ? {
53
+ [K in keyof P]: AssertSerializable<P[K]> extends never ? false : true;
54
+ }[number] extends true ? true : false : false : false;
55
+ /**
56
+ * Constraint type that ensures return type is serializable.
57
+ * Returns true if return type is serializable, false otherwise.
58
+ */
59
+ type IsReturnTypeSerializable<T extends (...args: any[]) => any> = T extends (...args: any[]) => Promise<infer R> ? AssertSerializable<R> extends never ? false : true : T extends (...args: any[]) => infer R ? AssertSerializable<R> extends never ? false : true : false;
60
+ /**
61
+ * Ensures a method has serializable parameters and return type.
62
+ * This constraint prevents the method from being used if it has non-serializable types.
63
+ */
64
+ export type ValidateRpcMethod<T extends (...args: any[]) => any> = AreParametersSerializable<T> extends true ? IsReturnTypeSerializable<T> extends true ? T : never : never;
34
65
  export {};
35
66
  //# sourceMappingURL=serializable.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serializable.d.ts","sourceRoot":"","sources":["../../src/types/serializable.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,KAAK,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AAG7D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,sBAAsB,GAAG,qBAAqB,CAAC;AAE9F,UAAU,sBAAsB;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC;AAED,UAAU,qBAAsB,SAAQ,KAAK,CAAC,gBAAgB,CAAC;CAAG;AAElE;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,CAAC,SAAS,gBAAgB,GAAG,CAAC,GAAG,KAAK,CAAC;AAE3E;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAChF,GAAG,IAAI,EAAE,MAAM,CAAC,KACb,GAAG,GACJ;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC5C,KAAK,CAAC;AAEV;;;GAGG;AACH,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,CAChF,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,OAAO,CAAC,MAAM,CAAC,CAAC,GACjB,kBAAkB,CAAC,CAAC,CAAC,GACrB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GACrC,kBAAkB,CAAC,CAAC,CAAC,GACrB,KAAK,CAAC;AAEV;;;GAGG;AACH,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,CACrE,GAAG,IAAI,EAAE,sBAAsB,CAAC,CAAC,CAAC,KAC/B,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAC3C,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,GAClC,sBAAsB,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"serializable.d.ts","sourceRoot":"","sources":["../../src/types/serializable.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zdavison/nestjs-rpc-toolkit",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "Toolkit for type-safe RPC calls in NestJS monorepos.",
5
5
  "private": false,
6
6
  "main": "dist/index.js",
@@ -9,18 +9,19 @@
9
9
  "access": "public"
10
10
  },
11
11
  "bin": {
12
- "bootstrap": "dist/bin/init.js"
12
+ "bootstrap": "dist/bin/bootstrap.js"
13
13
  },
14
14
  "dependencies": {
15
15
  "@nestjs/common": "^10.0.0",
16
16
  "@nestjs/microservices": "^10.0.0",
17
+ "glob": "^10.0.0",
17
18
  "rxjs": "^7.8.0",
18
19
  "ts-morph": "^20.0.0",
19
- "glob": "^10.0.0"
20
+ "type-fest": "^5.0.1"
20
21
  },
21
22
  "devDependencies": {
22
- "typescript": "^5.0.0",
23
- "@types/node": "^20.0.0"
23
+ "@types/node": "^20.0.0",
24
+ "typescript": "^5.0.0"
24
25
  },
25
26
  "files": [
26
27
  "dist/**/*"
@@ -30,7 +31,8 @@
30
31
  },
31
32
  "peerDependencies": {
32
33
  "@nestjs/common": "^9.0.0 || ^10.0.0",
33
- "@nestjs/microservices": "^9.0.0 || ^10.0.0"
34
+ "@nestjs/microservices": "^9.0.0 || ^10.0.0",
35
+ "reflect-metadata": "^0.1.13 || ^0.2.0"
34
36
  },
35
37
  "scripts": {
36
38
  "build": "tsc",
package/README.md DELETED
@@ -1,263 +0,0 @@
1
- # @zdavison/nestjs-rpc-toolkit
2
-
3
- A TypeScript toolkit for type-safe RPC calls in NestJS monorepos. Enables seamless inter-service communication with compile-time type safety and automatic type generation.
4
-
5
- [![npm version](https://badge.fury.io/js/%40zdavison%2Fnestjs-rpc-toolkit.svg)](https://badge.fury.io/js/%40zdavison%2Fnestjs-rpc-toolkit)
6
-
7
- ## Features
8
-
9
- - 🛡️ **Type Safety**: Full TypeScript support with generated types for RPC calls
10
- - 🏗️ **Decorator-Based**: Simple `@RpcController` and `@RpcMethod` decorators
11
- - 🔄 **Auto-Generation**: Automatic TypeScript type generation from your RPC methods
12
- - 📦 **Monorepo Ready**: Designed for NestJS monorepos with wildcard package scanning
13
- - 🚀 **Multiple Transports**: In-memory for development, TCP for production microservices
14
- - ⚡ **Zero Config**: Smart defaults with optional customization
15
-
16
- ## Quick Start
17
-
18
- ### 1. Installation
19
-
20
- ```bash
21
- npm install @zdavison/nestjs-rpc-toolkit
22
- ```
23
-
24
- ### 2. Define RPC Methods
25
-
26
- ```typescript
27
- import { RpcController, RpcMethod } from '@zdavison/nestjs-rpc-toolkit';
28
-
29
- @RpcController('user') // Creates 'user.*' RPC patterns
30
- export class UserService {
31
- @RpcMethod()
32
- async findOne(params: { id: string }): Promise<User> {
33
- // RPC pattern: 'user.findOne'
34
- return this.userRepository.findById(params.id);
35
- }
36
-
37
- @RpcMethod()
38
- async create(params: CreateUserDto): Promise<User> {
39
- // RPC pattern: 'user.create'
40
- return this.userRepository.create(params);
41
- }
42
- }
43
- ```
44
-
45
- ### 3. Initialize RPC Package
46
-
47
- ```bash
48
- npx @zdavison/nestjs-rpc-toolkit bootstrap
49
- ```
50
-
51
- This creates:
52
- - RPC package structure
53
- - Configuration files
54
- - Type generation scripts
55
- - TypeScript setup
56
-
57
- ### 4. Generate Types
58
-
59
- ```bash
60
- npm run generate:types
61
- ```
62
-
63
- Generates type-safe interfaces:
64
-
65
- ```typescript
66
- // Generated in your RPC package
67
- export interface UserDomain {
68
- findOne(params: { id: string }): Promise<User>;
69
- create(params: CreateUserDto): Promise<User>;
70
- }
71
-
72
- export interface IRpcClient {
73
- user: UserDomain;
74
- product: ProductDomain;
75
- // ... other domains
76
- }
77
- ```
78
-
79
- ### 5. Make Type-Safe RPC Calls
80
-
81
- ```typescript
82
- import { MessageBus } from '@your-org/rpc'; // Your generated RPC package
83
-
84
- @Injectable()
85
- export class ProductService {
86
- constructor(private readonly rpc: MessageBus) {}
87
-
88
- async getProductWithOwner(productId: string) {
89
- // Type-safe RPC calls with auto-completion
90
- const product = await this.rpc.send('product.findOne', { id: productId });
91
- const owner = await this.rpc.send('user.findOne', { id: product.ownerId });
92
-
93
- return { product, owner };
94
- }
95
- }
96
- ```
97
-
98
- ## Documentation
99
-
100
- ### @RpcController Decorator
101
-
102
- The `@RpcController` decorator marks classes containing RPC methods:
103
-
104
- ```typescript
105
- // Explicit prefix
106
- @RpcController('user')
107
- export class UserService { }
108
-
109
- // Auto-inferred from class name
110
- @RpcController() // Infers 'user' from 'UserService'
111
- export class UserService { }
112
-
113
- @RpcController() // Infers 'product' from 'ProductApplication'
114
- export class ProductApplication { }
115
- ```
116
-
117
- **Auto-inference rules:**
118
- - Removes suffixes: `Service`, `Application`, `Handler`, `Repository`
119
- - Converts to lowercase: `UserService` → `user`
120
-
121
- ### @RpcMethod Decorator
122
-
123
- Marks methods as RPC endpoints:
124
-
125
- ```typescript
126
- @RpcController('user')
127
- export class UserService {
128
- @RpcMethod()
129
- async findAll(): Promise<User[]> {
130
- // Pattern: 'user.findAll'
131
- }
132
-
133
- @RpcMethod()
134
- async findOne(params: { id: string }): Promise<User> {
135
- // Pattern: 'user.findOne'
136
- }
137
- }
138
- ```
139
-
140
- ### Configuration
141
-
142
- Create `nestjs-rpc-toolkit.config.json`:
143
-
144
- ```json
145
- {
146
- "packages": [
147
- "packages/modules/*",
148
- "apps/specific-service"
149
- ],
150
- "outputDir": "packages/lib-rpc/src"
151
- }
152
- ```
153
-
154
- **Package paths support:**
155
- - Glob patterns: `packages/modules/*`
156
- - Specific paths: `apps/user-service`
157
- - Multiple patterns in array
158
-
159
- ### Transport Options
160
-
161
- #### In-Process Transport (Development)
162
-
163
- ```typescript
164
- import { InProcessTransport } from '@zdavison/nestjs-rpc-toolkit';
165
-
166
- @Module({
167
- imports: [
168
- InProcessTransport.forRoot(),
169
- ],
170
- })
171
- export class AppModule {}
172
- ```
173
-
174
- #### TCP Transport (Production)
175
-
176
- ```typescript
177
- import { TcpTransport } from '@zdavison/nestjs-rpc-toolkit';
178
-
179
- @Module({
180
- imports: [
181
- TcpTransport.forRoot({
182
- host: 'localhost',
183
- port: 3001,
184
- }),
185
- ],
186
- })
187
- export class AppModule {}
188
- ```
189
-
190
- ## Examples
191
-
192
- The `examples/` directory contains a complete monorepo setup:
193
-
194
- ```bash
195
- cd examples
196
- pnpm install
197
- pnpm generate-rpc # Generate RPC types
198
- pnpm build # Build all packages
199
- pnpm dev # Start API in development mode
200
- ```
201
-
202
- ### Example Structure
203
-
204
- ```
205
- examples/
206
- ├── apps/api/ # Main NestJS application
207
- ├── modules/
208
- │ ├── user-module/ # User domain module
209
- │ └── auth-module/ # Auth domain module
210
- ├── lib-rpc/ # Generated RPC types package
211
- └── package.json
212
- ```
213
-
214
- ## Serialization Requirements
215
-
216
- All RPC parameters and return types must be JSON-serializable for TCP transport:
217
-
218
- ✅ **Allowed:**
219
- - Primitives: `string`, `number`, `boolean`, `null`
220
- - Plain objects: `{ name: string, age: number }`
221
- - Arrays: `string[]`, `User[]`
222
-
223
- ❌ **Avoid:**
224
- - Functions, callbacks
225
- - Class instances (use plain objects/interfaces)
226
- - `Buffer`, `Map`, `Set`
227
- - `undefined` (use `null` instead)
228
- - DOM elements
229
-
230
- ## API Reference
231
-
232
- ### Core Classes
233
-
234
- - **`MessageBus<T>`**: Type-safe RPC client
235
- - **`RpcTypesGenerator`**: Generates TypeScript types from RPC methods
236
- - **`InProcessTransport`**: In-process transport for development
237
- - **`TcpTransport`**: TCP transport for production
238
-
239
- ### Decorators
240
-
241
- - **`@RpcController(prefix?)`**: Marks RPC controller classes
242
- - **`@RpcMethod(pattern?)`**: Marks RPC endpoint methods
243
-
244
- ## Contributing
245
-
246
- 1. Fork the repository
247
- 2. Create your feature branch: `git checkout -b feature/my-feature`
248
- 3. Commit your changes: `git commit -am 'Add some feature'`
249
- 4. Push to the branch: `git push origin feature/my-feature`
250
- 5. Submit a pull request
251
-
252
- ## License
253
-
254
- MIT
255
-
256
- ## Support
257
-
258
- - [GitHub Issues](https://github.com/zdavison/nestjs-rpc-toolkit/issues)
259
- - [Documentation](https://github.com/zdavison/nestjs-rpc-toolkit)
260
-
261
- ---
262
-
263
- **Made for NestJS monorepos** 🚀